Move cipher/ into crypto/fipsmodule/ Change-Id: Id65e0988534056a72d9b40cc9ba5194e2d9b8a7c Reviewed-on: https://boringssl-review.googlesource.com/15904 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 596e793..e357a68 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt
@@ -88,7 +88,7 @@ # Level 1, depends only on 0.* add_subdirectory(digest_extra) -add_subdirectory(cipher) +add_subdirectory(cipher_extra) add_subdirectory(rand_extra) add_subdirectory(bio) add_subdirectory(bn_extra) @@ -166,7 +166,7 @@ $<TARGET_OBJECTS:pool> $<TARGET_OBJECTS:fipsmodule> $<TARGET_OBJECTS:digest_extra> - $<TARGET_OBJECTS:cipher> + $<TARGET_OBJECTS:cipher_extra> $<TARGET_OBJECTS:rc4> $<TARGET_OBJECTS:conf> $<TARGET_OBJECTS:chacha>
diff --git a/crypto/cipher/CMakeLists.txt b/crypto/cipher_extra/CMakeLists.txt similarity index 94% rename from crypto/cipher/CMakeLists.txt rename to crypto/cipher_extra/CMakeLists.txt index c1d483d..698161c 100644 --- a/crypto/cipher/CMakeLists.txt +++ b/crypto/cipher_extra/CMakeLists.txt
@@ -10,19 +10,16 @@ endif() add_library( - cipher + cipher_extra OBJECT - cipher.c + cipher_extra.c derive_key.c - aead.c e_null.c e_rc2.c e_rc4.c - e_des.c - e_aes.c e_aesgcmsiv.c e_aesctrhmac.c e_chacha20poly1305.c
diff --git a/crypto/cipher/aead_test.cc b/crypto/cipher_extra/aead_test.cc similarity index 100% rename from crypto/cipher/aead_test.cc rename to crypto/cipher_extra/aead_test.cc
diff --git a/crypto/cipher/asm/aes128gcmsiv-x86_64.pl b/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl similarity index 100% rename from crypto/cipher/asm/aes128gcmsiv-x86_64.pl rename to crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl
diff --git a/crypto/cipher/asm/chacha20_poly1305_x86_64.pl b/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl similarity index 100% rename from crypto/cipher/asm/chacha20_poly1305_x86_64.pl rename to crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl
diff --git a/crypto/cipher/e_null.c b/crypto/cipher_extra/cipher_extra.c similarity index 68% copy from crypto/cipher/e_null.c copy to crypto/cipher_extra/cipher_extra.c index 9f89308..fc8e24b 100644 --- a/crypto/cipher/e_null.c +++ b/crypto/cipher_extra/cipher_extra.c
@@ -56,31 +56,59 @@ #include <openssl/cipher.h> +#include <assert.h> #include <string.h> +#include <openssl/err.h> +#include <openssl/mem.h> #include <openssl/nid.h> -#include "../internal.h" #include "internal.h" +#include "../internal.h" -static int null_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, - const uint8_t *iv, int enc) { - return 1; -} - -static int null_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, - const uint8_t *in, size_t in_len) { - if (in != out) { - OPENSSL_memcpy(out, in, in_len); +const EVP_CIPHER *EVP_get_cipherbynid(int nid) { + switch (nid) { + case NID_rc2_cbc: + return EVP_rc2_cbc(); + case NID_rc2_40_cbc: + return EVP_rc2_40_cbc(); + case NID_des_ede3_cbc: + return EVP_des_ede3_cbc(); + case NID_des_ede_cbc: + return EVP_des_cbc(); + case NID_aes_128_cbc: + return EVP_aes_128_cbc(); + case NID_aes_192_cbc: + return EVP_aes_192_cbc(); + case NID_aes_256_cbc: + return EVP_aes_256_cbc(); + default: + return NULL; } - return 1; } -static const EVP_CIPHER n_cipher = { - NID_undef, 1 /* block size */, 0 /* key_len */, 0 /* iv_len */, - 0 /* ctx_size */, 0 /* flags */, NULL /* app_data */, null_init_key, - null_cipher, NULL /* cleanup */, NULL /* ctrl */, -}; +const EVP_CIPHER *EVP_get_cipherbyname(const char *name) { + if (OPENSSL_strcasecmp(name, "rc4") == 0) { + return EVP_rc4(); + } else if (OPENSSL_strcasecmp(name, "des-cbc") == 0) { + return EVP_des_cbc(); + } else if (OPENSSL_strcasecmp(name, "des-ede3-cbc") == 0 || + OPENSSL_strcasecmp(name, "3des") == 0) { + return EVP_des_ede3_cbc(); + } else if (OPENSSL_strcasecmp(name, "aes-128-cbc") == 0) { + return EVP_aes_128_cbc(); + } else if (OPENSSL_strcasecmp(name, "aes-256-cbc") == 0) { + return EVP_aes_256_cbc(); + } else if (OPENSSL_strcasecmp(name, "aes-128-ctr") == 0) { + return EVP_aes_128_ctr(); + } else if (OPENSSL_strcasecmp(name, "aes-256-ctr") == 0) { + return EVP_aes_256_ctr(); + } else if (OPENSSL_strcasecmp(name, "aes-128-ecb") == 0) { + return EVP_aes_128_ecb(); + } else if (OPENSSL_strcasecmp(name, "aes-256-ecb") == 0) { + return EVP_aes_256_ecb(); + } -const EVP_CIPHER *EVP_enc_null(void) { return &n_cipher; } + return NULL; +}
diff --git a/crypto/cipher/cipher_test.cc b/crypto/cipher_extra/cipher_test.cc similarity index 100% rename from crypto/cipher/cipher_test.cc rename to crypto/cipher_extra/cipher_test.cc
diff --git a/crypto/cipher/derive_key.c b/crypto/cipher_extra/derive_key.c similarity index 99% rename from crypto/cipher/derive_key.c rename to crypto/cipher_extra/derive_key.c index 9e1634a..ff5ae06 100644 --- a/crypto/cipher/derive_key.c +++ b/crypto/cipher_extra/derive_key.c
@@ -61,8 +61,6 @@ #include <openssl/digest.h> #include <openssl/mem.h> -#include "internal.h" - #define PKCS5_SALT_LEN 8
diff --git a/crypto/cipher/e_aesctrhmac.c b/crypto/cipher_extra/e_aesctrhmac.c similarity index 99% rename from crypto/cipher/e_aesctrhmac.c rename to crypto/cipher_extra/e_aesctrhmac.c index f7cd412..2372ef8 100644 --- a/crypto/cipher/e_aesctrhmac.c +++ b/crypto/cipher_extra/e_aesctrhmac.c
@@ -18,7 +18,7 @@ #include <openssl/err.h> #include <openssl/sha.h> -#include "internal.h" +#include "../fipsmodule/cipher/internal.h" #define EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN SHA256_DIGEST_LENGTH
diff --git a/crypto/cipher/e_aesgcmsiv.c b/crypto/cipher_extra/e_aesgcmsiv.c similarity index 99% rename from crypto/cipher/e_aesgcmsiv.c rename to crypto/cipher_extra/e_aesgcmsiv.c index 070f8cd..c7be11c 100644 --- a/crypto/cipher/e_aesgcmsiv.c +++ b/crypto/cipher_extra/e_aesgcmsiv.c
@@ -18,7 +18,7 @@ #include <openssl/crypto.h> #include <openssl/err.h> -#include "internal.h" +#include "../fipsmodule/cipher/internal.h" #if !defined(OPENSSL_SMALL)
diff --git a/crypto/cipher/e_chacha20poly1305.c b/crypto/cipher_extra/e_chacha20poly1305.c similarity index 99% rename from crypto/cipher/e_chacha20poly1305.c rename to crypto/cipher_extra/e_chacha20poly1305.c index c6e81ab..257663c 100644 --- a/crypto/cipher/e_chacha20poly1305.c +++ b/crypto/cipher_extra/e_chacha20poly1305.c
@@ -23,7 +23,7 @@ #include <openssl/mem.h> #include <openssl/poly1305.h> -#include "internal.h" +#include "../fipsmodule/cipher/internal.h" #include "../internal.h"
diff --git a/crypto/cipher/e_null.c b/crypto/cipher_extra/e_null.c similarity index 99% rename from crypto/cipher/e_null.c rename to crypto/cipher_extra/e_null.c index 9f89308..f5fe8fb 100644 --- a/crypto/cipher/e_null.c +++ b/crypto/cipher_extra/e_null.c
@@ -61,7 +61,6 @@ #include <openssl/nid.h> #include "../internal.h" -#include "internal.h" static int null_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
diff --git a/crypto/cipher/e_rc2.c b/crypto/cipher_extra/e_rc2.c similarity index 99% rename from crypto/cipher/e_rc2.c rename to crypto/cipher_extra/e_rc2.c index e1b4301..a18229c 100644 --- a/crypto/cipher/e_rc2.c +++ b/crypto/cipher_extra/e_rc2.c
@@ -57,8 +57,6 @@ #include <openssl/cipher.h> #include <openssl/nid.h> -#include "internal.h" - #define c2l(c, l) \ do { \
diff --git a/crypto/cipher/e_rc4.c b/crypto/cipher_extra/e_rc4.c similarity index 100% rename from crypto/cipher/e_rc4.c rename to crypto/cipher_extra/e_rc4.c
diff --git a/crypto/cipher/e_ssl3.c b/crypto/cipher_extra/e_ssl3.c similarity index 99% rename from crypto/cipher/e_ssl3.c rename to crypto/cipher_extra/e_ssl3.c index f1dad2b..03c2efa 100644 --- a/crypto/cipher/e_ssl3.c +++ b/crypto/cipher_extra/e_ssl3.c
@@ -26,6 +26,7 @@ #include "internal.h" #include "../internal.h" +#include "../fipsmodule/cipher/internal.h" typedef struct {
diff --git a/crypto/cipher/e_tls.c b/crypto/cipher_extra/e_tls.c similarity index 99% rename from crypto/cipher/e_tls.c rename to crypto/cipher_extra/e_tls.c index bb80cc6..5b92ebc 100644 --- a/crypto/cipher/e_tls.c +++ b/crypto/cipher_extra/e_tls.c
@@ -27,6 +27,7 @@ #include "../internal.h" #include "internal.h" +#include "../fipsmodule/cipher/internal.h" typedef struct {
diff --git a/crypto/cipher/internal.h b/crypto/cipher_extra/internal.h similarity index 74% rename from crypto/cipher/internal.h rename to crypto/cipher_extra/internal.h index 52dbac2..7136195 100644 --- a/crypto/cipher/internal.h +++ b/crypto/cipher_extra/internal.h
@@ -54,56 +54,18 @@ * copied and put under another distribution licence * [including the GNU Public Licence.] */ -#ifndef OPENSSL_HEADER_CIPHER_INTERNAL_H -#define OPENSSL_HEADER_CIPHER_INTERNAL_H +#ifndef OPENSSL_HEADER_CIPHER_EXTRA_INTERNAL_H +#define OPENSSL_HEADER_CIPHER_EXTRA_INTERNAL_H #include <openssl/base.h> -#include <openssl/aead.h> -#include <openssl/aes.h> - #include "../internal.h" -#include "../fipsmodule/modes/internal.h" #if defined(__cplusplus) extern "C" { #endif -/* EVP_CIPH_MODE_MASK contains the bits of |flags| that represent the mode. */ -#define EVP_CIPH_MODE_MASK 0x3f - - -/* EVP_AEAD represents a specific AEAD algorithm. */ -struct evp_aead_st { - uint8_t key_len; - uint8_t nonce_len; - uint8_t overhead; - uint8_t max_tag_len; - - /* init initialises an |EVP_AEAD_CTX|. If this call returns zero then - * |cleanup| will not be called for that context. */ - int (*init)(EVP_AEAD_CTX *, const uint8_t *key, size_t key_len, - size_t tag_len); - int (*init_with_direction)(EVP_AEAD_CTX *, const uint8_t *key, size_t key_len, - size_t tag_len, enum evp_aead_direction_t dir); - void (*cleanup)(EVP_AEAD_CTX *); - - int (*seal)(const EVP_AEAD_CTX *ctx, uint8_t *out, size_t *out_len, - size_t max_out_len, const uint8_t *nonce, size_t nonce_len, - const uint8_t *in, size_t in_len, const uint8_t *ad, - size_t ad_len); - - int (*open)(const EVP_AEAD_CTX *ctx, uint8_t *out, size_t *out_len, - size_t max_out_len, const uint8_t *nonce, size_t nonce_len, - const uint8_t *in, size_t in_len, const uint8_t *ad, - size_t ad_len); - - int (*get_iv)(const EVP_AEAD_CTX *ctx, const uint8_t **out_iv, - size_t *out_len); -}; - - /* EVP_tls_cbc_get_padding determines the padding from the decrypted, TLS, CBC * record in |in|. This decrypted record should not include any "decrypted" * explicit IV. If the record is publicly invalid, it returns zero. Otherwise, @@ -158,18 +120,9 @@ const uint8_t *mac_secret, unsigned mac_secret_length); -/* aes_ctr_set_key initialises |*aes_key| using |key_bytes| bytes from |key|, - * where |key_bytes| must either be 16, 24 or 32. If not NULL, |*out_block| is - * set to a function that encrypts single blocks. If not NULL, |*gcm_ctx| is - * initialised to do GHASH with the given key. It returns a function for - * optimised CTR-mode, or NULL if CTR-mode should be built using - * |*out_block|. */ -ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx, - block128_f *out_block, const uint8_t *key, - size_t key_bytes); #if defined(__cplusplus) } /* extern C */ #endif -#endif /* OPENSSL_HEADER_CIPHER_INTERNAL_H */ +#endif /* OPENSSL_HEADER_CIPHER_EXTRA_INTERNAL_H */
diff --git a/crypto/cipher/test/aes_128_cbc_sha1_ssl3_tests.txt b/crypto/cipher_extra/test/aes_128_cbc_sha1_ssl3_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_cbc_sha1_ssl3_tests.txt rename to crypto/cipher_extra/test/aes_128_cbc_sha1_ssl3_tests.txt
diff --git a/crypto/cipher/test/aes_128_cbc_sha1_tls_implicit_iv_tests.txt b/crypto/cipher_extra/test/aes_128_cbc_sha1_tls_implicit_iv_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_cbc_sha1_tls_implicit_iv_tests.txt rename to crypto/cipher_extra/test/aes_128_cbc_sha1_tls_implicit_iv_tests.txt
diff --git a/crypto/cipher/test/aes_128_cbc_sha1_tls_tests.txt b/crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_cbc_sha1_tls_tests.txt rename to crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt
diff --git a/crypto/cipher/test/aes_128_cbc_sha256_tls_tests.txt b/crypto/cipher_extra/test/aes_128_cbc_sha256_tls_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_cbc_sha256_tls_tests.txt rename to crypto/cipher_extra/test/aes_128_cbc_sha256_tls_tests.txt
diff --git a/crypto/cipher/test/aes_128_ctr_hmac_sha256.txt b/crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt similarity index 100% rename from crypto/cipher/test/aes_128_ctr_hmac_sha256.txt rename to crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt
diff --git a/crypto/cipher/test/aes_128_gcm_fips_testonly_tests.txt b/crypto/cipher_extra/test/aes_128_gcm_fips_testonly_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_gcm_fips_testonly_tests.txt rename to crypto/cipher_extra/test/aes_128_gcm_fips_testonly_tests.txt
diff --git a/crypto/cipher/test/aes_128_gcm_siv_tests.txt b/crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_gcm_siv_tests.txt rename to crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt
diff --git a/crypto/cipher/test/aes_128_gcm_tests.txt b/crypto/cipher_extra/test/aes_128_gcm_tests.txt similarity index 100% rename from crypto/cipher/test/aes_128_gcm_tests.txt rename to crypto/cipher_extra/test/aes_128_gcm_tests.txt
diff --git a/crypto/cipher/test/aes_256_cbc_sha1_ssl3_tests.txt b/crypto/cipher_extra/test/aes_256_cbc_sha1_ssl3_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_cbc_sha1_ssl3_tests.txt rename to crypto/cipher_extra/test/aes_256_cbc_sha1_ssl3_tests.txt
diff --git a/crypto/cipher/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt b/crypto/cipher_extra/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt rename to crypto/cipher_extra/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt
diff --git a/crypto/cipher/test/aes_256_cbc_sha1_tls_tests.txt b/crypto/cipher_extra/test/aes_256_cbc_sha1_tls_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_cbc_sha1_tls_tests.txt rename to crypto/cipher_extra/test/aes_256_cbc_sha1_tls_tests.txt
diff --git a/crypto/cipher/test/aes_256_cbc_sha256_tls_tests.txt b/crypto/cipher_extra/test/aes_256_cbc_sha256_tls_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_cbc_sha256_tls_tests.txt rename to crypto/cipher_extra/test/aes_256_cbc_sha256_tls_tests.txt
diff --git a/crypto/cipher/test/aes_256_cbc_sha384_tls_tests.txt b/crypto/cipher_extra/test/aes_256_cbc_sha384_tls_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_cbc_sha384_tls_tests.txt rename to crypto/cipher_extra/test/aes_256_cbc_sha384_tls_tests.txt
diff --git a/crypto/cipher/test/aes_256_ctr_hmac_sha256.txt b/crypto/cipher_extra/test/aes_256_ctr_hmac_sha256.txt similarity index 100% rename from crypto/cipher/test/aes_256_ctr_hmac_sha256.txt rename to crypto/cipher_extra/test/aes_256_ctr_hmac_sha256.txt
diff --git a/crypto/cipher/test/aes_256_gcm_fips_testonly_tests.txt b/crypto/cipher_extra/test/aes_256_gcm_fips_testonly_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_gcm_fips_testonly_tests.txt rename to crypto/cipher_extra/test/aes_256_gcm_fips_testonly_tests.txt
diff --git a/crypto/cipher/test/aes_256_gcm_siv_tests.txt b/crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_gcm_siv_tests.txt rename to crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt
diff --git a/crypto/cipher/test/aes_256_gcm_tests.txt b/crypto/cipher_extra/test/aes_256_gcm_tests.txt similarity index 100% rename from crypto/cipher/test/aes_256_gcm_tests.txt rename to crypto/cipher_extra/test/aes_256_gcm_tests.txt
diff --git a/crypto/cipher/test/chacha20_poly1305_tests.txt b/crypto/cipher_extra/test/chacha20_poly1305_tests.txt similarity index 100% rename from crypto/cipher/test/chacha20_poly1305_tests.txt rename to crypto/cipher_extra/test/chacha20_poly1305_tests.txt
diff --git a/crypto/cipher/test/cipher_tests.txt b/crypto/cipher_extra/test/cipher_tests.txt similarity index 100% rename from crypto/cipher/test/cipher_tests.txt rename to crypto/cipher_extra/test/cipher_tests.txt
diff --git a/crypto/cipher/test/des_ede3_cbc_sha1_ssl3_tests.txt b/crypto/cipher_extra/test/des_ede3_cbc_sha1_ssl3_tests.txt similarity index 100% rename from crypto/cipher/test/des_ede3_cbc_sha1_ssl3_tests.txt rename to crypto/cipher_extra/test/des_ede3_cbc_sha1_ssl3_tests.txt
diff --git a/crypto/cipher/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt b/crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt similarity index 100% rename from crypto/cipher/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt rename to crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt
diff --git a/crypto/cipher/test/des_ede3_cbc_sha1_tls_tests.txt b/crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_tests.txt similarity index 100% rename from crypto/cipher/test/des_ede3_cbc_sha1_tls_tests.txt rename to crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_tests.txt
diff --git a/crypto/cipher/test/make_all_legacy_aead_tests.sh b/crypto/cipher_extra/test/make_all_legacy_aead_tests.sh similarity index 100% rename from crypto/cipher/test/make_all_legacy_aead_tests.sh rename to crypto/cipher_extra/test/make_all_legacy_aead_tests.sh
diff --git a/crypto/cipher/test/make_legacy_aead_tests.go b/crypto/cipher_extra/test/make_legacy_aead_tests.go similarity index 100% rename from crypto/cipher/test/make_legacy_aead_tests.go rename to crypto/cipher_extra/test/make_legacy_aead_tests.go
diff --git a/crypto/cipher/test/nist_cavp/aes_128_cbc.txt b/crypto/cipher_extra/test/nist_cavp/aes_128_cbc.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_128_cbc.txt rename to crypto/cipher_extra/test/nist_cavp/aes_128_cbc.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_128_ctr.txt b/crypto/cipher_extra/test/nist_cavp/aes_128_ctr.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_128_ctr.txt rename to crypto/cipher_extra/test/nist_cavp/aes_128_ctr.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_128_gcm.txt b/crypto/cipher_extra/test/nist_cavp/aes_128_gcm.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_128_gcm.txt rename to crypto/cipher_extra/test/nist_cavp/aes_128_gcm.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_192_cbc.txt b/crypto/cipher_extra/test/nist_cavp/aes_192_cbc.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_192_cbc.txt rename to crypto/cipher_extra/test/nist_cavp/aes_192_cbc.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_192_ctr.txt b/crypto/cipher_extra/test/nist_cavp/aes_192_ctr.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_192_ctr.txt rename to crypto/cipher_extra/test/nist_cavp/aes_192_ctr.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_256_cbc.txt b/crypto/cipher_extra/test/nist_cavp/aes_256_cbc.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_256_cbc.txt rename to crypto/cipher_extra/test/nist_cavp/aes_256_cbc.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_256_ctr.txt b/crypto/cipher_extra/test/nist_cavp/aes_256_ctr.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_256_ctr.txt rename to crypto/cipher_extra/test/nist_cavp/aes_256_ctr.txt
diff --git a/crypto/cipher/test/nist_cavp/aes_256_gcm.txt b/crypto/cipher_extra/test/nist_cavp/aes_256_gcm.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/aes_256_gcm.txt rename to crypto/cipher_extra/test/nist_cavp/aes_256_gcm.txt
diff --git a/crypto/cipher/test/nist_cavp/make_cavp.go b/crypto/cipher_extra/test/nist_cavp/make_cavp.go similarity index 100% rename from crypto/cipher/test/nist_cavp/make_cavp.go rename to crypto/cipher_extra/test/nist_cavp/make_cavp.go
diff --git a/crypto/cipher/test/nist_cavp/tdes_cbc.txt b/crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/tdes_cbc.txt rename to crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt
diff --git a/crypto/cipher/test/nist_cavp/tdes_ecb.txt b/crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt similarity index 100% rename from crypto/cipher/test/nist_cavp/tdes_ecb.txt rename to crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt
diff --git a/crypto/cipher/tls_cbc.c b/crypto/cipher_extra/tls_cbc.c similarity index 99% rename from crypto/cipher/tls_cbc.c rename to crypto/cipher_extra/tls_cbc.c index 1d5006f..2372c5c 100644 --- a/crypto/cipher/tls_cbc.c +++ b/crypto/cipher_extra/tls_cbc.c
@@ -59,6 +59,7 @@ #include "../internal.h" #include "internal.h" +#include "../fipsmodule/cipher/internal.h" /* MAX_HASH_BIT_COUNT_BYTES is the maximum number of bytes in the hash's length
diff --git a/crypto/fipsmodule/aes/aes.c b/crypto/fipsmodule/aes/aes.c index edd866c..c68a5d5 100644 --- a/crypto/fipsmodule/aes/aes.c +++ b/crypto/fipsmodule/aes/aes.c
@@ -49,10 +49,10 @@ #include <openssl/aes.h> #include <assert.h> -#include <stdlib.h> #include <openssl/cpu.h> +#include "internal.h" #include "../modes/internal.h" @@ -1060,44 +1060,6 @@ #else -#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) - -static int hwaes_capable(void) { - return CRYPTO_is_ARMv8_AES_capable(); -} - -int aes_hw_set_encrypt_key(const uint8_t *user_key, const int bits, - AES_KEY *key); -int aes_hw_set_decrypt_key(const uint8_t *user_key, const int bits, - AES_KEY *key); -void aes_hw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); -void aes_hw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); - -#else - -static int hwaes_capable(void) { - return 0; -} - -static int aes_hw_set_encrypt_key(const uint8_t *user_key, int bits, AES_KEY *key) { - abort(); -} - -static int aes_hw_set_decrypt_key(const uint8_t *user_key, int bits, AES_KEY *key) { - abort(); -} - -static void aes_hw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) { - abort(); -} - -static void aes_hw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) { - abort(); -} - -#endif - - /* In this case several functions are provided by asm code. However, one cannot * control asm symbol visibility with command line flags and such so they are * always hidden and wrapped by these C functions, which can be so
diff --git a/crypto/fipsmodule/aes/internal.h b/crypto/fipsmodule/aes/internal.h new file mode 100644 index 0000000..01cff84 --- /dev/null +++ b/crypto/fipsmodule/aes/internal.h
@@ -0,0 +1,100 @@ +/* Copyright (c) 2017, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#ifndef OPENSSL_HEADER_AES_INTERNAL_H +#define OPENSSL_HEADER_AES_INTERNAL_H + +#include <stdlib.h> + +#include <openssl/cpu.h> + +#if defined(__cplusplus) +extern "C" { +#endif + + +#if !defined(OPENSSL_NO_ASM) && (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) +#define HWAES + +static int hwaes_capable(void) { + return CRYPTO_is_ARMv8_AES_capable(); +} +#endif /* !NO_ASM && (AES || AARCH64) */ + +#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_PPC64LE) +#define HWAES + +static int hwaes_capable(void) { + return CRYPTO_is_PPC64LE_vcrypto_capable(); +} +#endif /* !NO_ASM && PPC64LE */ + + +#if defined(HWAES) + +int aes_hw_set_encrypt_key(const uint8_t *user_key, const int bits, + AES_KEY *key); +int aes_hw_set_decrypt_key(const uint8_t *user_key, const int bits, + AES_KEY *key); +void aes_hw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); +void aes_hw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); +void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, + const AES_KEY *key, uint8_t *ivec, const int enc); +void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, + const AES_KEY *key, const uint8_t ivec[16]); + +#else + +/* If HWAES isn't defined then we provide dummy functions for each of the hwaes + * functions. */ +static int hwaes_capable(void) { return 0; } + +static int aes_hw_set_encrypt_key(const uint8_t *user_key, int bits, + AES_KEY *key) { + abort(); +} + +static int aes_hw_set_decrypt_key(const uint8_t *user_key, int bits, + AES_KEY *key) { + abort(); +} + +static void aes_hw_encrypt(const uint8_t *in, uint8_t *out, + const AES_KEY *key) { + abort(); +} + +static void aes_hw_decrypt(const uint8_t *in, uint8_t *out, + const AES_KEY *key) { + abort(); +} + +static void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, + const AES_KEY *key, uint8_t *ivec, int enc) { + abort(); +} + +static void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, + size_t len, const AES_KEY *key, + const uint8_t ivec[16]) { + abort(); +} + +#endif /* !HWAES */ + +#if defined(__cplusplus) +} /* extern C */ +#endif + +#endif /* OPENSSL_HEADER_AES_INTERNAL_H */
diff --git a/crypto/fipsmodule/bcm.c b/crypto/fipsmodule/bcm.c index 692b57c..6dd5105 100644 --- a/crypto/fipsmodule/bcm.c +++ b/crypto/fipsmodule/bcm.c
@@ -54,6 +54,10 @@ #include "bn/rsaz_exp.c" #include "bn/shift.c" #include "bn/sqrt.c" +#include "cipher/aead.c" +#include "cipher/cipher.c" +#include "cipher/e_aes.c" +#include "cipher/e_des.c" #include "des/des.c" #include "digest/digest.c" #include "digest/digests.c"
diff --git a/crypto/cipher/aead.c b/crypto/fipsmodule/cipher/aead.c similarity index 99% rename from crypto/cipher/aead.c rename to crypto/fipsmodule/cipher/aead.c index 40b0bbf..25c28bd 100644 --- a/crypto/cipher/aead.c +++ b/crypto/fipsmodule/cipher/aead.c
@@ -21,7 +21,7 @@ #include <openssl/mem.h> #include "internal.h" -#include "../internal.h" +#include "../../internal.h" size_t EVP_AEAD_key_length(const EVP_AEAD *aead) { return aead->key_len; }
diff --git a/crypto/cipher/cipher.c b/crypto/fipsmodule/cipher/cipher.c similarity index 91% rename from crypto/cipher/cipher.c rename to crypto/fipsmodule/cipher/cipher.c index e46e43e..d116715 100644 --- a/crypto/cipher/cipher.c +++ b/crypto/fipsmodule/cipher/cipher.c
@@ -64,30 +64,9 @@ #include <openssl/nid.h> #include "internal.h" -#include "../internal.h" +#include "../../internal.h" -const EVP_CIPHER *EVP_get_cipherbynid(int nid) { - switch (nid) { - case NID_rc2_cbc: - return EVP_rc2_cbc(); - case NID_rc2_40_cbc: - return EVP_rc2_40_cbc(); - case NID_des_ede3_cbc: - return EVP_des_ede3_cbc(); - case NID_des_ede_cbc: - return EVP_des_cbc(); - case NID_aes_128_cbc: - return EVP_aes_128_cbc(); - case NID_aes_192_cbc: - return EVP_aes_192_cbc(); - case NID_aes_256_cbc: - return EVP_aes_256_cbc(); - default: - return NULL; - } -} - void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx) { OPENSSL_memset(ctx, 0, sizeof(EVP_CIPHER_CTX)); } @@ -630,28 +609,3 @@ int EVP_add_cipher_alias(const char *a, const char *b) { return 1; } - -const EVP_CIPHER *EVP_get_cipherbyname(const char *name) { - if (OPENSSL_strcasecmp(name, "rc4") == 0) { - return EVP_rc4(); - } else if (OPENSSL_strcasecmp(name, "des-cbc") == 0) { - return EVP_des_cbc(); - } else if (OPENSSL_strcasecmp(name, "des-ede3-cbc") == 0 || - OPENSSL_strcasecmp(name, "3des") == 0) { - return EVP_des_ede3_cbc(); - } else if (OPENSSL_strcasecmp(name, "aes-128-cbc") == 0) { - return EVP_aes_128_cbc(); - } else if (OPENSSL_strcasecmp(name, "aes-256-cbc") == 0) { - return EVP_aes_256_cbc(); - } else if (OPENSSL_strcasecmp(name, "aes-128-ctr") == 0) { - return EVP_aes_128_ctr(); - } else if (OPENSSL_strcasecmp(name, "aes-256-ctr") == 0) { - return EVP_aes_256_ctr(); - } else if (OPENSSL_strcasecmp(name, "aes-128-ecb") == 0) { - return EVP_aes_128_ecb(); - } else if (OPENSSL_strcasecmp(name, "aes-256-ecb") == 0) { - return EVP_aes_256_ecb(); - } - - return NULL; -}
diff --git a/crypto/cipher/e_aes.c b/crypto/fipsmodule/cipher/e_aes.c similarity index 69% rename from crypto/cipher/e_aes.c rename to crypto/fipsmodule/cipher/e_aes.c index a16956e..423ae02 100644 --- a/crypto/cipher/e_aes.c +++ b/crypto/fipsmodule/cipher/e_aes.c
@@ -58,8 +58,9 @@ #include <openssl/rand.h> #include "internal.h" -#include "../internal.h" -#include "../fipsmodule/modes/internal.h" +#include "../../internal.h" +#include "../aes/internal.h" +#include "../modes/internal.h" #if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) #include <openssl/arm_arch.h> @@ -119,19 +120,7 @@ } #endif -#define HWAES -static int hwaes_capable(void) { - return CRYPTO_is_ARMv8_AES_capable(); -} - -#elif !defined(OPENSSL_NO_ASM) && defined(OPENSSL_PPC64LE) - -#define HWAES -static int hwaes_capable(void) { - return CRYPTO_is_PPC64LE_vcrypto_capable(); -} - -#endif /* OPENSSL_PPC64LE */ +#endif #if defined(BSAES) @@ -198,56 +187,6 @@ } #endif -#if defined(HWAES) -int aes_hw_set_encrypt_key(const uint8_t *user_key, const int bits, - AES_KEY *key); -int aes_hw_set_decrypt_key(const uint8_t *user_key, const int bits, - AES_KEY *key); -void aes_hw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); -void aes_hw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); -void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, - const AES_KEY *key, uint8_t *ivec, const int enc); -void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, - const AES_KEY *key, const uint8_t ivec[16]); -#else -/* If HWAES isn't defined then we provide dummy functions for each of the hwaes - * functions. */ -static int hwaes_capable(void) { - return 0; -} - -static int aes_hw_set_encrypt_key(const uint8_t *user_key, int bits, - AES_KEY *key) { - abort(); -} - -static int aes_hw_set_decrypt_key(const uint8_t *user_key, int bits, - AES_KEY *key) { - abort(); -} - -static void aes_hw_encrypt(const uint8_t *in, uint8_t *out, - const AES_KEY *key) { - abort(); -} - -static void aes_hw_decrypt(const uint8_t *in, uint8_t *out, - const AES_KEY *key) { - abort(); -} - -static void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, - const AES_KEY *key, uint8_t *ivec, int enc) { - abort(); -} - -static void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, - size_t len, const AES_KEY *key, - const uint8_t ivec[16]) { - abort(); -} -#endif - #if !defined(OPENSSL_NO_ASM) && \ (defined(OPENSSL_X86_64) || defined(OPENSSL_X86)) int aesni_set_encrypt_key(const uint8_t *userKey, int bits, AES_KEY *key); @@ -679,100 +618,196 @@ } } -static const EVP_CIPHER aes_128_cbc = { - NID_aes_128_cbc, 16 /* block_size */, 16 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, aes_init_key, aes_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_cbc_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_128_ctr = { - NID_aes_128_ctr, 1 /* block_size */, 16 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, - NULL /* app_data */, aes_init_key, aes_ctr_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_128_cbc; + out->block_size = 16; + out->key_len = 16; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = aes_init_key; + out->cipher = aes_cbc_cipher; +} -static const EVP_CIPHER aes_128_ecb = { - NID_aes_128_ecb, 16 /* block_size */, 16 /* key_size */, - 0 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, aes_init_key, aes_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_ctr_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_128_ofb = { - NID_aes_128_ofb128, 1 /* block_size */, 16 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_OFB_MODE, - NULL /* app_data */, aes_init_key, aes_ofb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_128_ctr; + out->block_size = 1; + out->key_len = 16; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CTR_MODE; + out->init = aes_init_key; + out->cipher = aes_ctr_cipher; +} -static const EVP_CIPHER aes_128_gcm = { - NID_aes_128_gcm, 1 /* block_size */, 16 /* key_size */, 12 /* iv_len */, - sizeof(EVP_AES_GCM_CTX), - EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | - EVP_CIPH_FLAG_AEAD_CIPHER, - NULL /* app_data */, aes_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, - aes_gcm_ctrl}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_ecb_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_aes_128_ecb; + out->block_size = 16; + out->key_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = aes_init_key; + out->cipher = aes_ecb_cipher; +} -static const EVP_CIPHER aes_192_cbc = { - NID_aes_192_cbc, 16 /* block_size */, 24 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, aes_init_key, aes_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_ofb_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_192_ctr = { - NID_aes_192_ctr, 1 /* block_size */, 24 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, - NULL /* app_data */, aes_init_key, aes_ctr_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_128_ofb128; + out->block_size = 1; + out->key_len = 16; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_OFB_MODE; + out->init = aes_init_key; + out->cipher = aes_ofb_cipher; +} -static const EVP_CIPHER aes_192_ecb = { - NID_aes_192_ecb, 16 /* block_size */, 24 /* key_size */, - 0 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, aes_init_key, aes_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_128_gcm_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_192_gcm = { - NID_aes_192_gcm, 1 /* block_size */, 24 /* key_size */, 12 /* iv_len */, - sizeof(EVP_AES_GCM_CTX), - EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | - EVP_CIPH_FLAG_AEAD_CIPHER, - NULL /* app_data */, aes_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, - aes_gcm_ctrl}; + out->nid = NID_aes_128_gcm; + out->block_size = 1; + out->key_len = 16; + out->iv_len = 12; + out->ctx_size = sizeof(EVP_AES_GCM_CTX); + out->flags = EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | + EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | + EVP_CIPH_CTRL_INIT | EVP_CIPH_FLAG_AEAD_CIPHER; + out->init = aes_gcm_init_key; + out->cipher = aes_gcm_cipher; + out->cleanup = aes_gcm_cleanup; + out->ctrl = aes_gcm_ctrl; +} +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_cbc_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_256_cbc = { - NID_aes_256_cbc, 16 /* block_size */, 32 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, aes_init_key, aes_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_192_cbc; + out->block_size = 16; + out->key_len = 24; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = aes_init_key; + out->cipher = aes_cbc_cipher; +} -static const EVP_CIPHER aes_256_ctr = { - NID_aes_256_ctr, 1 /* block_size */, 32 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, - NULL /* app_data */, aes_init_key, aes_ctr_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_ctr_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_256_ecb = { - NID_aes_256_ecb, 16 /* block_size */, 32 /* key_size */, - 0 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, aes_init_key, aes_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_192_ctr; + out->block_size = 1; + out->key_len = 24; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CTR_MODE; + out->init = aes_init_key; + out->cipher = aes_ctr_cipher; +} -static const EVP_CIPHER aes_256_ofb = { - NID_aes_256_ofb128, 1 /* block_size */, 32 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_OFB_MODE, - NULL /* app_data */, aes_init_key, aes_ofb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_ecb_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aes_256_gcm = { - NID_aes_256_gcm, 1 /* block_size */, 32 /* key_size */, 12 /* iv_len */, - sizeof(EVP_AES_GCM_CTX), - EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | - EVP_CIPH_FLAG_AEAD_CIPHER, - NULL /* app_data */, aes_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, - aes_gcm_ctrl}; + out->nid = NID_aes_192_ecb; + out->block_size = 16; + out->key_len = 24; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = aes_init_key; + out->cipher = aes_ecb_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_192_gcm_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_192_gcm; + out->block_size = 1; + out->key_len = 24; + out->iv_len = 12; + out->ctx_size = sizeof(EVP_AES_GCM_CTX); + out->flags = EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | + EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | + EVP_CIPH_CTRL_INIT | EVP_CIPH_FLAG_AEAD_CIPHER; + out->init = aes_gcm_init_key; + out->cipher = aes_gcm_cipher; + out->cleanup = aes_gcm_cleanup; + out->ctrl = aes_gcm_ctrl; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_cbc_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_cbc; + out->block_size = 16; + out->key_len = 32; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = aes_init_key; + out->cipher = aes_cbc_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_ctr_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_ctr; + out->block_size = 1; + out->key_len = 32; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CTR_MODE; + out->init = aes_init_key; + out->cipher = aes_ctr_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_ecb_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_ecb; + out->block_size = 16; + out->key_len = 32; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = aes_init_key; + out->cipher = aes_ecb_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_ofb_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_ofb128; + out->block_size = 1; + out->key_len = 32; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_OFB_MODE; + out->init = aes_init_key; + out->cipher = aes_ofb_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aes_256_gcm_generic) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_gcm; + out->block_size = 1; + out->key_len = 32; + out->iv_len = 12; + out->ctx_size = sizeof(EVP_AES_GCM_CTX); + out->flags = EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | + EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | + EVP_CIPH_CTRL_INIT | EVP_CIPH_FLAG_AEAD_CIPHER; + out->init = aes_gcm_init_key; + out->cipher = aes_gcm_cipher; + out->cleanup = aes_gcm_cleanup; + out->ctrl = aes_gcm_ctrl; +} #if !defined(OPENSSL_NO_ASM) && \ (defined(OPENSSL_X86_64) || defined(OPENSSL_X86)) @@ -867,107 +902,204 @@ return 1; } -static const EVP_CIPHER aesni_128_cbc = { - NID_aes_128_cbc, 16 /* block_size */, 16 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, aesni_init_key, aesni_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_128_cbc) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_128_ctr = { - NID_aes_128_ctr, 1 /* block_size */, 16 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, - NULL /* app_data */, aesni_init_key, aes_ctr_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_128_cbc; + out->block_size = 16; + out->key_len = 16; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = aesni_init_key; + out->cipher = aesni_cbc_cipher; +} -static const EVP_CIPHER aesni_128_ecb = { - NID_aes_128_ecb, 16 /* block_size */, 16 /* key_size */, - 0 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, aesni_init_key, aesni_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_128_ctr) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_128_ofb = { - NID_aes_128_ofb128, 1 /* block_size */, 16 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_OFB_MODE, - NULL /* app_data */, aesni_init_key, aes_ofb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_128_ctr; + out->block_size = 1; + out->key_len = 16; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CTR_MODE; + out->init = aesni_init_key; + out->cipher = aes_ctr_cipher; +} -static const EVP_CIPHER aesni_128_gcm = { - NID_aes_128_gcm, 1 /* block_size */, 16 /* key_size */, 12 /* iv_len */, - sizeof(EVP_AES_GCM_CTX), - EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | - EVP_CIPH_FLAG_AEAD_CIPHER, - NULL /* app_data */, aesni_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, - aes_gcm_ctrl}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_128_ecb) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_aes_128_ecb; + out->block_size = 16; + out->key_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = aesni_init_key; + out->cipher = aesni_ecb_cipher; +} -static const EVP_CIPHER aesni_192_cbc = { - NID_aes_192_cbc, 16 /* block_size */, 24 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, aesni_init_key, aesni_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_128_ofb) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_192_ctr = { - NID_aes_192_ctr, 1 /* block_size */, 24 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, - NULL /* app_data */, aesni_init_key, aes_ctr_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_128_ofb128; + out->block_size = 1; + out->key_len = 16; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_OFB_MODE; + out->init = aesni_init_key; + out->cipher = aes_ofb_cipher; +} -static const EVP_CIPHER aesni_192_ecb = { - NID_aes_192_ecb, 16 /* block_size */, 24 /* key_size */, - 0 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, aesni_init_key, aesni_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_128_gcm) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_192_gcm = { - NID_aes_192_gcm, 1 /* block_size */, 24 /* key_size */, 12 /* iv_len */, - sizeof(EVP_AES_GCM_CTX), - EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | - EVP_CIPH_FLAG_AEAD_CIPHER, - NULL /* app_data */, aesni_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, - aes_gcm_ctrl}; + out->nid = NID_aes_128_gcm; + out->block_size = 1; + out->key_len = 16; + out->iv_len = 12; + out->ctx_size = sizeof(EVP_AES_GCM_CTX); + out->flags = EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | + EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | + EVP_CIPH_CTRL_INIT | EVP_CIPH_FLAG_AEAD_CIPHER; + out->init = aesni_gcm_init_key; + out->cipher = aes_gcm_cipher; + out->cleanup = aes_gcm_cleanup; + out->ctrl = aes_gcm_ctrl; +} +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_192_cbc) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_256_cbc = { - NID_aes_256_cbc, 16 /* block_size */, 32 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, aesni_init_key, aesni_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_192_cbc; + out->block_size = 16; + out->key_len = 24; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = aesni_init_key; + out->cipher = aesni_cbc_cipher; +} -static const EVP_CIPHER aesni_256_ctr = { - NID_aes_256_ctr, 1 /* block_size */, 32 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, - NULL /* app_data */, aesni_init_key, aes_ctr_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_192_ctr) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_256_ecb = { - NID_aes_256_ecb, 16 /* block_size */, 32 /* key_size */, - 0 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, aesni_init_key, aesni_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; + out->nid = NID_aes_192_ctr; + out->block_size = 1; + out->key_len = 24; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CTR_MODE; + out->init = aesni_init_key; + out->cipher = aes_ctr_cipher; +} -static const EVP_CIPHER aesni_256_ofb = { - NID_aes_256_ofb128, 1 /* block_size */, 32 /* key_size */, - 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_OFB_MODE, - NULL /* app_data */, aesni_init_key, aes_ofb_cipher, - NULL /* cleanup */, NULL /* ctrl */}; +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_192_ecb) { + memset(out, 0, sizeof(EVP_CIPHER)); -static const EVP_CIPHER aesni_256_gcm = { - NID_aes_256_gcm, 1 /* block_size */, 32 /* key_size */, 12 /* iv_len */, - sizeof(EVP_AES_GCM_CTX), - EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY | - EVP_CIPH_FLAG_AEAD_CIPHER, - NULL /* app_data */, aesni_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, - aes_gcm_ctrl}; + out->nid = NID_aes_192_ecb; + out->block_size = 16; + out->key_len = 24; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = aesni_init_key; + out->cipher = aesni_ecb_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_192_gcm) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_192_gcm; + out->block_size = 1; + out->key_len = 24; + out->iv_len = 12; + out->ctx_size = sizeof(EVP_AES_GCM_CTX); + out->flags = EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | + EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | + EVP_CIPH_CTRL_INIT | EVP_CIPH_FLAG_AEAD_CIPHER; + out->init = aesni_gcm_init_key; + out->cipher = aes_gcm_cipher; + out->cleanup = aes_gcm_cleanup; + out->ctrl = aes_gcm_ctrl; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_256_cbc) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_cbc; + out->block_size = 16; + out->key_len = 32; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = aesni_init_key; + out->cipher = aesni_cbc_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_256_ctr) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_ctr; + out->block_size = 1; + out->key_len = 32; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_CTR_MODE; + out->init = aesni_init_key; + out->cipher = aes_ctr_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_256_ecb) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_ecb; + out->block_size = 16; + out->key_len = 32; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = aesni_init_key; + out->cipher = aesni_ecb_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_256_ofb) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_ofb128; + out->block_size = 1; + out->key_len = 32; + out->iv_len = 16; + out->ctx_size = sizeof(EVP_AES_KEY); + out->flags = EVP_CIPH_OFB_MODE; + out->init = aesni_init_key; + out->cipher = aes_ofb_cipher; +} + +DEFINE_LOCAL_DATA(EVP_CIPHER, aesni_256_gcm) { + memset(out, 0, sizeof(EVP_CIPHER)); + + out->nid = NID_aes_256_gcm; + out->block_size = 1; + out->key_len = 32; + out->iv_len = 12; + out->ctx_size = sizeof(EVP_AES_GCM_CTX); + out->flags = EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | + EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | + EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY | + EVP_CIPH_FLAG_AEAD_CIPHER; + out->init = aesni_gcm_init_key; + out->cipher = aes_gcm_cipher; + out->cleanup = aes_gcm_cleanup; + out->ctrl = aes_gcm_ctrl; +} #define EVP_CIPHER_FUNCTION(keybits, mode) \ const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \ if (aesni_capable()) { \ - return &aesni_##keybits##_##mode; \ + return aesni_##keybits##_##mode(); \ } else { \ - return &aes_##keybits##_##mode; \ + return aes_##keybits##_##mode##_generic(); \ } \ } @@ -979,7 +1111,7 @@ #define EVP_CIPHER_FUNCTION(keybits, mode) \ const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \ - return &aes_##keybits##_##mode; \ + return aes_##keybits##_##mode##_generic(); \ } #endif @@ -1147,35 +1279,31 @@ return 1; } -static const EVP_AEAD aead_aes_128_gcm = { - 16, /* key len */ - 12, /* nonce len */ - EVP_AEAD_AES_GCM_TAG_LEN, /* overhead */ - EVP_AEAD_AES_GCM_TAG_LEN, /* max tag length */ - aead_aes_gcm_init, - NULL, /* init_with_direction */ - aead_aes_gcm_cleanup, - aead_aes_gcm_seal, - aead_aes_gcm_open, - NULL, /* get_iv */ -}; +DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm) { + memset(out, 0, sizeof(EVP_AEAD)); -static const EVP_AEAD aead_aes_256_gcm = { - 32, /* key len */ - 12, /* nonce len */ - EVP_AEAD_AES_GCM_TAG_LEN, /* overhead */ - EVP_AEAD_AES_GCM_TAG_LEN, /* max tag length */ - aead_aes_gcm_init, - NULL, /* init_with_direction */ - aead_aes_gcm_cleanup, - aead_aes_gcm_seal, - aead_aes_gcm_open, - NULL, /* get_iv */ -}; + out->key_len = 16; + out->nonce_len = 12; + out->overhead = EVP_AEAD_AES_GCM_TAG_LEN; + out->max_tag_len = EVP_AEAD_AES_GCM_TAG_LEN; + out->init = aead_aes_gcm_init; + out->cleanup = aead_aes_gcm_cleanup; + out->seal = aead_aes_gcm_seal; + out->open = aead_aes_gcm_open; +} -const EVP_AEAD *EVP_aead_aes_128_gcm(void) { return &aead_aes_128_gcm; } +DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_256_gcm) { + memset(out, 0, sizeof(EVP_AEAD)); -const EVP_AEAD *EVP_aead_aes_256_gcm(void) { return &aead_aes_256_gcm; } + out->key_len = 32; + out->nonce_len = 12; + out->overhead = EVP_AEAD_AES_GCM_TAG_LEN; + out->max_tag_len = EVP_AEAD_AES_GCM_TAG_LEN; + out->init = aead_aes_gcm_init; + out->cleanup = aead_aes_gcm_cleanup; + out->seal = aead_aes_gcm_seal; + out->open = aead_aes_gcm_open; +} #if defined(BORINGSSL_FIPS) #define FIPS_AES_GCM_IV_LEN 12 @@ -1246,39 +1374,32 @@ return ret; } -static const EVP_AEAD aead_aes_128_gcm_fips_testonly = { - 16, /* key len */ - 0, /* nonce len */ - EVP_AEAD_AES_GCM_TAG_LEN + FIPS_AES_GCM_IV_LEN, /* overhead */ - EVP_AEAD_AES_GCM_TAG_LEN, /* max tag length */ - aead_aes_gcm_init, - NULL, /* init_with_direction */ - aead_aes_gcm_cleanup, - aead_aes_gcm_fips_testonly_seal, - aead_aes_gcm_fips_testonly_open, - NULL, /* get_iv */ -}; +DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_128_gcm_fips_testonly) { + memset(out, 0, sizeof(EVP_AEAD)); -static const EVP_AEAD aead_aes_256_gcm_fips_testonly = { - 32, /* key len */ - 0, /* nonce len */ - EVP_AEAD_AES_GCM_TAG_LEN + FIPS_AES_GCM_IV_LEN, /* overhead */ - EVP_AEAD_AES_GCM_TAG_LEN, /* max tag length */ - aead_aes_gcm_init, - NULL, /* init_with_direction */ - aead_aes_gcm_cleanup, - aead_aes_gcm_fips_testonly_seal, - aead_aes_gcm_fips_testonly_open, - NULL, /* get_iv */ -}; - -const EVP_AEAD *EVP_aead_aes_128_gcm_fips_testonly(void) { - return &aead_aes_128_gcm_fips_testonly; + out->key_len = 16; + out->nonce_len = 0; + out->overhead = EVP_AEAD_AES_GCM_TAG_LEN + FIPS_AES_GCM_IV_LEN; + out->max_tag_len = EVP_AEAD_AES_GCM_TAG_LEN; + out->init = aead_aes_gcm_init; + out->cleanup = aead_aes_gcm_cleanup; + out->seal = aead_aes_gcm_fips_testonly_seal; + out->open = aead_aes_gcm_fips_testonly_open; } -const EVP_AEAD *EVP_aead_aes_256_gcm_fips_testonly(void) { - return &aead_aes_256_gcm_fips_testonly; +DEFINE_METHOD_FUNCTION(EVP_AEAD, EVP_aead_aes_256_gcm_fips_testonly) { + memset(out, 0, sizeof(EVP_AEAD)); + + out->key_len = 32; + out->nonce_len = 0; + out->overhead = EVP_AEAD_AES_GCM_TAG_LEN + FIPS_AES_GCM_IV_LEN; + out->max_tag_len = EVP_AEAD_AES_GCM_TAG_LEN; + out->init = aead_aes_gcm_init; + out->cleanup = aead_aes_gcm_cleanup; + out->seal = aead_aes_gcm_fips_testonly_seal; + out->open = aead_aes_gcm_fips_testonly_open; } + #endif /* BORINGSSL_FIPS */ int EVP_has_aes_hardware(void) {
diff --git a/crypto/cipher/e_des.c b/crypto/fipsmodule/cipher/e_des.c similarity index 74% rename from crypto/cipher/e_des.c rename to crypto/fipsmodule/cipher/e_des.c index e72f003..eaba6d7 100644 --- a/crypto/cipher/e_des.c +++ b/crypto/fipsmodule/cipher/e_des.c
@@ -59,6 +59,7 @@ #include <openssl/nid.h> #include "internal.h" +#include "../delocate.h" typedef struct { @@ -87,14 +88,17 @@ return 1; } -static const EVP_CIPHER des_cbc = { - NID_des_cbc, 8 /* block_size */, 8 /* key_size */, - 8 /* iv_len */, sizeof(EVP_DES_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, des_init_key, des_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */, }; - -const EVP_CIPHER *EVP_des_cbc(void) { return &des_cbc; } - +DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_cbc) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_des_cbc; + out->block_size = 8; + out->key_len = 8; + out->iv_len = 8; + out->ctx_size = sizeof(EVP_DES_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = des_init_key; + out->cipher = des_cbc_cipher; +} static int des_ecb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t in_len) { @@ -111,14 +115,17 @@ return 1; } -static const EVP_CIPHER des_ecb = { - NID_des_ecb, 8 /* block_size */, 8 /* key_size */, - 0 /* iv_len */, sizeof(EVP_DES_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, des_init_key, des_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */, }; - -const EVP_CIPHER *EVP_des_ecb(void) { return &des_ecb; } - +DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ecb) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_des_ecb; + out->block_size = 8; + out->key_len = 8; + out->iv_len = 0; + out->ctx_size = sizeof(EVP_DES_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = des_init_key; + out->cipher = des_ecb_cipher; +} typedef struct { union { @@ -127,7 +134,6 @@ } ks; } DES_EDE_KEY; - static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv, int enc) { DES_cblock *deskey = (DES_cblock *)key; @@ -150,14 +156,17 @@ return 1; } -static const EVP_CIPHER des_ede3_cbc = { - NID_des_ede3_cbc, 8 /* block_size */, 24 /* key_size */, - 8 /* iv_len */, sizeof(DES_EDE_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, des_ede3_init_key, des_ede3_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */, }; - -const EVP_CIPHER *EVP_des_ede3_cbc(void) { return &des_ede3_cbc; } - +DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede3_cbc) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_des_ede3_cbc; + out->block_size = 8; + out->key_len = 24; + out->iv_len = 8; + out->ctx_size = sizeof(DES_EDE_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = des_ede3_init_key; + out->cipher = des_ede3_cbc_cipher; +} static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv, int enc) { @@ -171,14 +180,17 @@ return 1; } -static const EVP_CIPHER des_ede_cbc = { - NID_des_ede_cbc, 8 /* block_size */, 16 /* key_size */, - 8 /* iv_len */, sizeof(DES_EDE_KEY), EVP_CIPH_CBC_MODE, - NULL /* app_data */, des_ede_init_key , des_ede3_cbc_cipher, - NULL /* cleanup */, NULL /* ctrl */, }; - -const EVP_CIPHER *EVP_des_ede_cbc(void) { return &des_ede_cbc; } - +DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede_cbc) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_des_ede_cbc; + out->block_size = 8; + out->key_len = 16; + out->iv_len = 8; + out->ctx_size = sizeof(DES_EDE_KEY); + out->flags = EVP_CIPH_CBC_MODE; + out->init = des_ede_init_key; + out->cipher = des_ede3_cbc_cipher; +} static int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t in_len) { @@ -196,20 +208,26 @@ return 1; } -static const EVP_CIPHER des_ede_ecb = { - NID_des_ede_cbc, 8 /* block_size */, 16 /* key_size */, - 0 /* iv_len */, sizeof(DES_EDE_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, des_ede_init_key , des_ede_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */, }; +DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_des_ede_ecb; + out->block_size = 8; + out->key_len = 16; + out->iv_len = 0; + out->ctx_size = sizeof(DES_EDE_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = des_ede_init_key; + out->cipher = des_ede_ecb_cipher; +} -const EVP_CIPHER *EVP_des_ede(void) { return &des_ede_ecb; } - - -static const EVP_CIPHER des_ede3_ecb = { - NID_des_ede3_cbc, 8 /* block_size */, 24 /* key_size */, - 0 /* iv_len */, sizeof(DES_EDE_KEY), EVP_CIPH_ECB_MODE, - NULL /* app_data */, des_ede3_init_key, des_ede_ecb_cipher, - NULL /* cleanup */, NULL /* ctrl */, -}; - -const EVP_CIPHER *EVP_des_ede3(void) { return &des_ede3_ecb; } +DEFINE_METHOD_FUNCTION(EVP_CIPHER, EVP_des_ede3) { + memset(out, 0, sizeof(EVP_CIPHER)); + out->nid = NID_des_ede3_ecb; + out->block_size = 8; + out->key_len = 24; + out->iv_len = 0; + out->ctx_size = sizeof(DES_EDE_KEY); + out->flags = EVP_CIPH_ECB_MODE; + out->init = des_ede3_init_key; + out->cipher = des_ede_ecb_cipher; +}
diff --git a/crypto/cipher/internal.h b/crypto/fipsmodule/cipher/internal.h similarity index 64% copy from crypto/cipher/internal.h copy to crypto/fipsmodule/cipher/internal.h index 52dbac2..9a01f52 100644 --- a/crypto/cipher/internal.h +++ b/crypto/fipsmodule/cipher/internal.h
@@ -62,8 +62,8 @@ #include <openssl/aead.h> #include <openssl/aes.h> -#include "../internal.h" -#include "../fipsmodule/modes/internal.h" +#include "../../internal.h" +#include "../modes/internal.h" #if defined(__cplusplus) extern "C" { @@ -73,7 +73,6 @@ /* EVP_CIPH_MODE_MASK contains the bits of |flags| that represent the mode. */ #define EVP_CIPH_MODE_MASK 0x3f - /* EVP_AEAD represents a specific AEAD algorithm. */ struct evp_aead_st { uint8_t key_len; @@ -103,61 +102,6 @@ size_t *out_len); }; - -/* EVP_tls_cbc_get_padding determines the padding from the decrypted, TLS, CBC - * record in |in|. This decrypted record should not include any "decrypted" - * explicit IV. If the record is publicly invalid, it returns zero. Otherwise, - * it returns one and sets |*out_padding_ok| to all ones (0xfff..f) if the - * padding is valid and zero otherwise. It then sets |*out_len| to the length - * with the padding removed or |in_len| if invalid. - * - * If the function returns one, it runs in time independent of the contents of - * |in|. It is also guaranteed that |*out_len| >= |mac_size|, satisfying - * |EVP_tls_cbc_copy_mac|'s precondition. */ -int EVP_tls_cbc_remove_padding(crypto_word_t *out_padding_ok, size_t *out_len, - const uint8_t *in, size_t in_len, - size_t block_size, size_t mac_size); - -/* EVP_tls_cbc_copy_mac copies |md_size| bytes from the end of the first - * |in_len| bytes of |in| to |out| in constant time (independent of the concrete - * value of |in_len|, which may vary within a 256-byte window). |in| must point - * to a buffer of |orig_len| bytes. - * - * On entry: - * orig_len >= in_len >= md_size - * md_size <= EVP_MAX_MD_SIZE */ -void EVP_tls_cbc_copy_mac(uint8_t *out, size_t md_size, const uint8_t *in, - size_t in_len, size_t orig_len); - -/* EVP_tls_cbc_record_digest_supported returns 1 iff |md| is a hash function - * which EVP_tls_cbc_digest_record supports. */ -int EVP_tls_cbc_record_digest_supported(const EVP_MD *md); - -/* EVP_tls_cbc_digest_record computes the MAC of a decrypted, padded TLS - * record. - * - * md: the hash function used in the HMAC. - * EVP_tls_cbc_record_digest_supported must return true for this hash. - * md_out: the digest output. At most EVP_MAX_MD_SIZE bytes will be written. - * md_out_size: the number of output bytes is written here. - * header: the 13-byte, TLS record header. - * data: the record data itself - * data_plus_mac_size: the secret, reported length of the data and MAC - * once the padding has been removed. - * data_plus_mac_plus_padding_size: the public length of the whole - * record, including padding. - * - * On entry: by virtue of having been through one of the remove_padding - * functions, above, we know that data_plus_mac_size is large enough to contain - * a padding byte and MAC. (If the padding was invalid, it might contain the - * padding too. ) */ -int EVP_tls_cbc_digest_record(const EVP_MD *md, uint8_t *md_out, - size_t *md_out_size, const uint8_t header[13], - const uint8_t *data, size_t data_plus_mac_size, - size_t data_plus_mac_plus_padding_size, - const uint8_t *mac_secret, - unsigned mac_secret_length); - /* aes_ctr_set_key initialises |*aes_key| using |key_bytes| bytes from |key|, * where |key_bytes| must either be 16, 24 or 32. If not NULL, |*out_block| is * set to a function that encrypts single blocks. If not NULL, |*gcm_ctx| is
diff --git a/crypto/fipsmodule/delocate.go b/crypto/fipsmodule/delocate.go index 7483fc7..c8ea063 100644 --- a/crypto/fipsmodule/delocate.go +++ b/crypto/fipsmodule/delocate.go
@@ -248,6 +248,8 @@ break } + orig := line + if strings.Contains(line, "OPENSSL_ia32cap_get@PLT") { ia32capGetNeeded = true } @@ -307,7 +309,7 @@ ret = append(ret, line) continue - case "leaq", "movq", "cmpq": + case "leaq", "movq", "cmpq", "cmovneq", "cmoveq": if instr == "movq" && strings.Contains(line, "@GOTTPOFF(%rip)") { // GOTTPOFF are offsets into the thread-local // storage that are stored in the GOT. We have @@ -332,13 +334,15 @@ } target := args[0] + invertedCondition := "" + if strings.HasSuffix(target, "(%rip)") { target = target[:len(target)-6] if isGlobal := symbols[target]; isGlobal { line = strings.Replace(line, target, localTargetName(target), 1) } - if strings.Contains(line, "@GOTPCREL") && instr == "movq" { + if strings.Contains(line, "@GOTPCREL") && (instr == "movq" || instr == "cmoveq" || instr == "cmovneq") { line = strings.Replace(line, "@GOTPCREL", "", -1) target = strings.Replace(target, "@GOTPCREL", "", -1) @@ -351,12 +355,24 @@ target = redirectorName } + switch instr { + case "cmoveq": + invertedCondition = "ne" + case "cmovneq": + invertedCondition = "e" + } + + if len(invertedCondition) > 0 { + ret = append(ret, "\t# Was " + orig) + ret = append(ret, "\tj" + invertedCondition + " 1f") + } + // Nobody actually wants to read the // code of a function. This is a load // from the GOT which, now that we're // referencing the symbol directly, // needs to be transformed into an LEA. - line = strings.Replace(line, "movq", "leaq", 1) + line = strings.Replace(line, instr, "leaq", 1) instr = "leaq" } @@ -390,6 +406,9 @@ } ret = append(ret, line) + if len(invertedCondition) > 0 { + ret = append(ret, "1:") + } continue case ".comm":
diff --git a/crypto/fipsmodule/rand/ctrdrbg.c b/crypto/fipsmodule/rand/ctrdrbg.c index 5920837..2b22f5d 100644 --- a/crypto/fipsmodule/rand/ctrdrbg.c +++ b/crypto/fipsmodule/rand/ctrdrbg.c
@@ -18,7 +18,7 @@ #include <openssl/mem.h> #include "internal.h" -#include "../../cipher/internal.h" +#include "../cipher/internal.h" /* Section references in this file refer to SP 800-90Ar1:
diff --git a/util/all_tests.go b/util/all_tests.go index 3e47ed2..1b912dc 100644 --- a/util/all_tests.go +++ b/util/all_tests.go
@@ -252,7 +252,7 @@ func shortTestName(test test) string { var args []string for _, arg := range test.args { - if test.args[0] == "crypto/evp/evp_test" || test.args[0] == "crypto/cipher/cipher_test" || test.args[0] == "crypto/cipher/aead_test" || !strings.HasSuffix(arg, ".txt") { + if test.args[0] == "crypto/evp/evp_test" || test.args[0] == "crypto/cipher_extra/cipher_test" || test.args[0] == "crypto/cipher_extra/aead_test" || !strings.HasSuffix(arg, ".txt") { args = append(args, arg) } }
diff --git a/util/all_tests.json b/util/all_tests.json index a3b2ed6..c9cddc0 100644 --- a/util/all_tests.json +++ b/util/all_tests.json
@@ -1,36 +1,36 @@ [ - ["crypto/cipher/aead_test", "aes-128-cbc-sha1-ssl3", "crypto/cipher/test/aes_128_cbc_sha1_ssl3_tests.txt"], - ["crypto/cipher/aead_test", "aes-128-cbc-sha1-tls", "crypto/cipher/test/aes_128_cbc_sha1_tls_tests.txt"], - ["crypto/cipher/aead_test", "aes-128-cbc-sha1-tls-implicit-iv", "crypto/cipher/test/aes_128_cbc_sha1_tls_implicit_iv_tests.txt"], - ["crypto/cipher/aead_test", "aes-128-cbc-sha256-tls", "crypto/cipher/test/aes_128_cbc_sha256_tls_tests.txt"], - ["crypto/cipher/aead_test", "aes-128-ctr-hmac-sha256", "crypto/cipher/test/aes_128_ctr_hmac_sha256.txt"], - ["crypto/cipher/aead_test", "aes-128-gcm", "crypto/cipher/test/aes_128_gcm_tests.txt"], - ["crypto/cipher/aead_test", "aes-128-gcm", "crypto/cipher/test/nist_cavp/aes_128_gcm.txt"], - ["crypto/cipher/aead_test", "aes-128-gcm-fips-testonly", "crypto/cipher/test/aes_128_gcm_fips_testonly_tests.txt"], - ["crypto/cipher/aead_test", "aes-128-gcm-siv", "crypto/cipher/test/aes_128_gcm_siv_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-cbc-sha1-ssl3", "crypto/cipher/test/aes_256_cbc_sha1_ssl3_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-cbc-sha1-tls", "crypto/cipher/test/aes_256_cbc_sha1_tls_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-cbc-sha1-tls-implicit-iv", "crypto/cipher/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-cbc-sha256-tls", "crypto/cipher/test/aes_256_cbc_sha256_tls_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-cbc-sha384-tls", "crypto/cipher/test/aes_256_cbc_sha384_tls_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-ctr-hmac-sha256", "crypto/cipher/test/aes_256_ctr_hmac_sha256.txt"], - ["crypto/cipher/aead_test", "aes-256-gcm", "crypto/cipher/test/aes_256_gcm_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-gcm", "crypto/cipher/test/nist_cavp/aes_256_gcm.txt"], - ["crypto/cipher/aead_test", "aes-256-gcm-fips-testonly", "crypto/cipher/test/aes_256_gcm_fips_testonly_tests.txt"], - ["crypto/cipher/aead_test", "aes-256-gcm-siv", "crypto/cipher/test/aes_256_gcm_siv_tests.txt"], - ["crypto/cipher/aead_test", "chacha20-poly1305", "crypto/cipher/test/chacha20_poly1305_tests.txt"], - ["crypto/cipher/aead_test", "des-ede3-cbc-sha1-ssl3", "crypto/cipher/test/des_ede3_cbc_sha1_ssl3_tests.txt"], - ["crypto/cipher/aead_test", "des-ede3-cbc-sha1-tls", "crypto/cipher/test/des_ede3_cbc_sha1_tls_tests.txt"], - ["crypto/cipher/aead_test", "des-ede3-cbc-sha1-tls-implicit-iv", "crypto/cipher/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/cipher_tests.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aes_128_cbc.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aes_128_ctr.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aes_192_cbc.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aes_192_ctr.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aes_256_cbc.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aes_256_ctr.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/tdes_cbc.txt"], - ["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/tdes_ecb.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-cbc-sha1-ssl3", "crypto/cipher_extra/test/aes_128_cbc_sha1_ssl3_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-cbc-sha1-tls", "crypto/cipher_extra/test/aes_128_cbc_sha1_tls_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-cbc-sha1-tls-implicit-iv", "crypto/cipher_extra/test/aes_128_cbc_sha1_tls_implicit_iv_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-cbc-sha256-tls", "crypto/cipher_extra/test/aes_128_cbc_sha256_tls_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-ctr-hmac-sha256", "crypto/cipher_extra/test/aes_128_ctr_hmac_sha256.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-gcm", "crypto/cipher_extra/test/aes_128_gcm_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-gcm", "crypto/cipher_extra/test/nist_cavp/aes_128_gcm.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-gcm-fips-testonly", "crypto/cipher_extra/test/aes_128_gcm_fips_testonly_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-128-gcm-siv", "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-cbc-sha1-ssl3", "crypto/cipher_extra/test/aes_256_cbc_sha1_ssl3_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-cbc-sha1-tls", "crypto/cipher_extra/test/aes_256_cbc_sha1_tls_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-cbc-sha1-tls-implicit-iv", "crypto/cipher_extra/test/aes_256_cbc_sha1_tls_implicit_iv_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-cbc-sha256-tls", "crypto/cipher_extra/test/aes_256_cbc_sha256_tls_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-cbc-sha384-tls", "crypto/cipher_extra/test/aes_256_cbc_sha384_tls_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-ctr-hmac-sha256", "crypto/cipher_extra/test/aes_256_ctr_hmac_sha256.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-gcm", "crypto/cipher_extra/test/aes_256_gcm_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-gcm", "crypto/cipher_extra/test/nist_cavp/aes_256_gcm.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-gcm-fips-testonly", "crypto/cipher_extra/test/aes_256_gcm_fips_testonly_tests.txt"], + ["crypto/cipher_extra/aead_test", "aes-256-gcm-siv", "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt"], + ["crypto/cipher_extra/aead_test", "chacha20-poly1305", "crypto/cipher_extra/test/chacha20_poly1305_tests.txt"], + ["crypto/cipher_extra/aead_test", "des-ede3-cbc-sha1-ssl3", "crypto/cipher_extra/test/des_ede3_cbc_sha1_ssl3_tests.txt"], + ["crypto/cipher_extra/aead_test", "des-ede3-cbc-sha1-tls", "crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_tests.txt"], + ["crypto/cipher_extra/aead_test", "des-ede3-cbc-sha1-tls-implicit-iv", "crypto/cipher_extra/test/des_ede3_cbc_sha1_tls_implicit_iv_tests.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/cipher_tests.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/aes_128_cbc.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/aes_128_ctr.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/aes_192_cbc.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/aes_192_ctr.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/aes_256_cbc.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/aes_256_ctr.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt"], + ["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt"], ["crypto/crypto_test"], ["crypto/curve25519/ed25519_test", "crypto/curve25519/ed25519_tests.txt"], ["crypto/digest_extra/digest_test"],