aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Nardi <12729895+IvanNardi@users.noreply.github.com>2023-04-04 14:19:41 +0200
committerGitHub <noreply@github.com>2023-04-04 14:19:41 +0200
commitcc5aec5f0ac6ff3d7d4c9ecbe02881641e8c8c92 (patch)
treea1acafaa0f86978e648de0a75713873744ea8270 /src
parentd7662379b470191afd5f5d3b26f4e0763bc24a83 (diff)
fuzz: add fuzzer to test internal gcrypt code (#1920)
Diffstat (limited to 'src')
-rw-r--r--src/lib/third_party/include/gcrypt_light.h8
-rw-r--r--src/lib/third_party/src/gcrypt_light.c27
2 files changed, 23 insertions, 12 deletions
diff --git a/src/lib/third_party/include/gcrypt_light.h b/src/lib/third_party/include/gcrypt_light.h
index 6d6a115ee..bbd664155 100644
--- a/src/lib/third_party/include/gcrypt_light.h
+++ b/src/lib/third_party/include/gcrypt_light.h
@@ -1,4 +1,8 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#ifndef GCRY_LIGHT_H
#define GCRY_LIGHT_H
@@ -84,4 +88,8 @@ size_t gcry_cipher_get_algo_keylen (int algo);
#endif /* GCRY_LIGHT_H */
+#ifdef __cplusplus
+}
+#endif
+
/* vim: set ts=4 sw=4 et foldmethod=marker foldmarker={{{{,}}}}: */
diff --git a/src/lib/third_party/src/gcrypt_light.c b/src/lib/third_party/src/gcrypt_light.c
index 10cb7cd39..512f67bb5 100644
--- a/src/lib/third_party/src/gcrypt_light.c
+++ b/src/lib/third_party/src/gcrypt_light.c
@@ -116,7 +116,7 @@ const char *gcry_check_version(void *unused) {
gcry_error_t gcry_md_open(gcry_md_hd_t *h,int algo,int flags) {
gcry_md_hd_t ctx;
if(!(algo == GCRY_MD_SHA256 && flags == GCRY_MD_FLAG_HMAC)) return MBEDTLS_ERR_MD_NOT_SUPPORT;
- ctx = ndpi_calloc(1,sizeof(struct gcry_md_hd));
+ ctx = (gcry_md_hd_t)ndpi_calloc(1,sizeof(struct gcry_md_hd));
if(!ctx) return MBEDTLS_ERR_MD_ALLOC_FAILED;
*h = ctx;
return GPG_ERR_NO_ERROR;
@@ -133,13 +133,15 @@ void gcry_md_reset(gcry_md_hd_t h) {
gcry_error_t gcry_md_setkey(gcry_md_hd_t h,const uint8_t *key,size_t key_len) {
if(h->key_len) return MBEDTLS_ERR_MD_REKEY;
h->key_len = key_len <= sizeof(h->key) ? key_len : sizeof(h->key);
- memcpy(h->key,key,h->key_len);
+ if(h->key_len > 0)
+ memcpy(h->key,key,h->key_len);
return GPG_ERR_NO_ERROR;
}
gcry_error_t gcry_md_write(gcry_md_hd_t h,const uint8_t *data,size_t data_len) {
if(h->data_len + data_len > GCRY_MD_BUFF_SIZE) return MBEDTLS_ERR_MD_DATA_TOO_BIG;
- memcpy(&h->data_buf[h->data_len],data,data_len);
+ if(data_len > 0)
+ memcpy(&h->data_buf[h->data_len],data,data_len);
h->data_len += data_len;
return GPG_ERR_NO_ERROR;
}
@@ -178,7 +180,7 @@ size_t s_len = ROUND_SIZE8(sizeof(struct gcry_cipher_hd));;
switch(mode) {
case GCRY_CIPHER_MODE_ECB:
- r = ndpi_calloc(1,s_len + sizeof(mbedtls_aes_context));
+ r = (struct gcry_cipher_hd *)ndpi_calloc(1,s_len + sizeof(mbedtls_aes_context));
if(!r) return MBEDTLS_ERR_CIPHER_ALLOC_FAILED;
r->ctx.ecb = (mbedtls_aes_context *)(r+1);
mbedtls_aes_init(r->ctx.ecb);
@@ -188,7 +190,7 @@ size_t s_len = ROUND_SIZE8(sizeof(struct gcry_cipher_hd));;
size_t aes_ctx_size = ROUND_SIZE8(sizeof( mbedtls_aes_context ));
size_t gcm_ctx_size = ROUND_SIZE8(sizeof( mbedtls_gcm_context ));
- r = ndpi_calloc(1,s_len + gcm_ctx_size + aes_ctx_size);
+ r = (struct gcry_cipher_hd *)ndpi_calloc(1,s_len + gcm_ctx_size + aes_ctx_size);
if(!r) return MBEDTLS_ERR_CIPHER_ALLOC_FAILED;
r->ctx.gcm = (mbedtls_gcm_context *)(r+1);
mbedtls_gcm_init(r->ctx.gcm,(void *)(((char *)(r+1)) + gcm_ctx_size));
@@ -250,10 +252,10 @@ gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t h, const void *key, size_t key
if( keylen != gcry_cipher_get_algo_keylen(h->algo)) return MBEDTLS_ERR_CIPHER_BAD_KEY;
switch(h->mode) {
case GCRY_CIPHER_MODE_ECB:
- r = mbedtls_aes_setkey_enc( h->ctx.ecb, key, keylen*8 );
+ r = mbedtls_aes_setkey_enc( h->ctx.ecb, (const unsigned char *)key, keylen*8 );
break;
case GCRY_CIPHER_MODE_GCM:
- r = mbedtls_gcm_setkey( h->ctx.gcm, MBEDTLS_CIPHER_ID_AES, key, keylen*8 );
+ r = mbedtls_gcm_setkey( h->ctx.gcm, MBEDTLS_CIPHER_ID_AES, (const unsigned char *)key, keylen*8 );
break;
}
if(!r) {
@@ -285,7 +287,8 @@ gcry_error_t gcry_cipher_authenticate (gcry_cipher_hd_t h, const void *abuf, siz
if(abuflen > sizeof(h->auth)) return MBEDTLS_ERR_CIPHER_BAD_KEY;
h->s_auth = 1;
h->authlen = abuflen;
- memcpy(h->auth,abuf,abuflen);
+ if(abuflen > 0)
+ memcpy(h->auth,abuf,abuflen);
return 0;
}
return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
@@ -298,7 +301,7 @@ gcry_error_t gcry_cipher_checktag (gcry_cipher_hd_t h, const void *intag, size_t
if(h->s_crypt_ok && h->taglen == taglen) {
size_t i;
int diff;
- const uint8_t *ctag = intag;
+ const uint8_t *ctag = (const uint8_t *)intag;
for( diff = 0, i = 0; i < taglen; i++ )
diff |= ctag[i] ^ h->tag[i];
if(!diff) return 0;
@@ -326,7 +329,7 @@ static gcry_error_t _gcry_cipher_crypt (gcry_cipher_hd_t h,
if(check_valid_algo_mode(h)) return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
if(!inlen && !outsize) return MBEDTLS_ERR_GCM_BAD_INPUT;
if(!in && !inlen) {
- src = ndpi_malloc(outsize);
+ src = (uint8_t *)ndpi_malloc(outsize);
if(!src) return MBEDTLS_ERR_GCM_ALLOC_FAILED;
srclen = outsize;
memcpy(src,out,outsize);
@@ -338,7 +341,7 @@ static gcry_error_t _gcry_cipher_crypt (gcry_cipher_hd_t h,
if(!encrypt) return MBEDTLS_ERR_GCM_NOT_SUPPORT;
if(!( h->s_key && !h->s_crypt_ok)) return MBEDTLS_ERR_AES_MISSING_KEY;
rv = mbedtls_aes_crypt_ecb(h->ctx.ecb, MBEDTLS_AES_ENCRYPT,
- src ? src:in, out);
+ src ? src:(const unsigned char *)in, (unsigned char *)out);
break;
case GCRY_CIPHER_MODE_GCM:
if(encrypt) return MBEDTLS_ERR_GCM_NOT_SUPPORT;
@@ -349,7 +352,7 @@ static gcry_error_t _gcry_cipher_crypt (gcry_cipher_hd_t h,
src ? srclen:outsize,
h->iv,h->ivlen,
h->auth,h->authlen,
- src ? src:in,out,
+ src ? src:(const unsigned char *)in, (unsigned char *)out,
h->taglen, h->tag);
break;
}