LCOV - code coverage report
Current view: top level - openssh-6.6p1 - cipher.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 168 196 85.7 %
Date: 2014-08-01 Functions: 23 24 95.8 %
Branches: 113 154 73.4 %

           Branch data     Line data    Source code
       1                 :            : /* $OpenBSD: cipher.c,v 1.97 2014/02/07 06:55:54 djm Exp $ */
       2                 :            : /*
       3                 :            :  * Author: Tatu Ylonen <ylo@cs.hut.fi>
       4                 :            :  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
       5                 :            :  *                    All rights reserved
       6                 :            :  *
       7                 :            :  * As far as I am concerned, the code I have written for this software
       8                 :            :  * can be used freely for any purpose.  Any derived versions of this
       9                 :            :  * software must be clearly marked as such, and if the derived work is
      10                 :            :  * incompatible with the protocol description in the RFC file, it must be
      11                 :            :  * called by a name other than "ssh" or "Secure Shell".
      12                 :            :  *
      13                 :            :  *
      14                 :            :  * Copyright (c) 1999 Niels Provos.  All rights reserved.
      15                 :            :  * Copyright (c) 1999, 2000 Markus Friedl.  All rights reserved.
      16                 :            :  *
      17                 :            :  * Redistribution and use in source and binary forms, with or without
      18                 :            :  * modification, are permitted provided that the following conditions
      19                 :            :  * are met:
      20                 :            :  * 1. Redistributions of source code must retain the above copyright
      21                 :            :  *    notice, this list of conditions and the following disclaimer.
      22                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      23                 :            :  *    notice, this list of conditions and the following disclaimer in the
      24                 :            :  *    documentation and/or other materials provided with the distribution.
      25                 :            :  *
      26                 :            :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
      27                 :            :  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
      28                 :            :  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
      29                 :            :  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
      30                 :            :  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      31                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      32                 :            :  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      33                 :            :  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      34                 :            :  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
      35                 :            :  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      36                 :            :  */
      37                 :            : 
      38                 :            : #include "includes.h"
      39                 :            : 
      40                 :            : #include <sys/types.h>
      41                 :            : 
      42                 :            : #include <string.h>
      43                 :            : #include <stdarg.h>
      44                 :            : #include <stdio.h>
      45                 :            : 
      46                 :            : #include "xmalloc.h"
      47                 :            : #include "log.h"
      48                 :            : #include "misc.h"
      49                 :            : #include "cipher.h"
      50                 :            : #include "buffer.h"
      51                 :            : #include "digest.h"
      52                 :            : 
      53                 :            : /* compatibility with old or broken OpenSSL versions */
      54                 :            : #include "openbsd-compat/openssl-compat.h"
      55                 :            : 
      56                 :            : extern const EVP_CIPHER *evp_ssh1_bf(void);
      57                 :            : extern const EVP_CIPHER *evp_ssh1_3des(void);
      58                 :            : extern void ssh1_3des_iv(EVP_CIPHER_CTX *, int, u_char *, int);
      59                 :            : 
      60                 :            : struct Cipher {
      61                 :            :         char    *name;
      62                 :            :         int     number;         /* for ssh1 only */
      63                 :            :         u_int   block_size;
      64                 :            :         u_int   key_len;
      65                 :            :         u_int   iv_len;         /* defaults to block_size */
      66                 :            :         u_int   auth_len;
      67                 :            :         u_int   discard_len;
      68                 :            :         u_int   flags;
      69                 :            : #define CFLAG_CBC               (1<<0)
      70                 :            : #define CFLAG_CHACHAPOLY        (1<<1)
      71                 :            :         const EVP_CIPHER        *(*evptype)(void);
      72                 :            : };
      73                 :            : 
      74                 :            : static const struct Cipher ciphers[] = {
      75                 :            :         { "none",     SSH_CIPHER_NONE, 8, 0, 0, 0, 0, 0, EVP_enc_null },
      76                 :            :         { "des",      SSH_CIPHER_DES, 8, 8, 0, 0, 0, 1, EVP_des_cbc },
      77                 :            :         { "3des",     SSH_CIPHER_3DES, 8, 16, 0, 0, 0, 1, evp_ssh1_3des },
      78                 :            :         { "blowfish", SSH_CIPHER_BLOWFISH, 8, 32, 0, 0, 0, 1, evp_ssh1_bf },
      79                 :            : 
      80                 :            :         { "3des-cbc", SSH_CIPHER_SSH2, 8, 24, 0, 0, 0, 1, EVP_des_ede3_cbc },
      81                 :            :         { "blowfish-cbc",
      82                 :            :                         SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 1, EVP_bf_cbc },
      83                 :            :         { "cast128-cbc",
      84                 :            :                         SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 1, EVP_cast5_cbc },
      85                 :            :         { "arcfour",  SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 0, EVP_rc4 },
      86                 :            :         { "arcfour128",       SSH_CIPHER_SSH2, 8, 16, 0, 0, 1536, 0, EVP_rc4 },
      87                 :            :         { "arcfour256",       SSH_CIPHER_SSH2, 8, 32, 0, 0, 1536, 0, EVP_rc4 },
      88                 :            :         { "aes128-cbc",       SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, 1, EVP_aes_128_cbc },
      89                 :            :         { "aes192-cbc",       SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, 1, EVP_aes_192_cbc },
      90                 :            :         { "aes256-cbc",       SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 1, EVP_aes_256_cbc },
      91                 :            :         { "rijndael-cbc@lysator.liu.se",
      92                 :            :                         SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 1, EVP_aes_256_cbc },
      93                 :            :         { "aes128-ctr",       SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, 0, EVP_aes_128_ctr },
      94                 :            :         { "aes192-ctr",       SSH_CIPHER_SSH2, 16, 24, 0, 0, 0, 0, EVP_aes_192_ctr },
      95                 :            :         { "aes256-ctr",       SSH_CIPHER_SSH2, 16, 32, 0, 0, 0, 0, EVP_aes_256_ctr },
      96                 :            : #ifdef OPENSSL_HAVE_EVPGCM
      97                 :            :         { "aes128-gcm@openssh.com",
      98                 :            :                         SSH_CIPHER_SSH2, 16, 16, 12, 16, 0, 0, EVP_aes_128_gcm },
      99                 :            :         { "aes256-gcm@openssh.com",
     100                 :            :                         SSH_CIPHER_SSH2, 16, 32, 12, 16, 0, 0, EVP_aes_256_gcm },
     101                 :            : #endif
     102                 :            :         { "chacha20-poly1305@openssh.com",
     103                 :            :                         SSH_CIPHER_SSH2, 8, 64, 0, 16, 0, CFLAG_CHACHAPOLY, NULL },
     104                 :            :         { NULL,         SSH_CIPHER_INVALID, 0, 0, 0, 0, 0, 0, NULL }
     105                 :            : };
     106                 :            : 
     107                 :            : /*--*/
     108                 :            : 
     109                 :            : /* Returns a list of supported ciphers separated by the specified char. */
     110                 :            : char *
     111                 :        615 : cipher_alg_list(char sep, int auth_only)
     112                 :            : {
     113                 :        615 :         char *ret = NULL;
     114                 :        615 :         size_t nlen, rlen = 0;
     115                 :            :         const Cipher *c;
     116                 :            : 
     117         [ +  + ]:      12915 :         for (c = ciphers; c->name != NULL; c++) {
     118         [ +  + ]:      12300 :                 if (c->number != SSH_CIPHER_SSH2)
     119                 :       2460 :                         continue;
     120 [ +  + ][ +  + ]:       9840 :                 if (auth_only && c->auth_len == 0)
     121                 :       6123 :                         continue;
     122         [ +  + ]:       3717 :                 if (ret != NULL)
     123                 :       3102 :                         ret[rlen++] = sep;
     124                 :       3717 :                 nlen = strlen(c->name);
     125                 :       3717 :                 ret = xrealloc(ret, 1, rlen + nlen + 2);
     126                 :       3717 :                 memcpy(ret + rlen, c->name, nlen + 1);
     127                 :       3717 :                 rlen += nlen;
     128                 :            :         }
     129                 :        615 :         return ret;
     130                 :            : }
     131                 :            : 
     132                 :            : u_int
     133                 :       3789 : cipher_blocksize(const Cipher *c)
     134                 :            : {
     135                 :       3789 :         return (c->block_size);
     136                 :            : }
     137                 :            : 
     138                 :            : u_int
     139                 :       3789 : cipher_keylen(const Cipher *c)
     140                 :            : {
     141                 :      10883 :         return (c->key_len);
     142                 :            : }
     143                 :            : 
     144                 :            : u_int
     145                 :       7226 : cipher_seclen(const Cipher *c)
     146                 :            : {
     147         [ +  + ]:       7226 :         if (strcmp("3des-cbc", c->name) == 0)
     148                 :            :                 return 14;
     149                 :       7094 :         return cipher_keylen(c);
     150                 :            : }
     151                 :            : 
     152                 :            : u_int
     153                 :      90174 : cipher_authlen(const Cipher *c)
     154                 :            : {
     155                 :     103346 :         return (c->auth_len);
     156                 :            : }
     157                 :            : 
     158                 :            : u_int
     159                 :       3789 : cipher_ivlen(const Cipher *c)
     160                 :            : {
     161                 :            :         /*
     162                 :            :          * Default is cipher block size, except for chacha20+poly1305 that
     163                 :            :          * needs no IV. XXX make iv_len == -1 default?
     164                 :            :          */
     165 [ +  + ][ +  + ]:       8310 :         return (c->iv_len != 0 || (c->flags & CFLAG_CHACHAPOLY) != 0) ?
     166 [ +  + ][ +  + ]:      16890 :             c->iv_len : c->block_size;
     167                 :            : }
     168                 :            : 
     169                 :            : u_int
     170                 :        103 : cipher_get_number(const Cipher *c)
     171                 :            : {
     172                 :        103 :         return (c->number);
     173                 :            : }
     174                 :            : 
     175                 :            : u_int
     176                 :          0 : cipher_is_cbc(const Cipher *c)
     177                 :            : {
     178                 :          0 :         return (c->flags & CFLAG_CBC) != 0;
     179                 :            : }
     180                 :            : 
     181                 :            : u_int
     182                 :        269 : cipher_mask_ssh1(int client)
     183                 :            : {
     184                 :        269 :         u_int mask = 0;
     185                 :        269 :         mask |= 1 << SSH_CIPHER_3DES;             /* Mandatory */
     186                 :        269 :         mask |= 1 << SSH_CIPHER_BLOWFISH;
     187         [ +  + ]:        269 :         if (client) {
     188                 :         61 :                 mask |= 1 << SSH_CIPHER_DES;
     189                 :            :         }
     190                 :        269 :         return mask;
     191                 :            : }
     192                 :            : 
     193                 :            : const Cipher *
     194                 :       7588 : cipher_by_name(const char *name)
     195                 :            : {
     196                 :            :         const Cipher *c;
     197         [ +  - ]:      80063 :         for (c = ciphers; c->name != NULL; c++)
     198         [ +  + ]:      80063 :                 if (strcmp(c->name, name) == 0)
     199                 :            :                         return c;
     200                 :            :         return NULL;
     201                 :            : }
     202                 :            : 
     203                 :            : const Cipher *
     204                 :       1737 : cipher_by_number(int id)
     205                 :            : {
     206                 :            :         const Cipher *c;
     207 [ +  - ][ +  - ]:       2761 :         for (c = ciphers; c->name != NULL; c++)
     208 [ +  + ][ +  + ]:       2761 :                 if (c->number == id)
     209                 :            :                         return c;
     210                 :            :         return NULL;
     211                 :            : }
     212                 :            : 
     213                 :            : #define CIPHER_SEP      ","
     214                 :            : int
     215                 :        513 : ciphers_valid(const char *names)
     216                 :            : {
     217                 :            :         const Cipher *c;
     218                 :            :         char *cipher_list, *cp;
     219                 :            :         char *p;
     220                 :            : 
     221 [ +  - ][ +  - ]:        513 :         if (names == NULL || strcmp(names, "") == 0)
     222                 :            :                 return 0;
     223                 :        513 :         cipher_list = cp = xstrdup(names);
     224 [ +  + ][ +  - ]:       1024 :         for ((p = strsep(&cp, CIPHER_SEP)); p && *p != '\0';
     225                 :        511 :             (p = strsep(&cp, CIPHER_SEP))) {
     226                 :        513 :                 c = cipher_by_name(p);
     227 [ +  - ][ +  + ]:        513 :                 if (c == NULL || c->number != SSH_CIPHER_SSH2) {
     228                 :          2 :                         debug("bad cipher %s [%s]", p, names);
     229                 :          2 :                         free(cipher_list);
     230                 :          2 :                         return 0;
     231                 :            :                 }
     232                 :            :         }
     233                 :        511 :         debug3("ciphers ok: [%s]", names);
     234                 :        511 :         free(cipher_list);
     235                 :        511 :         return 1;
     236                 :            : }
     237                 :            : 
     238                 :            : /*
     239                 :            :  * Parses the name of the cipher.  Returns the number of the corresponding
     240                 :            :  * cipher, or -1 on error.
     241                 :            :  */
     242                 :            : 
     243                 :            : int
     244                 :          2 : cipher_number(const char *name)
     245                 :            : {
     246                 :            :         const Cipher *c;
     247         [ +  - ]:          2 :         if (name == NULL)
     248                 :            :                 return -1;
     249         [ +  - ]:          7 :         for (c = ciphers; c->name != NULL; c++)
     250         [ +  + ]:          7 :                 if (strcasecmp(c->name, name) == 0)
     251                 :          2 :                         return c->number;
     252                 :            :         return -1;
     253                 :            : }
     254                 :            : 
     255                 :            : char *
     256                 :        165 : cipher_name(int id)
     257                 :            : {
     258                 :        165 :         const Cipher *c = cipher_by_number(id);
     259         [ +  - ]:        165 :         return (c==NULL) ? "<unknown>" : c->name;
     260                 :            : }
     261                 :            : 
     262                 :            : void
     263                 :      10996 : cipher_init(CipherContext *cc, const Cipher *cipher,
     264                 :            :     const u_char *key, u_int keylen, const u_char *iv, u_int ivlen,
     265                 :            :     int do_encrypt)
     266                 :            : {
     267                 :            :         static int dowarn = 1;
     268                 :            : #ifdef SSH_OLD_EVP
     269                 :            :         EVP_CIPHER *type;
     270                 :            : #else
     271                 :            :         const EVP_CIPHER *type;
     272                 :            :         int klen;
     273                 :            : #endif
     274                 :            :         u_char *junk, *discard;
     275                 :            : 
     276         [ -  + ]:      10996 :         if (cipher->number == SSH_CIPHER_DES) {
     277         [ #  # ]:          0 :                 if (dowarn) {
     278                 :          0 :                         error("Warning: use of DES is strongly discouraged "
     279                 :            :                             "due to cryptographic weaknesses");
     280                 :          0 :                         dowarn = 0;
     281                 :            :                 }
     282         [ #  # ]:          0 :                 if (keylen > 8)
     283                 :          0 :                         keylen = 8;
     284                 :            :         }
     285                 :      10996 :         cc->plaintext = (cipher->number == SSH_CIPHER_NONE);
     286                 :      10996 :         cc->encrypt = do_encrypt;
     287                 :            : 
     288         [ -  + ]:      10996 :         if (keylen < cipher->key_len)
     289                 :          0 :                 fatal("cipher_init: key length %d is insufficient for %s.",
     290                 :            :                     keylen, cipher->name);
     291 [ +  + ][ -  + ]:      16057 :         if (iv != NULL && ivlen < cipher_ivlen(cipher))
     292                 :          0 :                 fatal("cipher_init: iv length %d is insufficient for %s.",
     293                 :            :                     ivlen, cipher->name);
     294                 :      10996 :         cc->cipher = cipher;
     295                 :            : 
     296         [ +  + ]:      10996 :         if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0) {
     297                 :        146 :                 chachapoly_init(&cc->cp_ctx, key, keylen);
     298                 :        146 :                 return;
     299                 :            :         }
     300                 :      10850 :         type = (*cipher->evptype)();
     301                 :      10850 :         EVP_CIPHER_CTX_init(&cc->evp);
     302                 :            : #ifdef SSH_OLD_EVP
     303                 :            :         if (type->key_len > 0 && type->key_len != keylen) {
     304                 :            :                 debug("cipher_init: set keylen (%d -> %d)",
     305                 :            :                     type->key_len, keylen);
     306                 :            :                 type->key_len = keylen;
     307                 :            :         }
     308                 :            :         EVP_CipherInit(&cc->evp, type, (u_char *)key, (u_char *)iv,
     309                 :            :             (do_encrypt == CIPHER_ENCRYPT));
     310                 :            : #else
     311         [ -  + ]:      10850 :         if (EVP_CipherInit(&cc->evp, type, NULL, (u_char *)iv,
     312                 :            :             (do_encrypt == CIPHER_ENCRYPT)) == 0)
     313                 :          0 :                 fatal("cipher_init: EVP_CipherInit failed for %s",
     314                 :            :                     cipher->name);
     315   [ +  +  -  + ]:      11142 :         if (cipher_authlen(cipher) &&
     316                 :        292 :             !EVP_CIPHER_CTX_ctrl(&cc->evp, EVP_CTRL_GCM_SET_IV_FIXED,
     317                 :            :             -1, (u_char *)iv))
     318                 :          0 :                 fatal("cipher_init: EVP_CTRL_GCM_SET_IV_FIXED failed for %s",
     319                 :            :                     cipher->name);
     320                 :      10850 :         klen = EVP_CIPHER_CTX_key_length(&cc->evp);
     321         [ +  + ]:      10850 :         if (klen > 0 && keylen != (u_int)klen) {
     322                 :        638 :                 debug2("cipher_init: set keylen (%d -> %d)", klen, keylen);
     323         [ -  + ]:        638 :                 if (EVP_CIPHER_CTX_set_key_length(&cc->evp, keylen) == 0)
     324                 :          0 :                         fatal("cipher_init: set keylen failed (%d -> %d)",
     325                 :            :                             klen, keylen);
     326                 :            :         }
     327         [ -  + ]:      10850 :         if (EVP_CipherInit(&cc->evp, NULL, (u_char *)key, NULL, -1) == 0)
     328                 :          0 :                 fatal("cipher_init: EVP_CipherInit: set key failed for %s",
     329                 :            :                     cipher->name);
     330                 :            : #endif
     331                 :            : 
     332         [ +  + ]:      10850 :         if (cipher->discard_len > 0) {
     333                 :        256 :                 junk = xmalloc(cipher->discard_len);
     334                 :        256 :                 discard = xmalloc(cipher->discard_len);
     335         [ -  + ]:        256 :                 if (EVP_Cipher(&cc->evp, discard, junk,
     336                 :            :                     cipher->discard_len) == 0)
     337                 :          0 :                         fatal("evp_crypt: EVP_Cipher failed during discard");
     338                 :        256 :                 explicit_bzero(discard, cipher->discard_len);
     339                 :        256 :                 free(junk);
     340                 :        256 :                 free(discard);
     341                 :            :         }
     342                 :            : }
     343                 :            : 
     344                 :            : /*
     345                 :            :  * cipher_crypt() operates as following:
     346                 :            :  * Copy 'aadlen' bytes (without en/decryption) from 'src' to 'dest'.
     347                 :            :  * Theses bytes are treated as additional authenticated data for
     348                 :            :  * authenticated encryption modes.
     349                 :            :  * En/Decrypt 'len' bytes at offset 'aadlen' from 'src' to 'dest'.
     350                 :            :  * Use 'authlen' bytes at offset 'len'+'aadlen' as the authentication tag.
     351                 :            :  * This tag is written on encryption and verified on decryption.
     352                 :            :  * Both 'aadlen' and 'authlen' can be set to 0.
     353                 :            :  * cipher_crypt() returns 0 on success and -1 if the decryption integrity
     354                 :            :  * check fails.
     355                 :            :  */
     356                 :            : int
     357                 :      61419 : cipher_crypt(CipherContext *cc, u_int seqnr, u_char *dest, const u_char *src,
     358                 :            :     u_int len, u_int aadlen, u_int authlen)
     359                 :            : {
     360         [ +  + ]:      61419 :         if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
     361                 :       1137 :                 return chachapoly_crypt(&cc->cp_ctx, seqnr, dest, src, len,
     362                 :            :                     aadlen, authlen, cc->encrypt);
     363         [ +  + ]:      60282 :         if (authlen) {
     364                 :            :                 u_char lastiv[1];
     365                 :            : 
     366         [ -  + ]:       2322 :                 if (authlen != cipher_authlen(cc->cipher))
     367                 :          0 :                         fatal("%s: authlen mismatch %d", __func__, authlen);
     368                 :            :                 /* increment IV */
     369         [ -  + ]:       2322 :                 if (!EVP_CIPHER_CTX_ctrl(&cc->evp, EVP_CTRL_GCM_IV_GEN,
     370                 :            :                     1, lastiv))
     371                 :          0 :                         fatal("%s: EVP_CTRL_GCM_IV_GEN", __func__);
     372                 :            :                 /* set tag on decyption */
     373   [ +  +  -  + ]:       3220 :                 if (!cc->encrypt &&
     374                 :        898 :                     !EVP_CIPHER_CTX_ctrl(&cc->evp, EVP_CTRL_GCM_SET_TAG,
     375                 :        898 :                     authlen, (u_char *)src + aadlen + len))
     376                 :       2322 :                         fatal("%s: EVP_CTRL_GCM_SET_TAG", __func__);
     377                 :            :         }
     378         [ +  + ]:      60282 :         if (aadlen) {
     379   [ +  +  -  + ]:      34284 :                 if (authlen &&
     380                 :       2322 :                     EVP_Cipher(&cc->evp, NULL, (u_char *)src, aadlen) < 0)
     381                 :          0 :                         fatal("%s: EVP_Cipher(aad) failed", __func__);
     382                 :      31962 :                 memcpy(dest, src, aadlen);
     383                 :            :         }
     384         [ -  + ]:      60282 :         if (len % cc->cipher->block_size)
     385                 :          0 :                 fatal("%s: bad plaintext length %d", __func__, len);
     386         [ -  + ]:      60282 :         if (EVP_Cipher(&cc->evp, dest + aadlen, (u_char *)src + aadlen,
     387                 :            :             len) < 0)
     388                 :          0 :                 fatal("%s: EVP_Cipher failed", __func__);
     389         [ +  + ]:      60282 :         if (authlen) {
     390                 :            :                 /* compute tag (on encrypt) or verify tag (on decrypt) */
     391         [ -  + ]:       2322 :                 if (EVP_Cipher(&cc->evp, NULL, NULL, 0) < 0) {
     392         [ #  # ]:          0 :                         if (cc->encrypt)
     393                 :          0 :                                 fatal("%s: EVP_Cipher(final) failed", __func__);
     394                 :            :                         else
     395                 :            :                                 return -1;
     396                 :            :                 }
     397   [ +  +  -  + ]:       3746 :                 if (cc->encrypt &&
     398                 :       1424 :                     !EVP_CIPHER_CTX_ctrl(&cc->evp, EVP_CTRL_GCM_GET_TAG,
     399                 :       1424 :                     authlen, dest + aadlen + len))
     400                 :          0 :                         fatal("%s: EVP_CTRL_GCM_GET_TAG", __func__);
     401                 :            :         }
     402                 :            :         return 0;
     403                 :            : }
     404                 :            : 
     405                 :            : /* Extract the packet length, including any decryption necessary beforehand */
     406                 :            : int
     407                 :      48321 : cipher_get_length(CipherContext *cc, u_int *plenp, u_int seqnr,
     408                 :            :     const u_char *cp, u_int len)
     409                 :            : {
     410         [ +  + ]:      48321 :         if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
     411                 :       2030 :                 return chachapoly_get_length(&cc->cp_ctx, plenp, seqnr,
     412                 :            :                     cp, len);
     413         [ +  + ]:      46291 :         if (len < 4)
     414                 :            :                 return -1;
     415                 :      14894 :         *plenp = get_u32(cp);
     416                 :      14894 :         return 0;
     417                 :            : }
     418                 :            : 
     419                 :            : void
     420                 :       3978 : cipher_cleanup(CipherContext *cc)
     421                 :            : {
     422         [ +  + ]:       3978 :         if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
     423                 :        102 :                 explicit_bzero(&cc->cp_ctx, sizeof(cc->cp_ctx));
     424         [ -  + ]:       3876 :         else if (EVP_CIPHER_CTX_cleanup(&cc->evp) == 0)
     425                 :          0 :                 error("cipher_cleanup: EVP_CIPHER_CTX_cleanup failed");
     426                 :       3978 : }
     427                 :            : 
     428                 :            : /*
     429                 :            :  * Selects the cipher, and keys if by computing the MD5 checksum of the
     430                 :            :  * passphrase and using the resulting 16 bytes as the key.
     431                 :            :  */
     432                 :            : 
     433                 :            : void
     434                 :       1479 : cipher_set_key_string(CipherContext *cc, const Cipher *cipher,
     435                 :            :     const char *passphrase, int do_encrypt)
     436                 :            : {
     437                 :            :         u_char digest[16];
     438                 :            : 
     439         [ -  + ]:       1479 :         if (ssh_digest_memory(SSH_DIGEST_MD5, passphrase, strlen(passphrase),
     440                 :            :             digest, sizeof(digest)) < 0)
     441                 :          0 :                 fatal("%s: md5 failed", __func__);
     442                 :            : 
     443                 :       1479 :         cipher_init(cc, cipher, digest, 16, NULL, 0, do_encrypt);
     444                 :            : 
     445                 :       1479 :         explicit_bzero(digest, sizeof(digest));
     446                 :       1479 : }
     447                 :            : 
     448                 :            : /*
     449                 :            :  * Exports an IV from the CipherContext required to export the key
     450                 :            :  * state back from the unprivileged child to the privileged parent
     451                 :            :  * process.
     452                 :            :  */
     453                 :            : 
     454                 :            : int
     455                 :        206 : cipher_get_keyiv_len(const CipherContext *cc)
     456                 :            : {
     457                 :        206 :         const Cipher *c = cc->cipher;
     458                 :            :         int ivlen;
     459                 :            : 
     460         [ +  + ]:        206 :         if (c->number == SSH_CIPHER_3DES)
     461                 :            :                 ivlen = 24;
     462         [ +  - ]:          2 :         else if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
     463                 :            :                 ivlen = 0;
     464                 :            :         else
     465                 :          2 :                 ivlen = EVP_CIPHER_CTX_iv_length(&cc->evp);
     466                 :        206 :         return (ivlen);
     467                 :            : }
     468                 :            : 
     469                 :            : void
     470                 :       1522 : cipher_get_keyiv(CipherContext *cc, u_char *iv, u_int len)
     471                 :            : {
     472                 :       1522 :         const Cipher *c = cc->cipher;
     473                 :            :         int evplen;
     474                 :            : 
     475         [ +  + ]:       1522 :         if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0) {
     476         [ -  + ]:         22 :                 if (len != 0)
     477                 :          0 :                         fatal("%s: wrong iv length %d != %d", __func__, len, 0);
     478                 :            :                 return;
     479                 :            :         }
     480                 :            : 
     481      [ +  +  - ]:       1500 :         switch (c->number) {
     482                 :            :         case SSH_CIPHER_SSH2:
     483                 :            :         case SSH_CIPHER_DES:
     484                 :            :         case SSH_CIPHER_BLOWFISH:
     485                 :       1296 :                 evplen = EVP_CIPHER_CTX_iv_length(&cc->evp);
     486         [ +  + ]:       1296 :                 if (evplen <= 0)
     487                 :            :                         return;
     488         [ -  + ]:       1176 :                 if ((u_int)evplen != len)
     489                 :          0 :                         fatal("%s: wrong iv length %d != %d", __func__,
     490                 :            :                             evplen, len);
     491                 :            : #ifdef USE_BUILTIN_RIJNDAEL
     492                 :            :                 if (c->evptype == evp_rijndael)
     493                 :            :                         ssh_rijndael_iv(&cc->evp, 0, iv, len);
     494                 :            :                 else
     495                 :            : #endif
     496                 :            : #ifndef OPENSSL_HAVE_EVPCTR
     497                 :            :                 if (c->evptype == evp_aes_128_ctr)
     498                 :            :                         ssh_aes_ctr_iv(&cc->evp, 0, iv, len);
     499                 :            :                 else
     500                 :            : #endif
     501                 :       1176 :                 memcpy(iv, cc->evp.iv, len);
     502                 :            :                 break;
     503                 :            :         case SSH_CIPHER_3DES:
     504                 :        204 :                 ssh1_3des_iv(&cc->evp, 0, iv, 24);
     505                 :        204 :                 break;
     506                 :            :         default:
     507                 :          0 :                 fatal("%s: bad cipher %d", __func__, c->number);
     508                 :            :         }
     509                 :            : }
     510                 :            : 
     511                 :            : void
     512                 :        186 : cipher_set_keyiv(CipherContext *cc, u_char *iv)
     513                 :            : {
     514                 :        186 :         const Cipher *c = cc->cipher;
     515                 :        186 :         int evplen = 0;
     516                 :            : 
     517         [ +  - ]:        186 :         if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0)
     518                 :            :                 return;
     519                 :            : 
     520      [ +  +  - ]:        186 :         switch (c->number) {
     521                 :            :         case SSH_CIPHER_SSH2:
     522                 :            :         case SSH_CIPHER_DES:
     523                 :            :         case SSH_CIPHER_BLOWFISH:
     524                 :          2 :                 evplen = EVP_CIPHER_CTX_iv_length(&cc->evp);
     525         [ +  - ]:          2 :                 if (evplen == 0)
     526                 :            :                         return;
     527                 :            : #ifdef USE_BUILTIN_RIJNDAEL
     528                 :            :                 if (c->evptype == evp_rijndael)
     529                 :            :                         ssh_rijndael_iv(&cc->evp, 1, iv, evplen);
     530                 :            :                 else
     531                 :            : #endif
     532                 :            : #ifndef OPENSSL_HAVE_EVPCTR
     533                 :            :                 if (c->evptype == evp_aes_128_ctr)
     534                 :            :                         ssh_aes_ctr_iv(&cc->evp, 1, iv, evplen);
     535                 :            :                 else
     536                 :            : #endif
     537                 :          2 :                 memcpy(cc->evp.iv, iv, evplen);
     538                 :            :                 break;
     539                 :            :         case SSH_CIPHER_3DES:
     540                 :        184 :                 ssh1_3des_iv(&cc->evp, 1, iv, 24);
     541                 :        184 :                 break;
     542                 :            :         default:
     543                 :          0 :                 fatal("%s: bad cipher %d", __func__, c->number);
     544                 :            :         }
     545                 :            : }
     546                 :            : 
     547                 :            : int
     548                 :       3044 : cipher_get_keycontext(const CipherContext *cc, u_char *dat)
     549                 :            : {
     550                 :       3044 :         const Cipher *c = cc->cipher;
     551                 :       3044 :         int plen = 0;
     552                 :            : 
     553         [ +  + ]:       3044 :         if (c->evptype == EVP_rc4) {
     554                 :        240 :                 plen = EVP_X_STATE_LEN(cc->evp);
     555         [ +  + ]:        240 :                 if (dat == NULL)
     556                 :            :                         return (plen);
     557                 :        120 :                 memcpy(dat, EVP_X_STATE(cc->evp), plen);
     558                 :            :         }
     559                 :       2924 :         return (plen);
     560                 :            : }
     561                 :            : 
     562                 :            : void
     563                 :       1470 : cipher_set_keycontext(CipherContext *cc, u_char *dat)
     564                 :            : {
     565                 :       1470 :         const Cipher *c = cc->cipher;
     566                 :            :         int plen;
     567                 :            : 
     568         [ +  + ]:       1470 :         if (c->evptype == EVP_rc4) {
     569                 :        120 :                 plen = EVP_X_STATE_LEN(cc->evp);
     570                 :        120 :                 memcpy(EVP_X_STATE(cc->evp), dat, plen);
     571                 :            :         }
     572                 :       1470 : }

Generated by: LCOV version 1.9