From 0a9356e645335be014f5b28ff8c9448a503b85d7 Mon Sep 17 00:00:00 2001 From: Koji Takeda Date: Thu, 14 Aug 2025 16:57:42 +0900 Subject: [PATCH] Improve original implementation on SetAsymKeyDer() and the test --- tests/api/test_asn.c | 387 ++++++++++++++++++++++++++++++++++++++++ tests/api/test_asn.h | 2 + tests/api/test_mldsa.c | 32 ---- wolfcrypt/src/asn.c | 21 ++- wolfssl/wolfcrypt/asn.h | 2 +- 5 files changed, 400 insertions(+), 44 deletions(-) diff --git a/tests/api/test_asn.c b/tests/api/test_asn.c index 9bc236e198..d9fd7d6924 100644 --- a/tests/api/test_asn.c +++ b/tests/api/test_asn.c @@ -23,6 +23,393 @@ #include +#if defined(WC_ENABLE_ASYM_KEY_EXPORT) && defined(HAVE_ED25519) +static int test_SetAsymKeyDer_once(byte* privKey, word32 privKeySz, byte* pubKey, + word32 pubKeySz, byte* trueDer, word32 trueDerSz) +{ + EXPECT_DECLS; + + byte* calcDer = NULL; + word32 calcDerSz = 0; + + ExpectIntEQ(calcDerSz = SetAsymKeyDer(privKey, privKeySz, pubKey, pubKeySz, + NULL, 0, ED25519k), trueDerSz); + ExpectNotNull(calcDer = (byte*)XMALLOC(calcDerSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(calcDerSz = SetAsymKeyDer(privKey, privKeySz, pubKey, pubKeySz, + calcDer, calcDerSz, ED25519k), trueDerSz); + ExpectIntEQ(XMEMCMP(calcDer, trueDer, trueDerSz), 0); + XFREE(calcDer, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + return EXPECT_RESULT(); +} +#endif /* WC_ENABLE_ASYM_KEY_EXPORT && HAVE_ED25519 */ + +int test_SetAsymKeyDer(void) +{ + EXPECT_DECLS; + +#if defined(WC_ENABLE_ASYM_KEY_EXPORT) && defined(HAVE_ED25519) + /* We can't access the keyEd25519Oid variable, so declare it instead */ + byte algId[] = {43, 101, 112}; + byte version[] = {0x0}; + byte keyPat = 0xcc; + + byte* privKey = NULL; + word32 privKeySz = 0; + byte* pubKey = NULL; + word32 pubKeySz = 0; + byte trueDer[310]; /* The largest size is 310 bytes on Condition 8 */ + word32 trueDerSz = 0; + + /* + * Condition 1: + * PKEY data = 34 (1 to 127) + * PKEY_CURVEPKEY data = 32 (1 to 127) + * PUBKEY data = 0 (Empty) + * SEQ data = 46 (1 to 127) + */ + privKeySz = 32; + pubKeySz = 0; + trueDerSz = 48; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = trueDerSz - 2; + /* VER */ + trueDer[2] = ASN_INTEGER; + trueDer[3] = sizeof(version); + trueDer[4] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[5] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[6] = sizeof(algId) + 2; + trueDer[7] = ASN_OBJECT_ID; + trueDer[8] = sizeof(algId); + trueDer[9] = algId[0]; + trueDer[10] = algId[1]; + trueDer[11] = algId[2]; + /* PKEY */ + trueDer[12] = ASN_OCTET_STRING; + trueDer[13] = privKeySz + 2; + trueDer[14] = ASN_OCTET_STRING; + trueDer[15] = privKeySz; + privKey = &trueDer[16]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[16] to trueDer[47] */ + /* PUBKEY */ + pubKey = NULL; /* Empty */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 2: + * PKEY data = 129 (128 to 255) + * PKEY_CURVEKEY data = 127 (0 to 127) + * PUBKEY data = 0 (Empty) + * SEQ data = 142 (128 to 255) + */ + privKeySz = 127; + pubKeySz = 0; + trueDerSz = 145; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = 0x81; + trueDer[2] = trueDerSz - 3; + /* VER */ + trueDer[3] = ASN_INTEGER; + trueDer[4] = sizeof(version); + trueDer[5] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[6] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[7] = sizeof(algId) + 2; + trueDer[8] = ASN_OBJECT_ID; + trueDer[9] = sizeof(algId); + trueDer[10] = algId[0]; + trueDer[11] = algId[1]; + trueDer[12] = algId[2]; + /* PKEY */ + trueDer[13] = ASN_OCTET_STRING; + trueDer[14] = 0x81; + trueDer[15] = privKeySz + 2; + trueDer[16] = ASN_OCTET_STRING; + trueDer[17] = privKeySz; + privKey = &trueDer[18]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[18] to trueDer[144] */ + /* PUBKEY */ + pubKey = NULL; /* Empty */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 3: + * PKEY data = 131 (128 to 255) + * PKEY_CURVEKEY = 128 (128 to 255) + * PUBKEY data = 0 (Empty) + * SEQ data =144 (128 to 255) + */ + privKeySz = 128; + pubKeySz = 0; + trueDerSz = 147; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = 0x81; + trueDer[2] = trueDerSz - 3; + /* VER */ + trueDer[3] = ASN_INTEGER; + trueDer[4] = sizeof(version); + trueDer[5] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[6] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[7] = sizeof(algId) + 2; + trueDer[8] = ASN_OBJECT_ID; + trueDer[9] = sizeof(algId); + trueDer[10] = algId[0]; + trueDer[11] = algId[1]; + trueDer[12] = algId[2]; + /* PKEY */ + trueDer[13] = ASN_OCTET_STRING; + trueDer[14] = 0x81; + trueDer[15] = privKeySz + 3; + trueDer[16] = ASN_OCTET_STRING; + trueDer[17] = 0x81; + trueDer[18] = privKeySz; + privKey = &trueDer[19]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[19] to trueDer[146] */ + /* PUBKEY */ + pubKey = NULL; /* Empty */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 4: + * PKEY data = 258 (256 to 65535) + * PKEY_CURVEPKEY data = 255 (128 to 255) + * PUBKEY data = 0 (Empty) + * SEQ data = 272 (256 to 65536) + */ + privKeySz = 255; + pubKeySz = 0; + trueDerSz = 276; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = 0x82; + trueDer[2] = ((trueDerSz - 4) >> 8) & 0xff; + trueDer[3] = (trueDerSz - 4) & 0xff; + /* VER */ + trueDer[4] = ASN_INTEGER; + trueDer[5] = sizeof(version); + trueDer[6] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[7] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[8] = sizeof(algId) + 2; + trueDer[9] = ASN_OBJECT_ID; + trueDer[10] = sizeof(algId); + trueDer[11] = algId[0]; + trueDer[12] = algId[1]; + trueDer[13] = algId[2]; + /* PKEY */ + trueDer[14] = ASN_OCTET_STRING; + trueDer[15] = 0x82; + trueDer[16] = ((privKeySz + 3) >> 8) & 0xff; + trueDer[17] = (privKeySz + 3) & 0xff; + trueDer[18] = ASN_OCTET_STRING; + trueDer[19] = 0x81; + trueDer[20] = privKeySz; + privKey = &trueDer[21]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[21] to trueDer[275] */ + /* PUBKEY */ + pubKey = NULL; /* Empty */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 5: + * PKEY data = 260 (256 to 65535) + * PKEY_CURVEPKEY data = 256 (256 to 65535) + * PUBKEY data = 0 (Empty) + * SEQ data = 274 (256 to 65535) + */ + privKeySz = 256; + pubKeySz = 0; + trueDerSz = 278; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = 0x82; + trueDer[2] = ((trueDerSz - 4) >> 8) & 0xff; + trueDer[3] = (trueDerSz - 4) & 0xff; + /* VER */ + trueDer[4] = ASN_INTEGER; + trueDer[5] = sizeof(version); + trueDer[6] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[7] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[8] = sizeof(algId) + 2; + trueDer[9] = ASN_OBJECT_ID; + trueDer[10] = sizeof(algId); + trueDer[11] = algId[0]; + trueDer[12] = algId[1]; + trueDer[13] = algId[2]; + /* PKEY */ + trueDer[14] = ASN_OCTET_STRING; + trueDer[15] = 0x82; + trueDer[16] = ((privKeySz + 4) >> 8) & 0xff; + trueDer[17] = (privKeySz + 4) & 0xff; + trueDer[18] = ASN_OCTET_STRING; + trueDer[19] = 0x82; + trueDer[20] = (privKeySz >> 8) & 0xff; + trueDer[21] = privKeySz & 0xff; + privKey = &trueDer[22]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[22] to trueDer[277] */ + /* PUBKEY */ + pubKey = NULL; /* Empty */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 6: + * PKEY data = 34 (1 to 127) + * PKEY_CURVEPKEY data = 32 (1 to 127) + * PUBKEY data = 32 (1 to 127) + * SEQ data = 80 (1 to 127) + */ + privKeySz = 32; + pubKeySz = 32; + trueDerSz = 82; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = trueDerSz - 2; + /* VER */ + trueDer[2] = ASN_INTEGER; + trueDer[3] = sizeof(version); + trueDer[4] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[5] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[6] = sizeof(algId) + 2; + trueDer[7] = ASN_OBJECT_ID; + trueDer[8] = sizeof(algId); + trueDer[9] = algId[0]; + trueDer[10] = algId[1]; + trueDer[11] = algId[2]; + /* PKEY */ + trueDer[12] = ASN_OCTET_STRING; + trueDer[13] = privKeySz + 2; + trueDer[14] = ASN_OCTET_STRING; + trueDer[15] = privKeySz; + privKey = &trueDer[16]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[16] to trueDer[47] */ + /* PUBKEY */ + trueDer[48] = ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY; + trueDer[49] = pubKeySz; + pubKey = &trueDer[50]; + XMEMSET(pubKey, keyPat, pubKeySz); /* trueDer[50] to trueDer[81] */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 7: + * PKEY data = 34 (1 to 127) + * PKEY_CURVEPKEY data = 32 (1 to 127) + * PUBKEY data = 128 (128 to 255) + * SEQ data = 180 (128 to 255) + */ + privKeySz = 32; + pubKeySz = 128; + trueDerSz = 180; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = 0x81; + trueDer[2] = trueDerSz - 3; + /* VER */ + trueDer[3] = ASN_INTEGER; + trueDer[4] = sizeof(version); + trueDer[5] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[6] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[7] = sizeof(algId) + 2; + trueDer[8] = ASN_OBJECT_ID; + trueDer[9] = sizeof(algId); + trueDer[10] = algId[0]; + trueDer[11] = algId[1]; + trueDer[12] = algId[2]; + /* PKEY */ + trueDer[13] = ASN_OCTET_STRING; + trueDer[14] = privKeySz + 2; + trueDer[15] = ASN_OCTET_STRING; + trueDer[16] = privKeySz; + privKey = &trueDer[17]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[17] to trueDer[48] */ + /* PUBKEY */ + trueDer[49] = ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY; + trueDer[50] = 0x81; + trueDer[51] = pubKeySz; + pubKey = &trueDer[52]; + XMEMSET(pubKey, keyPat, pubKeySz); /* trueDer[52] to trueDer[179] */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); + + /* + * Condition 8: + * PKEY data = 34 (1 to 127) + * PKEY_CURVEPKEY data = 32 (1 to 127) + * PUBKEY data = 256 (256 to 65535) + * SEQ data = 306 (256 to 65535) + */ + privKeySz = 32; + pubKeySz = 256; + trueDerSz = 310; + + /* SEQ */ + trueDer[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[1] = 0x82; + trueDer[2] = ((trueDerSz - 4) >> 8) & 0xff; + trueDer[3] = (trueDerSz - 4) & 0xff; + /* VER */ + trueDer[4] = ASN_INTEGER; + trueDer[5] = sizeof(version); + trueDer[6] = version[0]; + /* PKEYALGO_SEQ */ + trueDer[7] = ASN_SEQUENCE | ASN_CONSTRUCTED; + trueDer[8] = sizeof(algId) + 2; + trueDer[9] = ASN_OBJECT_ID; + trueDer[10] = sizeof(algId); + trueDer[11] = algId[0]; + trueDer[12] = algId[1]; + trueDer[13] = algId[2]; + /* PKEY */ + trueDer[14] = ASN_OCTET_STRING; + trueDer[15] = privKeySz + 2; + trueDer[16] = ASN_OCTET_STRING; + trueDer[17] = privKeySz; + privKey = &trueDer[18]; + XMEMSET(privKey, keyPat, privKeySz); /* trueDer[18] to trueDer[49] */ + /* PUBKEY */ + trueDer[50] = ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY; + trueDer[51] = 0x82; + trueDer[52] = (pubKeySz >> 8) & 0xff; + trueDer[53] = pubKeySz & 0xff; + pubKey = &trueDer[54]; + XMEMSET(pubKey, keyPat, pubKeySz); /* trueDer[54] to trueDer[309] */ + + EXPECT_TEST(test_SetAsymKeyDer_once(privKey, privKeySz, pubKey, pubKeySz, + trueDer, trueDerSz)); +#endif /* WC_ENABLE_ASYM_KEY_EXPORT && HAVE_ED25519 */ + + return EXPECT_RESULT(); + +} + #ifndef NO_ASN static int test_SetShortInt_once(word32 val, byte* valDer, word32 valDerSz) { diff --git a/tests/api/test_asn.h b/tests/api/test_asn.h index aeea0f7353..b8bb688bd7 100644 --- a/tests/api/test_asn.h +++ b/tests/api/test_asn.h @@ -24,10 +24,12 @@ #include +int test_SetAsymKeyDer(void); int test_SetShortInt(void); int test_wc_IndexSequenceOf(void); #define TEST_ASN_DECLS \ + TEST_DECL_GROUP("asn", test_SetAsymKeyDer), \ TEST_DECL_GROUP("asn", test_SetShortInt), \ TEST_DECL_GROUP("asn", test_wc_IndexSequenceOf) diff --git a/tests/api/test_mldsa.c b/tests/api/test_mldsa.c index 3b69c15387..775db3e270 100644 --- a/tests/api/test_mldsa.c +++ b/tests/api/test_mldsa.c @@ -3004,13 +3004,8 @@ int test_wc_dilithium_der(void) ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, NULL, 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); -#ifndef WOLFSSL_ASN_TEMPLATE - ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, - 0 ), BAD_FUNC_ARG); -#else ExpectIntGT(wc_Dilithium_PrivateKeyToDer(key , NULL, 0 ), 0); -#endif ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, der , 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, NULL, @@ -3020,23 +3015,13 @@ int test_wc_dilithium_der(void) ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , der , 0 ), WC_NO_ERR_TRACE(BUFFER_E)); /* Get length only. */ -#ifndef WOLFSSL_ASN_TEMPLATE - ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, - DILITHIUM_MAX_DER_SIZE), BAD_FUNC_ARG); -#else ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), privDerLen); -#endif ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, NULL, 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); -#ifndef WOLFSSL_ASN_TEMPLATE - ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, 0 ), - BAD_FUNC_ARG); -#else ExpectIntGT(wc_Dilithium_KeyToDer(key , NULL, 0 ), 0 ); -#endif ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, der , 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, NULL, DILITHIUM_MAX_DER_SIZE), @@ -3046,13 +3031,8 @@ int test_wc_dilithium_der(void) ExpectIntEQ(wc_Dilithium_KeyToDer(key , der , 0 ), WC_NO_ERR_TRACE(BUFFER_E)); /* Get length only. */ -#ifndef WOLFSSL_ASN_TEMPLATE - ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), - BAD_FUNC_ARG); -#else ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), keyDerLen); -#endif ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, NULL, NULL, 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); @@ -3101,25 +3081,15 @@ int test_wc_dilithium_der(void) idx = 0; ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der, &idx, key, len), 0); -#ifndef WOLFSSL_ASN_TEMPLATE - ExpectIntEQ(len = wc_Dilithium_PrivateKeyToDer(key, der, - DILITHIUM_MAX_DER_SIZE), BAD_FUNC_ARG); -#else ExpectIntEQ(len = wc_Dilithium_PrivateKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), privDerLen); idx = 0; ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, len), 0); -#endif -#ifndef WOLFSSL_ASN_TEMPLATE - ExpectIntEQ(len = wc_Dilithium_KeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), - BAD_FUNC_ARG); -#else ExpectIntEQ(len = wc_Dilithium_KeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), keyDerLen); idx = 0; ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, len), 0); -#endif wc_dilithium_free(key); @@ -3127,8 +3097,6 @@ int test_wc_dilithium_der(void) XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - (void)keyDerLen; #endif return EXPECT_RESULT(); } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index e100a37f3c..a68e4bf85c 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -37869,7 +37869,7 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, { int ret = 0; #ifndef WOLFSSL_ASN_TEMPLATE - word32 idx = 0, seqSz, verSz, algoSz, privSz, pubSz = 0, sz; + word32 idx = 0, seqSz, verSz, algoSz, tmpSz, privSz, pubSz = 0, sz; #else DECL_ASNSETDATA(dataASN, privateKeyASN_Length); int sz = 0; @@ -37884,16 +37884,15 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, } #ifndef WOLFSSL_ASN_TEMPLATE - if (privKeyLen >= 128 || pubKeyLen >= 128) { - /* privKeyLen and pubKeyLen are assumed to be less than 128 */ - return BAD_FUNC_ARG; - } - /* calculate size */ if (pubKey) { - pubSz = 2 + pubKeyLen; + pubSz = SetHeader(ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY, pubKeyLen, + NULL, 0) + pubKeyLen; } - privSz = 2 + 2 + privKeyLen; + + tmpSz = SetOctetString(privKeyLen, NULL) + privKeyLen; + + privSz = SetOctetString(tmpSz, NULL) + tmpSz; algoSz = SetAlgoID(keyType, NULL, oidKeyType, 0); verSz = 3; /* version is 3 bytes (enum + id + version(byte)) */ seqSz = SetSequence(verSz + algoSz + privSz + pubSz, NULL); @@ -37916,14 +37915,14 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, algoSz = SetAlgoID(keyType, output + idx, oidKeyType, 0); idx += algoSz; /* privKey */ - idx += SetOctetString(2 + privKeyLen, output + idx); + idx += SetOctetString(tmpSz, output + idx); idx += SetOctetString(privKeyLen, output + idx); XMEMCPY(output + idx, privKey, privKeyLen); idx += privKeyLen; /* pubKey */ if (pubKey) { - idx += SetHeader(ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY | - 1, pubKeyLen, output + idx, 0); + idx += SetHeader(ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY, + pubKeyLen, output + idx, 0); XMEMCPY(output + idx, pubKey, pubKeyLen); idx += pubKeyLen; } diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 60a3c11006..58f40b9dd1 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -2763,7 +2763,7 @@ WOLFSSL_LOCAL int DecodeAsymKey(const byte* input, word32* inOutIdx, #endif #ifdef WC_ENABLE_ASYM_KEY_EXPORT -WOLFSSL_LOCAL int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, +WOLFSSL_TEST_VIS int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, const byte* pubKey, word32 pubKeyLen, byte* output, word32 outLen, int keyType); #endif