LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - s3_cbc.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 182 241 75.5 %
Date: 2014-08-02 Functions: 10 12 83.3 %
Branches: 54 101 53.5 %

           Branch data     Line data    Source code
       1                 :            : /* ssl/s3_cbc.c */
       2                 :            : /* ====================================================================
       3                 :            :  * Copyright (c) 2012 The OpenSSL Project.  All rights reserved.
       4                 :            :  *
       5                 :            :  * Redistribution and use in source and binary forms, with or without
       6                 :            :  * modification, are permitted provided that the following conditions
       7                 :            :  * are met:
       8                 :            :  *
       9                 :            :  * 1. Redistributions of source code must retain the above copyright
      10                 :            :  *    notice, this list of conditions and the following disclaimer.
      11                 :            :  *
      12                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer in
      14                 :            :  *    the documentation and/or other materials provided with the
      15                 :            :  *    distribution.
      16                 :            :  *
      17                 :            :  * 3. All advertising materials mentioning features or use of this
      18                 :            :  *    software must display the following acknowledgment:
      19                 :            :  *    "This product includes software developed by the OpenSSL Project
      20                 :            :  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
      21                 :            :  *
      22                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      23                 :            :  *    endorse or promote products derived from this software without
      24                 :            :  *    prior written permission. For written permission, please contact
      25                 :            :  *    openssl-core@openssl.org.
      26                 :            :  *
      27                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      28                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      29                 :            :  *    permission of the OpenSSL Project.
      30                 :            :  *
      31                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      32                 :            :  *    acknowledgment:
      33                 :            :  *    "This product includes software developed by the OpenSSL Project
      34                 :            :  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
      35                 :            :  *
      36                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      37                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      38                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      39                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      40                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      41                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      42                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      43                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      44                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      45                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      46                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      47                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      48                 :            :  * ====================================================================
      49                 :            :  *
      50                 :            :  * This product includes cryptographic software written by Eric Young
      51                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
      52                 :            :  * Hudson (tjh@cryptsoft.com).
      53                 :            :  *
      54                 :            :  */
      55                 :            : 
      56                 :            : #include "ssl_locl.h"
      57                 :            : 
      58                 :            : #include <openssl/md5.h>
      59                 :            : #include <openssl/sha.h>
      60                 :            : 
      61                 :            : /* MAX_HASH_BIT_COUNT_BYTES is the maximum number of bytes in the hash's length
      62                 :            :  * field. (SHA-384/512 have 128-bit length.) */
      63                 :            : #define MAX_HASH_BIT_COUNT_BYTES 16
      64                 :            : 
      65                 :            : /* MAX_HASH_BLOCK_SIZE is the maximum hash block size that we'll support.
      66                 :            :  * Currently SHA-384/512 has a 128-byte block size and that's the largest
      67                 :            :  * supported by TLS.) */
      68                 :            : #define MAX_HASH_BLOCK_SIZE 128
      69                 :            : 
      70                 :            : /* Some utility functions are needed:
      71                 :            :  *
      72                 :            :  * These macros return the given value with the MSB copied to all the other
      73                 :            :  * bits. They use the fact that arithmetic shift shifts-in the sign bit.
      74                 :            :  * However, this is not ensured by the C standard so you may need to replace
      75                 :            :  * them with something else on odd CPUs. */
      76                 :            : #define DUPLICATE_MSB_TO_ALL(x) ( (unsigned)( (int)(x) >> (sizeof(int)*8-1) ) )
      77                 :            : #define DUPLICATE_MSB_TO_ALL_8(x) ((unsigned char)(DUPLICATE_MSB_TO_ALL(x)))
      78                 :            : 
      79                 :            : /* constant_time_lt returns 0xff if a<b and 0x00 otherwise. */
      80                 :     169840 : static unsigned constant_time_lt(unsigned a, unsigned b)
      81                 :            :         {
      82                 :     169840 :         a -= b;
      83                 :     169840 :         return DUPLICATE_MSB_TO_ALL(a);
      84                 :            :         }
      85                 :            : 
      86                 :            : /* constant_time_ge returns 0xff if a>=b and 0x00 otherwise. */
      87                 :    3364456 : static unsigned constant_time_ge(unsigned a, unsigned b)
      88                 :            :         {
      89                 :    3364456 :         a -= b;
      90                 :    3364456 :         return DUPLICATE_MSB_TO_ALL(~a);
      91                 :            :         }
      92                 :            : 
      93                 :            : /* constant_time_eq_8 returns 0xff if a==b and 0x00 otherwise. */
      94                 :       7128 : static unsigned char constant_time_eq_8(unsigned a, unsigned b)
      95                 :            :         {
      96                 :       7128 :         unsigned c = a ^ b;
      97                 :       7128 :         c--;
      98                 :       7128 :         return DUPLICATE_MSB_TO_ALL_8(c);
      99                 :            :         }
     100                 :            : 
     101                 :            : /* ssl3_cbc_remove_padding removes padding from the decrypted, SSLv3, CBC
     102                 :            :  * record in |rec| by updating |rec->length| in constant time.
     103                 :            :  *
     104                 :            :  * block_size: the block size of the cipher used to encrypt the record.
     105                 :            :  * returns:
     106                 :            :  *   0: (in non-constant time) if the record is publicly invalid.
     107                 :            :  *   1: if the padding was valid
     108                 :            :  *  -1: otherwise. */
     109                 :       1188 : int ssl3_cbc_remove_padding(const SSL* s,
     110                 :            :                             SSL3_RECORD *rec,
     111                 :            :                             unsigned block_size,
     112                 :            :                             unsigned mac_size)
     113                 :            :         {
     114                 :            :         unsigned padding_length, good;
     115                 :       1188 :         const unsigned overhead = 1 /* padding length byte */ + mac_size;
     116                 :            : 
     117                 :            :         /* These lengths are all public so we can test them in non-constant
     118                 :            :          * time. */
     119         [ +  - ]:       1188 :         if (overhead > rec->length)
     120                 :            :                 return 0;
     121                 :            : 
     122                 :       1188 :         padding_length = rec->data[rec->length-1];
     123                 :       1188 :         good = constant_time_ge(rec->length, padding_length+overhead);
     124                 :            :         /* SSLv3 requires that the padding is minimal. */
     125                 :       1188 :         good &= constant_time_ge(block_size, padding_length+1);
     126                 :       1188 :         rec->length -= good & (padding_length+1);
     127                 :       1188 :         return (int)((good & 1) | (~good & -1));
     128                 :            : }
     129                 :            : 
     130                 :            : /* tls1_cbc_remove_padding removes the CBC padding from the decrypted, TLS, CBC
     131                 :            :  * record in |rec| in constant time and returns 1 if the padding is valid and
     132                 :            :  * -1 otherwise. It also removes any explicit IV from the start of the record
     133                 :            :  * without leaking any timing about whether there was enough space after the
     134                 :            :  * padding was removed.
     135                 :            :  *
     136                 :            :  * block_size: the block size of the cipher used to encrypt the record.
     137                 :            :  * returns:
     138                 :            :  *   0: (in non-constant time) if the record is publicly invalid.
     139                 :            :  *   1: if the padding was valid
     140                 :            :  *  -1: otherwise. */
     141                 :      12789 : int tls1_cbc_remove_padding(const SSL* s,
     142                 :            :                             SSL3_RECORD *rec,
     143                 :            :                             unsigned block_size,
     144                 :            :                             unsigned mac_size)
     145                 :            :         {
     146                 :            :         unsigned padding_length, good, to_check, i;
     147                 :      12789 :         const unsigned overhead = 1 /* padding length byte */ + mac_size;
     148                 :            :         /* Check if version requires explicit IV */
     149         [ +  + ]:      12789 :         if (SSL_USE_EXPLICIT_IV(s))
     150                 :            :                 {
     151                 :            :                 /* These lengths are all public so we can test them in
     152                 :            :                  * non-constant time.
     153                 :            :                  */
     154         [ +  - ]:       8972 :                 if (overhead + block_size > rec->length)
     155                 :            :                         return 0;
     156                 :            :                 /* We can now safely skip explicit IV */
     157                 :       8972 :                 rec->data += block_size;
     158                 :       8972 :                 rec->input += block_size;
     159                 :       8972 :                 rec->length -= block_size;
     160                 :       8972 :                 rec->orig_len -= block_size;
     161                 :            :                 }
     162         [ +  - ]:       3817 :         else if (overhead > rec->length)
     163                 :            :                 return 0;
     164                 :            : 
     165                 :      12789 :         padding_length = rec->data[rec->length-1];
     166                 :            : 
     167                 :            :         /* NB: if compression is in operation the first packet may not be of
     168                 :            :          * even length so the padding bug check cannot be performed. This bug
     169                 :            :          * workaround has been around since SSLeay so hopefully it is either
     170                 :            :          * fixed now or no buggy implementation supports compression [steve]
     171                 :            :          */
     172 [ -  + ][ #  # ]:      12789 :         if ( (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG) && !s->expand)
     173                 :            :                 {
     174                 :            :                 /* First packet is even in size, so check */
     175 [ #  # ][ #  # ]:          0 :                 if ((memcmp(s->s3->read_sequence, "\0\0\0\0\0\0\0\0",8) == 0) &&
     176                 :          0 :                     !(padding_length & 1))
     177                 :            :                         {
     178                 :          0 :                         s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
     179                 :            :                         }
     180 [ #  # ][ #  # ]:          0 :                 if ((s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG) &&
     181                 :            :                     padding_length > 0)
     182                 :            :                         {
     183                 :          0 :                         padding_length--;
     184                 :            :                         }
     185                 :            :                 }
     186                 :            : 
     187         [ +  + ]:      12789 :         if (EVP_CIPHER_flags(s->enc_read_ctx->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER)
     188                 :            :                 {
     189                 :            :                 /* padding is already verified */
     190                 :        396 :                 rec->length -= padding_length + 1;
     191                 :        396 :                 return 1;
     192                 :            :                 }
     193                 :            : 
     194                 :      12393 :         good = constant_time_ge(rec->length, overhead+padding_length);
     195                 :            :         /* The padding consists of a length byte at the end of the record and
     196                 :            :          * then that many bytes of padding, all with the same value as the
     197                 :            :          * length byte. Thus, with the length byte included, there are i+1
     198                 :            :          * bytes of padding.
     199                 :            :          *
     200                 :            :          * We can't check just |padding_length+1| bytes because that leaks
     201                 :            :          * decrypted information. Therefore we always have to check the maximum
     202                 :            :          * amount of padding possible. (Again, the length of the record is
     203                 :            :          * public information so we can use it.) */
     204                 :      12393 :         to_check = 255; /* maximum amount of padding. */
     205         [ +  + ]:      12393 :         if (to_check > rec->length-1)
     206                 :       2445 :                 to_check = rec->length-1;
     207                 :            : 
     208         [ +  + ]:    2613200 :         for (i = 0; i < to_check; i++)
     209                 :            :                 {
     210                 :    2600807 :                 unsigned char mask = constant_time_ge(padding_length, i);
     211                 :    2600807 :                 unsigned char b = rec->data[rec->length-1-i];
     212                 :            :                 /* The final |padding_length+1| bytes should all have the value
     213                 :            :                  * |padding_length|. Therefore the XOR should be zero. */
     214                 :    2600807 :                 good &= ~(mask&(padding_length ^ b));
     215                 :            :                 }
     216                 :            : 
     217                 :            :         /* If any of the final |padding_length+1| bytes had the wrong value,
     218                 :            :          * one or more of the lower eight bits of |good| will be cleared. We
     219                 :            :          * AND the bottom 8 bits together and duplicate the result to all the
     220                 :            :          * bits. */
     221                 :      12393 :         good &= good >> 4;
     222                 :      12393 :         good &= good >> 2;
     223                 :      12393 :         good &= good >> 1;
     224                 :      12393 :         good <<= sizeof(good)*8-1;
     225                 :      12393 :         good = DUPLICATE_MSB_TO_ALL(good);
     226                 :            : 
     227                 :      12393 :         rec->length -= good & (padding_length+1);
     228                 :            : 
     229                 :      12393 :         return (int)((good & 1) | (~good & -1));
     230                 :            :         }
     231                 :            : 
     232                 :            : /* ssl3_cbc_copy_mac copies |md_size| bytes from the end of |rec| to |out| in
     233                 :            :  * constant time (independent of the concrete value of rec->length, which may
     234                 :            :  * vary within a 256-byte window).
     235                 :            :  *
     236                 :            :  * ssl3_cbc_remove_padding or tls1_cbc_remove_padding must be called prior to
     237                 :            :  * this function.
     238                 :            :  *
     239                 :            :  * On entry:
     240                 :            :  *   rec->orig_len >= md_size
     241                 :            :  *   md_size <= EVP_MAX_MD_SIZE
     242                 :            :  *
     243                 :            :  * If CBC_MAC_ROTATE_IN_PLACE is defined then the rotation is performed with
     244                 :            :  * variable accesses in a 64-byte-aligned buffer. Assuming that this fits into
     245                 :            :  * a single or pair of cache-lines, then the variable memory accesses don't
     246                 :            :  * actually affect the timing. CPUs with smaller cache-lines [if any] are
     247                 :            :  * not multi-core and are not considered vulnerable to cache-timing attacks.
     248                 :            :  */
     249                 :            : #define CBC_MAC_ROTATE_IN_PLACE
     250                 :            : 
     251                 :       1188 : void ssl3_cbc_copy_mac(unsigned char* out,
     252                 :            :                        const SSL3_RECORD *rec,
     253                 :            :                        unsigned md_size)
     254                 :            :         {
     255                 :            : #if defined(CBC_MAC_ROTATE_IN_PLACE)
     256                 :            :         unsigned char rotated_mac_buf[64+EVP_MAX_MD_SIZE];
     257                 :            :         unsigned char *rotated_mac;
     258                 :            : #else
     259                 :            :         unsigned char rotated_mac[EVP_MAX_MD_SIZE];
     260                 :            : #endif
     261                 :            : 
     262                 :            :         /* mac_end is the index of |rec->data| just after the end of the MAC. */
     263                 :       1188 :         unsigned mac_end = rec->length;
     264                 :       1188 :         unsigned mac_start = mac_end - md_size;
     265                 :            :         /* scan_start contains the number of bytes that we can ignore because
     266                 :            :          * the MAC's position can only vary by 255 bytes. */
     267                 :       1188 :         unsigned scan_start = 0;
     268                 :            :         unsigned i, j;
     269                 :            :         unsigned div_spoiler;
     270                 :            :         unsigned rotate_offset;
     271                 :            : 
     272         [ -  + ]:       1188 :         OPENSSL_assert(rec->orig_len >= md_size);
     273         [ -  + ]:       1188 :         OPENSSL_assert(md_size <= EVP_MAX_MD_SIZE);
     274                 :            : 
     275                 :            : #if defined(CBC_MAC_ROTATE_IN_PLACE)
     276                 :       1188 :         rotated_mac = rotated_mac_buf + ((0-(size_t)rotated_mac_buf)&63);
     277                 :            : #endif
     278                 :            : 
     279                 :            :         /* This information is public so it's safe to branch based on it. */
     280         [ +  + ]:       1188 :         if (rec->orig_len > md_size + 255 + 1)
     281                 :        396 :                 scan_start = rec->orig_len - (md_size + 255 + 1);
     282                 :            :         /* div_spoiler contains a multiple of md_size that is used to cause the
     283                 :            :          * modulo operation to be constant time. Without this, the time varies
     284                 :            :          * based on the amount of padding when running on Intel chips at least.
     285                 :            :          *
     286                 :            :          * The aim of right-shifting md_size is so that the compiler doesn't
     287                 :            :          * figure out that it can remove div_spoiler as that would require it
     288                 :            :          * to prove that md_size is always even, which I hope is beyond it. */
     289                 :       1188 :         div_spoiler = md_size >> 1;
     290                 :       1188 :         div_spoiler <<= (sizeof(div_spoiler)-1)*8;
     291                 :       1188 :         rotate_offset = (div_spoiler + mac_start - scan_start) % md_size;
     292                 :            : 
     293                 :       1188 :         memset(rotated_mac, 0, md_size);
     294         [ +  + ]:     147532 :         for (i = scan_start, j = 0; i < rec->orig_len; i++)
     295                 :            :                 {
     296                 :     146344 :                 unsigned char mac_started = constant_time_ge(i, mac_start);
     297                 :     146344 :                 unsigned char mac_ended = constant_time_ge(i, mac_end);
     298                 :     146344 :                 unsigned char b = rec->data[i];
     299                 :     146344 :                 rotated_mac[j++] |= b & mac_started & ~mac_ended;
     300                 :     146344 :                 j &= constant_time_lt(j,md_size);
     301                 :            :                 }
     302                 :            : 
     303                 :            :         /* Now rotate the MAC */
     304                 :            : #if defined(CBC_MAC_ROTATE_IN_PLACE)
     305                 :            :         j = 0;
     306         [ +  + ]:      24684 :         for (i = 0; i < md_size; i++)
     307                 :            :                 {
     308                 :            :                 /* in case cache-line is 32 bytes, touch second line */
     309                 :      23496 :                 ((volatile unsigned char *)rotated_mac)[rotate_offset^32];
     310                 :      23496 :                 out[j++] = rotated_mac[rotate_offset++];
     311                 :      23496 :                 rotate_offset &= constant_time_lt(rotate_offset,md_size);
     312                 :            :                 }
     313                 :            : #else
     314                 :            :         memset(out, 0, md_size);
     315                 :            :         rotate_offset = md_size - rotate_offset;
     316                 :            :         rotate_offset &= constant_time_lt(rotate_offset,md_size);
     317                 :            :         for (i = 0; i < md_size; i++)
     318                 :            :                 {
     319                 :            :                 for (j = 0; j < md_size; j++)
     320                 :            :                         out[j] |= rotated_mac[i] & constant_time_eq_8(j, rotate_offset);
     321                 :            :                 rotate_offset++;
     322                 :            :                 rotate_offset &= constant_time_lt(rotate_offset,md_size);
     323                 :            :                 }
     324                 :            : #endif
     325                 :       1188 :         }
     326                 :            : 
     327                 :            : /* u32toLE serialises an unsigned, 32-bit number (n) as four bytes at (p) in
     328                 :            :  * little-endian order. The value of p is advanced by four. */
     329                 :            : #define u32toLE(n, p) \
     330                 :            :         (*((p)++)=(unsigned char)(n), \
     331                 :            :          *((p)++)=(unsigned char)(n>>8), \
     332                 :            :          *((p)++)=(unsigned char)(n>>16), \
     333                 :            :          *((p)++)=(unsigned char)(n>>24))
     334                 :            : 
     335                 :            : /* These functions serialize the state of a hash and thus perform the standard
     336                 :            :  * "final" operation without adding the padding and length that such a function
     337                 :            :  * typically does. */
     338                 :        198 : static void tls1_md5_final_raw(void* ctx, unsigned char *md_out)
     339                 :            :         {
     340                 :        198 :         MD5_CTX *md5 = ctx;
     341                 :        198 :         u32toLE(md5->A, md_out);
     342                 :        198 :         u32toLE(md5->B, md_out);
     343                 :        198 :         u32toLE(md5->C, md_out);
     344                 :        198 :         u32toLE(md5->D, md_out);
     345                 :        198 :         }
     346                 :            : 
     347                 :       3366 : static void tls1_sha1_final_raw(void* ctx, unsigned char *md_out)
     348                 :            :         {
     349                 :       3366 :         SHA_CTX *sha1 = ctx;
     350                 :       3366 :         l2n(sha1->h0, md_out);
     351                 :       3366 :         l2n(sha1->h1, md_out);
     352                 :       3366 :         l2n(sha1->h2, md_out);
     353                 :       3366 :         l2n(sha1->h3, md_out);
     354                 :       3366 :         l2n(sha1->h4, md_out);
     355                 :       3366 :         }
     356                 :            : #define LARGEST_DIGEST_CTX SHA_CTX
     357                 :            : 
     358                 :            : #ifndef OPENSSL_NO_SHA256
     359                 :          0 : static void tls1_sha256_final_raw(void* ctx, unsigned char *md_out)
     360                 :            :         {
     361                 :          0 :         SHA256_CTX *sha256 = ctx;
     362                 :            :         unsigned i;
     363                 :            : 
     364         [ #  # ]:          0 :         for (i = 0; i < 8; i++)
     365                 :            :                 {
     366                 :          0 :                 l2n(sha256->h[i], md_out);
     367                 :            :                 }
     368                 :          0 :         }
     369                 :            : #undef  LARGEST_DIGEST_CTX
     370                 :            : #define LARGEST_DIGEST_CTX SHA256_CTX
     371                 :            : #endif
     372                 :            : 
     373                 :            : #ifndef OPENSSL_NO_SHA512
     374                 :          0 : static void tls1_sha512_final_raw(void* ctx, unsigned char *md_out)
     375                 :            :         {
     376                 :          0 :         SHA512_CTX *sha512 = ctx;
     377                 :            :         unsigned i;
     378                 :            : 
     379         [ #  # ]:          0 :         for (i = 0; i < 8; i++)
     380                 :            :                 {
     381                 :          0 :                 l2n8(sha512->h[i], md_out);
     382                 :            :                 }
     383                 :          0 :         }
     384                 :            : #undef  LARGEST_DIGEST_CTX
     385                 :            : #define LARGEST_DIGEST_CTX SHA512_CTX
     386                 :            : #endif
     387                 :            : 
     388                 :            : /* ssl3_cbc_record_digest_supported returns 1 iff |ctx| uses a hash function
     389                 :            :  * which ssl3_cbc_digest_record supports. */
     390                 :       1188 : char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx)
     391                 :            :         {
     392                 :            : #ifdef OPENSSL_FIPS
     393                 :            :         if (FIPS_mode())
     394                 :            :                 return 0;
     395                 :            : #endif
     396         [ -  + ]:       1188 :         switch (EVP_MD_CTX_type(ctx))
     397                 :            :                 {
     398                 :            :                 case NID_md5:
     399                 :            :                 case NID_sha1:
     400                 :            : #ifndef OPENSSL_NO_SHA256
     401                 :            :                 case NID_sha224:
     402                 :            :                 case NID_sha256:
     403                 :            : #endif
     404                 :            : #ifndef OPENSSL_NO_SHA512
     405                 :            :                 case NID_sha384:
     406                 :            :                 case NID_sha512:
     407                 :            : #endif
     408                 :            :                         return 1;
     409                 :            :                 default:
     410                 :          0 :                         return 0;
     411                 :            :                 }
     412                 :            :         }
     413                 :            : 
     414                 :            : /* ssl3_cbc_digest_record computes the MAC of a decrypted, padded SSLv3/TLS
     415                 :            :  * record.
     416                 :            :  *
     417                 :            :  *   ctx: the EVP_MD_CTX from which we take the hash function.
     418                 :            :  *     ssl3_cbc_record_digest_supported must return true for this EVP_MD_CTX.
     419                 :            :  *   md_out: the digest output. At most EVP_MAX_MD_SIZE bytes will be written.
     420                 :            :  *   md_out_size: if non-NULL, the number of output bytes is written here.
     421                 :            :  *   header: the 13-byte, TLS record header.
     422                 :            :  *   data: the record data itself, less any preceding explicit IV.
     423                 :            :  *   data_plus_mac_size: the secret, reported length of the data and MAC
     424                 :            :  *     once the padding has been removed.
     425                 :            :  *   data_plus_mac_plus_padding_size: the public length of the whole
     426                 :            :  *     record, including padding.
     427                 :            :  *   is_sslv3: non-zero if we are to use SSLv3. Otherwise, TLS.
     428                 :            :  *
     429                 :            :  * On entry: by virtue of having been through one of the remove_padding
     430                 :            :  * functions, above, we know that data_plus_mac_size is large enough to contain
     431                 :            :  * a padding byte and MAC. (If the padding was invalid, it might contain the
     432                 :            :  * padding too. ) */
     433                 :       1188 : void ssl3_cbc_digest_record(
     434                 :            :         const EVP_MD_CTX *ctx,
     435                 :            :         unsigned char* md_out,
     436                 :            :         size_t* md_out_size,
     437                 :            :         const unsigned char header[13],
     438                 :            :         const unsigned char *data,
     439                 :            :         size_t data_plus_mac_size,
     440                 :            :         size_t data_plus_mac_plus_padding_size,
     441                 :            :         const unsigned char *mac_secret,
     442                 :            :         unsigned mac_secret_length,
     443                 :            :         char is_sslv3)
     444                 :            :         {
     445                 :            :         union { double align;
     446                 :            :                 unsigned char c[sizeof(LARGEST_DIGEST_CTX)]; } md_state;
     447                 :            :         void (*md_final_raw)(void *ctx, unsigned char *md_out);
     448                 :            :         void (*md_transform)(void *ctx, const unsigned char *block);
     449                 :       1188 :         unsigned md_size, md_block_size = 64;
     450                 :       1188 :         unsigned sslv3_pad_length = 40, header_length, variance_blocks,
     451                 :            :                  len, max_mac_bytes, num_blocks,
     452                 :            :                  num_starting_blocks, k, mac_end_offset, c, index_a, index_b;
     453                 :            :         unsigned int bits;      /* at most 18 bits */
     454                 :            :         unsigned char length_bytes[MAX_HASH_BIT_COUNT_BYTES];
     455                 :            :         /* hmac_pad is the masked HMAC key. */
     456                 :            :         unsigned char hmac_pad[MAX_HASH_BLOCK_SIZE];
     457                 :            :         unsigned char first_block[MAX_HASH_BLOCK_SIZE];
     458                 :            :         unsigned char mac_out[EVP_MAX_MD_SIZE];
     459                 :            :         unsigned i, j, md_out_size_u;
     460                 :            :         EVP_MD_CTX md_ctx;
     461                 :            :         /* mdLengthSize is the number of bytes in the length field that terminates
     462                 :            :         * the hash. */
     463                 :       1188 :         unsigned md_length_size = 8;
     464                 :       1188 :         char length_is_big_endian = 1;
     465                 :            :         int ret;
     466                 :            : 
     467                 :            :         /* This is a, hopefully redundant, check that allows us to forget about
     468                 :            :          * many possible overflows later in this function. */
     469         [ -  + ]:       1188 :         OPENSSL_assert(data_plus_mac_plus_padding_size < 1024*1024);
     470                 :            : 
     471   [ +  +  -  -  :       1188 :         switch (EVP_MD_CTX_type(ctx))
                -  -  - ]
     472                 :            :                 {
     473                 :            :                 case NID_md5:
     474                 :         66 :                         MD5_Init((MD5_CTX*)md_state.c);
     475                 :         66 :                         md_final_raw = tls1_md5_final_raw;
     476                 :         66 :                         md_transform = (void(*)(void *ctx, const unsigned char *block)) MD5_Transform;
     477                 :         66 :                         md_size = 16;
     478                 :         66 :                         sslv3_pad_length = 48;
     479                 :         66 :                         length_is_big_endian = 0;
     480                 :         66 :                         break;
     481                 :            :                 case NID_sha1:
     482                 :       1122 :                         SHA1_Init((SHA_CTX*)md_state.c);
     483                 :       1122 :                         md_final_raw = tls1_sha1_final_raw;
     484                 :       1122 :                         md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA1_Transform;
     485                 :       1122 :                         md_size = 20;
     486                 :       1122 :                         break;
     487                 :            : #ifndef OPENSSL_NO_SHA256
     488                 :            :                 case NID_sha224:
     489                 :          0 :                         SHA224_Init((SHA256_CTX*)md_state.c);
     490                 :          0 :                         md_final_raw = tls1_sha256_final_raw;
     491                 :          0 :                         md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA256_Transform;
     492                 :          0 :                         md_size = 224/8;
     493                 :          0 :                         break;
     494                 :            :                 case NID_sha256:
     495                 :          0 :                         SHA256_Init((SHA256_CTX*)md_state.c);
     496                 :          0 :                         md_final_raw = tls1_sha256_final_raw;
     497                 :          0 :                         md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA256_Transform;
     498                 :          0 :                         md_size = 32;
     499                 :          0 :                         break;
     500                 :            : #endif
     501                 :            : #ifndef OPENSSL_NO_SHA512
     502                 :            :                 case NID_sha384:
     503                 :          0 :                         SHA384_Init((SHA512_CTX*)md_state.c);
     504                 :          0 :                         md_final_raw = tls1_sha512_final_raw;
     505                 :          0 :                         md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA512_Transform;
     506                 :          0 :                         md_size = 384/8;
     507                 :          0 :                         md_block_size = 128;
     508                 :          0 :                         md_length_size = 16;
     509                 :          0 :                         break;
     510                 :            :                 case NID_sha512:
     511                 :          0 :                         SHA512_Init((SHA512_CTX*)md_state.c);
     512                 :          0 :                         md_final_raw = tls1_sha512_final_raw;
     513                 :          0 :                         md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA512_Transform;
     514                 :          0 :                         md_size = 64;
     515                 :          0 :                         md_block_size = 128;
     516                 :          0 :                         md_length_size = 16;
     517                 :          0 :                         break;
     518                 :            : #endif
     519                 :            :                 default:
     520                 :            :                         /* ssl3_cbc_record_digest_supported should have been
     521                 :            :                          * called first to check that the hash function is
     522                 :            :                          * supported. */
     523                 :          0 :                         OPENSSL_assert(0);
     524         [ #  # ]:          0 :                         if (md_out_size)
     525                 :          0 :                                 *md_out_size = -1;
     526                 :          0 :                         return;
     527                 :            :                 }
     528                 :            : 
     529         [ -  + ]:       1188 :         OPENSSL_assert(md_length_size <= MAX_HASH_BIT_COUNT_BYTES);
     530         [ -  + ]:       1188 :         OPENSSL_assert(md_block_size <= MAX_HASH_BLOCK_SIZE);
     531         [ -  + ]:       1188 :         OPENSSL_assert(md_size <= EVP_MAX_MD_SIZE);
     532                 :            : 
     533                 :       1188 :         header_length = 13;
     534         [ +  - ]:       1188 :         if (is_sslv3)
     535                 :            :                 {
     536                 :       1188 :                 header_length =
     537                 :       1188 :                         mac_secret_length +
     538                 :            :                         sslv3_pad_length +
     539                 :            :                         8 /* sequence number */ +
     540                 :            :                         1 /* record type */ +
     541                 :            :                         2 /* record length */;
     542                 :            :                 }
     543                 :            : 
     544                 :            :         /* variance_blocks is the number of blocks of the hash that we have to
     545                 :            :          * calculate in constant time because they could be altered by the
     546                 :            :          * padding value.
     547                 :            :          *
     548                 :            :          * In SSLv3, the padding must be minimal so the end of the plaintext
     549                 :            :          * varies by, at most, 15+20 = 35 bytes. (We conservatively assume that
     550                 :            :          * the MAC size varies from 0..20 bytes.) In case the 9 bytes of hash
     551                 :            :          * termination (0x80 + 64-bit length) don't fit in the final block, we
     552                 :            :          * say that the final two blocks can vary based on the padding.
     553                 :            :          *
     554                 :            :          * TLSv1 has MACs up to 48 bytes long (SHA-384) and the padding is not
     555                 :            :          * required to be minimal. Therefore we say that the final six blocks
     556                 :            :          * can vary based on the padding.
     557                 :            :          *
     558                 :            :          * Later in the function, if the message is short and there obviously
     559                 :            :          * cannot be this many blocks then variance_blocks can be reduced. */
     560         [ -  + ]:       1188 :         variance_blocks = is_sslv3 ? 2 : 6;
     561                 :            :         /* From now on we're dealing with the MAC, which conceptually has 13
     562                 :            :          * bytes of `header' before the start of the data (TLS) or 71/75 bytes
     563                 :            :          * (SSLv3) */
     564                 :       1188 :         len = data_plus_mac_plus_padding_size + header_length;
     565                 :            :         /* max_mac_bytes contains the maximum bytes of bytes in the MAC, including
     566                 :            :         * |header|, assuming that there's no padding. */
     567                 :       1188 :         max_mac_bytes = len - md_size - 1;
     568                 :            :         /* num_blocks is the maximum number of hash blocks. */
     569                 :       1188 :         num_blocks = (max_mac_bytes + 1 + md_length_size + md_block_size - 1) / md_block_size;
     570                 :            :         /* In order to calculate the MAC in constant time we have to handle
     571                 :            :          * the final blocks specially because the padding value could cause the
     572                 :            :          * end to appear somewhere in the final |variance_blocks| blocks and we
     573                 :            :          * can't leak where. However, |num_starting_blocks| worth of data can
     574                 :            :          * be hashed right away because no padding value can affect whether
     575                 :            :          * they are plaintext. */
     576                 :       1188 :         num_starting_blocks = 0;
     577                 :            :         /* k is the starting byte offset into the conceptual header||data where
     578                 :            :          * we start processing. */
     579                 :       1188 :         k = 0;
     580                 :            :         /* mac_end_offset is the index just past the end of the data to be
     581                 :            :          * MACed. */
     582                 :       1188 :         mac_end_offset = data_plus_mac_size + header_length - md_size;
     583                 :            :         /* c is the index of the 0x80 byte in the final hash block that
     584                 :            :          * contains application data. */
     585                 :       1188 :         c = mac_end_offset % md_block_size;
     586                 :            :         /* index_a is the hash block number that contains the 0x80 terminating
     587                 :            :          * value. */
     588                 :       1188 :         index_a = mac_end_offset / md_block_size;
     589                 :            :         /* index_b is the hash block number that contains the 64-bit hash
     590                 :            :          * length, in bits. */
     591                 :       1188 :         index_b = (mac_end_offset + md_length_size) / md_block_size;
     592                 :            :         /* bits is the hash-length in bits. It includes the additional hash
     593                 :            :          * block for the masked HMAC key, or whole of |header| in the case of
     594                 :            :          * SSLv3. */
     595                 :            : 
     596                 :            :         /* For SSLv3, if we're going to have any starting blocks then we need
     597                 :            :          * at least two because the header is larger than a single block. */
     598 [ -  + ][ +  + ]:       1188 :         if (num_blocks > variance_blocks + (is_sslv3 ? 1 : 0))
     599                 :            :                 {
     600                 :        396 :                 num_starting_blocks = num_blocks - variance_blocks;
     601                 :        396 :                 k = md_block_size*num_starting_blocks;
     602                 :            :                 }
     603                 :            : 
     604                 :       1188 :         bits = 8*mac_end_offset;
     605         [ -  + ]:       1188 :         if (!is_sslv3)
     606                 :            :                 {
     607                 :            :                 /* Compute the initial HMAC block. For SSLv3, the padding and
     608                 :            :                  * secret bytes are included in |header| because they take more
     609                 :            :                  * than a single block. */
     610                 :          0 :                 bits += 8*md_block_size;
     611                 :          0 :                 memset(hmac_pad, 0, md_block_size);
     612         [ #  # ]:          0 :                 OPENSSL_assert(mac_secret_length <= sizeof(hmac_pad));
     613                 :          0 :                 memcpy(hmac_pad, mac_secret, mac_secret_length);
     614         [ #  # ]:          0 :                 for (i = 0; i < md_block_size; i++)
     615                 :          0 :                         hmac_pad[i] ^= 0x36;
     616                 :            : 
     617                 :          0 :                 md_transform(md_state.c, hmac_pad);
     618                 :            :                 }
     619                 :            : 
     620         [ +  + ]:       1188 :         if (length_is_big_endian)
     621                 :            :                 {
     622                 :       1122 :                 memset(length_bytes,0,md_length_size-4);
     623                 :       1122 :                 length_bytes[md_length_size-4] = (unsigned char)(bits>>24);
     624                 :       1122 :                 length_bytes[md_length_size-3] = (unsigned char)(bits>>16);
     625                 :       1122 :                 length_bytes[md_length_size-2] = (unsigned char)(bits>>8);
     626                 :       1122 :                 length_bytes[md_length_size-1] = (unsigned char)bits;
     627                 :            :                 }
     628                 :            :         else
     629                 :            :                 {
     630                 :         66 :                 memset(length_bytes,0,md_length_size);
     631                 :         66 :                 length_bytes[md_length_size-5] = (unsigned char)(bits>>24);
     632                 :         66 :                 length_bytes[md_length_size-6] = (unsigned char)(bits>>16);
     633                 :         66 :                 length_bytes[md_length_size-7] = (unsigned char)(bits>>8);
     634                 :         66 :                 length_bytes[md_length_size-8] = (unsigned char)bits;
     635                 :            :                 }
     636                 :            : 
     637         [ +  + ]:       1188 :         if (k > 0)
     638                 :            :                 {
     639         [ +  - ]:        396 :                 if (is_sslv3)
     640                 :            :                         {
     641                 :            :                         /* The SSLv3 header is larger than a single block.
     642                 :            :                          * overhang is the number of bytes beyond a single
     643                 :            :                          * block that the header consumes: either 7 bytes
     644                 :            :                          * (SHA1) or 11 bytes (MD5). */
     645                 :        396 :                         unsigned overhang = header_length-md_block_size;
     646                 :        396 :                         md_transform(md_state.c, header);
     647                 :        396 :                         memcpy(first_block, header + md_block_size, overhang);
     648                 :        396 :                         memcpy(first_block + overhang, data, md_block_size-overhang);
     649                 :        396 :                         md_transform(md_state.c, first_block);
     650         [ +  + ]:       1188 :                         for (i = 1; i < k/md_block_size - 1; i++)
     651                 :        792 :                                 md_transform(md_state.c, data + md_block_size*i - overhang);
     652                 :            :                         }
     653                 :            :                 else
     654                 :            :                         {
     655                 :            :                         /* k is a multiple of md_block_size. */
     656                 :            :                         memcpy(first_block, header, 13);
     657                 :          0 :                         memcpy(first_block+13, data, md_block_size-13);
     658                 :          0 :                         md_transform(md_state.c, first_block);
     659         [ #  # ]:          0 :                         for (i = 1; i < k/md_block_size; i++)
     660                 :          0 :                                 md_transform(md_state.c, data + md_block_size*i - 13);
     661                 :            :                         }
     662                 :            :                 }
     663                 :            : 
     664                 :            :         memset(mac_out, 0, sizeof(mac_out));
     665                 :            : 
     666                 :            :         /* We now process the final hash blocks. For each block, we construct
     667                 :            :          * it in constant time. If the |i==index_a| then we'll include the 0x80
     668                 :            :          * bytes and zero pad etc. For each block we selectively copy it, in
     669                 :            :          * constant time, to |mac_out|. */
     670         [ +  + ]:       4752 :         for (i = num_starting_blocks; i <= num_starting_blocks+variance_blocks; i++)
     671                 :            :                 {
     672                 :            :                 unsigned char block[MAX_HASH_BLOCK_SIZE];
     673                 :       3564 :                 unsigned char is_block_a = constant_time_eq_8(i, index_a);
     674                 :       3564 :                 unsigned char is_block_b = constant_time_eq_8(i, index_b);
     675         [ +  + ]:     231660 :                 for (j = 0; j < md_block_size; j++)
     676                 :            :                         {
     677                 :     228096 :                         unsigned char b = 0, is_past_c, is_past_cp1;
     678         [ +  + ]:     228096 :                         if (k < header_length)
     679                 :      56408 :                                 b = header[k];
     680         [ +  + ]:     171688 :                         else if (k < data_plus_mac_plus_padding_size + header_length)
     681                 :      77132 :                                 b = data[k-header_length];
     682                 :     228096 :                         k++;
     683                 :            : 
     684                 :     228096 :                         is_past_c = is_block_a & constant_time_ge(j, c);
     685                 :     228096 :                         is_past_cp1 = is_block_a & constant_time_ge(j, c+1);
     686                 :            :                         /* If this is the block containing the end of the
     687                 :            :                          * application data, and we are at the offset for the
     688                 :            :                          * 0x80 value, then overwrite b with 0x80. */
     689                 :     228096 :                         b = (b&~is_past_c) | (0x80&is_past_c);
     690                 :            :                         /* If this the the block containing the end of the
     691                 :            :                          * application data and we're past the 0x80 value then
     692                 :            :                          * just write zero. */
     693                 :     228096 :                         b = b&~is_past_cp1;
     694                 :            :                         /* If this is index_b (the final block), but not
     695                 :            :                          * index_a (the end of the data), then the 64-bit
     696                 :            :                          * length didn't fit into index_a and we're having to
     697                 :            :                          * add an extra block of zeros. */
     698                 :     228096 :                         b &= ~is_block_b | is_block_a;
     699                 :            : 
     700                 :            :                         /* The final bytes of one of the blocks contains the
     701                 :            :                          * length. */
     702         [ +  + ]:     228096 :                         if (j >= md_block_size - md_length_size)
     703                 :            :                                 {
     704                 :            :                                 /* If this is index_b, write a length byte. */
     705                 :      28512 :                                 b = (b&~is_block_b) | (is_block_b&length_bytes[j-(md_block_size-md_length_size)]);
     706                 :            :                                 }
     707                 :     228096 :                         block[j] = b;
     708                 :            :                         }
     709                 :            : 
     710                 :       3564 :                 md_transform(md_state.c, block);
     711                 :       3564 :                 md_final_raw(md_state.c, block);
     712                 :            :                 /* If this is index_b, copy the hash value to |mac_out|. */
     713         [ +  + ]:      74052 :                 for (j = 0; j < md_size; j++)
     714                 :      70488 :                         mac_out[j] |= block[j]&is_block_b;
     715                 :            :                 }
     716                 :            : 
     717                 :       1188 :         EVP_MD_CTX_init(&md_ctx);
     718                 :       1188 :         EVP_DigestInit_ex(&md_ctx, ctx->digest, NULL /* engine */);
     719         [ -  + ]:       1188 :         if (is_sslv3)
     720                 :            :                 {
     721                 :            :                 /* We repurpose |hmac_pad| to contain the SSLv3 pad2 block. */
     722                 :       1188 :                 memset(hmac_pad, 0x5c, sslv3_pad_length);
     723                 :            : 
     724                 :       1188 :                 EVP_DigestUpdate(&md_ctx, mac_secret, mac_secret_length);
     725                 :       1188 :                 EVP_DigestUpdate(&md_ctx, hmac_pad, sslv3_pad_length);
     726                 :       1188 :                 EVP_DigestUpdate(&md_ctx, mac_out, md_size);
     727                 :            :                 }
     728                 :            :         else
     729                 :            :                 {
     730                 :            :                 /* Complete the HMAC in the standard manner. */
     731         [ #  # ]:          0 :                 for (i = 0; i < md_block_size; i++)
     732                 :          0 :                         hmac_pad[i] ^= 0x6a;
     733                 :            : 
     734                 :          0 :                 EVP_DigestUpdate(&md_ctx, hmac_pad, md_block_size);
     735                 :          0 :                 EVP_DigestUpdate(&md_ctx, mac_out, md_size);
     736                 :            :                 }
     737                 :       1188 :         ret = EVP_DigestFinal(&md_ctx, md_out, &md_out_size_u);
     738         [ +  - ]:       1188 :         if (ret && md_out_size)
     739                 :       1188 :                 *md_out_size = md_out_size_u;
     740                 :       1188 :         EVP_MD_CTX_cleanup(&md_ctx);
     741                 :            :         }
     742                 :            : 
     743                 :            : #ifdef OPENSSL_FIPS
     744                 :            : 
     745                 :            : /* Due to the need to use EVP in FIPS mode we can't reimplement digests but
     746                 :            :  * we can ensure the number of blocks processed is equal for all cases
     747                 :            :  * by digesting additional data.
     748                 :            :  */
     749                 :            : 
     750                 :            : void tls_fips_digest_extra(
     751                 :            :         const EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *mac_ctx,
     752                 :            :         const unsigned char *data, size_t data_len, size_t orig_len)
     753                 :            :         {
     754                 :            :         size_t block_size, digest_pad, blocks_data, blocks_orig;
     755                 :            :         if (EVP_CIPHER_CTX_mode(cipher_ctx) != EVP_CIPH_CBC_MODE)
     756                 :            :                 return;
     757                 :            :         block_size = EVP_MD_CTX_block_size(mac_ctx);
     758                 :            :         /* We are in FIPS mode if we get this far so we know we have only SHA*
     759                 :            :          * digests and TLS to deal with.
     760                 :            :          * Minimum digest padding length is 17 for SHA384/SHA512 and 9
     761                 :            :          * otherwise.
     762                 :            :          * Additional header is 13 bytes. To get the number of digest blocks
     763                 :            :          * processed round up the amount of data plus padding to the nearest
     764                 :            :          * block length. Block length is 128 for SHA384/SHA512 and 64 otherwise.
     765                 :            :          * So we have:
     766                 :            :          * blocks = (payload_len + digest_pad + 13 + block_size - 1)/block_size
     767                 :            :          * equivalently:
     768                 :            :          * blocks = (payload_len + digest_pad + 12)/block_size + 1
     769                 :            :          * HMAC adds a constant overhead.
     770                 :            :          * We're ultimately only interested in differences so this becomes
     771                 :            :          * blocks = (payload_len + 29)/128
     772                 :            :          * for SHA384/SHA512 and
     773                 :            :          * blocks = (payload_len + 21)/64
     774                 :            :          * otherwise.
     775                 :            :          */
     776                 :            :         digest_pad = block_size == 64 ? 21 : 29;
     777                 :            :         blocks_orig = (orig_len + digest_pad)/block_size;
     778                 :            :         blocks_data = (data_len + digest_pad)/block_size;
     779                 :            :         /* MAC enough blocks to make up the difference between the original
     780                 :            :          * and actual lengths plus one extra block to ensure this is never a
     781                 :            :          * no op. The "data" pointer should always have enough space to
     782                 :            :          * perform this operation as it is large enough for a maximum
     783                 :            :          * length TLS buffer. 
     784                 :            :          */
     785                 :            :         EVP_DigestSignUpdate(mac_ctx, data,
     786                 :            :                                 (blocks_orig - blocks_data + 1) * block_size);
     787                 :            :         }
     788                 :            : #endif

Generated by: LCOV version 1.9