forked from wolfSSL/wolfssl
ED: add --enable-ed25519-stream and --enable-ed448-stream to configure.ac, disabled by default, and add them to --enable-all and --enable-all-crypto lists, along with --enable-aesgcm-stream; report AES-GCM and ED* streaming API options in feature summary rendered at end;
refactor ED routines to pivot on WOLFSSL_ED*_PERSISTENT_SHA and WOLFSSL_ED*_STREAMING_VERIFY macros, with sha state in the key struct only when WOLFSSL_ED*_PERSISTENT_SHA, otherwise on the stack as before; add ed*_hash_init() and ed*_hash_free() local helpers; ED* peer review: fix line lengths, remove superfluous retval checks, tweaks for efficiency, and add ED448_PREHASH_SIZE to ed448.h.
This commit is contained in:
43
configure.ac
43
configure.ac
@@ -350,6 +350,7 @@ then
|
|||||||
test "$enable_atomicuser" = "" && enable_atomicuser=yes
|
test "$enable_atomicuser" = "" && enable_atomicuser=yes
|
||||||
test "$enable_pkcallbacks" = "" && enable_pkcallbacks=yes
|
test "$enable_pkcallbacks" = "" && enable_pkcallbacks=yes
|
||||||
test "$enable_aesgcm" = "" && enable_aesgcm=yes
|
test "$enable_aesgcm" = "" && enable_aesgcm=yes
|
||||||
|
test "$enable_aesgcm_stream" = "" && enable_aesgcm_stream=yes
|
||||||
test "$enable_aesccm" = "" && enable_aesccm=yes
|
test "$enable_aesccm" = "" && enable_aesccm=yes
|
||||||
test "$enable_aesctr" = "" && enable_aesctr=yes
|
test "$enable_aesctr" = "" && enable_aesctr=yes
|
||||||
test "$enable_aesofb" = "" && enable_aesofb=yes
|
test "$enable_aesofb" = "" && enable_aesofb=yes
|
||||||
@@ -459,7 +460,9 @@ then
|
|||||||
test "$enable_scep" = "" && enable_scep=yes
|
test "$enable_scep" = "" && enable_scep=yes
|
||||||
test "$enable_pkcs7" = "" && enable_pkcs7=yes
|
test "$enable_pkcs7" = "" && enable_pkcs7=yes
|
||||||
test "$enable_ed25519" = "" && enable_ed25519=yes
|
test "$enable_ed25519" = "" && enable_ed25519=yes
|
||||||
|
test "$enable_ed25519_stream" = "" && enable_ed25519_stream=yes
|
||||||
test "$enable_ed448" = "" && enable_ed448=yes
|
test "$enable_ed448" = "" && enable_ed448=yes
|
||||||
|
test "$enable_ed448_stream" = "" && enable_ed448_stream=yes
|
||||||
|
|
||||||
if test "$ENABLED_LINUXKM_DEFAULTS" != "yes"
|
if test "$ENABLED_LINUXKM_DEFAULTS" != "yes"
|
||||||
then
|
then
|
||||||
@@ -493,6 +496,7 @@ then
|
|||||||
test "$enable_atomicuser" = "" && enable_atomicuser=yes
|
test "$enable_atomicuser" = "" && enable_atomicuser=yes
|
||||||
test "$enable_pkcallbacks" = "" && enable_pkcallbacks=yes
|
test "$enable_pkcallbacks" = "" && enable_pkcallbacks=yes
|
||||||
test "$enable_aesgcm" = "" && enable_aesgcm=yes
|
test "$enable_aesgcm" = "" && enable_aesgcm=yes
|
||||||
|
test "$enable_aesgcm_stream" = "" && enable_aesgcm_stream=yes
|
||||||
test "$enable_aesccm" = "" && enable_aesccm=yes
|
test "$enable_aesccm" = "" && enable_aesccm=yes
|
||||||
test "$enable_aesctr" = "" && enable_aesctr=yes
|
test "$enable_aesctr" = "" && enable_aesctr=yes
|
||||||
test "$enable_aesofb" = "" && enable_aesofb=yes
|
test "$enable_aesofb" = "" && enable_aesofb=yes
|
||||||
@@ -561,7 +565,9 @@ then
|
|||||||
then
|
then
|
||||||
test "$enable_xchacha" = "" && enable_xchacha=yes
|
test "$enable_xchacha" = "" && enable_xchacha=yes
|
||||||
test "$enable_ed25519" = "" && enable_ed25519=yes
|
test "$enable_ed25519" = "" && enable_ed25519=yes
|
||||||
|
test "$enable_ed25519_stream" = "" && enable_ed25519_stream=yes
|
||||||
test "$enable_ed448" = "" && enable_ed448=yes
|
test "$enable_ed448" = "" && enable_ed448=yes
|
||||||
|
test "$enable_ed448_stream" = "" && enable_ed448_stream=yes
|
||||||
test "$enable_pkcs7" = "" && enable_pkcs7=yes
|
test "$enable_pkcs7" = "" && enable_pkcs7=yes
|
||||||
|
|
||||||
if test "$ENABLED_LINUXKM_DEFAULTS" != "yes"
|
if test "$ENABLED_LINUXKM_DEFAULTS" != "yes"
|
||||||
@@ -1311,7 +1317,7 @@ AC_ARG_ENABLE([aesgcm],
|
|||||||
[ ENABLED_AESGCM=yes ]
|
[ ENABLED_AESGCM=yes ]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE([aesgcm-stream],
|
AC_ARG_ENABLE([aesgcm-stream],
|
||||||
[AS_HELP_STRING([--enable-aesgcm-stream],[Enable wolfSSL AES-GCM support with streaming APIs (default: enabled)])],
|
[AS_HELP_STRING([--enable-aesgcm-stream],[Enable wolfSSL AES-GCM support with streaming APIs (default: disabled)])],
|
||||||
[ ENABLED_AESGCM_STREAM=$enableval ],
|
[ ENABLED_AESGCM_STREAM=$enableval ],
|
||||||
[ ENABLED_AESGCM_STREAM=no ]
|
[ ENABLED_AESGCM_STREAM=no ]
|
||||||
)
|
)
|
||||||
@@ -2141,6 +2147,11 @@ AC_ARG_ENABLE([ed25519],
|
|||||||
[ ENABLED_ED25519=$enableval ],
|
[ ENABLED_ED25519=$enableval ],
|
||||||
[ ENABLED_ED25519=no ]
|
[ ENABLED_ED25519=no ]
|
||||||
)
|
)
|
||||||
|
AC_ARG_ENABLE([ed25519-stream],
|
||||||
|
[AS_HELP_STRING([--enable-ed25519-stream],[Enable wolfSSL ED25519 support with streaming verify APIs (default: disabled)])],
|
||||||
|
[ ENABLED_ED25519_STREAM=$enableval ],
|
||||||
|
[ ENABLED_ED25519_STREAM=no ]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if test "$ENABLED_OPENSSH" = "yes"
|
if test "$ENABLED_OPENSSH" = "yes"
|
||||||
@@ -2169,6 +2180,17 @@ then
|
|||||||
ENABLED_CERTS=yes
|
ENABLED_CERTS=yes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$ENABLED_ED25519_STREAM" != "no"
|
||||||
|
then
|
||||||
|
if test "$ENABLED_ED25519" = "no"
|
||||||
|
then
|
||||||
|
AC_MSG_ERROR([ED25519 verify streaming enabled but ED25519 is disabled])
|
||||||
|
else
|
||||||
|
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ED25519_STREAMING_VERIFY"
|
||||||
|
AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ED25519_STREAMING_VERIFY"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# for using memory optimization setting on both curve448 and ed448
|
# for using memory optimization setting on both curve448 and ed448
|
||||||
ENABLED_CURVE448_SMALL=no
|
ENABLED_CURVE448_SMALL=no
|
||||||
@@ -2206,6 +2228,11 @@ AC_ARG_ENABLE([ed448],
|
|||||||
[ ENABLED_ED448=$enableval ],
|
[ ENABLED_ED448=$enableval ],
|
||||||
[ ENABLED_ED448=no ]
|
[ ENABLED_ED448=no ]
|
||||||
)
|
)
|
||||||
|
AC_ARG_ENABLE([ed448-stream],
|
||||||
|
[AS_HELP_STRING([--enable-ed448-stream],[Enable wolfSSL ED448 support with streaming verify APIs (default: disabled)])],
|
||||||
|
[ ENABLED_ED448_STREAM=$enableval ],
|
||||||
|
[ ENABLED_ED448_STREAM=no ]
|
||||||
|
)
|
||||||
|
|
||||||
if test "$ENABLED_ED448" != "no" && test "$ENABLED_32BIT" = "no"
|
if test "$ENABLED_ED448" != "no" && test "$ENABLED_32BIT" = "no"
|
||||||
then
|
then
|
||||||
@@ -2236,6 +2263,17 @@ then
|
|||||||
ENABLED_CERTS=yes
|
ENABLED_CERTS=yes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$ENABLED_ED448_STREAM" != "no"
|
||||||
|
then
|
||||||
|
if test "$ENABLED_ED448" = "no"
|
||||||
|
then
|
||||||
|
AC_MSG_ERROR([ED448 verify streaming enabled but ED448 is disabled])
|
||||||
|
else
|
||||||
|
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ED448_STREAMING_VERIFY"
|
||||||
|
AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ED448_STREAMING_VERIFY"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# FP ECC, Fixed Point cache ECC
|
# FP ECC, Fixed Point cache ECC
|
||||||
@@ -6671,6 +6709,7 @@ echo " * AES-NI: $ENABLED_AESNI"
|
|||||||
echo " * AES-CBC: $ENABLED_AESCBC"
|
echo " * AES-CBC: $ENABLED_AESCBC"
|
||||||
echo " * AES-CBC length checks: $ENABLED_AESCBC_LENGTH_CHECKS"
|
echo " * AES-CBC length checks: $ENABLED_AESCBC_LENGTH_CHECKS"
|
||||||
echo " * AES-GCM: $ENABLED_AESGCM"
|
echo " * AES-GCM: $ENABLED_AESGCM"
|
||||||
|
echo " * AES-GCM streaming: $ENABLED_AESGCM_STREAM"
|
||||||
echo " * AES-CCM: $ENABLED_AESCCM"
|
echo " * AES-CCM: $ENABLED_AESCCM"
|
||||||
echo " * AES-CTR: $ENABLED_AESCTR"
|
echo " * AES-CTR: $ENABLED_AESCTR"
|
||||||
echo " * AES-CFB: $ENABLED_AESCFB"
|
echo " * AES-CFB: $ENABLED_AESCFB"
|
||||||
@@ -6722,8 +6761,10 @@ echo " * ECC Custom Curves: $ENABLED_ECCCUSTCURVES"
|
|||||||
echo " * ECC Minimum Bits: $ENABLED_ECCMINSZ"
|
echo " * ECC Minimum Bits: $ENABLED_ECCMINSZ"
|
||||||
echo " * CURVE25519: $ENABLED_CURVE25519"
|
echo " * CURVE25519: $ENABLED_CURVE25519"
|
||||||
echo " * ED25519: $ENABLED_ED25519"
|
echo " * ED25519: $ENABLED_ED25519"
|
||||||
|
echo " * ED25519 streaming: $ENABLED_ED25519_STREAM"
|
||||||
echo " * CURVE448: $ENABLED_CURVE448"
|
echo " * CURVE448: $ENABLED_CURVE448"
|
||||||
echo " * ED448: $ENABLED_ED448"
|
echo " * ED448: $ENABLED_ED448"
|
||||||
|
echo " * ED448 streaming: $ENABLED_ED448_STREAM"
|
||||||
echo " * FPECC: $ENABLED_FPECC"
|
echo " * FPECC: $ENABLED_FPECC"
|
||||||
echo " * ECC_ENCRYPT: $ENABLED_ECC_ENCRYPT"
|
echo " * ECC_ENCRYPT: $ENABLED_ECC_ENCRYPT"
|
||||||
echo " * ECCSI $ENABLED_ECCSI"
|
echo " * ECCSI $ENABLED_ECCSI"
|
||||||
|
@@ -56,6 +56,27 @@ static const byte ed25519Ctx[ED25519CTX_SIZE+1] =
|
|||||||
"SigEd25519 no Ed25519 collisions";
|
"SigEd25519 no Ed25519 collisions";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int ed25519_hash_init(ed25519_key* key, wc_Sha512 *sha)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = wc_InitSha512_ex(sha, key->heap,
|
||||||
|
#if defined(WOLF_CRYPTO_CB)
|
||||||
|
key->devId
|
||||||
|
#else
|
||||||
|
INVALID_DEVID
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
if (ret == 0)
|
||||||
|
key->sha_clean_flag = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
static int ed25519_hash_reset(ed25519_key* key)
|
static int ed25519_hash_reset(ed25519_key* key)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -75,36 +96,73 @@ static int ed25519_hash_reset(ed25519_key* key)
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif /* WOLFSSL_ED25519_PERSISTENT_SHA */
|
||||||
|
|
||||||
static int ed25519_hash_update(ed25519_key* key, const byte* data, word32 len)
|
static int ed25519_hash_update(ed25519_key* key, wc_Sha512 *sha,
|
||||||
|
const byte* data, word32 len)
|
||||||
{
|
{
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
if (key->sha_clean_flag)
|
if (key->sha_clean_flag)
|
||||||
key->sha_clean_flag = 0;
|
key->sha_clean_flag = 0;
|
||||||
return wc_Sha512Update(&key->sha, data, len);
|
#else
|
||||||
|
(void)key;
|
||||||
|
#endif
|
||||||
|
return wc_Sha512Update(sha, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ed25519_hash_final(ed25519_key* key, byte* hash)
|
static int ed25519_hash_final(ed25519_key* key, wc_Sha512 *sha, byte* hash)
|
||||||
{
|
{
|
||||||
int ret = wc_Sha512Final(&key->sha, hash);
|
int ret = wc_Sha512Final(sha, hash);
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
key->sha_clean_flag = 1;
|
key->sha_clean_flag = 1;
|
||||||
|
#else
|
||||||
|
(void)key;
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ed25519_hash_free(ed25519_key* key, wc_Sha512 *sha)
|
||||||
|
{
|
||||||
|
wc_Sha512Free(sha);
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
key->sha_clean_flag = 0;
|
||||||
|
#else
|
||||||
|
(void)key;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ed25519_hash(ed25519_key* key, const byte* in, word32 inLen,
|
static int ed25519_hash(ed25519_key* key, const byte* in, word32 inLen,
|
||||||
byte* hash)
|
byte* hash)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
#ifndef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
wc_Sha512 sha[1];
|
||||||
|
#else
|
||||||
|
wc_Sha512 *sha;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (key == NULL || (in == NULL && inLen > 0) || hash == NULL) {
|
if (key == NULL || (in == NULL && inLen > 0) || hash == NULL) {
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
sha = &key->sha;
|
||||||
ret = ed25519_hash_reset(key);
|
ret = ed25519_hash_reset(key);
|
||||||
|
#else
|
||||||
|
ret = ed25519_hash_init(key, sha);
|
||||||
|
#endif
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = ed25519_hash_update(key, sha, in, inLen);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, in, inLen);
|
ret = ed25519_hash_final(key, sha, hash);
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_final(key, hash);
|
#ifndef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
ed25519_hash_free(key, sha);
|
||||||
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -252,23 +310,38 @@ int wc_ed25519_sign_msg_ex(const byte* in, word32 inLen, byte* out,
|
|||||||
az[31] &= 63; /* same than az[31] &= 127 because of az[31] |= 64 */
|
az[31] &= 63; /* same than az[31] &= 127 because of az[31] |= 64 */
|
||||||
az[31] |= 64;
|
az[31] |= 64;
|
||||||
|
|
||||||
if (ret != 0)
|
{
|
||||||
return ret;
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
if (type == Ed25519ctx || type == Ed25519ph) {
|
wc_Sha512 *sha = &key->sha;
|
||||||
ret = ed25519_hash_update(key, ed25519Ctx, ED25519CTX_SIZE);
|
#else
|
||||||
|
wc_Sha512 sha[1];
|
||||||
|
ret = ed25519_hash_init(key, sha);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (type == Ed25519ctx || type == Ed25519ph) {
|
||||||
|
ret = ed25519_hash_update(key, sha, ed25519Ctx, ED25519CTX_SIZE);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = ed25519_hash_update(key, sha, &type, sizeof(type));
|
||||||
|
if (ret == 0)
|
||||||
|
ret = ed25519_hash_update(key, sha, &contextLen,
|
||||||
|
sizeof(contextLen));
|
||||||
|
if (ret == 0 && context != NULL)
|
||||||
|
ret = ed25519_hash_update(key, sha, context, contextLen);
|
||||||
|
}
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, &type, sizeof(type));
|
ret = ed25519_hash_update(key, sha, az + ED25519_KEY_SIZE,
|
||||||
|
ED25519_KEY_SIZE);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, &contextLen, sizeof(contextLen));
|
ret = ed25519_hash_update(key, sha, in, inLen);
|
||||||
if (ret == 0 && context != NULL)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, context, contextLen);
|
ret = ed25519_hash_final(key, sha, nonce);
|
||||||
|
#ifndef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
ed25519_hash_free(key, sha);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_update(key, az + ED25519_KEY_SIZE, ED25519_KEY_SIZE);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_update(key, in, inLen);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_final(key, nonce);
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -290,23 +363,39 @@ int wc_ed25519_sign_msg_ex(const byte* in, word32 inLen, byte* out,
|
|||||||
|
|
||||||
/* step 3: hash R + public key + message getting H(R,A,M) then
|
/* step 3: hash R + public key + message getting H(R,A,M) then
|
||||||
creating S = (r + H(R,A,M)a) mod l */
|
creating S = (r + H(R,A,M)a) mod l */
|
||||||
if (type == Ed25519ctx || type == Ed25519ph) {
|
{
|
||||||
ret = ed25519_hash_update(key, ed25519Ctx, ED25519CTX_SIZE);
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
wc_Sha512 *sha = &key->sha;
|
||||||
|
#else
|
||||||
|
wc_Sha512 sha[1];
|
||||||
|
ret = ed25519_hash_init(key, sha);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (type == Ed25519ctx || type == Ed25519ph) {
|
||||||
|
ret = ed25519_hash_update(key, sha, ed25519Ctx, ED25519CTX_SIZE);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = ed25519_hash_update(key, sha, &type, sizeof(type));
|
||||||
|
if (ret == 0)
|
||||||
|
ret = ed25519_hash_update(key, sha, &contextLen,
|
||||||
|
sizeof(contextLen));
|
||||||
|
if (ret == 0 && context != NULL)
|
||||||
|
ret = ed25519_hash_update(key, sha, context, contextLen);
|
||||||
|
}
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, &type, sizeof(type));
|
ret = ed25519_hash_update(key, sha, out, ED25519_SIG_SIZE/2);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, &contextLen, sizeof(contextLen));
|
ret = ed25519_hash_update(key, sha, key->p, ED25519_PUB_KEY_SIZE);
|
||||||
if (ret == 0 && context != NULL)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, context, contextLen);
|
ret = ed25519_hash_update(key, sha, in, inLen);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = ed25519_hash_final(key, sha, hram);
|
||||||
|
#ifndef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
ed25519_hash_free(key, sha);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_update(key, out, ED25519_SIG_SIZE/2);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_update(key, key->p, ED25519_PUB_KEY_SIZE);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_update(key, in, inLen);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = ed25519_hash_final(key, hram);
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -413,10 +502,12 @@ int wc_ed25519ph_sign_msg(const byte* in, word32 inLen, byte* out,
|
|||||||
context extra signing data
|
context extra signing data
|
||||||
contextLen length of extra signing data
|
contextLen length of extra signing data
|
||||||
*/
|
*/
|
||||||
int wc_ed25519_verify_msg_init(const byte* sig, word32 sigLen, ed25519_key* key,
|
static int ed25519_verify_msg_init_with_sha(const byte* sig, word32 sigLen,
|
||||||
byte type, const byte* context, byte contextLen)
|
ed25519_key* key, wc_Sha512 *sha,
|
||||||
|
byte type, const byte* context,
|
||||||
|
byte contextLen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* sanity check on arguments */
|
/* sanity check on arguments */
|
||||||
if (sig == NULL || key == NULL ||
|
if (sig == NULL || key == NULL ||
|
||||||
@@ -430,22 +521,27 @@ int wc_ed25519_verify_msg_init(const byte* sig, word32 sigLen, ed25519_key* key,
|
|||||||
|
|
||||||
/* find H(R,A,M) and store it as h */
|
/* find H(R,A,M) and store it as h */
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
ret = ed25519_hash_reset(key);
|
ret = ed25519_hash_reset(key);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
#else
|
||||||
|
ret = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (type == Ed25519ctx || type == Ed25519ph) {
|
if (type == Ed25519ctx || type == Ed25519ph) {
|
||||||
ret = ed25519_hash_update(key, ed25519Ctx, ED25519CTX_SIZE);
|
ret = ed25519_hash_update(key, sha, ed25519Ctx, ED25519CTX_SIZE);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, &type, sizeof(type));
|
ret = ed25519_hash_update(key, sha, &type, sizeof(type));
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, &contextLen, sizeof(contextLen));
|
ret = ed25519_hash_update(key, sha, &contextLen, sizeof(contextLen));
|
||||||
if (ret == 0 && context != NULL)
|
if (ret == 0 && context != NULL)
|
||||||
ret = ed25519_hash_update(key, context, contextLen);
|
ret = ed25519_hash_update(key, sha, context, contextLen);
|
||||||
}
|
}
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, sig, ED25519_SIG_SIZE/2);
|
ret = ed25519_hash_update(key, sha, sig, ED25519_SIG_SIZE/2);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed25519_hash_update(key, key->p, ED25519_PUB_KEY_SIZE);
|
ret = ed25519_hash_update(key, sha, key->p, ED25519_PUB_KEY_SIZE);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -456,13 +552,15 @@ int wc_ed25519_verify_msg_init(const byte* sig, word32 sigLen, ed25519_key* key,
|
|||||||
key Ed25519 public key
|
key Ed25519 public key
|
||||||
return 0 on success
|
return 0 on success
|
||||||
*/
|
*/
|
||||||
int wc_ed25519_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
static int ed25519_verify_msg_update_with_sha(const byte* msgSegment,
|
||||||
ed25519_key* key) {
|
word32 msgSegmentLen,
|
||||||
|
ed25519_key* key,
|
||||||
|
wc_Sha512 *sha) {
|
||||||
/* sanity check on arguments */
|
/* sanity check on arguments */
|
||||||
if (msgSegment == NULL || key == NULL)
|
if (msgSegment == NULL || key == NULL)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
return ed25519_hash_update(key, msgSegment, msgSegmentLen);
|
return ed25519_hash_update(key, sha, msgSegment, msgSegmentLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -472,8 +570,9 @@ int wc_ed25519_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
|||||||
key Ed25519 public key
|
key Ed25519 public key
|
||||||
return 0 and res of 1 on success
|
return 0 and res of 1 on success
|
||||||
*/
|
*/
|
||||||
int wc_ed25519_verify_msg_final(const byte* sig, word32 sigLen, int* res,
|
static int ed25519_verify_msg_final_with_sha(const byte* sig, word32 sigLen,
|
||||||
ed25519_key* key)
|
int* res, ed25519_key* key,
|
||||||
|
wc_Sha512 *sha)
|
||||||
{
|
{
|
||||||
byte rcheck[ED25519_KEY_SIZE];
|
byte rcheck[ED25519_KEY_SIZE];
|
||||||
byte h[WC_SHA512_DIGEST_SIZE];
|
byte h[WC_SHA512_DIGEST_SIZE];
|
||||||
@@ -502,7 +601,7 @@ int wc_ed25519_verify_msg_final(const byte* sig, word32 sigLen, int* res,
|
|||||||
|
|
||||||
/* find H(R,A,M) and store it as h */
|
/* find H(R,A,M) and store it as h */
|
||||||
|
|
||||||
ret = ed25519_hash_final(key, h);
|
ret = ed25519_hash_final(key, sha, h);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -535,6 +634,27 @@ int wc_ed25519_verify_msg_final(const byte* sig, word32 sigLen, int* res,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED25519_STREAMING_VERIFY
|
||||||
|
|
||||||
|
int wc_ed25519_verify_msg_init(const byte* sig, word32 sigLen, ed25519_key* key,
|
||||||
|
byte type, const byte* context, byte contextLen) {
|
||||||
|
return ed25519_verify_msg_init_with_sha(sig, sigLen, key, &key->sha,
|
||||||
|
type, context, contextLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wc_ed25519_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
||||||
|
ed25519_key* key) {
|
||||||
|
return ed25519_verify_msg_update_with_sha(msgSegment, msgSegmentLen,
|
||||||
|
key, &key->sha);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wc_ed25519_verify_msg_final(const byte* sig, word32 sigLen, int* res,
|
||||||
|
ed25519_key* key) {
|
||||||
|
return ed25519_verify_msg_final_with_sha(sig, sigLen, res,
|
||||||
|
key, &key->sha);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* WOLFSSL_ED25519_STREAMING_VERIFY */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
sig is array of bytes containing the signature
|
sig is array of bytes containing the signature
|
||||||
@@ -550,6 +670,11 @@ int wc_ed25519_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
byte type, const byte* context, byte contextLen)
|
byte type, const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
wc_Sha512 *sha;
|
||||||
|
#else
|
||||||
|
wc_Sha512 sha[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* sanity check on arguments */
|
/* sanity check on arguments */
|
||||||
if (sig == NULL || msg == NULL || res == NULL || key == NULL ||
|
if (sig == NULL || msg == NULL || res == NULL || key == NULL ||
|
||||||
@@ -566,16 +691,24 @@ int wc_ed25519_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = wc_ed25519_verify_msg_init(sig, sigLen, key,
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
sha = &key->sha;
|
||||||
|
#else
|
||||||
|
ret = ed25519_hash_init(key, sha);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ret = ed25519_verify_msg_init_with_sha(sig, sigLen, key, sha,
|
||||||
type, context, contextLen);
|
type, context, contextLen);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = wc_ed25519_verify_msg_update(msg, msgLen, key);
|
ret = ed25519_verify_msg_update_with_sha(msg, msgLen, key, sha);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return wc_ed25519_verify_msg_final(sig, sigLen, res, key);
|
return ed25519_verify_msg_final_with_sha(sig, sigLen, res, key, sha);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -591,7 +724,7 @@ int wc_ed25519_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
word32 msgLen, int* res, ed25519_key* key)
|
word32 msgLen, int* res, ed25519_key* key)
|
||||||
{
|
{
|
||||||
return wc_ed25519_verify_msg_ex(sig, sigLen, msg, msgLen, res, key,
|
return wc_ed25519_verify_msg_ex(sig, sigLen, msg, msgLen, res, key,
|
||||||
(byte)Ed25519, NULL, 0);
|
(byte)Ed25519, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -610,7 +743,7 @@ int wc_ed25519ctx_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
const byte* context, byte contextLen)
|
const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
return wc_ed25519_verify_msg_ex(sig, sigLen, msg, msgLen, res, key,
|
return wc_ed25519_verify_msg_ex(sig, sigLen, msg, msgLen, res, key,
|
||||||
Ed25519ctx, context, contextLen);
|
Ed25519ctx, context, contextLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -629,7 +762,7 @@ int wc_ed25519ph_verify_hash(const byte* sig, word32 sigLen, const byte* hash,
|
|||||||
const byte* context, byte contextLen)
|
const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
return wc_ed25519_verify_msg_ex(sig, sigLen, hash, hashLen, res, key,
|
return wc_ed25519_verify_msg_ex(sig, sigLen, hash, hashLen, res, key,
|
||||||
Ed25519ph, context, contextLen);
|
Ed25519ph, context, contextLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -655,7 +788,7 @@ int wc_ed25519ph_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return wc_ed25519_verify_msg_ex(sig, sigLen, hash, sizeof(hash), res, key,
|
return wc_ed25519_verify_msg_ex(sig, sigLen, hash, sizeof(hash), res, key,
|
||||||
Ed25519ph, context, contextLen);
|
Ed25519ph, context, contextLen);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_ED25519_VERIFY */
|
#endif /* HAVE_ED25519_VERIFY */
|
||||||
|
|
||||||
@@ -663,8 +796,6 @@ int wc_ed25519ph_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
/* initialize information and memory for key */
|
/* initialize information and memory for key */
|
||||||
int wc_ed25519_init_ex(ed25519_key* key, void* heap, int devId)
|
int wc_ed25519_init_ex(ed25519_key* key, void* heap, int devId)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
@@ -680,18 +811,11 @@ int wc_ed25519_init_ex(ed25519_key* key, void* heap, int devId)
|
|||||||
fe_init();
|
fe_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = wc_InitSha512_ex(&key->sha, key->heap,
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
#if defined(WOLF_CRYPTO_CB)
|
return ed25519_hash_init(key, &key->sha);
|
||||||
key->devId
|
#else /* !WOLFSSL_ED25519_PERSISTENT_SHA */
|
||||||
#else
|
return 0;
|
||||||
INVALID_DEVID
|
#endif /* WOLFSSL_ED25519_PERSISTENT_SHA */
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
if (ret == 0)
|
|
||||||
key->sha_clean_flag = 1;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_ed25519_init(ed25519_key* key)
|
int wc_ed25519_init(ed25519_key* key)
|
||||||
@@ -705,7 +829,9 @@ void wc_ed25519_free(ed25519_key* key)
|
|||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wc_Sha512Free(&key->sha);
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
ed25519_hash_free(key, &key->sha);
|
||||||
|
#endif
|
||||||
|
|
||||||
ForceZero(key, sizeof(ed25519_key));
|
ForceZero(key, sizeof(ed25519_key));
|
||||||
}
|
}
|
||||||
|
@@ -51,6 +51,28 @@
|
|||||||
static const byte ed448Ctx[ED448CTX_SIZE+1] = "SigEd448";
|
static const byte ed448Ctx[ED448CTX_SIZE+1] = "SigEd448";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static int ed448_hash_init(ed448_key* key, wc_Shake *sha)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = wc_InitShake256(sha, key->heap,
|
||||||
|
#if defined(WOLF_CRYPTO_CB)
|
||||||
|
key->devId
|
||||||
|
#else
|
||||||
|
INVALID_DEVID
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
if (ret == 0)
|
||||||
|
key->sha_clean_flag = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
static int ed448_hash_reset(ed448_key* key)
|
static int ed448_hash_reset(ed448_key* key)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -71,36 +93,74 @@ static int ed448_hash_reset(ed448_key* key)
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif /* WOLFSSL_ED448_PERSISTENT_SHA */
|
||||||
|
|
||||||
static int ed448_hash_update(ed448_key* key, const byte* data, word32 len)
|
static int ed448_hash_update(ed448_key* key, wc_Shake *sha, const byte* data,
|
||||||
|
word32 len)
|
||||||
{
|
{
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
if (key->sha_clean_flag)
|
if (key->sha_clean_flag)
|
||||||
key->sha_clean_flag = 0;
|
key->sha_clean_flag = 0;
|
||||||
return wc_Shake256_Update(&key->sha, data, len);
|
#else
|
||||||
|
(void)key;
|
||||||
|
#endif
|
||||||
|
return wc_Shake256_Update(sha, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ed448_hash_final(ed448_key* key, byte* hash, word32 hashLen)
|
static int ed448_hash_final(ed448_key* key, wc_Shake *sha, byte* hash,
|
||||||
|
word32 hashLen)
|
||||||
{
|
{
|
||||||
int ret = wc_Shake256_Final(&key->sha, hash, hashLen);
|
int ret = wc_Shake256_Final(sha, hash, hashLen);
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
key->sha_clean_flag = 1;
|
key->sha_clean_flag = 1;
|
||||||
|
#else
|
||||||
|
(void)key;
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ed448_hash_free(ed448_key* key, wc_Shake *sha)
|
||||||
|
{
|
||||||
|
wc_Shake256_Free(sha);
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
key->sha_clean_flag = 0;
|
||||||
|
#else
|
||||||
|
(void)key;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ed448_hash(ed448_key* key, const byte* in, word32 inLen,
|
static int ed448_hash(ed448_key* key, const byte* in, word32 inLen,
|
||||||
byte* hash, word32 hashLen)
|
byte* hash, word32 hashLen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
#ifndef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
wc_Shake sha[1];
|
||||||
|
#else
|
||||||
|
wc_Shake *sha;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (key == NULL || (in == NULL && inLen > 0) || hash == NULL) {
|
if (key == NULL || (in == NULL && inLen > 0) || hash == NULL) {
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
sha = &key->sha;
|
||||||
ret = ed448_hash_reset(key);
|
ret = ed448_hash_reset(key);
|
||||||
|
#else
|
||||||
|
ret = ed448_hash_init(key, sha);
|
||||||
|
#endif
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = ed448_hash_update(key, sha, in, inLen);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = ed448_hash_update(key, in, inLen);
|
ret = ed448_hash_final(key, sha, hash, hashLen);
|
||||||
if (ret == 0)
|
|
||||||
ret = ed448_hash_final(key, hash, hashLen);
|
#ifndef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
ed448_hash_free(key, sha);
|
||||||
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -234,34 +294,52 @@ int wc_ed448_sign_msg_ex(const byte* in, word32 inLen, byte* out,
|
|||||||
ret = ed448_hash(key, key->k, ED448_KEY_SIZE, az, sizeof(az));
|
ret = ed448_hash(key, key->k, ED448_KEY_SIZE, az, sizeof(az));
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
wc_Shake *sha = &key->sha;
|
||||||
|
#else
|
||||||
|
wc_Shake sha[1];
|
||||||
|
ret = ed448_hash_init(key, sha);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
/* apply clamp */
|
/* apply clamp */
|
||||||
az[0] &= 0xfc;
|
az[0] &= 0xfc;
|
||||||
az[55] |= 0x80;
|
az[55] |= 0x80;
|
||||||
az[56] = 0x00;
|
az[56] = 0x00;
|
||||||
|
|
||||||
|
ret = ed448_hash_update(key, sha, ed448Ctx, ED448CTX_SIZE);
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, ed448Ctx, ED448CTX_SIZE);
|
ret = ed448_hash_update(key, sha, &type, sizeof(type));
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, &type, sizeof(type));
|
ret = ed448_hash_update(key, sha, &contextLen, sizeof(contextLen));
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_update(key, &contextLen, sizeof(contextLen));
|
|
||||||
}
|
}
|
||||||
if ((ret == 0) && (context != NULL)) {
|
if ((ret == 0) && (context != NULL)) {
|
||||||
ret = ed448_hash_update(key, context, contextLen);
|
ret = ed448_hash_update(key, sha, context, contextLen);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, az + ED448_KEY_SIZE, ED448_KEY_SIZE);
|
ret = ed448_hash_update(key, sha, az + ED448_KEY_SIZE, ED448_KEY_SIZE);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, in, inLen);
|
ret = ed448_hash_update(key, sha, in, inLen);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_final(key, nonce, sizeof(nonce));
|
ret = ed448_hash_final(key, sha, nonce, sizeof(nonce));
|
||||||
}
|
}
|
||||||
|
#ifndef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
ed448_hash_free(key, sha);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
wc_Shake *sha = &key->sha;
|
||||||
|
#else
|
||||||
|
wc_Shake sha[1];
|
||||||
|
ret = ed448_hash_init(key, sha);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
sc448_reduce(nonce);
|
sc448_reduce(nonce);
|
||||||
|
|
||||||
/* step 2: computing R = rB where rB is the scalar multiplication of
|
/* step 2: computing R = rB where rB is the scalar multiplication of
|
||||||
@@ -271,30 +349,32 @@ int wc_ed448_sign_msg_ex(const byte* in, word32 inLen, byte* out,
|
|||||||
|
|
||||||
/* step 3: hash R + public key + message getting H(R,A,M) then
|
/* step 3: hash R + public key + message getting H(R,A,M) then
|
||||||
creating S = (r + H(R,A,M)a) mod l */
|
creating S = (r + H(R,A,M)a) mod l */
|
||||||
|
|
||||||
|
ret = ed448_hash_update(key, sha, ed448Ctx, ED448CTX_SIZE);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, ed448Ctx, ED448CTX_SIZE);
|
ret = ed448_hash_update(key, sha, &type, sizeof(type));
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_update(key, &type, sizeof(type));
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_update(key, &contextLen, sizeof(contextLen));
|
|
||||||
}
|
|
||||||
if ((ret == 0) && (context != NULL)) {
|
|
||||||
ret = ed448_hash_update(key, context, contextLen);
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_update(key, out, ED448_SIG_SIZE/2);
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_update(key, key->p, ED448_PUB_KEY_SIZE);
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_update(key, in, inLen);
|
|
||||||
}
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = ed448_hash_final(key, hram, sizeof(hram));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = ed448_hash_update(key, sha, &contextLen, sizeof(contextLen));
|
||||||
|
}
|
||||||
|
if ((ret == 0) && (context != NULL)) {
|
||||||
|
ret = ed448_hash_update(key, sha, context, contextLen);
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = ed448_hash_update(key, sha, out, ED448_SIG_SIZE/2);
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = ed448_hash_update(key, sha, key->p, ED448_PUB_KEY_SIZE);
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = ed448_hash_update(key, sha, in, inLen);
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = ed448_hash_final(key, sha, hram, sizeof(hram));
|
||||||
|
}
|
||||||
|
#ifndef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
ed448_hash_free(key, sha);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
@@ -374,8 +454,8 @@ int wc_ed448ph_sign_hash(const byte* hash, word32 hashLen, byte* out,
|
|||||||
int wc_ed448ph_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen,
|
int wc_ed448ph_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen,
|
||||||
ed448_key* key, const byte* context, byte contextLen)
|
ed448_key* key, const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret;
|
||||||
byte hash[64];
|
byte hash[ED448_PREHASH_SIZE];
|
||||||
|
|
||||||
ret = ed448_hash(key, in, inLen, hash, sizeof(hash));
|
ret = ed448_hash(key, in, inLen, hash, sizeof(hash));
|
||||||
|
|
||||||
@@ -404,8 +484,10 @@ int wc_ed448ph_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen,
|
|||||||
* other -ve values when hash fails,
|
* other -ve values when hash fails,
|
||||||
* 0 otherwise.
|
* 0 otherwise.
|
||||||
*/
|
*/
|
||||||
int wc_ed448_verify_msg_init(const byte* sig, word32 sigLen, ed448_key* key,
|
|
||||||
byte type, const byte* context, byte contextLen)
|
static int ed448_verify_msg_init_with_sha(const byte* sig, word32 sigLen,
|
||||||
|
ed448_key* key, wc_Shake *sha, byte type,
|
||||||
|
const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -421,25 +503,27 @@ int wc_ed448_verify_msg_init(const byte* sig, word32 sigLen, ed448_key* key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* find H(R,A,M) and store it as h */
|
/* find H(R,A,M) and store it as h */
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
ret = ed448_hash_reset(key);
|
ret = ed448_hash_reset(key);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = ed448_hash_update(key, ed448Ctx, ED448CTX_SIZE);
|
ret = ed448_hash_update(key, sha, ed448Ctx, ED448CTX_SIZE);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, &type, sizeof(type));
|
ret = ed448_hash_update(key, sha, &type, sizeof(type));
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, &contextLen, sizeof(contextLen));
|
ret = ed448_hash_update(key, sha, &contextLen, sizeof(contextLen));
|
||||||
}
|
}
|
||||||
if ((ret == 0) && (context != NULL)) {
|
if ((ret == 0) && (context != NULL)) {
|
||||||
ret = ed448_hash_update(key, context, contextLen);
|
ret = ed448_hash_update(key, sha, context, contextLen);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, sig, ED448_SIG_SIZE/2);
|
ret = ed448_hash_update(key, sha, sig, ED448_SIG_SIZE/2);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ed448_hash_update(key, key->p, ED448_PUB_KEY_SIZE);
|
ret = ed448_hash_update(key, sha, key->p, ED448_PUB_KEY_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -451,14 +535,16 @@ int wc_ed448_verify_msg_init(const byte* sig, word32 sigLen, ed448_key* key,
|
|||||||
key Ed448 public key
|
key Ed448 public key
|
||||||
return 0 on success
|
return 0 on success
|
||||||
*/
|
*/
|
||||||
int wc_ed448_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
static int ed448_verify_msg_update_with_sha(const byte* msgSegment,
|
||||||
ed448_key* key)
|
word32 msgSegmentLen,
|
||||||
|
ed448_key* key,
|
||||||
|
wc_Shake *sha)
|
||||||
{
|
{
|
||||||
/* sanity check on arguments */
|
/* sanity check on arguments */
|
||||||
if (msgSegment == NULL || key == NULL)
|
if (msgSegment == NULL || key == NULL)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
return ed448_hash_update(key, msgSegment, msgSegmentLen);
|
return ed448_hash_update(key, sha, msgSegment, msgSegmentLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify the message using the ed448 public key.
|
/* Verify the message using the ed448 public key.
|
||||||
@@ -472,8 +558,8 @@ int wc_ed448_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
|||||||
* other -ve values when hash fails,
|
* other -ve values when hash fails,
|
||||||
* 0 otherwise.
|
* 0 otherwise.
|
||||||
*/
|
*/
|
||||||
int wc_ed448_verify_msg_final(const byte* sig, word32 sigLen,
|
static int ed448_verify_msg_final_with_sha(const byte* sig, word32 sigLen,
|
||||||
int* res, ed448_key* key)
|
int* res, ed448_key* key, wc_Shake *sha)
|
||||||
{
|
{
|
||||||
byte rcheck[ED448_KEY_SIZE];
|
byte rcheck[ED448_KEY_SIZE];
|
||||||
byte h[ED448_SIG_SIZE];
|
byte h[ED448_SIG_SIZE];
|
||||||
@@ -496,7 +582,7 @@ int wc_ed448_verify_msg_final(const byte* sig, word32 sigLen,
|
|||||||
if (ge448_from_bytes_negate_vartime(&A, key->p) != 0)
|
if (ge448_from_bytes_negate_vartime(&A, key->p) != 0)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
ret = ed448_hash_final(key, h, sizeof(h));
|
ret = ed448_hash_final(key, sha, h, sizeof(h));
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -524,6 +610,28 @@ int wc_ed448_verify_msg_final(const byte* sig, word32 sigLen,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED448_STREAMING_VERIFY
|
||||||
|
int wc_ed448_verify_msg_init(const byte* sig, word32 sigLen, ed448_key* key,
|
||||||
|
byte type, const byte* context, byte contextLen)
|
||||||
|
{
|
||||||
|
return ed448_verify_msg_init_with_sha(sig, sigLen, key, &key->sha, type,
|
||||||
|
context, contextLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wc_ed448_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
||||||
|
ed448_key* key)
|
||||||
|
{
|
||||||
|
return ed448_verify_msg_update_with_sha(msgSegment, msgSegmentLen, key,
|
||||||
|
&key->sha);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wc_ed448_verify_msg_final(const byte* sig, word32 sigLen,
|
||||||
|
int* res, ed448_key* key)
|
||||||
|
{
|
||||||
|
return ed448_verify_msg_final_with_sha(sig, sigLen, res, key, &key->sha);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Verify the message using the ed448 public key.
|
/* Verify the message using the ed448 public key.
|
||||||
*
|
*
|
||||||
* sig [in] Signature to verify.
|
* sig [in] Signature to verify.
|
||||||
@@ -546,16 +654,35 @@ int wc_ed448_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
byte type, const byte* context, byte contextLen)
|
byte type, const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
ret = wc_ed448_verify_msg_init(sig, sigLen, key,
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
wc_Shake *sha;
|
||||||
|
#else
|
||||||
|
wc_Shake sha[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (key == NULL)
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
sha = &key->sha;
|
||||||
|
#else
|
||||||
|
ret = ed448_hash_init(key, sha);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ret = ed448_verify_msg_init_with_sha(sig, sigLen, key, sha,
|
||||||
type, context, contextLen);
|
type, context, contextLen);
|
||||||
if (ret < 0)
|
if (ret == 0)
|
||||||
return ret;
|
ret = ed448_verify_msg_update_with_sha(msg, msgLen, key, sha);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = ed448_verify_msg_final_with_sha(sig, sigLen, res, key, sha);
|
||||||
|
|
||||||
ret = wc_ed448_verify_msg_update(msg, msgLen, key);
|
#ifndef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
if (ret < 0)
|
ed448_hash_free(key, sha);
|
||||||
return ret;
|
#endif
|
||||||
|
|
||||||
return wc_ed448_verify_msg_final(sig, sigLen, res, key);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify the message using the ed448 public key.
|
/* Verify the message using the ed448 public key.
|
||||||
@@ -627,7 +754,7 @@ int wc_ed448ph_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
const byte* context, byte contextLen)
|
const byte* context, byte contextLen)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
byte hash[64];
|
byte hash[ED448_PREHASH_SIZE];
|
||||||
|
|
||||||
ret = ed448_hash(key, msg, msgLen, hash, sizeof(hash));
|
ret = ed448_hash(key, msg, msgLen, hash, sizeof(hash));
|
||||||
|
|
||||||
@@ -648,8 +775,6 @@ int wc_ed448ph_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
|||||||
*/
|
*/
|
||||||
int wc_ed448_init_ex(ed448_key* key, void *heap, int devId)
|
int wc_ed448_init_ex(ed448_key* key, void *heap, int devId)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
@@ -664,18 +789,11 @@ int wc_ed448_init_ex(ed448_key* key, void *heap, int devId)
|
|||||||
|
|
||||||
fe448_init();
|
fe448_init();
|
||||||
|
|
||||||
ret = wc_InitShake256(&key->sha, heap,
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
#if defined(WOLF_CRYPTO_CB)
|
return ed448_hash_init(key, &key->sha);
|
||||||
key->devId
|
#else /* !WOLFSSL_ED448_PERSISTENT_SHA */
|
||||||
#else
|
return 0;
|
||||||
INVALID_DEVID
|
#endif /* WOLFSSL_ED448_PERSISTENT_SHA */
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
if (ret == 0)
|
|
||||||
key->sha_clean_flag = 1;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the ed448 private/public key.
|
/* Initialize the ed448 private/public key.
|
||||||
@@ -694,7 +812,9 @@ int wc_ed448_init(ed448_key* key) {
|
|||||||
void wc_ed448_free(ed448_key* key)
|
void wc_ed448_free(ed448_key* key)
|
||||||
{
|
{
|
||||||
if (key != NULL) {
|
if (key != NULL) {
|
||||||
wc_Shake256_Free(&key->sha);
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
ed448_hash_free(key, &key->sha);
|
||||||
|
#endif
|
||||||
ForceZero(key, sizeof(ed448_key));
|
ForceZero(key, sizeof(ed448_key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25143,7 +25143,9 @@ WOLFSSL_TEST_SUBROUTINE int ed25519_test(void)
|
|||||||
int i;
|
int i;
|
||||||
word32 outlen;
|
word32 outlen;
|
||||||
#ifdef HAVE_ED25519_VERIFY
|
#ifdef HAVE_ED25519_VERIFY
|
||||||
|
#ifdef WOLFSSL_ED25519_STREAMING_VERIFY
|
||||||
int j;
|
int j;
|
||||||
|
#endif
|
||||||
int verify;
|
int verify;
|
||||||
#endif /* HAVE_ED25519_VERIFY */
|
#endif /* HAVE_ED25519_VERIFY */
|
||||||
#endif /* HAVE_ED25519_SIGN && HAVE_ED25519_KEY_EXPORT && HAVE_ED25519_KEY_IMPORT */
|
#endif /* HAVE_ED25519_SIGN && HAVE_ED25519_KEY_EXPORT && HAVE_ED25519_KEY_IMPORT */
|
||||||
@@ -25551,6 +25553,7 @@ WOLFSSL_TEST_SUBROUTINE int ed25519_test(void)
|
|||||||
&key) != 0 || verify != 1)
|
&key) != 0 || verify != 1)
|
||||||
return -11031 - i;
|
return -11031 - i;
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED25519_STREAMING_VERIFY
|
||||||
/* test verify on good msg using streaming interface directly */
|
/* test verify on good msg using streaming interface directly */
|
||||||
if (wc_ed25519_verify_msg_init(out, outlen,
|
if (wc_ed25519_verify_msg_init(out, outlen,
|
||||||
&key, (byte)Ed25519, NULL, 0) != 0)
|
&key, (byte)Ed25519, NULL, 0) != 0)
|
||||||
@@ -25562,6 +25565,7 @@ WOLFSSL_TEST_SUBROUTINE int ed25519_test(void)
|
|||||||
if (wc_ed25519_verify_msg_final(out, outlen, &verify,
|
if (wc_ed25519_verify_msg_final(out, outlen, &verify,
|
||||||
&key) != 0 || verify != 1)
|
&key) != 0 || verify != 1)
|
||||||
return -11231 - i;
|
return -11231 - i;
|
||||||
|
#endif /* WOLFSSL_ED25519_STREAMING_VERIFY */
|
||||||
|
|
||||||
/* test verify on bad msg */
|
/* test verify on bad msg */
|
||||||
out[outlen-1] = out[outlen-1] + 1;
|
out[outlen-1] = out[outlen-1] + 1;
|
||||||
@@ -26455,7 +26459,9 @@ WOLFSSL_TEST_SUBROUTINE int ed448_test(void)
|
|||||||
int i;
|
int i;
|
||||||
word32 outlen;
|
word32 outlen;
|
||||||
#ifdef HAVE_ED448_VERIFY
|
#ifdef HAVE_ED448_VERIFY
|
||||||
|
#ifdef WOLFSSL_ED448_STREAMING_VERIFY
|
||||||
int j;
|
int j;
|
||||||
|
#endif /* WOLFSSL_ED448_STREAMING_VERIFY */
|
||||||
int verify;
|
int verify;
|
||||||
#endif /* HAVE_ED448_VERIFY */
|
#endif /* HAVE_ED448_VERIFY */
|
||||||
#endif /* HAVE_ED448_SIGN && HAVE_ED448_KEY_EXPORT && HAVE_ED448_KEY_IMPORT */
|
#endif /* HAVE_ED448_SIGN && HAVE_ED448_KEY_EXPORT && HAVE_ED448_KEY_IMPORT */
|
||||||
@@ -26966,6 +26972,7 @@ WOLFSSL_TEST_SUBROUTINE int ed448_test(void)
|
|||||||
return -11731 - i;
|
return -11731 - i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_ED448_STREAMING_VERIFY
|
||||||
/* test verify on good msg using streaming interface directly */
|
/* test verify on good msg using streaming interface directly */
|
||||||
if (wc_ed448_verify_msg_init(out, outlen,
|
if (wc_ed448_verify_msg_init(out, outlen,
|
||||||
&key, (byte)Ed448, NULL, 0) != 0)
|
&key, (byte)Ed448, NULL, 0) != 0)
|
||||||
@@ -26977,6 +26984,7 @@ WOLFSSL_TEST_SUBROUTINE int ed448_test(void)
|
|||||||
if (wc_ed448_verify_msg_final(out, outlen, &verify,
|
if (wc_ed448_verify_msg_final(out, outlen, &verify,
|
||||||
&key) != 0 || verify != 1)
|
&key) != 0 || verify != 1)
|
||||||
return -11931 - i;
|
return -11931 - i;
|
||||||
|
#endif /* WOLFSSL_ED448_STREAMING_VERIFY */
|
||||||
|
|
||||||
/* test verify on bad msg */
|
/* test verify on bad msg */
|
||||||
out[outlen-2] = out[outlen-2] + 1;
|
out[outlen-2] = out[outlen-2] + 1;
|
||||||
|
@@ -94,8 +94,10 @@ struct ed25519_key {
|
|||||||
int devId;
|
int devId;
|
||||||
#endif
|
#endif
|
||||||
void *heap;
|
void *heap;
|
||||||
|
#ifdef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
wc_Sha512 sha;
|
wc_Sha512 sha;
|
||||||
int sha_clean_flag;
|
int sha_clean_flag;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -145,6 +147,7 @@ WOLFSSL_API
|
|||||||
int wc_ed25519_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
int wc_ed25519_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
||||||
word32 msgLen, int* res, ed25519_key* key,
|
word32 msgLen, int* res, ed25519_key* key,
|
||||||
byte type, const byte* context, byte contextLen);
|
byte type, const byte* context, byte contextLen);
|
||||||
|
#ifdef WOLFSSL_ED25519_STREAMING_VERIFY
|
||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ed25519_verify_msg_init(const byte* sig, word32 sigLen, ed25519_key* key,
|
int wc_ed25519_verify_msg_init(const byte* sig, word32 sigLen, ed25519_key* key,
|
||||||
byte type, const byte* context, byte contextLen);
|
byte type, const byte* context, byte contextLen);
|
||||||
@@ -154,6 +157,7 @@ int wc_ed25519_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
|||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ed25519_verify_msg_final(const byte* sig, word32 sigLen, int* res,
|
int wc_ed25519_verify_msg_final(const byte* sig, word32 sigLen, int* res,
|
||||||
ed25519_key* key);
|
ed25519_key* key);
|
||||||
|
#endif /* WOLFSSL_ED25519_STREAMING_VERIFY */
|
||||||
#endif /* HAVE_ED25519_VERIFY */
|
#endif /* HAVE_ED25519_VERIFY */
|
||||||
|
|
||||||
|
|
||||||
|
@@ -65,6 +65,7 @@
|
|||||||
/* both private and public key */
|
/* both private and public key */
|
||||||
#define ED448_PRV_KEY_SIZE (ED448_PUB_KEY_SIZE+ED448_KEY_SIZE)
|
#define ED448_PRV_KEY_SIZE (ED448_PUB_KEY_SIZE+ED448_KEY_SIZE)
|
||||||
|
|
||||||
|
#define ED448_PREHASH_SIZE 64
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
Ed448 = 0,
|
Ed448 = 0,
|
||||||
@@ -93,8 +94,10 @@ struct ed448_key {
|
|||||||
int devId;
|
int devId;
|
||||||
#endif
|
#endif
|
||||||
void *heap;
|
void *heap;
|
||||||
|
#ifdef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
wc_Shake sha;
|
wc_Shake sha;
|
||||||
int sha_clean_flag;
|
int sha_clean_flag;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -125,6 +128,7 @@ WOLFSSL_API
|
|||||||
int wc_ed448_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
int wc_ed448_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
|
||||||
word32 msgLen, int* res, ed448_key* key,
|
word32 msgLen, int* res, ed448_key* key,
|
||||||
byte type, const byte* context, byte contextLen);
|
byte type, const byte* context, byte contextLen);
|
||||||
|
#ifdef WOLFSSL_ED448_STREAMING_VERIFY
|
||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ed448_verify_msg_init(const byte* sig, word32 sigLen, ed448_key* key,
|
int wc_ed448_verify_msg_init(const byte* sig, word32 sigLen, ed448_key* key,
|
||||||
byte type, const byte* context, byte contextLen);
|
byte type, const byte* context, byte contextLen);
|
||||||
@@ -134,6 +138,7 @@ int wc_ed448_verify_msg_update(const byte* msgSegment, word32 msgSegmentLen,
|
|||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ed448_verify_msg_final(const byte* sig, word32 sigLen,
|
int wc_ed448_verify_msg_final(const byte* sig, word32 sigLen,
|
||||||
int* stat, ed448_key* key);
|
int* stat, ed448_key* key);
|
||||||
|
#endif /* WOLFSSL_ED448_STREAMING_VERIFY */
|
||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ed448_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
int wc_ed448_verify_msg(const byte* sig, word32 sigLen, const byte* msg,
|
||||||
word32 msgLen, int* stat, ed448_key* key,
|
word32 msgLen, int* stat, ed448_key* key,
|
||||||
|
@@ -1867,6 +1867,10 @@ extern void uITRON4_free(void *p) ;
|
|||||||
#ifndef NO_ED25519_VERIFY
|
#ifndef NO_ED25519_VERIFY
|
||||||
#undef HAVE_ED25519_VERIFY
|
#undef HAVE_ED25519_VERIFY
|
||||||
#define HAVE_ED25519_VERIFY
|
#define HAVE_ED25519_VERIFY
|
||||||
|
#ifdef WOLFSSL_ED25519_STREAMING_VERIFY
|
||||||
|
#undef WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
#define WOLFSSL_ED25519_PERSISTENT_SHA
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_ED25519_KEY_EXPORT
|
#ifndef NO_ED25519_KEY_EXPORT
|
||||||
#undef HAVE_ED25519_KEY_EXPORT
|
#undef HAVE_ED25519_KEY_EXPORT
|
||||||
@@ -1905,6 +1909,10 @@ extern void uITRON4_free(void *p) ;
|
|||||||
#ifndef NO_ED448_VERIFY
|
#ifndef NO_ED448_VERIFY
|
||||||
#undef HAVE_ED448_VERIFY
|
#undef HAVE_ED448_VERIFY
|
||||||
#define HAVE_ED448_VERIFY
|
#define HAVE_ED448_VERIFY
|
||||||
|
#ifdef WOLFSSL_ED448_STREAMING_VERIFY
|
||||||
|
#undef WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
#define WOLFSSL_ED448_PERSISTENT_SHA
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_ED448_KEY_EXPORT
|
#ifndef NO_ED448_KEY_EXPORT
|
||||||
#undef HAVE_ED448_KEY_EXPORT
|
#undef HAVE_ED448_KEY_EXPORT
|
||||||
|
Reference in New Issue
Block a user