Skip to content

Commit 75bd1af

Browse files
authored
Merge pull request #7179 from philljj/fix_ext_xmss_sigsleft
Fix ext_xmss SigsLeft.
2 parents 48b99b0 + 947528e commit 75bd1af

1 file changed

Lines changed: 21 additions & 4 deletions

File tree

wolfcrypt/src/ext_xmss.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ int wc_XmssKey_Sign(XmssKey* key, byte * sig, word32 * sigLen, const byte * msg,
763763
*/
764764
int wc_XmssKey_SigsLeft(XmssKey* key)
765765
{
766-
int ret;
766+
int ret = 0;
767767

768768
/* Validate parameter. */
769769
if (key == NULL) {
@@ -785,13 +785,30 @@ int wc_XmssKey_SigsLeft(XmssKey* key)
785785
ret = 0;
786786
}
787787
else {
788-
xmss_params* params = &key->params;
789-
unsigned long long idx;
788+
/* The following assumes core_fast implementation is used
789+
* from patched xmss-reference. */
790+
const unsigned char* sk = (key->sk + XMSS_OID_LEN);
791+
const xmss_params* params = &key->params;
792+
unsigned long long idx = 0;
793+
794+
if (key->is_xmssmt) {
795+
for (uint64_t i = 0; i < params->index_bytes; i++) {
796+
idx |= ((unsigned long long)sk[i])
797+
<< 8 * (params->index_bytes - 1 - i);
798+
}
799+
}
800+
else {
801+
idx = ((unsigned long)sk[0] << 24) |
802+
((unsigned long)sk[1] << 16) |
803+
((unsigned long)sk[2] << 8) | sk[3];
804+
}
790805

791-
idx = (unsigned long)bytes_to_ull(key->sk, params->index_bytes);
792806
ret = idx < ((1ULL << params->full_height) - 1);
793807
}
794808

809+
/* Force zero the secret key from memory always. */
810+
ForceZero(key->sk, key->sk_len);
811+
795812
return ret;
796813
}
797814
#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY*/

0 commit comments

Comments
 (0)