diff options
author | Hans Nilsson <hans@erlang.org> | 2021-04-12 09:30:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-12 09:30:22 +0200 |
commit | c95809184ed3fbf60eecabbd4faf7e4ff21fc36c (patch) | |
tree | bc471b31762cb58d32415d12e49ede1dcfaef15d | |
parent | e93c2734460fde0f45f6b7d71b284bb7cbe7ffb7 (diff) | |
parent | df8f3e886f8285bb5cd19ab2adbd5ba0563306b4 (diff) | |
download | erlang-c95809184ed3fbf60eecabbd4faf7e4ff21fc36c.tar.gz |
Merge pull request #4686 from starbelly/add-aead-to-cipher-info-map
Add aead attribute to map from crypto:cipher_info/1
OTP-17313
-rw-r--r-- | lib/crypto/c_src/atoms.c | 2 | ||||
-rw-r--r-- | lib/crypto/c_src/atoms.h | 1 | ||||
-rw-r--r-- | lib/crypto/c_src/cipher.c | 3 | ||||
-rw-r--r-- | lib/crypto/doc/src/crypto.xml | 2 | ||||
-rw-r--r-- | lib/crypto/src/crypto.erl | 3 | ||||
-rw-r--r-- | lib/crypto/test/crypto_SUITE.erl | 41 |
6 files changed, 50 insertions, 2 deletions
diff --git a/lib/crypto/c_src/atoms.c b/lib/crypto/c_src/atoms.c index 858ffe39f7..5671e6d801 100644 --- a/lib/crypto/c_src/atoms.c +++ b/lib/crypto/c_src/atoms.c @@ -52,6 +52,7 @@ ERL_NIF_TERM atom_not_supported; ERL_NIF_TERM atom_type; ERL_NIF_TERM atom_size; ERL_NIF_TERM atom_block_size; +ERL_NIF_TERM atom_prop_aead; ERL_NIF_TERM atom_key_length; ERL_NIF_TERM atom_iv_length; ERL_NIF_TERM atom_mode; @@ -186,6 +187,7 @@ int init_atoms(ErlNifEnv *env, const ERL_NIF_TERM fips_mode, const ERL_NIF_TERM atom_type = enif_make_atom(env,"type"); atom_size = enif_make_atom(env,"size"); atom_block_size = enif_make_atom(env,"block_size"); + atom_prop_aead = enif_make_atom(env,"prop_aead"); atom_key_length = enif_make_atom(env,"key_length"); atom_iv_length = enif_make_atom(env,"iv_length"); atom_mode = enif_make_atom(env,"mode"); diff --git a/lib/crypto/c_src/atoms.h b/lib/crypto/c_src/atoms.h index ac8b4e2b74..414e3045ea 100644 --- a/lib/crypto/c_src/atoms.h +++ b/lib/crypto/c_src/atoms.h @@ -57,6 +57,7 @@ extern ERL_NIF_TERM atom_type; extern ERL_NIF_TERM atom_size; extern ERL_NIF_TERM atom_block_size; extern ERL_NIF_TERM atom_key_length; +extern ERL_NIF_TERM atom_prop_aead; extern ERL_NIF_TERM atom_iv_length; extern ERL_NIF_TERM atom_mode; extern ERL_NIF_TERM atom_encrypt; diff --git a/lib/crypto/c_src/cipher.c b/lib/crypto/c_src/cipher.c index c872922f6b..132c98f17d 100644 --- a/lib/crypto/c_src/cipher.c +++ b/lib/crypto/c_src/cipher.c @@ -229,6 +229,9 @@ ERL_NIF_TERM cipher_info_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[] enif_make_int(env, EVP_CIPHER_iv_length(cipher)), &ret); enif_make_map_put(env, ret, atom_block_size, enif_make_int(env, EVP_CIPHER_block_size(cipher)), &ret); + enif_make_map_put(env, ret, atom_prop_aead, + (((EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) != 0) ? atom_true : atom_false), + &ret); mode = EVP_CIPHER_mode(cipher); switch (mode) { diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml index b2e145840b..9c26f926e0 100644 --- a/lib/crypto/doc/src/crypto.xml +++ b/lib/crypto/doc/src/crypto.xml @@ -1189,7 +1189,7 @@ <name name="cipher_info" arity="1" since="OTP 22.0"/> <fsummary>Information about supported ciphers.</fsummary> <desc> - <p>Provides a map with information about block_size, key_length, iv_length and possibly other properties of the + <p>Provides a map with information about block_size, key_length, iv_length, aead support and possibly other properties of the cipher algorithm in question. </p> <note> diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl index 1fa2d3805c..81154e0884 100644 --- a/lib/crypto/src/crypto.erl +++ b/lib/crypto/src/crypto.erl @@ -725,7 +725,8 @@ mac_final_nif(_Ref) -> ?nif_stub. iv_length := integer(), block_size := integer(), mode := CipherModes, - type := undefined | integer() + type := undefined | integer(), + prop_aead := boolean() }, CipherModes :: undefined | cbc_mode diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl index 4c89cdafe9..40b6ad46d6 100644 --- a/lib/crypto/test/crypto_SUITE.erl +++ b/lib/crypto/test/crypto_SUITE.erl @@ -57,6 +57,8 @@ bad_verify_name/1, cipher_info/0, cipher_info/1, + cipher_info_prop_aead_attr/0, + cipher_info_prop_aead_attr/1, cipher_padding/1, compute/0, compute/1, @@ -1242,6 +1244,45 @@ cipher_info(Config) when is_list(Config) -> ct:fail('Cipher unsupported',[]) end. +cipher_info_prop_aead_attr() -> + [{doc, "crypto cipher_info prop_aead attribute testing"}]. +cipher_info_prop_aead_attr(Config) when is_list(Config) -> + AeadCiphers = [aes_128_ccm, aes_192_ccm, aes_256_ccm, aes_128_gcm, aes_192_gcm, aes_256_gcm, chacha20_poly1305], + case lists:foldl(fun(C,Ok) -> + case crypto:cipher_info(C) of + #{prop_aead := true} -> + true and Ok; + _ -> + false + end + end, + true, + AeadCiphers + ) + of + true -> + ok; + false -> + ct:fail('AEAD Cipher attribute reported false',[]) + end, + NonAeadCiphers = [aes_ige256, blowfish_cbc, blowfish_cfb64], + case lists:foldl(fun(C,Ok) -> + case crypto:cipher_info(C) of + #{prop_aead := false} -> + true and Ok; + _ -> + false + end + end, + true, + NonAeadCiphers + ) + of + true -> + ok; + false -> + ct:fail('Non-AEAD Cipher attribute reported true',[]) + end. %%-------------------------------------------------------------------- hash_info() -> |