]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
corrected bug in stream ciphers and added new cipher to the new padding format.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 17 Mar 2013 11:22:11 +0000 (12:22 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 17 Mar 2013 11:30:02 +0000 (12:30 +0100)
lib/gnutls_cipher.c

index 8531a4c7b08189799307420a1ae06abf853d04c7..390a6b1ce876b8add4a9d5dc31ad1b62b1459e2b 100644 (file)
@@ -417,7 +417,7 @@ compressed_to_ciphertext (gnutls_session_t session,
        */
       if (auth_cipher) 
         return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-      else if (iv_size > 0)
+      else if (block_algo == CIPHER_STREAM && iv_size > 0)
         _gnutls_auth_cipher_setiv(&params->write.cipher_state, UINT64DATA(params->write.sequence_number), 8);
     }
 
@@ -474,6 +474,9 @@ compressed_to_ciphertext_new (gnutls_session_t session,
   int explicit_iv = _gnutls_version_has_explicit_iv (session->security_parameters.version);
   int auth_cipher = _gnutls_auth_cipher_is_aead(&params->write.cipher_state);
   uint8_t nonce[MAX_CIPHER_BLOCK_SIZE];
+  unsigned iv_size;
+
+  iv_size = gnutls_cipher_get_iv_size(params->cipher_algorithm);
 
   _gnutls_hard_log("ENC[%p]: cipher: %s, MAC: %s, Epoch: %u\n",
     session, gnutls_cipher_get_name(params->cipher_algorithm), gnutls_mac_get_name(params->mac_algorithm),
@@ -528,6 +531,8 @@ compressed_to_ciphertext_new (gnutls_session_t session,
           cipher_data += AEAD_EXPLICIT_DATA_SIZE;
           length += AEAD_EXPLICIT_DATA_SIZE;
         }
+      else if (iv_size > 0)
+        _gnutls_auth_cipher_setiv(&params->write.cipher_state, UINT64DATA(params->write.sequence_number), 8);
     }
   else
     {
@@ -834,7 +839,9 @@ ciphertext_to_compressed_new (gnutls_session_t session,
   unsigned int ver = gnutls_protocol_get_version (session);
   unsigned int tag_size = _gnutls_auth_cipher_tag_len (&params->read.cipher_state);
   unsigned int explicit_iv = _gnutls_version_has_explicit_iv (session->security_parameters.version);
-
+  unsigned iv_size;
+  
+  iv_size = gnutls_cipher_get_iv_size(params->cipher_algorithm);
   blocksize = gnutls_cipher_get_block_size (params->cipher_algorithm);
 
   /* actual decryption (inplace)
@@ -866,6 +873,11 @@ ciphertext_to_compressed_new (gnutls_session_t session,
           
           length_to_decrypt = ciphertext->size - tag_size;
         }
+      else if (iv_size > 0) 
+        { /* a stream cipher with explicit IV */
+          _gnutls_auth_cipher_setiv(&params->read.cipher_state, UINT64DATA(*sequence), 8);
+          length_to_decrypt = ciphertext->size;
+        }
       else
         {
           if (ciphertext->size < tag_size)