Skip to content

Commit 927930c

Browse files
Merge pull request #6740 from SparkiDev/ecies_kdf
ECIES: add support for other KDFs
2 parents b546473 + 41d6afc commit 927930c

3 files changed

Lines changed: 72 additions & 3 deletions

File tree

wolfcrypt/src/ecc.c

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13843,7 +13843,9 @@ int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
1384313843
ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret + pubKeySz,
1384413844
&sharedSz);
1384513845
#endif
13846-
} while (ret == WC_PENDING_E);
13846+
}
13847+
while (ret == WC_PENDING_E);
13848+
1384713849
if (ret == 0) {
1384813850
#ifdef WOLFSSL_ECIES_ISO18033
1384913851
/* KDF data is encoded public key and secret. */
@@ -13855,6 +13857,30 @@ int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
1385513857
ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
1385613858
keys, (word32)keysLen);
1385713859
break;
13860+
case ecHKDF_SHA1 :
13861+
ret = wc_HKDF(WC_SHA, sharedSecret, sharedSz, ctx->kdfSalt,
13862+
ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
13863+
keys, (word32)keysLen);
13864+
break;
13865+
#if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER)
13866+
case ecKDF_X963_SHA1 :
13867+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
13868+
ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
13869+
break;
13870+
case ecKDF_X963_SHA256 :
13871+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
13872+
ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
13873+
break;
13874+
case ecKDF_SHA1 :
13875+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
13876+
NULL, 0, keys, (word32)keysLen);
13877+
break;
13878+
case ecKDF_SHA256 :
13879+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
13880+
NULL, 0, keys, (word32)keysLen);
13881+
break;
13882+
#endif
13883+
1385813884

1385913885
default:
1386013886
ret = BAD_FUNC_ARG;
@@ -14250,6 +14276,29 @@ int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
1425014276
ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
1425114277
keys, (word32)keysLen);
1425214278
break;
14279+
case ecHKDF_SHA1 :
14280+
ret = wc_HKDF(WC_SHA, sharedSecret, sharedSz, ctx->kdfSalt,
14281+
ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
14282+
keys, (word32)keysLen);
14283+
break;
14284+
#if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER)
14285+
case ecKDF_X963_SHA1 :
14286+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
14287+
ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
14288+
break;
14289+
case ecKDF_X963_SHA256 :
14290+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
14291+
ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
14292+
break;
14293+
case ecKDF_SHA1 :
14294+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
14295+
NULL, 0, keys, (word32)keysLen);
14296+
break;
14297+
case ecKDF_SHA256 :
14298+
ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
14299+
NULL, 0, keys, (word32)keysLen);
14300+
break;
14301+
#endif
1425314302

1425414303
default:
1425514304
ret = BAD_FUNC_ARG;

wolfcrypt/test/test.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29437,6 +29437,22 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_encrypt_test(void)
2943729437
printf("ECIES: AES_128_CBC, HKDF_SHA256, HMAC_SHA256\n");
2943829438
}
2943929439
}
29440+
#ifdef HAVE_X963_KDF
29441+
if (ret == 0) {
29442+
ret = ecc_encrypt_e2e_test(&rng, userA, userB, ecAES_128_CBC,
29443+
ecKDF_X963_SHA256, ecHMAC_SHA256);
29444+
if (ret != 0) {
29445+
printf("ECIES: AES_128_CBC, KDF_X963_SHA256, HMAC_SHA256\n");
29446+
}
29447+
}
29448+
if (ret == 0) {
29449+
ret = ecc_encrypt_e2e_test(&rng, userA, userB, ecAES_128_CBC,
29450+
ecKDF_SHA256, ecHMAC_SHA256);
29451+
if (ret != 0) {
29452+
printf("ECIES: AES_128_CBC, KDF_SHA256, HMAC_SHA256\n");
29453+
}
29454+
}
29455+
#endif
2944029456
#endif
2944129457
#ifdef WOLFSSL_AES_256
2944229458
if (ret == 0) {

wolfssl/wolfcrypt/ecc.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -895,8 +895,12 @@ enum ecEncAlgo {
895895
};
896896

897897
enum ecKdfAlgo {
898-
ecHKDF_SHA256 = 1, /* default */
899-
ecHKDF_SHA1 = 2
898+
ecHKDF_SHA256 = 1, /* default */
899+
ecHKDF_SHA1 = 2,
900+
ecKDF_X963_SHA1 = 3,
901+
ecKDF_X963_SHA256 = 4,
902+
ecKDF_SHA1 = 5,
903+
ecKDF_SHA256 = 6
900904
};
901905

902906
enum ecMacAlgo {

0 commit comments

Comments
 (0)