The branch master has been updated via c748c1147623beaf8ea3a33d5c4b1535f74baa16 (commit) via 7d04be79dbd4cf47d2b079057f272b34c2256e8f (commit) via 2ff9e7432d32c454ccc6c6b67442662baa335557 (commit) via 23a9808c4c617ea48cdb7d0b0d9fdbcd107411ed (commit) via 4e8cb45c095aaf9317bc62b7787af66217663a48 (commit) via cd8e4decf79985ffe586c4ccdd35e897f3ac703a (commit) via 99119000add47e4d1d9241f4e76f57d98439a766 (commit) from e9b1c42f753fcb90eee70a12b0ac832951d7ac0b (commit)
- Log ----------------------------------------------------------------- commit c748c1147623beaf8ea3a33d5c4b1535f74baa16 Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 22:15:02 2016 +0000 make update Reviewed-by: Rich Salz <rs...@openssl.org> commit 7d04be79dbd4cf47d2b079057f272b34c2256e8f Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 18:04:42 2016 +0000 Generalise KDF test in evp_test.c Reviewed-by: Rich Salz <rs...@openssl.org> commit 2ff9e7432d32c454ccc6c6b67442662baa335557 Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 16:22:25 2016 +0000 Convert PRF tests to use Ctrl Reviewed-by: Rich Salz <rs...@openssl.org> commit 23a9808c4c617ea48cdb7d0b0d9fdbcd107411ed Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 15:08:18 2016 +0000 Add Ctrl keyword to KDF test in evp_test Reviewed-by: Rich Salz <rs...@openssl.org> commit 4e8cb45c095aaf9317bc62b7787af66217663a48 Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 14:58:33 2016 +0000 Add string ctrl operations to TLS1 PRF, update documentation. Reviewed-by: Rich Salz <rs...@openssl.org> commit cd8e4decf79985ffe586c4ccdd35e897f3ac703a Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 14:56:02 2016 +0000 Use utility functions for HMAC and CMAC. Reviewed-by: Rich Salz <rs...@openssl.org> commit 99119000add47e4d1d9241f4e76f57d98439a766 Author: Dr. Stephen Henson <st...@openssl.org> Date: Tue Mar 1 14:47:15 2016 +0000 EVP_PKEY_CTX utility functions. Utility functions to pass a string or hex string to EVP_PKEY_CTX_ctrl(). Reviewed-by: Rich Salz <rs...@openssl.org> ----------------------------------------------------------------------- Summary of changes: crypto/cmac/cm_pmeth.c | 19 ++++------------ crypto/evp/pmeth_lib.c | 29 ++++++++++++++++++++++++ crypto/hmac/hm_pmeth.c | 19 ++++------------ crypto/kdf/tls1_prf.c | 27 +++++++++++++++++++++- doc/crypto/EVP_PKEY_TLS1_PRF.pod | 11 ++++++++- include/openssl/evp.h | 3 +++ test/evp_test.c | 33 +++------------------------ test/evptests.txt | 48 ++++++++++++++++++++-------------------- util/libeay.num | 2 ++ 9 files changed, 105 insertions(+), 86 deletions(-) diff --git a/crypto/cmac/cm_pmeth.c b/crypto/cmac/cm_pmeth.c index 4e060f3..f00a32e 100644 --- a/crypto/cmac/cm_pmeth.c +++ b/crypto/cmac/cm_pmeth.c @@ -157,10 +157,6 @@ static int pkey_cmac_ctrl_str(EVP_PKEY_CTX *ctx, if (!value) { return 0; } - if (strcmp(type, "key") == 0) { - void *p = (void *)value; - return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, strlen(p), p); - } if (strcmp(type, "cipher") == 0) { const EVP_CIPHER *c; c = EVP_get_cipherbyname(value); @@ -168,17 +164,10 @@ static int pkey_cmac_ctrl_str(EVP_PKEY_CTX *ctx, return 0; return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_CIPHER, -1, (void *)c); } - if (strcmp(type, "hexkey") == 0) { - unsigned char *key; - int r; - long keylen; - key = string_to_hex(value, &keylen); - if (!key) - return 0; - r = pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, keylen, key); - OPENSSL_free(key); - return r; - } + if (strcmp(type, "key") == 0) + return EVP_PKEY_CTX_str2ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, value); + if (strcmp(type, "hexkey") == 0) + return EVP_PKEY_CTX_hex2ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, value); return -2; } diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c index 72baaa9..44a6a05 100644 --- a/crypto/evp/pmeth_lib.c +++ b/crypto/evp/pmeth_lib.c @@ -63,8 +63,10 @@ # include <openssl/engine.h> #endif #include <openssl/evp.h> +#include <openssl/x509v3.h> #include "internal/asn1_int.h" #include "internal/evp_int.h" +#include "internal/numbers.h" typedef int sk_cmp_fn_type(const char *const *a, const char *const *b); @@ -381,6 +383,33 @@ int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, return ctx->pmeth->ctrl_str(ctx, name, value); } +/* Utility functions to send a string of hex string to a ctrl */ + +int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str) +{ + size_t len; + + len = strlen(str); + if (len > INT_MAX) + return -1; + return ctx->pmeth->ctrl(ctx, cmd, len, (void *)str); +} + +int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex) +{ + unsigned char *bin; + long binlen; + int rv = -1; + + bin = string_to_hex(hex, &binlen); + if (bin == NULL) + return 0; + if (binlen <= INT_MAX) + rv = ctx->pmeth->ctrl(ctx, cmd, binlen, bin); + OPENSSL_free(bin); + return rv; +} + int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx) { return ctx->operation; diff --git a/crypto/hmac/hm_pmeth.c b/crypto/hmac/hm_pmeth.c index 41013bc..268b48d 100644 --- a/crypto/hmac/hm_pmeth.c +++ b/crypto/hmac/hm_pmeth.c @@ -206,21 +206,10 @@ static int pkey_hmac_ctrl_str(EVP_PKEY_CTX *ctx, if (!value) { return 0; } - if (strcmp(type, "key") == 0) { - void *p = (void *)value; - return pkey_hmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, -1, p); - } - if (strcmp(type, "hexkey") == 0) { - unsigned char *key; - int r; - long keylen; - key = string_to_hex(value, &keylen); - if (!key) - return 0; - r = pkey_hmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, keylen, key); - OPENSSL_free(key); - return r; - } + if (strcmp(type, "key") == 0) + return EVP_PKEY_CTX_str2ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, value); + if (strcmp(type, "hexkey") == 0) + return EVP_PKEY_CTX_hex2ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, value); return -2; } diff --git a/crypto/kdf/tls1_prf.c b/crypto/kdf/tls1_prf.c index 374c6e4..1302eb0 100644 --- a/crypto/kdf/tls1_prf.c +++ b/crypto/kdf/tls1_prf.c @@ -138,6 +138,31 @@ static int pkey_tls1_prf_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) } } +static int pkey_tls1_prf_ctrl_str(EVP_PKEY_CTX *ctx, + const char *type, const char *value) +{ + if (value == NULL) + return 0; + if (strcmp(type, "md") == 0) { + TLS1_PRF_PKEY_CTX *kctx = ctx->data; + + const EVP_MD *md = EVP_get_digestbyname(value); + if (md == NULL) + return 0; + kctx->md = md; + return 1; + } + if (strcmp(type, "secret") == 0) + return EVP_PKEY_CTX_str2ctrl(ctx, EVP_PKEY_CTRL_TLS_SECRET, value); + if (strcmp(type, "hexsecret") == 0) + return EVP_PKEY_CTX_hex2ctrl(ctx, EVP_PKEY_CTRL_TLS_SECRET, value); + if (strcmp(type, "seed") == 0) + return EVP_PKEY_CTX_str2ctrl(ctx, EVP_PKEY_CTRL_TLS_SEED, value); + if (strcmp(type, "hexseed") == 0) + return EVP_PKEY_CTX_hex2ctrl(ctx, EVP_PKEY_CTRL_TLS_SEED, value); + return -2; +} + static int pkey_tls1_prf_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen) { @@ -176,7 +201,7 @@ const EVP_PKEY_METHOD tls1_prf_pkey_meth = { 0, pkey_tls1_prf_derive, pkey_tls1_prf_ctrl, - 0 + pkey_tls1_prf_ctrl_str }; static int tls1_prf_P_hash(const EVP_MD *md, diff --git a/doc/crypto/EVP_PKEY_TLS1_PRF.pod b/doc/crypto/EVP_PKEY_TLS1_PRF.pod index 8e9ff5a..e2a695d 100644 --- a/doc/crypto/EVP_PKEY_TLS1_PRF.pod +++ b/doc/crypto/EVP_PKEY_TLS1_PRF.pod @@ -33,6 +33,14 @@ and any seed is reset. EVP_PKEY_CTX_add1_tls1_prf_seed() sets the seed to B<seedlen> bytes of B<seed>. If a seed is already set it is appended to the existing value. +=head1 STRING CTRLS + +The TLS PRF also supports string based control operations using +EVP_PKEY_CTX_ctrl_str(). The B<type> parameters "secret" and "seed" use +the supplied B<value> parameter as a secret or seed value. The names +"hexsecret" and "hexseed" are similar except they take a hex string which +is converted to binary. + =head1 NOTES All these functions are implemented as macros. @@ -82,6 +90,7 @@ and seed value "seed": =head1 SEE ALSO L<EVP_PKEY_CTX_new(3)>, -L<EVP_PKEY_derive(3)>, +L<EVP_PKEY_CTX_ctrl(3)>, +L<EVP_PKEY_derive(3)> =cut diff --git a/include/openssl/evp.h b/include/openssl/evp.h index d71429e..44ca1f3 100644 --- a/include/openssl/evp.h +++ b/include/openssl/evp.h @@ -1224,6 +1224,9 @@ int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value); +int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str); +int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex); + int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); diff --git a/test/evp_test.c b/test/evp_test.c index 6bc3a8a..bda7f69 100644 --- a/test/evp_test.c +++ b/test/evp_test.c @@ -1739,9 +1739,7 @@ static const struct evp_test_method encode_test_method = { encode_test_run, }; -/* - * KDF operations: initially just TLS1 PRF but can be adapted. - */ +/* KDF operations */ struct kdf_data { /* Context for this operation */ @@ -1780,39 +1778,14 @@ static void kdf_test_cleanup(struct evp_test *t) EVP_PKEY_CTX_free(kdata->ctx); } -static int kdf_ctrl(EVP_PKEY_CTX *ctx, int op, const char *value) -{ - unsigned char *buf = NULL; - size_t buf_len; - int rv = 0; - if (test_bin(value, &buf, &buf_len) == 0) - return 0; - if (EVP_PKEY_CTX_ctrl(ctx, -1, -1, op, buf_len, buf) <= 0) - goto err; - rv = 1; - err: - OPENSSL_free(buf); - return rv; -} - static int kdf_test_parse(struct evp_test *t, const char *keyword, const char *value) { struct kdf_data *kdata = t->data; if (strcmp(keyword, "Output") == 0) return test_bin(value, &kdata->output, &kdata->output_len); - else if (strcmp(keyword, "MD") == 0) { - const EVP_MD *md = EVP_get_digestbyname(value); - if (md == NULL) - return 0; - if (EVP_PKEY_CTX_set_tls1_prf_md(kdata->ctx, md) <= 0) - return 0; - return 1; - } else if (strcmp(keyword, "Secret") == 0) { - return kdf_ctrl(kdata->ctx, EVP_PKEY_CTRL_TLS_SECRET, value); - } else if (strncmp("Seed", keyword, 4) == 0) { - return kdf_ctrl(kdata->ctx, EVP_PKEY_CTRL_TLS_SEED, value); - } + if (strncmp(keyword, "Ctrl", 4) == 0) + return pkey_test_ctrl(kdata->ctx, value); return 0; } diff --git a/test/evptests.txt b/test/evptests.txt index 4c83163..b041344 100644 --- a/test/evptests.txt +++ b/test/evptests.txt @@ -2974,48 +2974,48 @@ Ciphertext = 64a0861575861af460f062c79be643bd5e805cfd345cf389f108670ac76c8cb24c6 # TLS1 PRF tests, from NIST test vectors KDF=TLS1-PRF -MD=MD5-SHA1 -Secret = bded7fa5c1699c010be23dd06ada3a48349f21e5f86263d512c0c5cc379f0e780ec55d9844b2f1db02a96453513568d0 -Seed.label = "master secret" -Seed.client_random = e5acaf549cd25c22d964c0d930fa4b5261d2507fad84c33715b7b9a864020693 -Seed.server_random = 135e4d557fdf3aa6406d82975d5c606a9734c9334b42136e96990fbd5358cdb2 +Ctrl.md = md:MD5-SHA1 +Ctrl.Secret = hexsecret:bded7fa5c1699c010be23dd06ada3a48349f21e5f86263d512c0c5cc379f0e780ec55d9844b2f1db02a96453513568d0 +Ctrl.label = seed:master secret +Ctrl.client_random = hexseed:e5acaf549cd25c22d964c0d930fa4b5261d2507fad84c33715b7b9a864020693 +Ctrl.server_random = hexseed:135e4d557fdf3aa6406d82975d5c606a9734c9334b42136e96990fbd5358cdb2 Output = 2f6962dfbc744c4b2138bb6b3d33054c5ecc14f24851d9896395a44ab3964efc2090c5bf51a0891209f46c1e1e998f62 KDF=TLS1-PRF -MD=MD5-SHA1 -Secret = 2f6962dfbc744c4b2138bb6b3d33054c5ecc14f24851d9896395a44ab3964efc2090c5bf51a0891209f46c1e1e998f62 -Seed.label = "key expansion" -Seed.server_random = 67267e650eb32444119d222a368c191af3082888dc35afe8368e638c828874be -Seed.client_random = d58a7b1cd4fedaa232159df652ce188f9d997e061b9bf48e83b62990440931f6 +Ctrl.md = md:MD5-SHA1 +Ctrl.Secret = hexsecret:2f6962dfbc744c4b2138bb6b3d33054c5ecc14f24851d9896395a44ab3964efc2090c5bf51a0891209f46c1e1e998f62 +Ctrl.label = seed:key expansion +Ctrl.server_random = hexseed:67267e650eb32444119d222a368c191af3082888dc35afe8368e638c828874be +Ctrl.client_random = hexseed:d58a7b1cd4fedaa232159df652ce188f9d997e061b9bf48e83b62990440931f6 Output = 3088825988e77fce68d19f756e18e43eb7fe672433504feaf99b3c503d9091b164f166db301d70c9fc0870b4a94563907bee1a61fb786cb717576890bcc51cb9ead97e01d0a2fea99c953377b195205ff07b369589178796edc963fd80fdbe518a2fc1c35c18ae8d KDF=TLS1-PRF -MD=SHA256 -Secret = f8938ecc9edebc5030c0c6a441e213cd24e6f770a50dda07876f8d55da062bcadb386b411fd4fe4313a604fce6c17fbc -Seed.label = "master secret" -Seed.client_random = 36c129d01a3200894b9179faac589d9835d58775f9b5ea3587cb8fd0364cae8c -Seed.server_random = f6c9575ed7ddd73e1f7d16eca115415812a43c2b747daaaae043abfb50053fce +Ctrl.md = md:SHA256 +Ctrl.Secret = hexsecret:f8938ecc9edebc5030c0c6a441e213cd24e6f770a50dda07876f8d55da062bcadb386b411fd4fe4313a604fce6c17fbc +Ctrl.label = seed:master secret +Ctrl.client_random = hexseed:36c129d01a3200894b9179faac589d9835d58775f9b5ea3587cb8fd0364cae8c +Ctrl.server_random = hexseed:f6c9575ed7ddd73e1f7d16eca115415812a43c2b747daaaae043abfb50053fce Output = 202c88c00f84a17a20027079604787461176455539e705be730890602c289a5001e34eeb3a043e5d52a65e66125188bf KDF=TLS1-PRF -MD=SHA256 -Secret = 202c88c00f84a17a20027079604787461176455539e705be730890602c289a5001e34eeb3a043e5d52a65e66125188bf -Seed.label = "key expansion" -Seed.server_random = ae6c806f8ad4d80784549dff28a4b58fd837681a51d928c3e30ee5ff14f39868 -Seed.client_random = 62e1fd91f23f558a605f28478c58cf72637b89784d959df7e946d3f07bd1b616 +Ctrl.md = md:SHA256 +Ctrl.Secret = hexsecret:202c88c00f84a17a20027079604787461176455539e705be730890602c289a5001e34eeb3a043e5d52a65e66125188bf +Ctrl.label = seed:key expansion +Ctrl.server_random = hexseed:ae6c806f8ad4d80784549dff28a4b58fd837681a51d928c3e30ee5ff14f39868 +Ctrl.client_random = hexseed:62e1fd91f23f558a605f28478c58cf72637b89784d959df7e946d3f07bd1b616 Output = d06139889fffac1e3a71865f504aa5d0d2a2e89506c6f2279b670c3e1b74f531016a2530c51a3a0f7e1d6590d0f0566b2f387f8d11fd4f731cdd572d2eae927f6f2f81410b25e6960be68985add6c38445ad9f8c64bf8068bf9a6679485d966f1ad6f68b43495b10a683755ea2b858d70ccac7ec8b053c6bd41ca299d4e51928 # Missing digest. KDF=TLS1-PRF -Secret = 01 -Seed = 02 +Ctrl.Secret = hexsecret:01 +Ctrl.Seed = hexseed:02 Output = 03 Result = KDF_DERIVE_ERROR # Missing secret. KDF=TLS1-PRF -MD=MD5-SHA1 -Seed = 02 +Ctrl.md = md:MD5-SHA1 +Ctrl.Seed = hexseed:02 Output = 03 Result = KDF_DERIVE_ERROR diff --git a/util/libeay.num b/util/libeay.num index d49fd74..3033574 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -4801,3 +4801,5 @@ CT_POLICY_EVAL_CTX_set0_cert 5304 1_1_0 EXIST::FUNCTION: CT_POLICY_EVAL_CTX_get0_log_store 5305 1_1_0 EXIST::FUNCTION: CT_POLICY_EVAL_CTX_free 5306 1_1_0 EXIST::FUNCTION: CT_verify_no_bad_scts 5307 1_1_0 EXIST::FUNCTION: +EVP_PKEY_CTX_hex2ctrl 5308 1_1_0 EXIST::FUNCTION: +EVP_PKEY_CTX_str2ctrl 5309 1_1_0 EXIST::FUNCTION: _____ openssl-commits mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-commits