Fix: Check (un)wrapped key length.
authorDariusz Michaluk <d.michaluk@samsung.com>
Wed, 17 Aug 2016 15:23:51 +0000 (17:23 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Mon, 29 Aug 2016 12:45:41 +0000 (14:45 +0200)
Change-Id: I6d664586637f94a0bd5f442f14b7a590a0580d8f

src/encrypt.c

index ebe43a41e886ba17982450133ce544920a28956e..4cedf96e1c503f25eafdc1a2aefa6ab964fbdf7d 100644 (file)
@@ -938,13 +938,31 @@ int encrypt_update(yaca_context_h ctx,
        if (!verify_state_change(c, target_state))
                return YACA_ERROR_INVALID_PARAMETER;
 
-       if (mode == EVP_CIPH_WRAP_MODE && op_type == OP_ENCRYPT) {
-               if (type == NID_id_aes128_wrap || type == NID_id_aes192_wrap || type == NID_id_aes256_wrap) {
-                       if (input_len % 8 != 0 || input_len < (YACA_KEY_LENGTH_UNSAFE_128BIT / 8))
-                               return YACA_ERROR_INVALID_PARAMETER;
-               } else if (type == NID_id_smime_alg_CMS3DESwrap) {
-                       if (input_len != (YACA_KEY_LENGTH_UNSAFE_128BIT / 8) && input_len != (YACA_KEY_LENGTH_192BIT / 8))
-                               return YACA_ERROR_INVALID_PARAMETER;
+       if (mode == EVP_CIPH_WRAP_MODE) {
+               if (op_type == OP_ENCRYPT) {
+                       if (type == NID_id_aes128_wrap || type == NID_id_aes192_wrap || type == NID_id_aes256_wrap) {
+                               if (input_len % 8 != 0 || input_len < (YACA_KEY_LENGTH_UNSAFE_128BIT / 8))
+                                       return YACA_ERROR_INVALID_PARAMETER;
+                       } else if (type == NID_id_smime_alg_CMS3DESwrap) {
+                               if (input_len != (YACA_KEY_LENGTH_UNSAFE_128BIT / 8) &&
+                                   input_len != (YACA_KEY_LENGTH_192BIT / 8))
+                                       return YACA_ERROR_INVALID_PARAMETER;
+                       } else {
+                               assert(false);
+                               return YACA_ERROR_INTERNAL;
+                       }
+               } else if (op_type == OP_DECRYPT) {
+                       if (type == NID_id_aes128_wrap || type == NID_id_aes192_wrap || type == NID_id_aes256_wrap) {
+                               if (input_len % 8 != 0 || input_len < (YACA_KEY_LENGTH_UNSAFE_128BIT / 8 + 8))
+                                       return YACA_ERROR_INVALID_PARAMETER;
+                       } else if (type == NID_id_smime_alg_CMS3DESwrap) {
+                               if (input_len != (YACA_KEY_LENGTH_UNSAFE_128BIT / 8 + 16) &&
+                                   input_len != (YACA_KEY_LENGTH_192BIT / 8 + 16))
+                                       return YACA_ERROR_INVALID_PARAMETER;
+                       } else {
+                               assert(false);
+                               return YACA_ERROR_INTERNAL;
+                       }
                } else {
                        assert(false);
                        return YACA_ERROR_INTERNAL;