| @@ -58,21 +58,18 @@ static void hash_init_with_dom( | |||
| uint8_t prehashed, | |||
| uint8_t for_prehash, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| hash_init(hash); | |||
| #if NO_CONTEXT | |||
| if (no_context) { | |||
| if (context_len == 0 && context == ED25519_NO_CONTEXT) { | |||
| (void)prehashed; | |||
| (void)for_prehash; | |||
| (void)context; | |||
| (void)context_len; | |||
| return; | |||
| } | |||
| #else | |||
| (void)no_context; | |||
| #endif | |||
| const char *dom_s = "SigEd25519 no Ed25519 collisions"; | |||
| const uint8_t dom[2] = {2+word_is_zero(prehashed)+word_is_zero(for_prehash), context_len}; | |||
| @@ -134,8 +131,7 @@ void decaf_ed25519_sign ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| API_NS(scalar_t) secret_scalar; | |||
| hash_ctx_t hash; | |||
| @@ -155,7 +151,7 @@ void decaf_ed25519_sign ( | |||
| API_NS(scalar_decode_long)(secret_scalar, expanded.secret_scalar_ser, sizeof(expanded.secret_scalar_ser)); | |||
| /* Hash to create the nonce */ | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,expanded.seed,sizeof(expanded.seed)); | |||
| hash_update(hash,message,message_len); | |||
| decaf_bzero(&expanded, sizeof(expanded)); | |||
| @@ -189,7 +185,7 @@ void decaf_ed25519_sign ( | |||
| API_NS(scalar_t) challenge_scalar; | |||
| { | |||
| /* Compute the challenge */ | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,nonce_point,sizeof(nonce_point)); | |||
| hash_update(hash,pubkey,DECAF_EDDSA_25519_PUBLIC_BYTES); | |||
| hash_update(hash,message,message_len); | |||
| @@ -229,7 +225,7 @@ void decaf_ed25519_sign_prehash ( | |||
| hash_destroy(hash_too); | |||
| } | |||
| decaf_ed25519_sign(signature,privkey,pubkey,hash_output,sizeof(hash_output),1,context,context_len,0); | |||
| decaf_ed25519_sign(signature,privkey,pubkey,hash_output,sizeof(hash_output),1,context,context_len); | |||
| decaf_bzero(hash_output,sizeof(hash_output)); | |||
| } | |||
| @@ -240,8 +236,7 @@ decaf_error_t decaf_ed25519_verify ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| API_NS(point_t) pk_point, r_point; | |||
| decaf_error_t error = API_NS(point_decode_like_eddsa_and_ignore_cofactor)(pk_point,pubkey); | |||
| @@ -254,7 +249,7 @@ decaf_error_t decaf_ed25519_verify ( | |||
| { | |||
| /* Compute the challenge */ | |||
| hash_ctx_t hash; | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,signature,DECAF_EDDSA_25519_PUBLIC_BYTES); | |||
| hash_update(hash,pubkey,DECAF_EDDSA_25519_PUBLIC_BYTES); | |||
| hash_update(hash,message,message_len); | |||
| @@ -305,7 +300,7 @@ decaf_error_t decaf_ed25519_verify_prehash ( | |||
| hash_destroy(hash_too); | |||
| } | |||
| ret = decaf_ed25519_verify(signature,pubkey,hash_output,sizeof(hash_output),1,context,context_len,0); | |||
| ret = decaf_ed25519_verify(signature,pubkey,hash_output,sizeof(hash_output),1,context,context_len); | |||
| return ret; | |||
| } | |||
| @@ -58,21 +58,18 @@ static void hash_init_with_dom( | |||
| uint8_t prehashed, | |||
| uint8_t for_prehash, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| hash_init(hash); | |||
| #if NO_CONTEXT | |||
| if (no_context) { | |||
| if (context_len == 0 && context == ED448_NO_CONTEXT) { | |||
| (void)prehashed; | |||
| (void)for_prehash; | |||
| (void)context; | |||
| (void)context_len; | |||
| return; | |||
| } | |||
| #else | |||
| (void)no_context; | |||
| #endif | |||
| const char *dom_s = "SigEd448"; | |||
| const uint8_t dom[2] = {2+word_is_zero(prehashed)+word_is_zero(for_prehash), context_len}; | |||
| @@ -134,8 +131,7 @@ void decaf_ed448_sign ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| API_NS(scalar_t) secret_scalar; | |||
| hash_ctx_t hash; | |||
| @@ -155,7 +151,7 @@ void decaf_ed448_sign ( | |||
| API_NS(scalar_decode_long)(secret_scalar, expanded.secret_scalar_ser, sizeof(expanded.secret_scalar_ser)); | |||
| /* Hash to create the nonce */ | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,expanded.seed,sizeof(expanded.seed)); | |||
| hash_update(hash,message,message_len); | |||
| decaf_bzero(&expanded, sizeof(expanded)); | |||
| @@ -189,7 +185,7 @@ void decaf_ed448_sign ( | |||
| API_NS(scalar_t) challenge_scalar; | |||
| { | |||
| /* Compute the challenge */ | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,nonce_point,sizeof(nonce_point)); | |||
| hash_update(hash,pubkey,DECAF_EDDSA_448_PUBLIC_BYTES); | |||
| hash_update(hash,message,message_len); | |||
| @@ -229,7 +225,7 @@ void decaf_ed448_sign_prehash ( | |||
| hash_destroy(hash_too); | |||
| } | |||
| decaf_ed448_sign(signature,privkey,pubkey,hash_output,sizeof(hash_output),1,context,context_len,0); | |||
| decaf_ed448_sign(signature,privkey,pubkey,hash_output,sizeof(hash_output),1,context,context_len); | |||
| decaf_bzero(hash_output,sizeof(hash_output)); | |||
| } | |||
| @@ -240,8 +236,7 @@ decaf_error_t decaf_ed448_verify ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| API_NS(point_t) pk_point, r_point; | |||
| decaf_error_t error = API_NS(point_decode_like_eddsa_and_ignore_cofactor)(pk_point,pubkey); | |||
| @@ -254,7 +249,7 @@ decaf_error_t decaf_ed448_verify ( | |||
| { | |||
| /* Compute the challenge */ | |||
| hash_ctx_t hash; | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,signature,DECAF_EDDSA_448_PUBLIC_BYTES); | |||
| hash_update(hash,pubkey,DECAF_EDDSA_448_PUBLIC_BYTES); | |||
| hash_update(hash,message,message_len); | |||
| @@ -305,7 +300,7 @@ decaf_error_t decaf_ed448_verify_prehash ( | |||
| hash_destroy(hash_too); | |||
| } | |||
| ret = decaf_ed448_verify(signature,pubkey,hash_output,sizeof(hash_output),1,context,context_len,0); | |||
| ret = decaf_ed448_verify(signature,pubkey,hash_output,sizeof(hash_output),1,context,context_len); | |||
| return ret; | |||
| } | |||
| @@ -34,7 +34,8 @@ extern "C" { | |||
| /** Does EdDSA support non-contextual signatures? */ | |||
| #define DECAF_EDDSA_25519_NO_CONTEXT 1 | |||
| const uint8_t * const ED25519_NO_CONTEXT = (const uint8_t * const)(25519); | |||
| /** Prehash context renaming macros. */ | |||
| #define decaf_ed25519_prehash_ctx_s decaf_sha512_ctx_s | |||
| #define decaf_ed25519_prehash_ctx_t decaf_sha512_ctx_t | |||
| @@ -64,7 +65,6 @@ void decaf_ed25519_derive_public_key ( | |||
| * @param [in] prehashed Nonzero if the message is actually the hash of something you want to sign. | |||
| * @param [in] context A "context" for this signature of up to 255 bytes. | |||
| * @param [in] context_len Length of the context. | |||
| * @param [in] no_context Nonzero if no context should be used (only Ed25519 supported). | |||
| * | |||
| * @warning For Ed25519, it is unsafe to use the same key for both prehashed and non-prehashed | |||
| * messages, at least without some very careful protocol-level disambiguation. For Ed448 it is | |||
| @@ -79,8 +79,7 @@ void decaf_ed25519_sign ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) API_VIS __attribute__((nonnull(1,2,3))) NOINLINE; | |||
| /** | |||
| @@ -128,7 +127,6 @@ void decaf_ed25519_prehash_init ( | |||
| * @param [in] prehashed Nonzero if the message is actually the hash of something you want to verify. | |||
| * @param [in] context A "context" for this signature of up to 255 bytes. | |||
| * @param [in] context_len Length of the context. | |||
| * @param [in] no_context Nonzero if no context should be used (only Ed25519 supported). | |||
| * | |||
| * @warning For Ed25519, it is unsafe to use the same key for both prehashed and non-prehashed | |||
| * messages, at least without some very careful protocol-level disambiguation. For Ed448 it is | |||
| @@ -142,8 +140,7 @@ decaf_error_t decaf_ed25519_verify ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) API_VIS __attribute__((nonnull(1,2))) NOINLINE; | |||
| /** | |||
| @@ -141,8 +141,7 @@ public: | |||
| */ | |||
| inline SecureBuffer sign ( | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /* TODO: this exn spec tickles a Clang bug? | |||
| * throw(LengthException, std::bad_alloc) | |||
| */ { | |||
| @@ -159,8 +158,7 @@ public: | |||
| message.size(), | |||
| 0, | |||
| context.data(), | |||
| context.size(), | |||
| no_context | |||
| context.size() | |||
| ); | |||
| return out; | |||
| } | |||
| @@ -247,8 +245,7 @@ public: | |||
| inline decaf_error_t WARN_UNUSED verify_noexcept ( | |||
| const FixedBlock<DECAF_EDDSA_25519_SIGNATURE_BYTES> &sig, | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /*NOEXCEPT*/ { | |||
| if (context.size() > 255) { | |||
| return DECAF_FAILURE; | |||
| @@ -261,8 +258,7 @@ public: | |||
| message.size(), | |||
| 0, | |||
| context.data(), | |||
| context.size(), | |||
| no_context | |||
| context.size() | |||
| ); | |||
| } | |||
| @@ -276,14 +272,13 @@ public: | |||
| inline void verify ( | |||
| const FixedBlock<DECAF_EDDSA_25519_SIGNATURE_BYTES> &sig, | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /*throw(LengthException,CryptoException)*/ { | |||
| if (context.size() > 255) { | |||
| throw LengthException(); | |||
| } | |||
| if (DECAF_SUCCESS != verify_noexcept( sig, message, context, no_context )) { | |||
| if (DECAF_SUCCESS != verify_noexcept( sig, message, context )) { | |||
| throw CryptoException(); | |||
| } | |||
| } | |||
| @@ -34,7 +34,7 @@ extern "C" { | |||
| /** Does EdDSA support non-contextual signatures? */ | |||
| #define DECAF_EDDSA_448_NO_CONTEXT 0 | |||
| /** Prehash context renaming macros. */ | |||
| #define decaf_ed448_prehash_ctx_s decaf_shake256_ctx_s | |||
| #define decaf_ed448_prehash_ctx_t decaf_shake256_ctx_t | |||
| @@ -64,7 +64,6 @@ void decaf_ed448_derive_public_key ( | |||
| * @param [in] prehashed Nonzero if the message is actually the hash of something you want to sign. | |||
| * @param [in] context A "context" for this signature of up to 255 bytes. | |||
| * @param [in] context_len Length of the context. | |||
| * @param [in] no_context Nonzero if no context should be used (only Ed25519 supported). | |||
| * | |||
| * @warning For Ed25519, it is unsafe to use the same key for both prehashed and non-prehashed | |||
| * messages, at least without some very careful protocol-level disambiguation. For Ed448 it is | |||
| @@ -79,8 +78,7 @@ void decaf_ed448_sign ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) API_VIS __attribute__((nonnull(1,2,3))) NOINLINE; | |||
| /** | |||
| @@ -128,7 +126,6 @@ void decaf_ed448_prehash_init ( | |||
| * @param [in] prehashed Nonzero if the message is actually the hash of something you want to verify. | |||
| * @param [in] context A "context" for this signature of up to 255 bytes. | |||
| * @param [in] context_len Length of the context. | |||
| * @param [in] no_context Nonzero if no context should be used (only Ed25519 supported). | |||
| * | |||
| * @warning For Ed25519, it is unsafe to use the same key for both prehashed and non-prehashed | |||
| * messages, at least without some very careful protocol-level disambiguation. For Ed448 it is | |||
| @@ -142,8 +139,7 @@ decaf_error_t decaf_ed448_verify ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) API_VIS __attribute__((nonnull(1,2))) NOINLINE; | |||
| /** | |||
| @@ -141,8 +141,7 @@ public: | |||
| */ | |||
| inline SecureBuffer sign ( | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /* TODO: this exn spec tickles a Clang bug? | |||
| * throw(LengthException, std::bad_alloc) | |||
| */ { | |||
| @@ -159,8 +158,7 @@ public: | |||
| message.size(), | |||
| 0, | |||
| context.data(), | |||
| context.size(), | |||
| no_context | |||
| context.size() | |||
| ); | |||
| return out; | |||
| } | |||
| @@ -247,8 +245,7 @@ public: | |||
| inline decaf_error_t WARN_UNUSED verify_noexcept ( | |||
| const FixedBlock<DECAF_EDDSA_448_SIGNATURE_BYTES> &sig, | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /*NOEXCEPT*/ { | |||
| if (context.size() > 255) { | |||
| return DECAF_FAILURE; | |||
| @@ -261,8 +258,7 @@ public: | |||
| message.size(), | |||
| 0, | |||
| context.data(), | |||
| context.size(), | |||
| no_context | |||
| context.size() | |||
| ); | |||
| } | |||
| @@ -276,14 +272,13 @@ public: | |||
| inline void verify ( | |||
| const FixedBlock<DECAF_EDDSA_448_SIGNATURE_BYTES> &sig, | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /*throw(LengthException,CryptoException)*/ { | |||
| if (context.size() > 255) { | |||
| throw LengthException(); | |||
| } | |||
| if (DECAF_SUCCESS != verify_noexcept( sig, message, context, no_context )) { | |||
| if (DECAF_SUCCESS != verify_noexcept( sig, message, context )) { | |||
| throw CryptoException(); | |||
| } | |||
| } | |||
| @@ -49,21 +49,18 @@ static void hash_init_with_dom( | |||
| uint8_t prehashed, | |||
| uint8_t for_prehash, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| hash_init(hash); | |||
| #if NO_CONTEXT | |||
| if (no_context) { | |||
| if (context_len == 0 && context == ED$(gf_shortname)_NO_CONTEXT) { | |||
| (void)prehashed; | |||
| (void)for_prehash; | |||
| (void)context; | |||
| (void)context_len; | |||
| return; | |||
| } | |||
| #else | |||
| (void)no_context; | |||
| #endif | |||
| const char *dom_s = "$(eddsa_dom)"; | |||
| const uint8_t dom[2] = {2+word_is_zero(prehashed)+word_is_zero(for_prehash), context_len}; | |||
| @@ -125,8 +122,7 @@ void decaf_ed$(gf_shortname)_sign ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| API_NS(scalar_t) secret_scalar; | |||
| hash_ctx_t hash; | |||
| @@ -146,7 +142,7 @@ void decaf_ed$(gf_shortname)_sign ( | |||
| API_NS(scalar_decode_long)(secret_scalar, expanded.secret_scalar_ser, sizeof(expanded.secret_scalar_ser)); | |||
| /* Hash to create the nonce */ | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,expanded.seed,sizeof(expanded.seed)); | |||
| hash_update(hash,message,message_len); | |||
| decaf_bzero(&expanded, sizeof(expanded)); | |||
| @@ -180,7 +176,7 @@ void decaf_ed$(gf_shortname)_sign ( | |||
| API_NS(scalar_t) challenge_scalar; | |||
| { | |||
| /* Compute the challenge */ | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,nonce_point,sizeof(nonce_point)); | |||
| hash_update(hash,pubkey,DECAF_EDDSA_$(gf_shortname)_PUBLIC_BYTES); | |||
| hash_update(hash,message,message_len); | |||
| @@ -220,7 +216,7 @@ void decaf_ed$(gf_shortname)_sign_prehash ( | |||
| hash_destroy(hash_too); | |||
| } | |||
| decaf_ed$(gf_shortname)_sign(signature,privkey,pubkey,hash_output,sizeof(hash_output),1,context,context_len,0); | |||
| decaf_ed$(gf_shortname)_sign(signature,privkey,pubkey,hash_output,sizeof(hash_output),1,context,context_len); | |||
| decaf_bzero(hash_output,sizeof(hash_output)); | |||
| } | |||
| @@ -231,8 +227,7 @@ decaf_error_t decaf_ed$(gf_shortname)_verify ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) { | |||
| API_NS(point_t) pk_point, r_point; | |||
| decaf_error_t error = API_NS(point_decode_like_eddsa_and_ignore_cofactor)(pk_point,pubkey); | |||
| @@ -245,7 +240,7 @@ decaf_error_t decaf_ed$(gf_shortname)_verify ( | |||
| { | |||
| /* Compute the challenge */ | |||
| hash_ctx_t hash; | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len,no_context); | |||
| hash_init_with_dom(hash,prehashed,0,context,context_len); | |||
| hash_update(hash,signature,DECAF_EDDSA_$(gf_shortname)_PUBLIC_BYTES); | |||
| hash_update(hash,pubkey,DECAF_EDDSA_$(gf_shortname)_PUBLIC_BYTES); | |||
| hash_update(hash,message,message_len); | |||
| @@ -296,7 +291,7 @@ decaf_error_t decaf_ed$(gf_shortname)_verify_prehash ( | |||
| hash_destroy(hash_too); | |||
| } | |||
| ret = decaf_ed$(gf_shortname)_verify(signature,pubkey,hash_output,sizeof(hash_output),1,context,context_len,0); | |||
| ret = decaf_ed$(gf_shortname)_verify(signature,pubkey,hash_output,sizeof(hash_output),1,context,context_len); | |||
| return ret; | |||
| } | |||
| @@ -19,7 +19,7 @@ extern "C" { | |||
| /** Does EdDSA support non-contextual signatures? */ | |||
| #define DECAF_EDDSA_$(gf_shortname)_NO_CONTEXT $(eddsa_no_context) | |||
| $("const uint8_t * const ED" + gf_shortname + "_NO_CONTEXT = (const uint8_t * const)(" + gf_shortname + ");\n" if eddsa_no_context else "") | |||
| /** Prehash context renaming macros. */ | |||
| #define decaf_ed$(gf_shortname)_prehash_ctx_s decaf_$(eddsa_hash)_ctx_s | |||
| #define decaf_ed$(gf_shortname)_prehash_ctx_t decaf_$(eddsa_hash)_ctx_t | |||
| @@ -49,7 +49,6 @@ void decaf_ed$(gf_shortname)_derive_public_key ( | |||
| * @param [in] prehashed Nonzero if the message is actually the hash of something you want to sign. | |||
| * @param [in] context A "context" for this signature of up to 255 bytes. | |||
| * @param [in] context_len Length of the context. | |||
| * @param [in] no_context Nonzero if no context should be used (only Ed25519 supported). | |||
| * | |||
| * @warning For Ed25519, it is unsafe to use the same key for both prehashed and non-prehashed | |||
| * messages, at least without some very careful protocol-level disambiguation. For Ed448 it is | |||
| @@ -64,8 +63,7 @@ void decaf_ed$(gf_shortname)_sign ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) API_VIS __attribute__((nonnull(1,2,3))) NOINLINE; | |||
| /** | |||
| @@ -113,7 +111,6 @@ void decaf_ed$(gf_shortname)_prehash_init ( | |||
| * @param [in] prehashed Nonzero if the message is actually the hash of something you want to verify. | |||
| * @param [in] context A "context" for this signature of up to 255 bytes. | |||
| * @param [in] context_len Length of the context. | |||
| * @param [in] no_context Nonzero if no context should be used (only Ed25519 supported). | |||
| * | |||
| * @warning For Ed25519, it is unsafe to use the same key for both prehashed and non-prehashed | |||
| * messages, at least without some very careful protocol-level disambiguation. For Ed448 it is | |||
| @@ -127,8 +124,7 @@ decaf_error_t decaf_ed$(gf_shortname)_verify ( | |||
| size_t message_len, | |||
| uint8_t prehashed, | |||
| const uint8_t *context, | |||
| uint8_t context_len, | |||
| uint8_t no_context | |||
| uint8_t context_len | |||
| ) API_VIS __attribute__((nonnull(1,2))) NOINLINE; | |||
| /** | |||
| @@ -125,8 +125,7 @@ public: | |||
| */ | |||
| inline SecureBuffer sign ( | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /* TODO: this exn spec tickles a Clang bug? | |||
| * throw(LengthException, std::bad_alloc) | |||
| */ { | |||
| @@ -143,8 +142,7 @@ public: | |||
| message.size(), | |||
| 0, | |||
| context.data(), | |||
| context.size(), | |||
| no_context | |||
| context.size() | |||
| ); | |||
| return out; | |||
| } | |||
| @@ -231,8 +229,7 @@ public: | |||
| inline decaf_error_t WARN_UNUSED verify_noexcept ( | |||
| const FixedBlock<DECAF_EDDSA_$(gf_shortname)_SIGNATURE_BYTES> &sig, | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /*NOEXCEPT*/ { | |||
| if (context.size() > 255) { | |||
| return DECAF_FAILURE; | |||
| @@ -245,8 +242,7 @@ public: | |||
| message.size(), | |||
| 0, | |||
| context.data(), | |||
| context.size(), | |||
| no_context | |||
| context.size() | |||
| ); | |||
| } | |||
| @@ -260,14 +256,13 @@ public: | |||
| inline void verify ( | |||
| const FixedBlock<DECAF_EDDSA_$(gf_shortname)_SIGNATURE_BYTES> &sig, | |||
| const Block &message, | |||
| const Block &context = Block(NULL,0), | |||
| const bool no_context = false | |||
| const Block &context = Block(NULL,0) | |||
| ) const /*throw(LengthException,CryptoException)*/ { | |||
| if (context.size() > 255) { | |||
| throw LengthException(); | |||
| } | |||
| if (DECAF_SUCCESS != verify_noexcept( sig, message, context, no_context )) { | |||
| if (DECAF_SUCCESS != verify_noexcept( sig, message, context )) { | |||
| throw CryptoException(); | |||
| } | |||
| } | |||
| @@ -469,7 +469,7 @@ static void test_cfrg_crypto() { | |||
| } | |||
| } | |||
| static const bool eddsa_prehashed[], eddsa_no_context[]; | |||
| static const bool eddsa_prehashed[]; | |||
| static const Block eddsa_sk[], eddsa_pk[], eddsa_message[], eddsa_context[], eddsa_sig[]; | |||
| static void test_cfrg_vectors() { | |||
| @@ -499,7 +499,7 @@ static void test_cfrg_vectors() { | |||
| typename EdDSA<Group>::PrivateKeyPh priv2(eddsa_sk[t]); | |||
| sig = priv2.sign_with_prehash(eddsa_message[t],eddsa_context[t]); | |||
| } else { | |||
| sig = priv.sign(eddsa_message[t],eddsa_context[t],eddsa_no_context[t]); | |||
| sig = priv.sign(eddsa_message[t],eddsa_context[t]); | |||
| } | |||
| if (!memeq(SecureBuffer(eddsa_sig[t]),sig)) { | |||
| @@ -346,15 +346,6 @@ template<> const Block Tests<Ed448Goldilocks>::eddsa_context[] = { | |||
| Block(NULL,0), | |||
| Block(ed448_eddsa_context[0],3) | |||
| }; | |||
| template<> const bool Tests<Ed448Goldilocks>::eddsa_no_context[] = { | |||
| false, | |||
| false, | |||
| false, | |||
| false, | |||
| false, | |||
| false, | |||
| false | |||
| }; | |||
| template<> const Block Tests<Ed448Goldilocks>::eddsa_sig[] = { | |||
| Block(ed448_eddsa_sig[0],114), | |||
| Block(ed448_eddsa_sig[1],114), | |||
| @@ -516,21 +507,13 @@ template<> const Block Tests<IsoEd25519>::eddsa_pk[] = { | |||
| Block(ed25519_eddsa_pk[4],32) | |||
| }; | |||
| template<> const Block Tests<IsoEd25519>::eddsa_context[] = { | |||
| Block(NULL,0), | |||
| Block(NULL,0), | |||
| Block(NULL,0), | |||
| Block(ED25519_NO_CONTEXT,0), | |||
| Block(ED25519_NO_CONTEXT,0), | |||
| Block(ED25519_NO_CONTEXT,0), | |||
| Block(NULL,0), | |||
| Block(ed25519_eddsa_context[0],3), | |||
| Block(ed25519_eddsa_context[1],3) | |||
| }; | |||
| template<> const bool Tests<IsoEd25519>::eddsa_no_context[] = { | |||
| true, | |||
| true, | |||
| true, | |||
| false, | |||
| false, | |||
| false | |||
| }; | |||
| template<> const Block Tests<IsoEd25519>::eddsa_message[] = { | |||
| Block(ed25519_eddsa_message[0],0), | |||
| Block(ed25519_eddsa_message[1],1), | |||