|
@@ -85,6 +85,33 @@ static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static int hash_init_crc16_ccitt(struct hash_algo *algo, void **ctxp)
|
|
|
+{
|
|
|
+ uint16_t *ctx = malloc(sizeof(uint16_t));
|
|
|
+ *ctx = 0;
|
|
|
+ *ctxp = ctx;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int hash_update_crc16_ccitt(struct hash_algo *algo, void *ctx,
|
|
|
+ const void *buf, unsigned int size,
|
|
|
+ int is_last)
|
|
|
+{
|
|
|
+ *((uint16_t *)ctx) = crc16_ccitt(*((uint16_t *)ctx), buf, size);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int hash_finish_crc16_ccitt(struct hash_algo *algo, void *ctx,
|
|
|
+ void *dest_buf, int size)
|
|
|
+{
|
|
|
+ if (size < algo->digest_size)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ *((uint16_t *)dest_buf) = *((uint16_t *)ctx);
|
|
|
+ free(ctx);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int hash_init_crc32(struct hash_algo *algo, void **ctxp)
|
|
|
{
|
|
|
uint32_t *ctx = malloc(sizeof(uint32_t));
|
|
@@ -159,6 +186,15 @@ static struct hash_algo hash_algo[] = {
|
|
|
#endif
|
|
|
},
|
|
|
#endif
|
|
|
+ {
|
|
|
+ .name = "crc16-ccitt",
|
|
|
+ .digest_size = 2,
|
|
|
+ .chunk_size = CHUNKSZ,
|
|
|
+ .hash_func_ws = crc16_ccitt_wd_buf,
|
|
|
+ .hash_init = hash_init_crc16_ccitt,
|
|
|
+ .hash_update = hash_update_crc16_ccitt,
|
|
|
+ .hash_finish = hash_finish_crc16_ccitt,
|
|
|
+ },
|
|
|
{
|
|
|
.name = "crc32",
|
|
|
.digest_size = 4,
|