| @@ -88,7 +88,7 @@ HEADERS= Makefile $(shell find src test -name "*.h") $(BUILD_OBJ)/timestamp | |||
| HEADERSXX = $(HEADERS) $(shell find . -name "*.hxx") | |||
| # components needed by the lib | |||
| LIBCOMPONENTS = $(BUILD_OBJ)/utils.o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto.o # and per-field components | |||
| LIBCOMPONENTS = $(BUILD_OBJ)/utils.o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto_255.o $(BUILD_OBJ)/decaf_crypto_448.o # and per-field components | |||
| BENCHCOMPONENTS = $(BUILD_OBJ)/bench.o $(BUILD_OBJ)/shake.o | |||
| @@ -1,14 +1,14 @@ | |||
| /** | |||
| * @cond internal | |||
| * @file decaf_crypto.c | |||
| * @file decaf_crypto_255.c | |||
| * @copyright | |||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | |||
| * Released under the MIT License. See LICENSE.txt for license information. | |||
| * @author Mike Hamburg | |||
| * @brief Example Decaf cyrpto routines. | |||
| * @brief Example Decaf crypto routines, 255-bit version. | |||
| */ | |||
| #include <decaf/crypto.h> | |||
| #include <decaf/crypto_255.h> | |||
| #include <string.h> | |||
| static const unsigned int DECAF_255_SCALAR_OVERKILL_BYTES = DECAF_255_SCALAR_BYTES + 8; | |||
| @@ -0,0 +1,213 @@ | |||
| /** | |||
| * @cond internal | |||
| * @file decaf_crypto_448.c | |||
| * @copyright | |||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | |||
| * Released under the MIT License. See LICENSE.txt for license information. | |||
| * @author Mike Hamburg | |||
| * @brief Example Decaf crypto routines, 448-bit version | |||
| * @todo TODO don't copy-paste. | |||
| */ | |||
| #include <decaf/crypto_448.h> | |||
| #include <string.h> | |||
| static const unsigned int DECAF_448_SCALAR_OVERKILL_BYTES = DECAF_448_SCALAR_BYTES + 8; | |||
| void decaf_448_derive_private_key ( | |||
| decaf_448_private_key_t priv, | |||
| const decaf_448_symmetric_key_t proto | |||
| ) { | |||
| const char *magic = "decaf::derive_448_private_key"; /* TODO: canonicalize and freeze */ | |||
| uint8_t encoded_scalar[DECAF_448_SCALAR_OVERKILL_BYTES]; | |||
| decaf_448_point_t pub; | |||
| keccak_strobe_t strobe; | |||
| strobe_init(strobe, &STROBE_256, magic, 0); | |||
| strobe_key(strobe, proto, sizeof(decaf_448_symmetric_key_t)); | |||
| strobe_prng(strobe, encoded_scalar, sizeof(encoded_scalar)); | |||
| strobe_destroy(strobe); | |||
| memcpy(priv->sym, proto, sizeof(decaf_448_symmetric_key_t)); | |||
| decaf_448_scalar_decode_long(priv->secret_scalar, encoded_scalar, sizeof(encoded_scalar)); | |||
| decaf_448_precomputed_scalarmul(pub, decaf_448_precomputed_base, priv->secret_scalar); | |||
| decaf_448_point_encode(priv->pub, pub); | |||
| decaf_bzero(encoded_scalar, sizeof(encoded_scalar)); | |||
| } | |||
| void | |||
| decaf_448_destroy_private_key ( | |||
| decaf_448_private_key_t priv | |||
| ) { | |||
| decaf_bzero((void*)priv, sizeof(decaf_448_private_key_t)); | |||
| } | |||
| void decaf_448_private_to_public ( | |||
| decaf_448_public_key_t pub, | |||
| const decaf_448_private_key_t priv | |||
| ) { | |||
| memcpy(pub, priv->pub, sizeof(decaf_448_public_key_t)); | |||
| } | |||
| static const uint16_t SHARED_SECRET_MAX_BLOCK_SIZE = 1<<12; /* TODO: standardize and freeze */ | |||
| decaf_error_t | |||
| decaf_448_shared_secret ( | |||
| uint8_t *shared, | |||
| size_t shared_bytes, | |||
| const decaf_448_private_key_t my_privkey, | |||
| const decaf_448_public_key_t your_pubkey, | |||
| int me_first | |||
| ) { | |||
| const char *magic = "decaf::decaf_448_shared_secret"; /* TODO: canonicalize and freeze */ | |||
| keccak_strobe_t strobe; | |||
| strobe_init(strobe, &STROBE_256, magic, 0); | |||
| uint8_t ss_ser[DECAF_448_SER_BYTES]; | |||
| if (me_first) { | |||
| strobe_ad(strobe,my_privkey->pub,sizeof(decaf_448_public_key_t)); | |||
| strobe_ad(strobe,your_pubkey,sizeof(decaf_448_public_key_t)); | |||
| } else { | |||
| strobe_ad(strobe,your_pubkey,sizeof(decaf_448_public_key_t)); | |||
| strobe_ad(strobe,my_privkey->pub,sizeof(decaf_448_public_key_t)); | |||
| } | |||
| decaf_error_t ret = decaf_448_direct_scalarmul( | |||
| ss_ser, your_pubkey, my_privkey->secret_scalar, DECAF_FALSE, DECAF_TRUE | |||
| ); | |||
| strobe_transact(strobe,NULL,ss_ser,sizeof(ss_ser),STROBE_CW_DH_KEY); | |||
| while (shared_bytes) { | |||
| uint16_t cando = (shared_bytes > SHARED_SECRET_MAX_BLOCK_SIZE) | |||
| ? SHARED_SECRET_MAX_BLOCK_SIZE : shared_bytes; | |||
| strobe_prng(strobe,shared,cando); | |||
| shared_bytes -= cando; | |||
| shared += cando; | |||
| } | |||
| strobe_destroy(strobe); | |||
| decaf_bzero(ss_ser, sizeof(ss_ser)); | |||
| return ret; | |||
| } | |||
| void | |||
| decaf_448_sign_strobe ( | |||
| keccak_strobe_t strobe, | |||
| decaf_448_signature_t sig, | |||
| const decaf_448_private_key_t priv | |||
| ) { | |||
| uint8_t overkill[DECAF_448_SCALAR_OVERKILL_BYTES]; | |||
| decaf_448_point_t point; | |||
| decaf_448_scalar_t nonce, challenge; | |||
| /* Stir pubkey */ | |||
| strobe_transact(strobe,NULL,priv->pub,sizeof(decaf_448_public_key_t),STROBE_CW_SIG_PK); | |||
| /* Derive nonce */ | |||
| keccak_strobe_t strobe2; | |||
| memcpy(strobe2,strobe,sizeof(strobe2)); | |||
| strobe_key(strobe2,priv->sym,sizeof(decaf_448_symmetric_key_t)); | |||
| strobe_prng(strobe2,overkill,sizeof(overkill)); | |||
| strobe_destroy(strobe2); | |||
| decaf_448_scalar_decode_long(nonce, overkill, sizeof(overkill)); | |||
| decaf_448_precomputed_scalarmul(point, decaf_448_precomputed_base, nonce); | |||
| decaf_448_point_encode(sig, point); | |||
| /* Derive challenge */ | |||
| strobe_transact(strobe,NULL,sig,DECAF_448_SER_BYTES,STROBE_CW_SIG_EPH); | |||
| strobe_transact(strobe,overkill,NULL,sizeof(overkill),STROBE_CW_SIG_CHAL); | |||
| decaf_448_scalar_decode_long(challenge, overkill, sizeof(overkill)); | |||
| /* Respond */ | |||
| decaf_448_scalar_mul(challenge, challenge, priv->secret_scalar); | |||
| decaf_448_scalar_sub(nonce, nonce, challenge); | |||
| /* Save results */ | |||
| decaf_448_scalar_encode(overkill, nonce); | |||
| strobe_transact(strobe,&sig[DECAF_448_SER_BYTES],overkill,DECAF_448_SCALAR_BYTES,STROBE_CW_SIG_RESP); | |||
| /* Clean up */ | |||
| decaf_448_scalar_destroy(nonce); | |||
| decaf_448_scalar_destroy(challenge); | |||
| decaf_bzero(overkill,sizeof(overkill)); | |||
| } | |||
| decaf_error_t | |||
| decaf_448_verify_strobe ( | |||
| keccak_strobe_t strobe, | |||
| const decaf_448_signature_t sig, | |||
| const decaf_448_public_key_t pub | |||
| ) { | |||
| decaf_bool_t ret; | |||
| uint8_t overkill[DECAF_448_SCALAR_OVERKILL_BYTES]; | |||
| decaf_448_point_t point, pubpoint; | |||
| decaf_448_scalar_t challenge, response; | |||
| /* Stir pubkey */ | |||
| strobe_transact(strobe,NULL,pub,sizeof(decaf_448_public_key_t),STROBE_CW_SIG_PK); | |||
| /* Derive nonce */ | |||
| strobe_transact(strobe,NULL,sig,DECAF_448_SER_BYTES,STROBE_CW_SIG_EPH); | |||
| ret = decaf_successful( decaf_448_point_decode(point, sig, DECAF_TRUE) ); | |||
| /* Derive challenge */ | |||
| strobe_transact(strobe,overkill,NULL,sizeof(overkill),STROBE_CW_SIG_CHAL); | |||
| decaf_448_scalar_decode_long(challenge, overkill, sizeof(overkill)); | |||
| /* Decode response */ | |||
| strobe_transact(strobe,overkill,&sig[DECAF_448_SER_BYTES],DECAF_448_SCALAR_BYTES,STROBE_CW_SIG_RESP); | |||
| ret &= decaf_successful( decaf_448_scalar_decode(response, overkill) ); | |||
| ret &= decaf_successful( decaf_448_point_decode(pubpoint, pub, DECAF_FALSE) ); | |||
| decaf_448_base_double_scalarmul_non_secret ( | |||
| pubpoint, response, pubpoint, challenge | |||
| ); | |||
| ret &= decaf_448_point_eq(pubpoint, point); | |||
| /* Nothing here is secret, so don't do these things: | |||
| decaf_bzero(overkill,sizeof(overkill)); | |||
| decaf_448_point_destroy(point); | |||
| decaf_448_point_destroy(pubpoint); | |||
| decaf_448_scalar_destroy(challenge); | |||
| decaf_448_scalar_destroy(response); | |||
| */ | |||
| return decaf_succeed_if(ret); | |||
| } | |||
| void | |||
| decaf_448_sign ( | |||
| decaf_448_signature_t sig, | |||
| const decaf_448_private_key_t priv, | |||
| const unsigned char *message, | |||
| size_t message_len | |||
| ) { | |||
| keccak_strobe_t ctx; | |||
| strobe_init(ctx,&STROBE_256,"decaf::decaf_448_sign",0); /* TODO: canonicalize and freeze */ | |||
| strobe_transact(ctx, NULL, message, message_len, STROBE_CW_STREAMING_PLAINTEXT); | |||
| decaf_448_sign_strobe(ctx, sig, priv); | |||
| strobe_destroy(ctx); | |||
| } | |||
| decaf_error_t | |||
| decaf_448_verify ( | |||
| const decaf_448_signature_t sig, | |||
| const decaf_448_public_key_t pub, | |||
| const unsigned char *message, | |||
| size_t message_len | |||
| ) { | |||
| keccak_strobe_t ctx; | |||
| strobe_init(ctx,&STROBE_256,"decaf::decaf_448_sign",0); /* TODO: canonicalize and freeze */ | |||
| strobe_transact(ctx, NULL, message, message_len, STROBE_CW_STREAMING_PLAINTEXT); | |||
| decaf_error_t ret = decaf_448_verify_strobe(ctx, sig, pub); | |||
| strobe_destroy(ctx); | |||
| return ret; | |||
| } | |||
| @@ -6,7 +6,8 @@ | |||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | |||
| * Released under the MIT License. See LICENSE.txt for license information. | |||
| * | |||
| * @brief Example cryptography using Decaf | |||
| * @brief Example cryptography using Decaf. | |||
| * @warning FIXME: this is out of sync with crypto_*.h | |||
| */ | |||
| #ifndef __DECAF_CRYPTO_HXX__ | |||
| #define __DECAF_CRYPTO_HXX__ 1 | |||
| @@ -1,5 +1,5 @@ | |||
| /** | |||
| * @file decaf/crypto.h | |||
| * @file decaf/crypto_255.h | |||
| * @copyright | |||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | |||
| * Released under the MIT License. See LICENSE.txt for license information. | |||
| @@ -11,10 +11,10 @@ | |||
| * @warning Experimental! The names, parameter orders etc are likely to change. | |||
| */ | |||
| #ifndef __DECAF_CRYPTO_H__ | |||
| #define __DECAF_CRYPTO_H__ 1 | |||
| #ifndef __DECAF_CRYPTO_255_H__ | |||
| #define __DECAF_CRYPTO_255_H__ 1 | |||
| #include <decaf.h> | |||
| #include <decaf/decaf_255.h> | |||
| #include <decaf/shake.h> | |||
| /** Number of bytes for a symmetric key (expanded to full key) */ | |||
| @@ -188,6 +188,6 @@ decaf_255_verify ( | |||
| } /* extern "C" */ | |||
| #endif | |||
| #endif /* __DECAF_CRYPTO_H__ */ | |||
| #endif /* __DECAF_CRYPTO_255_H__ */ | |||
| @@ -0,0 +1,193 @@ | |||
| /** | |||
| * @file decaf/crypto_448.h | |||
| * @copyright | |||
| * Copyright (c) 2015 Cryptography Research, Inc. \n | |||
| * Released under the MIT License. See LICENSE.txt for license information. | |||
| * @author Mike Hamburg | |||
| * @brief Example Decaf cyrpto routines. | |||
| * @warning These are merely examples, though they ought to be secure. But real | |||
| * protocols will decide differently on magic numbers, formats, which items to | |||
| * hash, etc. | |||
| * @warning Experimental! The names, parameter orders etc are likely to change. | |||
| */ | |||
| #ifndef __DECAF_CRYPTO_448_H__ | |||
| #define __DECAF_CRYPTO_448_H__ 1 | |||
| #include <decaf/decaf_448.h> | |||
| #include <decaf/shake.h> | |||
| /** Number of bytes for a symmetric key (expanded to full key) */ | |||
| #define DECAF_448_SYMMETRIC_KEY_BYTES 32 | |||
| /** @cond internal */ | |||
| #define API_VIS __attribute__((visibility("default"))) __attribute__((noinline)) // TODO: synergize with decaf.h | |||
| #define WARN_UNUSED __attribute__((warn_unused_result)) | |||
| #define NONNULL1 __attribute__((nonnull(1))) | |||
| #define NONNULL2 __attribute__((nonnull(1,2))) | |||
| #define NONNULL3 __attribute__((nonnull(1,2,3))) | |||
| #define NONNULL134 __attribute__((nonnull(1,3,4))) | |||
| #define NONNULL5 __attribute__((nonnull(1,2,3,4,5))) | |||
| /** @endcond */ | |||
| /** A symmetric key, the compressed point of a private key. */ | |||
| typedef unsigned char decaf_448_symmetric_key_t[DECAF_448_SYMMETRIC_KEY_BYTES]; | |||
| /** An encoded public key. */ | |||
| typedef unsigned char decaf_448_public_key_t[DECAF_448_SER_BYTES]; | |||
| /** A signature. */ | |||
| typedef unsigned char decaf_448_signature_t[DECAF_448_SER_BYTES + DECAF_448_SCALAR_BYTES]; | |||
| typedef struct { | |||
| /** @cond intetrnal */ | |||
| /** The symmetric key from which everything is expanded */ | |||
| decaf_448_symmetric_key_t sym; | |||
| /** The scalar x */ | |||
| decaf_448_scalar_t secret_scalar; | |||
| /** x*Base */ | |||
| decaf_448_public_key_t pub; | |||
| /** @endcond */ | |||
| } /** Private key structure for pointers. */ | |||
| decaf_448_private_key_s, | |||
| /** A private key (gmp array[1] style). */ | |||
| decaf_448_private_key_t[1]; | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** | |||
| * @brief Derive a key from its compressed form. | |||
| * @param [out] priv The derived private key. | |||
| * @param [in] proto The compressed or proto-key, which must be 32 random bytes. | |||
| */ | |||
| void decaf_448_derive_private_key ( | |||
| decaf_448_private_key_t priv, | |||
| const decaf_448_symmetric_key_t proto | |||
| ) NONNULL2 API_VIS; | |||
| /** | |||
| * @brief Destroy a private key. | |||
| */ | |||
| void decaf_448_destroy_private_key ( | |||
| decaf_448_private_key_t priv | |||
| ) NONNULL1 API_VIS; | |||
| /** | |||
| * @brief Convert a private key to a public one. | |||
| * @param [out] pub The extracted private key. | |||
| * @param [in] priv The private key. | |||
| */ | |||
| void decaf_448_private_to_public ( | |||
| decaf_448_public_key_t pub, | |||
| const decaf_448_private_key_t priv | |||
| ) NONNULL2 API_VIS; | |||
| /** | |||
| * @brief Compute a Diffie-Hellman shared secret. | |||
| * | |||
| * This is an example routine; real protocols would use something | |||
| * protocol-specific. | |||
| * | |||
| * @param [out] shared A buffer to store the shared secret. | |||
| * @param [in] shared_bytes The size of the buffer. | |||
| * @param [in] my_privkey My private key. | |||
| * @param [in] your_pubkey Your public key. | |||
| * @param [in] me_first Direction flag to break symmetry. | |||
| * | |||
| * @retval DECAF_SUCCESS Key exchange was successful. | |||
| * @retval DECAF_FAILURE Key exchange failed. | |||
| */ | |||
| decaf_error_t | |||
| decaf_448_shared_secret ( | |||
| uint8_t *shared, | |||
| size_t shared_bytes, | |||
| const decaf_448_private_key_t my_privkey, | |||
| const decaf_448_public_key_t your_pubkey, | |||
| int me_first | |||
| ) NONNULL134 WARN_UNUSED API_VIS; | |||
| /** | |||
| * @brief Sign a message from a STROBE context. | |||
| * | |||
| * @param [out] sig The signature. | |||
| * @param [in] priv Your private key. | |||
| * @param [in] strobe A STROBE context with the message. | |||
| */ | |||
| void | |||
| decaf_448_sign_strobe ( | |||
| keccak_strobe_t strobe, | |||
| decaf_448_signature_t sig, | |||
| const decaf_448_private_key_t priv | |||
| ) NONNULL3 API_VIS; | |||
| /** | |||
| * @brief Sign a message. | |||
| * | |||
| * @param [out] sig The signature. | |||
| * @param [in] priv Your private key. | |||
| * @param [in] message The message. | |||
| * @param [in] message_len The message's length. | |||
| */ | |||
| void | |||
| decaf_448_sign ( | |||
| decaf_448_signature_t sig, | |||
| const decaf_448_private_key_t priv, | |||
| const unsigned char *message, | |||
| size_t message_len | |||
| ) NONNULL3 API_VIS; | |||
| /** | |||
| * @brief Verify a signed message from its STROBE context. | |||
| * | |||
| * @param [in] sig The signature. | |||
| * @param [in] pub The public key. | |||
| * @param [in] strobe A STROBE context with the message. | |||
| * | |||
| * @return DECAF_SUCCESS The signature verified successfully. | |||
| * @return DECAF_FAILURE The signature did not verify successfully. | |||
| */ | |||
| decaf_error_t | |||
| decaf_448_verify_strobe ( | |||
| keccak_strobe_t strobe, | |||
| const decaf_448_signature_t sig, | |||
| const decaf_448_public_key_t pub | |||
| ) NONNULL3 API_VIS WARN_UNUSED; | |||
| /** | |||
| * @brief Verify a signed message. | |||
| * | |||
| * @param [in] sig The signature. | |||
| * @param [in] pub The public key. | |||
| * @param [in] message The message. | |||
| * @param [in] message_len The message's length. | |||
| * | |||
| * @return DECAF_SUCCESS The signature verified successfully. | |||
| * @return DECAF_FAILURE The signature did not verify successfully. | |||
| */ | |||
| decaf_error_t | |||
| decaf_448_verify ( | |||
| const decaf_448_signature_t sig, | |||
| const decaf_448_public_key_t pub, | |||
| const unsigned char *message, | |||
| size_t message_len | |||
| ) NONNULL3 API_VIS WARN_UNUSED; | |||
| #undef API_VIS | |||
| #undef WARN_UNUSED | |||
| #undef NONNULL1 | |||
| #undef NONNULL2 | |||
| #undef NONNULL3 | |||
| #undef NONNULL134 | |||
| #undef NONNULL5 | |||
| #ifdef __cplusplus | |||
| } /* extern "C" */ | |||
| #endif | |||
| #endif /* __DECAF_CRYPTO_448_H__ */ | |||
| @@ -583,7 +583,7 @@ void strobe_transact ( | |||
| uint32_t len = sponge->params->rate - sponge->params->position; | |||
| if (len < STROBE_FORGET_BYTES + len_cw) len += sponge->params->rate; | |||
| len -= len_cw; | |||
| len -= len_cw; /* HACK */ | |||
| if (cw_flags & STROBE_FLAG_NO_LENGTH) len = 2*STROBE_FORGET_BYTES; | |||
| @@ -11,7 +11,8 @@ | |||
| #include <decaf.hxx> | |||
| #include <decaf/shake.hxx> | |||
| #include <decaf/crypto.h> | |||
| #include <decaf/crypto_255.h> | |||
| #include <decaf/crypto_448.h> | |||
| #include <decaf/crypto.hxx> | |||
| #include <stdio.h> | |||
| #include <sys/time.h> | |||
| @@ -374,13 +375,8 @@ int main(int argc, char **argv) { | |||
| bool micro = false; | |||
| if (argc >= 2 && !strcmp(argv[1], "--micro")) | |||
| micro = true; | |||
| decaf_255_public_key_t p1,p2; | |||
| decaf_255_private_key_t s1,s2; | |||
| decaf_255_symmetric_key_t r1,r2; | |||
| decaf_255_signature_t sig1; | |||
| unsigned char ss[32]; | |||
| memset(r1,1,sizeof(r1)); | |||
| memset(r2,2,sizeof(r2)); | |||
| @@ -421,32 +417,72 @@ int main(int argc, char **argv) { | |||
| Benches<Ed448Goldilocks>::micro(); | |||
| } | |||
| /* TODO: 255->448 */ | |||
| printf("\nMacro-benchmarks:\n"); | |||
| for (Benchmark b("Keygen"); b.iter(); ) { | |||
| decaf_255_derive_private_key(s1,r1); | |||
| } | |||
| { | |||
| decaf_255_public_key_t p1,p2; | |||
| decaf_255_private_key_t s1,s2; | |||
| decaf_255_signature_t sig1; | |||
| unsigned char ss[32]; | |||
| printf("\nMacro-benchmarks for IsoEd25519:\n"); | |||
| for (Benchmark b("Keygen"); b.iter(); ) { | |||
| decaf_255_derive_private_key(s1,r1); | |||
| } | |||
| decaf_255_private_to_public(p1,s1); | |||
| decaf_255_derive_private_key(s2,r2); | |||
| decaf_255_private_to_public(p2,s2); | |||
| decaf_255_private_to_public(p1,s1); | |||
| decaf_255_derive_private_key(s2,r2); | |||
| decaf_255_private_to_public(p2,s2); | |||
| for (Benchmark b("Shared secret"); b.iter(); ) { | |||
| decaf_bool_t ret = decaf_255_shared_secret(ss,sizeof(ss),s1,p2,1); | |||
| ignore_result(ret); | |||
| assert(ret); | |||
| } | |||
| for (Benchmark b("Shared secret"); b.iter(); ) { | |||
| decaf_bool_t ret = decaf_255_shared_secret(ss,sizeof(ss),s1,p2,1); | |||
| ignore_result(ret); | |||
| assert(ret); | |||
| } | |||
| for (Benchmark b("Sign"); b.iter(); ) { | |||
| decaf_255_sign(sig1,s1,umessage,lmessage); | |||
| } | |||
| for (Benchmark b("Sign"); b.iter(); ) { | |||
| decaf_255_sign(sig1,s1,umessage,lmessage); | |||
| for (Benchmark b("Verify"); b.iter(); ) { | |||
| decaf_bool_t ret = decaf_255_verify(sig1,p1,umessage,lmessage); | |||
| rng.read(Buffer(umessage,lmessage)); | |||
| // umessage[0]++; | |||
| // umessage[1]^=umessage[0]; | |||
| ignore_result(ret); | |||
| } | |||
| } | |||
| { | |||
| decaf_448_public_key_t p1,p2; | |||
| decaf_448_private_key_t s1,s2; | |||
| decaf_448_signature_t sig1; | |||
| unsigned char ss[32]; | |||
| printf("\nMacro-benchmarks for Ed448-Goldilocks:\n"); | |||
| for (Benchmark b("Keygen"); b.iter(); ) { | |||
| decaf_448_derive_private_key(s1,r1); | |||
| } | |||
| for (Benchmark b("Verify"); b.iter(); ) { | |||
| decaf_bool_t ret = decaf_255_verify(sig1,p1,umessage,lmessage); | |||
| rng.read(Buffer(umessage,lmessage)); | |||
| // umessage[0]++; | |||
| // umessage[1]^=umessage[0]; | |||
| ignore_result(ret); | |||
| decaf_448_private_to_public(p1,s1); | |||
| decaf_448_derive_private_key(s2,r2); | |||
| decaf_448_private_to_public(p2,s2); | |||
| for (Benchmark b("Shared secret"); b.iter(); ) { | |||
| decaf_bool_t ret = decaf_448_shared_secret(ss,sizeof(ss),s1,p2,1); | |||
| ignore_result(ret); | |||
| assert(ret); | |||
| } | |||
| for (Benchmark b("Sign"); b.iter(); ) { | |||
| decaf_448_sign(sig1,s1,umessage,lmessage); | |||
| } | |||
| for (Benchmark b("Verify"); b.iter(); ) { | |||
| decaf_bool_t ret = decaf_448_verify(sig1,p1,umessage,lmessage); | |||
| rng.read(Buffer(umessage,lmessage)); | |||
| // umessage[0]++; | |||
| // umessage[1]^=umessage[0]; | |||
| ignore_result(ret); | |||
| } | |||
| } | |||
| Benches<IsoEd25519>::macro(); | |||
| @@ -11,7 +11,8 @@ | |||
| #include <decaf.hxx> | |||
| #include <decaf/shake.hxx> | |||
| #include <decaf/crypto.h> | |||
| #include <decaf/crypto_255.h> | |||
| #include <decaf/crypto_448.h> | |||
| #include <decaf/crypto.hxx> | |||
| #include <stdio.h> | |||
| @@ -341,8 +342,7 @@ static void test_crypto() { | |||
| }; // template<GroupId GROUP> | |||
| // TODO cross-field | |||
| static void test_decaf() { | |||
| static void test_decaf_255() { | |||
| Test test("Sample crypto"); | |||
| SpongeRng rng(Block("test_decaf")); | |||
| @@ -376,6 +376,41 @@ static void test_decaf() { | |||
| } | |||
| } | |||
| /* TODO: don't copy-paste */ | |||
| static void test_decaf_448() { | |||
| Test test("Sample crypto"); | |||
| SpongeRng rng(Block("test_decaf")); | |||
| decaf_448_symmetric_key_t proto1,proto2; | |||
| decaf_448_private_key_t s1,s2; | |||
| decaf_448_public_key_t p1,p2; | |||
| decaf_448_signature_t sig; | |||
| unsigned char shared1[1234],shared2[1234]; | |||
| const char *message = "Hello, world!"; | |||
| for (int i=0; i<NTESTS && test.passing_now; i++) { | |||
| rng.read(Buffer(proto1,sizeof(proto1))); | |||
| rng.read(Buffer(proto2,sizeof(proto2))); | |||
| decaf_448_derive_private_key(s1,proto1); | |||
| decaf_448_private_to_public(p1,s1); | |||
| decaf_448_derive_private_key(s2,proto2); | |||
| decaf_448_private_to_public(p2,s2); | |||
| if (DECAF_SUCCESS != decaf_448_shared_secret (shared1,sizeof(shared1),s1,p2,0)) { | |||
| test.fail(); printf("Fail ss12\n"); | |||
| } | |||
| if (DECAF_SUCCESS != decaf_448_shared_secret (shared2,sizeof(shared2),s2,p1,1)) { | |||
| test.fail(); printf("Fail ss21\n"); | |||
| } | |||
| if (memcmp(shared1,shared2,sizeof(shared1))) { | |||
| test.fail(); printf("Fail ss21 == ss12\n"); | |||
| } | |||
| decaf_448_sign (sig,s1,(const unsigned char *)message,strlen(message)); | |||
| if (DECAF_SUCCESS != decaf_448_verify (sig,p1,(const unsigned char *)message,strlen(message))) { | |||
| test.fail(); printf("Fail sig ver\n"); | |||
| } | |||
| } | |||
| } | |||
| int main(int argc, char **argv) { | |||
| (void) argc; (void) argv; | |||
| @@ -384,7 +419,7 @@ int main(int argc, char **argv) { | |||
| Tests<IsoEd25519>::test_elligator(); | |||
| Tests<IsoEd25519>::test_ec(); | |||
| Tests<IsoEd25519>::test_crypto(); | |||
| test_decaf(); | |||
| test_decaf_255(); | |||
| printf("\n"); | |||
| printf("Testing %s:\n", Ed448Goldilocks::name()); | |||
| @@ -392,6 +427,7 @@ int main(int argc, char **argv) { | |||
| Tests<Ed448Goldilocks>::test_elligator(); | |||
| Tests<Ed448Goldilocks>::test_ec(); | |||
| Tests<Ed448Goldilocks>::test_crypto(); | |||
| test_decaf_448(); | |||
| if (passing) printf("Passed all tests.\n"); | |||