[openssl] master update

kaduk at mit.edu kaduk at mit.edu
Sat Jun 20 16:47:10 UTC 2020


The branch master has been updated
       via  7cc5e0d283800c757e46d1476273d271120aa38d (commit)
       via  320d96a32c16de1adbf11f76819fe738f24665b1 (commit)
      from  5797e309fce89b5aa9f690ad82f272552b4c7987 (commit)


- Log -----------------------------------------------------------------
commit 7cc5e0d283800c757e46d1476273d271120aa38d
Author: Benjamin Kaduk <bkaduk at akamai.com>
Date:   Mon Jun 1 12:31:55 2020 -0700

    Allow oversized buffers for provider cipher IV fetch
    
    When we're fetching an IV, there's no need to enforce that the
    provided buffer is exactly the same size as the IV we want to
    write into it.  This might happen, for example, when
    EVP_CIPHER_CTX_iv_noconst() passes sizeof(ctx->iv) (that is,
    EVP_MAX_IV_LENGTH) for an AES-GCM cipher that uses a shorter IV.
    AES-OCB and CCM were also affected.
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/12039)

commit 320d96a32c16de1adbf11f76819fe738f24665b1
Author: Benjamin Kaduk <bkaduk at akamai.com>
Date:   Mon Jun 1 14:33:54 2020 -0700

    Set cipher IV as octet string and pointer from providers
    
    OSSL_CIPHER_PARAM_IV can be accessed both as an octet string and as
    an octet pointer (for routines like EVP_CIPHER_CTX_iv() that are
    in a nebulous undocumented-and-might-go-away-eventually state),
    the latter for when there is need to modify the actual value in
    the provider.
    
    Make sure that we consistently try to set it as both the string and pointer
    forms (not just octet string) and only fail if neither version succeeds.  The
    generic cipher get_ctx_params routine was already doing so, but the
    AES-variant-, GCM-, and CCM-specific ones were not.
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/12039)

-----------------------------------------------------------------------

Summary of changes:
 providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c | 3 ++-
 providers/implementations/ciphers/cipher_aes_ocb.c          | 5 +++--
 providers/implementations/ciphers/ciphercommon_ccm.c        | 5 +++--
 providers/implementations/ciphers/ciphercommon_gcm.c        | 5 +++--
 4 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c b/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c
index 34bd3c151f..ece4341a3f 100644
--- a/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c
+++ b/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c
@@ -229,7 +229,8 @@ static int aes_get_ctx_params(void *vctx, OSSL_PARAM params[])
     }
     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
     if (p != NULL
-        && !OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)) {
+        && !OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)
+        && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.oiv, ctx->base.ivlen)) {
         ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
         return 0;
     }
diff --git a/providers/implementations/ciphers/cipher_aes_ocb.c b/providers/implementations/ciphers/cipher_aes_ocb.c
index 859f3524a4..84ba062d6b 100644
--- a/providers/implementations/ciphers/cipher_aes_ocb.c
+++ b/providers/implementations/ciphers/cipher_aes_ocb.c
@@ -401,11 +401,12 @@ static int aes_ocb_get_ctx_params(void *vctx, OSSL_PARAM params[])
 
     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
     if (p != NULL) {
-        if (ctx->base.ivlen != p->data_size) {
+        if (ctx->base.ivlen > p->data_size) {
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
             return 0;
         }
-        if (!OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)) {
+        if (!OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)
+            && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.oiv, ctx->base.ivlen)) {
             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
             return 0;
         }
diff --git a/providers/implementations/ciphers/ciphercommon_ccm.c b/providers/implementations/ciphers/ciphercommon_ccm.c
index 80c2230d96..2b9a0687e3 100644
--- a/providers/implementations/ciphers/ciphercommon_ccm.c
+++ b/providers/implementations/ciphers/ciphercommon_ccm.c
@@ -160,11 +160,12 @@ int ccm_get_ctx_params(void *vctx, OSSL_PARAM params[])
 
     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
     if (p != NULL) {
-        if (ccm_get_ivlen(ctx) != p->data_size) {
+        if (ccm_get_ivlen(ctx) > p->data_size) {
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IVLEN);
             return 0;
         }
-        if (!OSSL_PARAM_set_octet_string(p, ctx->iv, p->data_size)) {
+        if (!OSSL_PARAM_set_octet_string(p, ctx->iv, p->data_size)
+            && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, p->data_size)) {
             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
             return 0;
         }
diff --git a/providers/implementations/ciphers/ciphercommon_gcm.c b/providers/implementations/ciphers/ciphercommon_gcm.c
index c6d53de41e..7daa8dce5b 100644
--- a/providers/implementations/ciphers/ciphercommon_gcm.c
+++ b/providers/implementations/ciphers/ciphercommon_gcm.c
@@ -156,11 +156,12 @@ int gcm_get_ctx_params(void *vctx, OSSL_PARAM params[])
     if (p != NULL) {
         if (ctx->iv_gen != 1 && ctx->iv_gen_rand != 1)
             return 0;
-        if (ctx->ivlen != p->data_size) {
+        if (ctx->ivlen > p->data_size) {
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
             return 0;
         }
-        if (!OSSL_PARAM_set_octet_string(p, ctx->iv, ctx->ivlen)) {
+        if (!OSSL_PARAM_set_octet_string(p, ctx->iv, ctx->ivlen)
+            && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)) {
             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
             return 0;
         }


More information about the openssl-commits mailing list