1818enum SphincsPlusError {
1919 SphincsPlusError_Params = 200 ,
2020 SphincsPlusError_Verify ,
21- SphincsPlusError_Verify_MsgLen ,
22- SphincsPlusError_Verify_MsgCmp ,
21+ SphincsPlusError_OutputSignLength ,
2322};
2423
2524#ifndef CKB_VM
2625
27- // TODO: switch the code to use crypto_sign_signature / crypto_sign_verify,
28- // so we don't need to append message to the end of the signature.
29-
3026#include <stdlib.h>
3127
3228int sphincs_plus_generate_keypair (uint8_t * pk , uint8_t * sk ) {
@@ -35,11 +31,14 @@ int sphincs_plus_generate_keypair(uint8_t *pk, uint8_t *sk) {
3531
3632int sphincs_plus_sign (const uint8_t * message , const uint8_t * sk ,
3733 uint8_t * out_sign ) {
38- unsigned long long out_sign_len = SPHINCS_PLUS_SIGN_SIZE ;
39- int ret = crypto_sign (out_sign , (unsigned long long * )& out_sign_len , message ,
40- SPX_MLEN , sk );
34+ size_t out_sign_len = 0 ;
35+ int ret =
36+ crypto_sign_signature (out_sign , & out_sign_len , message , SPX_MLEN , sk );
37+ if (ret != 0 ) {
38+ return ret ;
39+ }
4140 if ((uint32_t )out_sign_len != SPHINCS_PLUS_SIGN_SIZE ) {
42- return 1 ;
41+ return SphincsPlusError_OutputSignLength ;
4342 }
4443 return ret ;
4544}
@@ -58,21 +57,12 @@ int sphincs_plus_verify(const uint8_t *sign, uint32_t sign_size,
5857 pubkey_size != SPHINCS_PLUS_PK_SIZE ) {
5958 return SphincsPlusError_Params ;
6059 }
61- unsigned char mout [SPX_BYTES + SPX_MLEN ];
62- unsigned long long mlen = 0 ;
6360
64- int err = crypto_sign_open (mout , & mlen , sign , SPHINCS_PLUS_SIGN_SIZE , pubkey );
61+ int err = crypto_sign_verify (sign , SPHINCS_PLUS_SIGN_SIZE , message ,
62+ message_size , pubkey );
6563 if (err != 0 ) {
6664 return SphincsPlusError_Verify ;
6765 }
6866
69- if (mlen != SPX_MLEN ) {
70- return SphincsPlusError_Verify_MsgLen ;
71- }
72-
73- if (memcmp (mout , message , SPX_MLEN ) != 0 ) {
74- return SphincsPlusError_Verify_MsgCmp ;
75- }
76-
7767 return 0 ;
7868}
0 commit comments