LCOV - code coverage report
Current view: top level - openssh-6.6p1 - key.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 873 1254 69.6 %
Date: 2014-08-01 Functions: 57 59 96.6 %
Branches: 652 1064 61.3 %

           Branch data     Line data    Source code
       1                 :            : /* $OpenBSD: key.c,v 1.116 2014/02/02 03:44:31 djm Exp $ */
       2                 :            : /*
       3                 :            :  * read_bignum():
       4                 :            :  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
       5                 :            :  *
       6                 :            :  * As far as I am concerned, the code I have written for this software
       7                 :            :  * can be used freely for any purpose.  Any derived versions of this
       8                 :            :  * software must be clearly marked as such, and if the derived work is
       9                 :            :  * incompatible with the protocol description in the RFC file, it must be
      10                 :            :  * called by a name other than "ssh" or "Secure Shell".
      11                 :            :  *
      12                 :            :  *
      13                 :            :  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
      14                 :            :  * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
      15                 :            :  *
      16                 :            :  * Redistribution and use in source and binary forms, with or without
      17                 :            :  * modification, are permitted provided that the following conditions
      18                 :            :  * are met:
      19                 :            :  * 1. Redistributions of source code must retain the above copyright
      20                 :            :  *    notice, this list of conditions and the following disclaimer.
      21                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      22                 :            :  *    notice, this list of conditions and the following disclaimer in the
      23                 :            :  *    documentation and/or other materials provided with the distribution.
      24                 :            :  *
      25                 :            :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
      26                 :            :  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
      27                 :            :  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
      28                 :            :  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
      29                 :            :  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      30                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      31                 :            :  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      32                 :            :  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      33                 :            :  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
      34                 :            :  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      35                 :            :  */
      36                 :            : 
      37                 :            : #include "includes.h"
      38                 :            : 
      39                 :            : #include <sys/param.h>
      40                 :            : #include <sys/types.h>
      41                 :            : 
      42                 :            : #include "crypto_api.h"
      43                 :            : 
      44                 :            : #include <openssl/evp.h>
      45                 :            : #include <openbsd-compat/openssl-compat.h>
      46                 :            : 
      47                 :            : #include <stdarg.h>
      48                 :            : #include <stdio.h>
      49                 :            : #include <string.h>
      50                 :            : 
      51                 :            : #include "xmalloc.h"
      52                 :            : #include "key.h"
      53                 :            : #include "rsa.h"
      54                 :            : #include "uuencode.h"
      55                 :            : #include "buffer.h"
      56                 :            : #include "log.h"
      57                 :            : #include "misc.h"
      58                 :            : #include "ssh2.h"
      59                 :            : #include "digest.h"
      60                 :            : 
      61                 :            : static int to_blob(const Key *, u_char **, u_int *, int);
      62                 :            : static Key *key_from_blob2(const u_char *, u_int, int);
      63                 :            : 
      64                 :            : static struct KeyCert *
      65                 :       1575 : cert_new(void)
      66                 :            : {
      67                 :            :         struct KeyCert *cert;
      68                 :            : 
      69                 :       1575 :         cert = xcalloc(1, sizeof(*cert));
      70                 :       1575 :         buffer_init(&cert->certblob);
      71                 :       1575 :         buffer_init(&cert->critical);
      72                 :       1575 :         buffer_init(&cert->extensions);
      73                 :       1575 :         cert->key_id = NULL;
      74                 :       1575 :         cert->principals = NULL;
      75                 :       1575 :         cert->signature_key = NULL;
      76                 :       1575 :         return cert;
      77                 :            : }
      78                 :            : 
      79                 :            : Key *
      80                 :      51891 : key_new(int type)
      81                 :            : {
      82                 :            :         Key *k;
      83                 :            :         RSA *rsa;
      84                 :            :         DSA *dsa;
      85                 :      51891 :         k = xcalloc(1, sizeof(*k));
      86                 :      51891 :         k->type = type;
      87                 :      51891 :         k->ecdsa = NULL;
      88                 :      51891 :         k->ecdsa_nid = -1;
      89                 :      51891 :         k->dsa = NULL;
      90                 :      51891 :         k->rsa = NULL;
      91                 :      51891 :         k->cert = NULL;
      92                 :      51891 :         k->ed25519_sk = NULL;
      93 [ +  - ][ +  + ]:      51891 :         k->ed25519_pk = NULL;
         [ +  + ][ -  + ]
      94                 :            :         switch (k->type) {
      95                 :            :         case KEY_RSA1:
      96                 :            :         case KEY_RSA:
      97                 :            :         case KEY_RSA_CERT_V00:
      98                 :            :         case KEY_RSA_CERT:
      99         [ -  + ]:      32174 :                 if ((rsa = RSA_new()) == NULL)
     100                 :          0 :                         fatal("key_new: RSA_new failed");
     101         [ -  + ]:      32174 :                 if ((rsa->n = BN_new()) == NULL)
     102                 :          0 :                         fatal("key_new: BN_new failed");
     103         [ -  + ]:      32174 :                 if ((rsa->e = BN_new()) == NULL)
     104                 :          0 :                         fatal("key_new: BN_new failed");
     105                 :      32174 :                 k->rsa = rsa;
     106                 :      32174 :                 break;
     107                 :            :         case KEY_DSA:
     108                 :            :         case KEY_DSA_CERT_V00:
     109                 :            :         case KEY_DSA_CERT:
     110         [ -  + ]:        591 :                 if ((dsa = DSA_new()) == NULL)
     111                 :          0 :                         fatal("key_new: DSA_new failed");
     112         [ -  + ]:        591 :                 if ((dsa->p = BN_new()) == NULL)
     113                 :          0 :                         fatal("key_new: BN_new failed");
     114         [ -  + ]:        591 :                 if ((dsa->q = BN_new()) == NULL)
     115                 :          0 :                         fatal("key_new: BN_new failed");
     116         [ -  + ]:        591 :                 if ((dsa->g = BN_new()) == NULL)
     117                 :          0 :                         fatal("key_new: BN_new failed");
     118         [ -  + ]:        591 :                 if ((dsa->pub_key = BN_new()) == NULL)
     119                 :          0 :                         fatal("key_new: BN_new failed");
     120                 :        591 :                 k->dsa = dsa;
     121                 :        591 :                 break;
     122                 :            : #ifdef OPENSSL_HAS_ECC
     123                 :            :         case KEY_ECDSA:
     124                 :            :         case KEY_ECDSA_CERT:
     125                 :            :                 /* Cannot do anything until we know the group */
     126                 :            :                 break;
     127                 :            : #endif
     128                 :            :         case KEY_ED25519:
     129                 :            :         case KEY_ED25519_CERT:
     130                 :            :                 /* no need to prealloc */
     131                 :            :                 break;
     132                 :            :         case KEY_UNSPEC:
     133                 :            :                 break;
     134                 :            :         default:
     135                 :          0 :                 fatal("key_new: bad key type %d", k->type);
     136                 :            :                 break;
     137                 :            :         }
     138                 :            : 
     139         [ +  + ]:      51891 :         if (key_is_cert(k))
     140                 :       1318 :                 k->cert = cert_new();
     141                 :            : 
     142                 :      51891 :         return k;
     143                 :            : }
     144                 :            : 
     145                 :            : void
     146                 :       1610 : key_add_private(Key *k)
     147                 :            : {
     148 [ +  - ][ +  + ]:       1610 :         switch (k->type) {
                 [ +  + ]
     149                 :            :         case KEY_RSA1:
     150                 :            :         case KEY_RSA:
     151                 :            :         case KEY_RSA_CERT_V00:
     152                 :            :         case KEY_RSA_CERT:
     153         [ -  + ]:       1581 :                 if ((k->rsa->d = BN_new()) == NULL)
     154                 :          0 :                         fatal("key_new_private: BN_new failed");
     155         [ -  + ]:       1581 :                 if ((k->rsa->iqmp = BN_new()) == NULL)
     156                 :          0 :                         fatal("key_new_private: BN_new failed");
     157         [ -  + ]:       1581 :                 if ((k->rsa->q = BN_new()) == NULL)
     158                 :          0 :                         fatal("key_new_private: BN_new failed");
     159         [ -  + ]:       1581 :                 if ((k->rsa->p = BN_new()) == NULL)
     160                 :          0 :                         fatal("key_new_private: BN_new failed");
     161         [ -  + ]:       1581 :                 if ((k->rsa->dmq1 = BN_new()) == NULL)
     162                 :          0 :                         fatal("key_new_private: BN_new failed");
     163         [ -  + ]:       1581 :                 if ((k->rsa->dmp1 = BN_new()) == NULL)
     164                 :          0 :                         fatal("key_new_private: BN_new failed");
     165                 :            :                 break;
     166                 :            :         case KEY_DSA:
     167                 :            :         case KEY_DSA_CERT_V00:
     168                 :            :         case KEY_DSA_CERT:
     169         [ -  + ]:          1 :                 if ((k->dsa->priv_key = BN_new()) == NULL)
     170                 :         28 :                         fatal("key_new_private: BN_new failed");
     171                 :            :                 break;
     172                 :            :         case KEY_ECDSA:
     173                 :            :         case KEY_ECDSA_CERT:
     174                 :            :                 /* Cannot do anything until we know the group */
     175                 :            :                 break;
     176                 :            :         case KEY_ED25519:
     177                 :            :         case KEY_ED25519_CERT:
     178                 :            :                 /* no need to prealloc */
     179                 :            :                 break;
     180                 :            :         case KEY_UNSPEC:
     181                 :            :                 break;
     182                 :            :         default:
     183                 :            :                 break;
     184                 :            :         }
     185                 :       1610 : }
     186                 :            : 
     187                 :            : Key *
     188                 :       1582 : key_new_private(int type)
     189                 :            : {
     190                 :       1610 :         Key *k = key_new(type);
     191                 :            : 
     192                 :       1610 :         key_add_private(k);
     193                 :       1582 :         return k;
     194                 :            : }
     195                 :            : 
     196                 :            : static void
     197                 :       1545 : cert_free(struct KeyCert *cert)
     198                 :            : {
     199                 :            :         u_int i;
     200                 :            : 
     201                 :       1545 :         buffer_free(&cert->certblob);
     202                 :       1545 :         buffer_free(&cert->critical);
     203                 :       1545 :         buffer_free(&cert->extensions);
     204                 :       1545 :         free(cert->key_id);
     205         [ +  + ]:       3441 :         for (i = 0; i < cert->nprincipals; i++)
     206                 :       1896 :                 free(cert->principals[i]);
     207                 :       1545 :         free(cert->principals);
     208         [ +  + ]:       1545 :         if (cert->signature_key != NULL)
     209                 :       1387 :                 key_free(cert->signature_key);
     210                 :       1545 :         free(cert);
     211                 :       1545 : }
     212                 :            : 
     213                 :            : void
     214                 :      49080 : key_free(Key *k)
     215                 :            : {
     216         [ -  + ]:      49080 :         if (k == NULL)
     217                 :          0 :                 fatal("key_free: key is NULL");
     218   [ +  +  +  +  :      49080 :         switch (k->type) {
                   -  + ]
     219                 :            :         case KEY_RSA1:
     220                 :            :         case KEY_RSA:
     221                 :            :         case KEY_RSA_CERT_V00:
     222                 :            :         case KEY_RSA_CERT:
     223         [ +  + ]:      38991 :                 if (k->rsa != NULL)
     224                 :      30730 :                         RSA_free(k->rsa);
     225                 :      38991 :                 k->rsa = NULL;
     226                 :      38991 :                 break;
     227                 :            :         case KEY_DSA:
     228                 :            :         case KEY_DSA_CERT_V00:
     229                 :            :         case KEY_DSA_CERT:
     230         [ +  + ]:        820 :                 if (k->dsa != NULL)
     231                 :        561 :                         DSA_free(k->dsa);
     232                 :        820 :                 k->dsa = NULL;
     233                 :        820 :                 break;
     234                 :            : #ifdef OPENSSL_HAS_ECC
     235                 :            :         case KEY_ECDSA:
     236                 :            :         case KEY_ECDSA_CERT:
     237         [ +  + ]:       2226 :                 if (k->ecdsa != NULL)
     238                 :       1666 :                         EC_KEY_free(k->ecdsa);
     239                 :       2226 :                 k->ecdsa = NULL;
     240                 :       2226 :                 break;
     241                 :            : #endif
     242                 :            :         case KEY_ED25519:
     243                 :            :         case KEY_ED25519_CERT:
     244         [ +  + ]:        360 :                 if (k->ed25519_pk) {
     245                 :        266 :                         explicit_bzero(k->ed25519_pk, ED25519_PK_SZ);
     246                 :        266 :                         free(k->ed25519_pk);
     247                 :        266 :                         k->ed25519_pk = NULL;
     248                 :            :                 }
     249         [ +  + ]:        360 :                 if (k->ed25519_sk) {
     250                 :         30 :                         explicit_bzero(k->ed25519_sk, ED25519_SK_SZ);
     251                 :         30 :                         free(k->ed25519_sk);
     252                 :         30 :                         k->ed25519_sk = NULL;
     253                 :            :                 }
     254                 :            :                 break;
     255                 :            :         case KEY_UNSPEC:
     256                 :            :                 break;
     257                 :            :         default:
     258                 :          0 :                 fatal("key_free: bad key type %d", k->type);
     259                 :            :                 break;
     260                 :            :         }
     261         [ +  + ]:      49080 :         if (key_is_cert(k)) {
     262         [ +  + ]:       1681 :                 if (k->cert != NULL)
     263                 :       1229 :                         cert_free(k->cert);
     264                 :       1681 :                 k->cert = NULL;
     265                 :            :         }
     266                 :            : 
     267                 :      49080 :         free(k);
     268                 :      49080 : }
     269                 :            : 
     270                 :            : static int
     271                 :        146 : cert_compare(struct KeyCert *a, struct KeyCert *b)
     272                 :            : {
     273         [ +  - ]:        146 :         if (a == NULL && b == NULL)
     274                 :            :                 return 1;
     275         [ +  - ]:        146 :         if (a == NULL || b == NULL)
     276                 :            :                 return 0;
     277         [ +  - ]:        146 :         if (buffer_len(&a->certblob) != buffer_len(&b->certblob))
     278                 :            :                 return 0;
     279         [ +  - ]:        146 :         if (timingsafe_bcmp(buffer_ptr(&a->certblob), buffer_ptr(&b->certblob),
     280                 :        146 :             buffer_len(&a->certblob)) != 0)
     281                 :            :                 return 0;
     282                 :        146 :         return 1;
     283                 :            : }
     284                 :            : 
     285                 :            : /*
     286                 :            :  * Compare public portions of key only, allowing comparisons between
     287                 :            :  * certificates and plain keys too.
     288                 :            :  */
     289                 :            : int
     290                 :      29373 : key_equal_public(const Key *a, const Key *b)
     291                 :            : {
     292                 :            : #ifdef OPENSSL_HAS_ECC
     293                 :            :         BN_CTX *bnctx;
     294                 :            : #endif
     295                 :            : 
     296 [ +  - ][ +  + ]:      58746 :         if (a == NULL || b == NULL ||
     297                 :      58746 :             key_type_plain(a->type) != key_type_plain(b->type))
     298                 :            :                 return 0;
     299                 :            : 
     300   [ +  +  +  +  :      29291 :         switch (a->type) {
                      - ]
     301                 :            :         case KEY_RSA1:
     302                 :            :         case KEY_RSA_CERT_V00:
     303                 :            :         case KEY_RSA_CERT:
     304                 :            :         case KEY_RSA:
     305   [ +  -  +  - ]:       9789 :                 return a->rsa != NULL && b->rsa != NULL &&
     306 [ +  - ][ +  + ]:       9789 :                     BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
     307                 :       3263 :                     BN_cmp(a->rsa->n, b->rsa->n) == 0;
     308                 :            :         case KEY_DSA_CERT_V00:
     309                 :            :         case KEY_DSA_CERT:
     310                 :            :         case KEY_DSA:
     311   [ +  -  +  - ]:        174 :                 return a->dsa != NULL && b->dsa != NULL &&
     312         [ +  - ]:        116 :                     BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
     313         [ +  - ]:        116 :                     BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
     314 [ +  - ][ -  + ]:        174 :                     BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
     315                 :         58 :                     BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
     316                 :            : #ifdef OPENSSL_HAS_ECC
     317                 :            :         case KEY_ECDSA_CERT:
     318                 :            :         case KEY_ECDSA:
     319         [ +  - ]:      51852 :                 if (a->ecdsa == NULL || b->ecdsa == NULL ||
           [ +  -  +  - ]
     320         [ +  - ]:      51852 :                     EC_KEY_get0_public_key(a->ecdsa) == NULL ||
     321                 :      25926 :                     EC_KEY_get0_public_key(b->ecdsa) == NULL)
     322                 :            :                         return 0;
     323         [ -  + ]:      25926 :                 if ((bnctx = BN_CTX_new()) == NULL)
     324                 :          0 :                         fatal("%s: BN_CTX_new failed", __func__);
     325         [ +  - ]:      25926 :                 if (EC_GROUP_cmp(EC_KEY_get0_group(a->ecdsa),
     326         [ -  + ]:      25926 :                     EC_KEY_get0_group(b->ecdsa), bnctx) != 0 ||
     327                 :      25926 :                     EC_POINT_cmp(EC_KEY_get0_group(a->ecdsa),
     328                 :      25926 :                     EC_KEY_get0_public_key(a->ecdsa),
     329                 :      25926 :                     EC_KEY_get0_public_key(b->ecdsa), bnctx) != 0) {
     330                 :          0 :                         BN_CTX_free(bnctx);
     331                 :          0 :                         return 0;
     332                 :            :                 }
     333                 :      25926 :                 BN_CTX_free(bnctx);
     334                 :      25926 :                 return 1;
     335                 :            : #endif /* OPENSSL_HAS_ECC */
     336                 :            :         case KEY_ED25519:
     337                 :            :         case KEY_ED25519_CERT:
     338 [ +  - ][ +  - ]:         44 :                 return a->ed25519_pk != NULL && b->ed25519_pk != NULL &&
                 [ -  + ]
     339                 :         44 :                     memcmp(a->ed25519_pk, b->ed25519_pk, ED25519_PK_SZ) == 0;
     340                 :            :         default:
     341                 :          0 :                 fatal("key_equal: bad key type %d", a->type);
     342                 :            :         }
     343                 :            :         /* NOTREACHED */
     344                 :            : }
     345                 :            : 
     346                 :            : int
     347                 :      29199 : key_equal(const Key *a, const Key *b)
     348                 :            : {
     349 [ +  - ][ +  + ]:      29199 :         if (a == NULL || b == NULL || a->type != b->type)
     350                 :            :                 return 0;
     351         [ +  + ]:      29191 :         if (key_is_cert(a)) {
     352         [ +  - ]:        146 :                 if (!cert_compare(a->cert, b->cert))
     353                 :            :                         return 0;
     354                 :            :         }
     355                 :      29191 :         return key_equal_public(a, b);
     356                 :            : }
     357                 :            : 
     358                 :            : u_char*
     359                 :       7105 : key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
     360                 :            :     u_int *dgst_raw_length)
     361                 :            : {
     362                 :       7105 :         u_char *blob = NULL;
     363                 :       7105 :         u_char *retval = NULL;
     364                 :       7105 :         u_int len = 0;
     365                 :       7105 :         int nlen, elen, hash_alg = -1;
     366                 :            : 
     367                 :       7105 :         *dgst_raw_length = 0;
     368                 :            : 
     369                 :            :         /* XXX switch to DIGEST_* directly? */
     370   [ +  -  -  + ]:       7105 :         switch (dgst_type) {
     371                 :            :         case SSH_FP_MD5:
     372                 :            :                 hash_alg = SSH_DIGEST_MD5;
     373                 :            :                 break;
     374                 :            :         case SSH_FP_SHA1:
     375                 :        682 :                 hash_alg = SSH_DIGEST_SHA1;
     376                 :        682 :                 break;
     377                 :            :         case SSH_FP_SHA256:
     378                 :          0 :                 hash_alg = SSH_DIGEST_SHA256;
     379                 :          0 :                 break;
     380                 :            :         default:
     381                 :          0 :                 fatal("%s: bad digest type %d", __func__, dgst_type);
     382                 :            :         }
     383   [ +  +  +  -  :       7105 :         switch (k->type) {
                      - ]
     384                 :            :         case KEY_RSA1:
     385                 :        273 :                 nlen = BN_num_bytes(k->rsa->n);
     386                 :        273 :                 elen = BN_num_bytes(k->rsa->e);
     387                 :        273 :                 len = nlen + elen;
     388                 :        273 :                 blob = xmalloc(len);
     389                 :        273 :                 BN_bn2bin(k->rsa->n, blob);
     390                 :        273 :                 BN_bn2bin(k->rsa->e, blob + nlen);
     391                 :        273 :                 break;
     392                 :            :         case KEY_DSA:
     393                 :            :         case KEY_ECDSA:
     394                 :            :         case KEY_RSA:
     395                 :            :         case KEY_ED25519:
     396                 :            :                 key_to_blob(k, &blob, &len);
     397                 :            :                 break;
     398                 :            :         case KEY_DSA_CERT_V00:
     399                 :            :         case KEY_RSA_CERT_V00:
     400                 :            :         case KEY_DSA_CERT:
     401                 :            :         case KEY_ECDSA_CERT:
     402                 :            :         case KEY_RSA_CERT:
     403                 :            :         case KEY_ED25519_CERT:
     404                 :            :                 /* We want a fingerprint of the _key_ not of the cert */
     405                 :        506 :                 to_blob(k, &blob, &len, 1);
     406                 :        506 :                 break;
     407                 :            :         case KEY_UNSPEC:
     408                 :            :                 return retval;
     409                 :            :         default:
     410                 :          0 :                 fatal("%s: bad key type %d", __func__, k->type);
     411                 :            :                 break;
     412                 :            :         }
     413         [ +  - ]:       7105 :         if (blob != NULL) {
     414                 :       7105 :                 retval = xmalloc(SSH_DIGEST_MAX_LENGTH);
     415         [ -  + ]:       7105 :                 if ((ssh_digest_memory(hash_alg, blob, len,
     416                 :            :                     retval, SSH_DIGEST_MAX_LENGTH)) != 0)
     417                 :          0 :                         fatal("%s: digest_memory failed", __func__);
     418                 :       7105 :                 explicit_bzero(blob, len);
     419                 :       7105 :                 free(blob);
     420                 :       7105 :                 *dgst_raw_length = ssh_digest_bytes(hash_alg);
     421                 :            :         } else {
     422                 :          0 :                 fatal("%s: blob is null", __func__);
     423                 :            :         }
     424                 :       7105 :         return retval;
     425                 :            : }
     426                 :            : 
     427                 :            : static char *
     428                 :       6403 : key_fingerprint_hex(u_char *dgst_raw, u_int dgst_raw_len)
     429                 :            : {
     430                 :            :         char *retval;
     431                 :            :         u_int i;
     432                 :            : 
     433                 :       6403 :         retval = xcalloc(1, dgst_raw_len * 3 + 1);
     434         [ +  + ]:     108851 :         for (i = 0; i < dgst_raw_len; i++) {
     435                 :            :                 char hex[4];
     436                 :     102448 :                 snprintf(hex, sizeof(hex), "%02x:", dgst_raw[i]);
     437                 :     102448 :                 strlcat(retval, hex, dgst_raw_len * 3 + 1);
     438                 :            :         }
     439                 :            : 
     440                 :            :         /* Remove the trailing ':' character */
     441                 :       6403 :         retval[(dgst_raw_len * 3) - 1] = '\0';
     442                 :       6403 :         return retval;
     443                 :            : }
     444                 :            : 
     445                 :            : static char *
     446                 :          5 : key_fingerprint_bubblebabble(u_char *dgst_raw, u_int dgst_raw_len)
     447                 :            : {
     448                 :          5 :         char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' };
     449                 :          5 :         char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
     450                 :            :             'n', 'p', 'r', 's', 't', 'v', 'z', 'x' };
     451                 :          5 :         u_int i, j = 0, rounds, seed = 1;
     452                 :            :         char *retval;
     453                 :            : 
     454                 :          5 :         rounds = (dgst_raw_len / 2) + 1;
     455                 :          5 :         retval = xcalloc((rounds * 6), sizeof(char));
     456                 :          5 :         retval[j++] = 'x';
     457         [ +  + ]:         60 :         for (i = 0; i < rounds; i++) {
     458                 :            :                 u_int idx0, idx1, idx2, idx3, idx4;
     459 [ +  + ][ -  + ]:         55 :                 if ((i + 1 < rounds) || (dgst_raw_len % 2 != 0)) {
     460                 :         50 :                         idx0 = (((((u_int)(dgst_raw[2 * i])) >> 6) & 3) +
     461                 :            :                             seed) % 6;
     462                 :         50 :                         idx1 = (((u_int)(dgst_raw[2 * i])) >> 2) & 15;
     463                 :        100 :                         idx2 = ((((u_int)(dgst_raw[2 * i])) & 3) +
     464                 :         50 :                             (seed / 6)) % 6;
     465                 :         50 :                         retval[j++] = vowels[idx0];
     466                 :         50 :                         retval[j++] = consonants[idx1];
     467                 :         50 :                         retval[j++] = vowels[idx2];
     468         [ +  - ]:         50 :                         if ((i + 1) < rounds) {
     469                 :         50 :                                 idx3 = (((u_int)(dgst_raw[(2 * i) + 1])) >> 4) & 15;
     470                 :         50 :                                 idx4 = (((u_int)(dgst_raw[(2 * i) + 1]))) & 15;
     471                 :         50 :                                 retval[j++] = consonants[idx3];
     472                 :         50 :                                 retval[j++] = '-';
     473                 :         50 :                                 retval[j++] = consonants[idx4];
     474                 :         50 :                                 seed = ((seed * 5) +
     475                 :         50 :                                     ((((u_int)(dgst_raw[2 * i])) * 7) +
     476                 :         50 :                                     ((u_int)(dgst_raw[(2 * i) + 1])))) % 36;
     477                 :            :                         }
     478                 :            :                 } else {
     479                 :          5 :                         idx0 = seed % 6;
     480                 :          5 :                         idx1 = 16;
     481                 :          5 :                         idx2 = seed / 6;
     482                 :          5 :                         retval[j++] = vowels[idx0];
     483                 :          5 :                         retval[j++] = consonants[idx1];
     484                 :          5 :                         retval[j++] = vowels[idx2];
     485                 :            :                 }
     486                 :            :         }
     487                 :          5 :         retval[j++] = 'x';
     488                 :          5 :         retval[j++] = '\0';
     489                 :          5 :         return retval;
     490                 :            : }
     491                 :            : 
     492                 :            : /*
     493                 :            :  * Draw an ASCII-Art representing the fingerprint so human brain can
     494                 :            :  * profit from its built-in pattern recognition ability.
     495                 :            :  * This technique is called "random art" and can be found in some
     496                 :            :  * scientific publications like this original paper:
     497                 :            :  *
     498                 :            :  * "Hash Visualization: a New Technique to improve Real-World Security",
     499                 :            :  * Perrig A. and Song D., 1999, International Workshop on Cryptographic
     500                 :            :  * Techniques and E-Commerce (CrypTEC '99)
     501                 :            :  * sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
     502                 :            :  *
     503                 :            :  * The subject came up in a talk by Dan Kaminsky, too.
     504                 :            :  *
     505                 :            :  * If you see the picture is different, the key is different.
     506                 :            :  * If the picture looks the same, you still know nothing.
     507                 :            :  *
     508                 :            :  * The algorithm used here is a worm crawling over a discrete plane,
     509                 :            :  * leaving a trace (augmenting the field) everywhere it goes.
     510                 :            :  * Movement is taken from dgst_raw 2bit-wise.  Bumping into walls
     511                 :            :  * makes the respective movement vector be ignored for this turn.
     512                 :            :  * Graphs are not unambiguous, because circles in graphs can be
     513                 :            :  * walked in either direction.
     514                 :            :  */
     515                 :            : 
     516                 :            : /*
     517                 :            :  * Field sizes for the random art.  Have to be odd, so the starting point
     518                 :            :  * can be in the exact middle of the picture, and FLDBASE should be >=8 .
     519                 :            :  * Else pictures would be too dense, and drawing the frame would
     520                 :            :  * fail, too, because the key type would not fit in anymore.
     521                 :            :  */
     522                 :            : #define FLDBASE         8
     523                 :            : #define FLDSIZE_Y       (FLDBASE + 1)
     524                 :            : #define FLDSIZE_X       (FLDBASE * 2 + 1)
     525                 :            : static char *
     526                 :         20 : key_fingerprint_randomart(u_char *dgst_raw, u_int dgst_raw_len, const Key *k)
     527                 :            : {
     528                 :            :         /*
     529                 :            :          * Chars to be used after each other every time the worm
     530                 :            :          * intersects with itself.  Matter of taste.
     531                 :            :          */
     532                 :         20 :         char    *augmentation_string = " .o+=*BOX@%&#/^SE";
     533                 :            :         char    *retval, *p;
     534                 :            :         u_char   field[FLDSIZE_X][FLDSIZE_Y];
     535                 :            :         u_int    i, b;
     536                 :            :         int      x, y;
     537                 :         20 :         size_t   len = strlen(augmentation_string) - 1;
     538                 :            : 
     539                 :         20 :         retval = xcalloc(1, (FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
     540                 :            : 
     541                 :            :         /* initialize field */
     542                 :            :         memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
     543                 :         20 :         x = FLDSIZE_X / 2;
     544                 :         20 :         y = FLDSIZE_Y / 2;
     545                 :            : 
     546                 :            :         /* process raw key */
     547         [ +  + ]:        340 :         for (i = 0; i < dgst_raw_len; i++) {
     548                 :            :                 int input;
     549                 :            :                 /* each byte conveys four 2-bit move commands */
     550                 :        320 :                 input = dgst_raw[i];
     551         [ +  + ]:       1600 :                 for (b = 0; b < 4; b++) {
     552                 :            :                         /* evaluate 2 bit, rest is shifted later */
     553         [ +  + ]:       1280 :                         x += (input & 0x1) ? 1 : -1;
     554         [ +  + ]:       1280 :                         y += (input & 0x2) ? 1 : -1;
     555                 :            : 
     556                 :            :                         /* assure we are still in bounds */
     557                 :       1280 :                         x = MAX(x, 0);
     558                 :       1280 :                         y = MAX(y, 0);
     559                 :       1280 :                         x = MIN(x, FLDSIZE_X - 1);
     560                 :       1280 :                         y = MIN(y, FLDSIZE_Y - 1);
     561                 :            : 
     562                 :            :                         /* augment the field */
     563         [ +  - ]:       1280 :                         if (field[x][y] < len - 2)
     564                 :       1280 :                                 field[x][y]++;
     565                 :       1280 :                         input = input >> 2;
     566                 :            :                 }
     567                 :            :         }
     568                 :            : 
     569                 :            :         /* mark starting point and end point*/
     570                 :         20 :         field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len - 1;
     571                 :         20 :         field[x][y] = len;
     572                 :            : 
     573                 :            :         /* fill in retval */
     574                 :         40 :         snprintf(retval, FLDSIZE_X, "+--[%4s %4u]", key_type(k), key_size(k));
     575                 :         20 :         p = strchr(retval, '\0');
     576                 :            : 
     577                 :            :         /* output upper border */
     578         [ +  + ]:         88 :         for (i = p - retval - 1; i < FLDSIZE_X; i++)
     579                 :         68 :                 *p++ = '-';
     580                 :         20 :         *p++ = '+';
     581                 :         20 :         *p++ = '\n';
     582                 :            : 
     583                 :            :         /* output content */
     584         [ +  + ]:        200 :         for (y = 0; y < FLDSIZE_Y; y++) {
     585                 :        180 :                 *p++ = '|';
     586         [ +  + ]:       3240 :                 for (x = 0; x < FLDSIZE_X; x++)
     587                 :       3060 :                         *p++ = augmentation_string[MIN(field[x][y], len)];
     588                 :        180 :                 *p++ = '|';
     589                 :        180 :                 *p++ = '\n';
     590                 :            :         }
     591                 :            : 
     592                 :            :         /* output lower border */
     593                 :         20 :         *p++ = '+';
     594         [ +  + ]:        360 :         for (i = 0; i < FLDSIZE_X; i++)
     595                 :        340 :                 *p++ = '-';
     596                 :         20 :         *p++ = '+';
     597                 :            : 
     598                 :         20 :         return retval;
     599                 :            : }
     600                 :            : 
     601                 :            : char *
     602                 :       6428 : key_fingerprint(const Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
     603                 :            : {
     604                 :       6428 :         char *retval = NULL;
     605                 :            :         u_char *dgst_raw;
     606                 :            :         u_int dgst_raw_len;
     607                 :            : 
     608                 :       6428 :         dgst_raw = key_fingerprint_raw(k, dgst_type, &dgst_raw_len);
     609         [ -  + ]:       6428 :         if (!dgst_raw)
     610                 :          0 :                 fatal("key_fingerprint: null from key_fingerprint_raw()");
     611   [ +  +  +  - ]:       6428 :         switch (dgst_rep) {
     612                 :            :         case SSH_FP_HEX:
     613                 :       6403 :                 retval = key_fingerprint_hex(dgst_raw, dgst_raw_len);
     614                 :       6403 :                 break;
     615                 :            :         case SSH_FP_BUBBLEBABBLE:
     616                 :          5 :                 retval = key_fingerprint_bubblebabble(dgst_raw, dgst_raw_len);
     617                 :          5 :                 break;
     618                 :            :         case SSH_FP_RANDOMART:
     619                 :         20 :                 retval = key_fingerprint_randomart(dgst_raw, dgst_raw_len, k);
     620                 :         20 :                 break;
     621                 :            :         default:
     622                 :          0 :                 fatal("key_fingerprint: bad digest representation %d",
     623                 :            :                     dgst_rep);
     624                 :            :                 break;
     625                 :            :         }
     626                 :       6428 :         explicit_bzero(dgst_raw, dgst_raw_len);
     627                 :       6428 :         free(dgst_raw);
     628                 :       6428 :         return retval;
     629                 :            : }
     630                 :            : 
     631                 :            : /*
     632                 :            :  * Reads a multiple-precision integer in decimal from the buffer, and advances
     633                 :            :  * the pointer.  The integer must already be initialized.  This function is
     634                 :            :  * permitted to modify the buffer.  This leaves *cpp to point just beyond the
     635                 :            :  * last processed (and maybe modified) character.  Note that this may modify
     636                 :            :  * the buffer containing the number.
     637                 :            :  */
     638                 :            : static int
     639                 :       7396 : read_bignum(char **cpp, BIGNUM * value)
     640                 :            : {
     641                 :       7396 :         char *cp = *cpp;
     642                 :            :         int old;
     643                 :            : 
     644                 :            :         /* Skip any leading whitespace. */
     645         [ +  + ]:      14792 :         for (; *cp == ' ' || *cp == '\t'; cp++)
     646                 :            :                 ;
     647                 :            : 
     648                 :            :         /* Check that it begins with a decimal digit. */
     649         [ +  - ]:       7396 :         if (*cp < '0' || *cp > '9')
     650                 :            :                 return 0;
     651                 :            : 
     652                 :            :         /* Save starting position. */
     653                 :       7396 :         *cpp = cp;
     654                 :            : 
     655                 :            :         /* Move forward until all decimal digits skipped. */
     656         [ +  + ]:    2307552 :         for (; *cp >= '0' && *cp <= '9'; cp++)
     657                 :            :                 ;
     658                 :            : 
     659                 :            :         /* Save the old terminating character, and replace it by \0. */
     660                 :       7396 :         old = *cp;
     661                 :       7396 :         *cp = 0;
     662                 :            : 
     663                 :            :         /* Parse the number. */
     664         [ +  - ]:       7396 :         if (BN_dec2bn(&value, *cpp) == 0)
     665                 :            :                 return 0;
     666                 :            : 
     667                 :            :         /* Restore old terminating character. */
     668                 :       7396 :         *cp = old;
     669                 :            : 
     670                 :            :         /* Move beyond the number and return success. */
     671                 :       7396 :         *cpp = cp;
     672                 :       7396 :         return 1;
     673                 :            : }
     674                 :            : 
     675                 :            : static int
     676                 :         14 : write_bignum(FILE *f, BIGNUM *num)
     677                 :            : {
     678                 :         14 :         char *buf = BN_bn2dec(num);
     679         [ -  + ]:         14 :         if (buf == NULL) {
     680                 :          0 :                 error("write_bignum: BN_bn2dec() failed");
     681                 :          0 :                 return 0;
     682                 :            :         }
     683                 :            :         fprintf(f, " %s", buf);
     684                 :         14 :         OPENSSL_free(buf);
     685                 :         14 :         return 1;
     686                 :            : }
     687                 :            : 
     688                 :            : /* returns 1 ok, -1 error */
     689                 :            : int
     690                 :      17152 : key_read(Key *ret, char **cpp)
     691                 :            : {
     692                 :            :         Key *k;
     693                 :      17152 :         int success = -1;
     694                 :            :         char *cp, *space;
     695                 :            :         int len, n, type;
     696                 :            :         u_int bits;
     697                 :            :         u_char *blob;
     698                 :            : #ifdef OPENSSL_HAS_ECC
     699                 :      17152 :         int curve_nid = -1;
     700                 :            : #endif
     701                 :            : 
     702                 :      17152 :         cp = *cpp;
     703                 :            : 
     704      [ +  +  - ]:      17152 :         switch (ret->type) {
     705                 :            :         case KEY_RSA1:
     706                 :            :                 /* Get number of bits. */
     707         [ +  + ]:       4124 :                 if (*cp < '0' || *cp > '9')
     708                 :            :                         return -1;      /* Bad bit count... */
     709         [ +  + ]:      18490 :                 for (bits = 0; *cp >= '0' && *cp <= '9'; cp++)
     710                 :      14792 :                         bits = 10 * bits + *cp - '0';
     711         [ +  - ]:       3698 :                 if (bits == 0)
     712                 :            :                         return -1;
     713                 :       3698 :                 *cpp = cp;
     714                 :            :                 /* Get public exponent, public modulus. */
     715         [ +  - ]:       3698 :                 if (!read_bignum(cpp, ret->rsa->e))
     716                 :            :                         return -1;
     717         [ +  - ]:       3698 :                 if (!read_bignum(cpp, ret->rsa->n))
     718                 :            :                         return -1;
     719                 :            :                 /* validate the claimed number of bits */
     720         [ -  + ]:       3698 :                 if ((u_int)BN_num_bits(ret->rsa->n) != bits) {
     721                 :          0 :                         verbose("key_read: claimed key size %d does not match "
     722                 :          0 :                            "actual %d", bits, BN_num_bits(ret->rsa->n));
     723                 :          0 :                         return -1;
     724                 :            :                 }
     725                 :            :                 success = 1;
     726                 :            :                 break;
     727                 :            :         case KEY_UNSPEC:
     728                 :            :         case KEY_RSA:
     729                 :            :         case KEY_DSA:
     730                 :            :         case KEY_ECDSA:
     731                 :            :         case KEY_ED25519:
     732                 :            :         case KEY_DSA_CERT_V00:
     733                 :            :         case KEY_RSA_CERT_V00:
     734                 :            :         case KEY_DSA_CERT:
     735                 :            :         case KEY_ECDSA_CERT:
     736                 :            :         case KEY_RSA_CERT:
     737                 :            :         case KEY_ED25519_CERT:
     738                 :      13028 :                 space = strchr(cp, ' ');
     739         [ -  + ]:      13028 :                 if (space == NULL) {
     740                 :          0 :                         debug3("key_read: missing whitespace");
     741                 :          0 :                         return -1;
     742                 :            :                 }
     743                 :      13028 :                 *space = '\0';
     744                 :      13028 :                 type = key_type_from_name(cp);
     745                 :            : #ifdef OPENSSL_HAS_ECC
     746 [ +  + ][ -  + ]:      13028 :                 if (key_type_plain(type) == KEY_ECDSA &&
     747                 :            :                     (curve_nid = key_ecdsa_nid_from_name(cp)) == -1) {
     748                 :          0 :                         debug("key_read: invalid curve");
     749                 :          0 :                         return -1;
     750                 :            :                 }
     751                 :            : #endif
     752                 :      13028 :                 *space = ' ';
     753         [ +  + ]:      13028 :                 if (type == KEY_UNSPEC) {
     754                 :       3856 :                         debug3("key_read: missing keytype");
     755                 :       3856 :                         return -1;
     756                 :            :                 }
     757                 :       9172 :                 cp = space+1;
     758         [ -  + ]:       9172 :                 if (*cp == '\0') {
     759                 :          0 :                         debug3("key_read: short string");
     760                 :          0 :                         return -1;
     761                 :            :                 }
     762         [ +  + ]:       9172 :                 if (ret->type == KEY_UNSPEC) {
     763                 :       7940 :                         ret->type = type;
     764         [ +  + ]:       1232 :                 } else if (ret->type != type) {
     765                 :            :                         /* is a key, but different type */
     766                 :         36 :                         debug3("key_read: type mismatch");
     767                 :         36 :                         return -1;
     768                 :            :                 }
     769                 :       9136 :                 len = 2*strlen(cp);
     770                 :       9136 :                 blob = xmalloc(len);
     771                 :       9136 :                 n = uudecode(cp, blob, len);
     772         [ -  + ]:       9136 :                 if (n < 0) {
     773                 :          0 :                         error("key_read: uudecode %s failed", cp);
     774                 :          0 :                         free(blob);
     775                 :          0 :                         return -1;
     776                 :            :                 }
     777                 :      18272 :                 k = key_from_blob(blob, (u_int)n);
     778                 :       9136 :                 free(blob);
     779         [ +  + ]:       9136 :                 if (k == NULL) {
     780                 :          2 :                         error("key_read: key_from_blob %s failed", cp);
     781                 :          2 :                         return -1;
     782                 :            :                 }
     783         [ -  + ]:       9134 :                 if (k->type != type) {
     784                 :          0 :                         error("key_read: type mismatch: encoding error");
     785                 :          0 :                         key_free(k);
     786                 :          0 :                         return -1;
     787                 :            :                 }
     788                 :            : #ifdef OPENSSL_HAS_ECC
     789 [ +  + ][ -  + ]:       9134 :                 if (key_type_plain(type) == KEY_ECDSA &&
     790                 :        530 :                     curve_nid != k->ecdsa_nid) {
     791                 :          0 :                         error("key_read: type mismatch: EC curve mismatch");
     792                 :          0 :                         key_free(k);
     793                 :          0 :                         return -1;
     794                 :            :                 }
     795                 :            : #endif
     796                 :            : /*XXXX*/
     797         [ +  + ]:       9134 :                 if (key_is_cert(ret)) {
     798         [ -  + ]:        452 :                         if (!key_is_cert(k)) {
     799                 :          0 :                                 error("key_read: loaded key is not a cert");
     800                 :          0 :                                 key_free(k);
     801                 :          0 :                                 return -1;
     802                 :            :                         }
     803         [ -  + ]:        452 :                         if (ret->cert != NULL)
     804                 :          0 :                                 cert_free(ret->cert);
     805                 :        452 :                         ret->cert = k->cert;
     806                 :        452 :                         k->cert = NULL;
     807                 :            :                 }
     808         [ +  + ]:       9134 :                 if (key_type_plain(ret->type) == KEY_RSA) {
     809         [ +  + ]:       8261 :                         if (ret->rsa != NULL)
     810                 :       1156 :                                 RSA_free(ret->rsa);
     811                 :       8261 :                         ret->rsa = k->rsa;
     812                 :       8261 :                         k->rsa = NULL;
     813                 :            : #ifdef DEBUG_PK
     814                 :            :                         RSA_print_fp(stderr, ret->rsa, 8);
     815                 :            : #endif
     816                 :            :                 }
     817         [ +  + ]:       9134 :                 if (key_type_plain(ret->type) == KEY_DSA) {
     818         [ +  + ]:        259 :                         if (ret->dsa != NULL)
     819                 :          6 :                                 DSA_free(ret->dsa);
     820                 :        259 :                         ret->dsa = k->dsa;
     821                 :        259 :                         k->dsa = NULL;
     822                 :            : #ifdef DEBUG_PK
     823                 :            :                         DSA_print_fp(stderr, ret->dsa, 8);
     824                 :            : #endif
     825                 :            :                 }
     826                 :            : #ifdef OPENSSL_HAS_ECC
     827         [ +  + ]:       9134 :                 if (key_type_plain(ret->type) == KEY_ECDSA) {
     828         [ -  + ]:        530 :                         if (ret->ecdsa != NULL)
     829                 :          0 :                                 EC_KEY_free(ret->ecdsa);
     830                 :        530 :                         ret->ecdsa = k->ecdsa;
     831                 :        530 :                         ret->ecdsa_nid = k->ecdsa_nid;
     832                 :        530 :                         k->ecdsa = NULL;
     833                 :        530 :                         k->ecdsa_nid = -1;
     834                 :            : #ifdef DEBUG_PK
     835                 :            :                         key_dump_ec_key(ret->ecdsa);
     836                 :            : #endif
     837                 :            :                 }
     838                 :            : #endif
     839         [ +  + ]:       9134 :                 if (key_type_plain(ret->type) == KEY_ED25519) {
     840                 :         84 :                         free(ret->ed25519_pk);
     841                 :         84 :                         ret->ed25519_pk = k->ed25519_pk;
     842                 :         84 :                         k->ed25519_pk = NULL;
     843                 :            : #ifdef DEBUG_PK
     844                 :            :                         /* XXX */
     845                 :            : #endif
     846                 :            :                 }
     847                 :       9134 :                 success = 1;
     848                 :            : /*XXXX*/
     849                 :       9134 :                 key_free(k);
     850                 :            :                 if (success != 1)
     851                 :            :                         break;
     852                 :            :                 /* advance cp: skip whitespace and data */
     853         [ -  + ]:       9134 :                 while (*cp == ' ' || *cp == '\t')
     854                 :          0 :                         cp++;
     855 [ +  + ][ +  - ]:    3688885 :                 while (*cp != '\0' && *cp != ' ' && *cp != '\t')
     856                 :    3679751 :                         cp++;
     857                 :       9134 :                 *cpp = cp;
     858                 :       9134 :                 break;
     859                 :            :         default:
     860                 :          0 :                 fatal("key_read: bad key type: %d", ret->type);
     861                 :            :                 break;
     862                 :            :         }
     863                 :            :         return success;
     864                 :            : }
     865                 :            : 
     866                 :            : int
     867                 :        167 : key_write(const Key *key, FILE *f)
     868                 :            : {
     869                 :        167 :         int n, success = 0;
     870                 :        167 :         u_int len, bits = 0;
     871                 :            :         u_char *blob;
     872                 :            :         char *uu;
     873                 :            : 
     874         [ +  + ]:        167 :         if (key_is_cert(key)) {
     875         [ -  + ]:         99 :                 if (key->cert == NULL) {
     876                 :          0 :                         error("%s: no cert data", __func__);
     877                 :          0 :                         return 0;
     878                 :            :                 }
     879         [ -  + ]:         99 :                 if (buffer_len(&key->cert->certblob) == 0) {
     880                 :          0 :                         error("%s: no signed certificate blob", __func__);
     881                 :          0 :                         return 0;
     882                 :            :                 }
     883                 :            :         }
     884                 :            : 
     885   [ +  +  +  +  :        167 :         switch (key->type) {
                   +  - ]
     886                 :            :         case KEY_RSA1:
     887         [ +  - ]:          7 :                 if (key->rsa == NULL)
     888                 :            :                         return 0;
     889                 :            :                 /* size of modulus 'n' */
     890                 :          7 :                 bits = BN_num_bits(key->rsa->n);
     891                 :            :                 fprintf(f, "%u", bits);
     892   [ +  -  -  + ]:         14 :                 if (write_bignum(f, key->rsa->e) &&
     893                 :          7 :                     write_bignum(f, key->rsa->n))
     894                 :            :                         return 1;
     895                 :          0 :                 error("key_write: failed for RSA key");
     896                 :          0 :                 return 0;
     897                 :            :         case KEY_DSA:
     898                 :            :         case KEY_DSA_CERT_V00:
     899                 :            :         case KEY_DSA_CERT:
     900         [ +  - ]:         27 :                 if (key->dsa == NULL)
     901                 :            :                         return 0;
     902                 :            :                 break;
     903                 :            : #ifdef OPENSSL_HAS_ECC
     904                 :            :         case KEY_ECDSA:
     905                 :            :         case KEY_ECDSA_CERT:
     906         [ +  - ]:         30 :                 if (key->ecdsa == NULL)
     907                 :            :                         return 0;
     908                 :            :                 break;
     909                 :            : #endif
     910                 :            :         case KEY_ED25519:
     911                 :            :         case KEY_ED25519_CERT:
     912         [ +  - ]:          9 :                 if (key->ed25519_pk == NULL)
     913                 :            :                         return 0;
     914                 :            :                 break;
     915                 :            :         case KEY_RSA:
     916                 :            :         case KEY_RSA_CERT_V00:
     917                 :            :         case KEY_RSA_CERT:
     918         [ +  - ]:         94 :                 if (key->rsa == NULL)
     919                 :            :                         return 0;
     920                 :            :                 break;
     921                 :            :         default:
     922                 :            :                 return 0;
     923                 :            :         }
     924                 :            : 
     925                 :            :         key_to_blob(key, &blob, &len);
     926                 :        160 :         uu = xmalloc(2*len);
     927                 :        160 :         n = uuencode(blob, len, uu, 2*len);
     928         [ +  - ]:        160 :         if (n > 0) {
     929                 :        160 :                 fprintf(f, "%s %s", key_ssh_name(key), uu);
     930                 :        160 :                 success = 1;
     931                 :            :         }
     932                 :        160 :         free(blob);
     933                 :        160 :         free(uu);
     934                 :            : 
     935                 :        160 :         return success;
     936                 :            : }
     937                 :            : 
     938                 :            : const char *
     939                 :          9 : key_cert_type(const Key *k)
     940                 :            : {
     941      [ -  -  + ]:          9 :         switch (k->cert->type) {
     942                 :            :         case SSH2_CERT_TYPE_USER:
     943                 :            :                 return "user";
     944                 :            :         case SSH2_CERT_TYPE_HOST:
     945                 :          0 :                 return "host";
     946                 :            :         default:
     947                 :          0 :                 return "unknown";
     948                 :            :         }
     949                 :            : }
     950                 :            : 
     951                 :            : struct keytype {
     952                 :            :         char *name;
     953                 :            :         char *shortname;
     954                 :            :         int type;
     955                 :            :         int nid;
     956                 :            :         int cert;
     957                 :            : };
     958                 :            : static const struct keytype keytypes[] = {
     959                 :            :         { NULL, "RSA1", KEY_RSA1, 0, 0 },
     960                 :            :         { "ssh-rsa", "RSA", KEY_RSA, 0, 0 },
     961                 :            :         { "ssh-dss", "DSA", KEY_DSA, 0, 0 },
     962                 :            :         { "ssh-ed25519", "ED25519", KEY_ED25519, 0, 0 },
     963                 :            : #ifdef OPENSSL_HAS_ECC
     964                 :            :         { "ecdsa-sha2-nistp256", "ECDSA", KEY_ECDSA, NID_X9_62_prime256v1, 0 },
     965                 :            :         { "ecdsa-sha2-nistp384", "ECDSA", KEY_ECDSA, NID_secp384r1, 0 },
     966                 :            : # ifdef OPENSSL_HAS_NISTP521
     967                 :            :         { "ecdsa-sha2-nistp521", "ECDSA", KEY_ECDSA, NID_secp521r1, 0 },
     968                 :            : # endif
     969                 :            : #endif /* OPENSSL_HAS_ECC */
     970                 :            :         { "ssh-rsa-cert-v01@openssh.com", "RSA-CERT", KEY_RSA_CERT, 0, 1 },
     971                 :            :         { "ssh-dss-cert-v01@openssh.com", "DSA-CERT", KEY_DSA_CERT, 0, 1 },
     972                 :            : #ifdef OPENSSL_HAS_ECC
     973                 :            :         { "ecdsa-sha2-nistp256-cert-v01@openssh.com", "ECDSA-CERT",
     974                 :            :             KEY_ECDSA_CERT, NID_X9_62_prime256v1, 1 },
     975                 :            :         { "ecdsa-sha2-nistp384-cert-v01@openssh.com", "ECDSA-CERT",
     976                 :            :             KEY_ECDSA_CERT, NID_secp384r1, 1 },
     977                 :            : # ifdef OPENSSL_HAS_NISTP521
     978                 :            :         { "ecdsa-sha2-nistp521-cert-v01@openssh.com", "ECDSA-CERT",
     979                 :            :             KEY_ECDSA_CERT, NID_secp521r1, 1 },
     980                 :            : # endif
     981                 :            : #endif /* OPENSSL_HAS_ECC */
     982                 :            :         { "ssh-rsa-cert-v00@openssh.com", "RSA-CERT-V00",
     983                 :            :             KEY_RSA_CERT_V00, 0, 1 },
     984                 :            :         { "ssh-dss-cert-v00@openssh.com", "DSA-CERT-V00",
     985                 :            :             KEY_DSA_CERT_V00, 0, 1 },
     986                 :            :         { "ssh-ed25519-cert-v01@openssh.com", "ED25519-CERT",
     987                 :            :             KEY_ED25519_CERT, 0, 1 },
     988                 :            :         { NULL, NULL, -1, -1, 0 }
     989                 :            : };
     990                 :            : 
     991                 :            : const char *
     992                 :      21091 : key_type(const Key *k)
     993                 :            : {
     994                 :            :         const struct keytype *kt;
     995                 :            : 
     996 [ #  # ][ #  # ]:      45375 :         for (kt = keytypes; kt->type != -1; kt++) {
         [ #  # ][ #  # ]
         [ #  # ][ +  - ]
                 [ +  - ]
     997 [ #  # ][ #  # ]:      45375 :                 if (kt->type == k->type)
         [ #  # ][ #  # ]
         [ #  # ][ +  + ]
                 [ +  + ]
     998                 :      21111 :                         return kt->shortname;
     999                 :            :         }
    1000                 :            :         return "unknown";
    1001                 :            : }
    1002                 :            : 
    1003                 :            : static const char *
    1004                 :            : key_ssh_name_from_type_nid(int type, int nid)
    1005                 :            : {
    1006                 :            :         const struct keytype *kt;
    1007                 :            : 
    1008 [ +  - ][ +  - ]:      38760 :         for (kt = keytypes; kt->type != -1; kt++) {
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1009 [ +  + ][ -  + ]:      38760 :                 if (kt->type == type && (kt->nid == 0 || kt->nid == nid))
         [ #  # ][ +  + ]
         [ +  + ][ +  - ]
         [ +  + ][ -  + ]
         [ #  # ][ +  + ]
         [ +  - ][ +  + ]
         [ +  + ][ -  + ]
         [ #  # ][ +  + ]
         [ -  + ][ #  # ]
         [ +  + ][ +  - ]
         [ +  + ][ +  + ]
         [ +  + ][ +  + ]
         [ +  + ][ +  + ]
                 [ +  + ]
    1010                 :      14492 :                         return kt->name;
    1011                 :            :         }
    1012                 :            :         return "ssh-unknown";
    1013                 :            : }
    1014                 :            : 
    1015                 :            : const char *
    1016                 :       2302 : key_ssh_name(const Key *k)
    1017                 :            : {
    1018                 :       4871 :         return key_ssh_name_from_type_nid(k->type, k->ecdsa_nid);
    1019                 :            : }
    1020                 :            : 
    1021                 :            : const char *
    1022                 :        408 : key_ssh_name_plain(const Key *k)
    1023                 :            : {
    1024                 :       1224 :         return key_ssh_name_from_type_nid(key_type_plain(k->type),
    1025                 :            :             k->ecdsa_nid);
    1026                 :            : }
    1027                 :            : 
    1028                 :            : int
    1029                 :      43245 : key_type_from_name(char *name)
    1030                 :            : {
    1031                 :            :         const struct keytype *kt;
    1032                 :            : 
    1033         [ +  + ]:     227018 :         for (kt = keytypes; kt->type != -1; kt++) {
    1034                 :            :                 /* Only allow shortname matches for plain key types */
    1035 [ +  + ][ +  + ]:     223119 :                 if ((kt->name != NULL && strcmp(name, kt->name) == 0) ||
                 [ +  + ]
    1036         [ +  + ]:     127866 :                     (!kt->cert && strcasecmp(kt->shortname, name) == 0))
    1037                 :            :                         return kt->type;
    1038                 :            :         }
    1039                 :       3899 :         debug2("key_type_from_name: unknown key type '%s'", name);
    1040                 :       3899 :         return KEY_UNSPEC;
    1041                 :            : }
    1042                 :            : 
    1043                 :            : int
    1044                 :       1833 : key_ecdsa_nid_from_name(const char *name)
    1045                 :            : {
    1046                 :            :         const struct keytype *kt;
    1047                 :            : 
    1048         [ +  - ]:      12500 :         for (kt = keytypes; kt->type != -1; kt++) {
    1049         [ +  + ]:      12500 :                 if (kt->type != KEY_ECDSA && kt->type != KEY_ECDSA_CERT)
    1050                 :       8576 :                         continue;
    1051 [ +  - ][ +  + ]:       3924 :                 if (kt->name != NULL && strcmp(name, kt->name) == 0)
    1052                 :       1833 :                         return kt->nid;
    1053                 :            :         }
    1054                 :          0 :         debug2("%s: unknown/non-ECDSA key type '%s'", __func__, name);
    1055                 :          0 :         return -1;
    1056                 :            : }
    1057                 :            : 
    1058                 :            : char *
    1059                 :          3 : key_alg_list(int certs_only, int plain_only)
    1060                 :            : {
    1061                 :          3 :         char *ret = NULL;
    1062                 :          3 :         size_t nlen, rlen = 0;
    1063                 :            :         const struct keytype *kt;
    1064                 :            : 
    1065         [ +  + ]:         48 :         for (kt = keytypes; kt->type != -1; kt++) {
    1066         [ +  + ]:         45 :                 if (kt->name == NULL)
    1067                 :          3 :                         continue;
    1068 [ -  + ][ #  # ]:         42 :                 if ((certs_only && !kt->cert) || (plain_only && kt->cert))
         [ +  + ][ +  + ]
    1069                 :         16 :                         continue;
    1070         [ +  + ]:         26 :                 if (ret != NULL)
    1071                 :         23 :                         ret[rlen++] = '\n';
    1072                 :         26 :                 nlen = strlen(kt->name);
    1073                 :         26 :                 ret = xrealloc(ret, 1, rlen + nlen + 2);
    1074                 :         26 :                 memcpy(ret + rlen, kt->name, nlen + 1);
    1075                 :         26 :                 rlen += nlen;
    1076                 :            :         }
    1077                 :          3 :         return ret;
    1078                 :            : }
    1079                 :            : 
    1080                 :            : int
    1081                 :          0 : key_type_is_cert(int type)
    1082                 :            : {
    1083                 :            :         const struct keytype *kt;
    1084                 :            : 
    1085 [ +  - ][ +  - ]:     816585 :         for (kt = keytypes; kt->type != -1; kt++) {
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ #  # ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
                 [ +  + ]
    1086 [ +  + ][ +  + ]:     792876 :                 if (kt->type == type)
         [ +  + ][ +  + ]
         [ +  + ][ +  + ]
         [ #  # ][ +  + ]
         [ +  + ][ +  + ]
         [ +  + ][ +  + ]
                 [ +  + ]
    1087                 :     153314 :                         return kt->cert;
    1088                 :            :         }
    1089                 :            :         return 0;
    1090                 :            : }
    1091                 :            : 
    1092                 :            : static int
    1093                 :            : key_type_is_valid_ca(int type)
    1094                 :            : {
    1095 [ -  + ][ -  + ]:       1259 :         switch (type) {
    1096                 :            :         case KEY_RSA:
    1097                 :            :         case KEY_DSA:
    1098                 :            :         case KEY_ECDSA:
    1099                 :            :         case KEY_ED25519:
    1100                 :            :                 return 1;
    1101                 :            :         default:
    1102                 :            :                 return 0;
    1103                 :            :         }
    1104                 :            : }
    1105                 :            : 
    1106                 :            : u_int
    1107                 :       7518 : key_size(const Key *k)
    1108                 :            : {
    1109   [ +  +  +  -  :       7518 :         switch (k->type) {
                      + ]
    1110                 :            :         case KEY_RSA1:
    1111                 :            :         case KEY_RSA:
    1112                 :            :         case KEY_RSA_CERT_V00:
    1113                 :            :         case KEY_RSA_CERT:
    1114                 :       7425 :                 return BN_num_bits(k->rsa->n);
    1115                 :            :         case KEY_DSA:
    1116                 :            :         case KEY_DSA_CERT_V00:
    1117                 :            :         case KEY_DSA_CERT:
    1118                 :         28 :                 return BN_num_bits(k->dsa->p);
    1119                 :            :         case KEY_ED25519:
    1120                 :            :                 return 256;     /* XXX */
    1121                 :            : #ifdef OPENSSL_HAS_ECC
    1122                 :            :         case KEY_ECDSA:
    1123                 :            :         case KEY_ECDSA_CERT:
    1124                 :         46 :                 return key_curve_nid_to_bits(k->ecdsa_nid);
    1125                 :            : #endif
    1126                 :            :         }
    1127                 :          0 :         return 0;
    1128                 :            : }
    1129                 :            : 
    1130                 :            : static RSA *
    1131                 :        119 : rsa_generate_private_key(u_int bits)
    1132                 :            : {
    1133                 :        119 :         RSA *private = RSA_new();
    1134                 :        119 :         BIGNUM *f4 = BN_new();
    1135                 :            : 
    1136         [ -  + ]:        119 :         if (private == NULL)
    1137                 :          0 :                 fatal("%s: RSA_new failed", __func__);
    1138         [ -  + ]:        119 :         if (f4 == NULL)
    1139                 :          0 :                 fatal("%s: BN_new failed", __func__);
    1140         [ -  + ]:        119 :         if (!BN_set_word(f4, RSA_F4))
    1141                 :          0 :                 fatal("%s: BN_new failed", __func__);
    1142         [ -  + ]:        119 :         if (!RSA_generate_key_ex(private, bits, f4, NULL))
    1143                 :          0 :                 fatal("%s: key generation failed.", __func__);
    1144                 :        119 :         BN_free(f4);
    1145                 :        119 :         return private;
    1146                 :            : }
    1147                 :            : 
    1148                 :            : static DSA*
    1149                 :         12 : dsa_generate_private_key(u_int bits)
    1150                 :            : {
    1151                 :         12 :         DSA *private = DSA_new();
    1152                 :            : 
    1153         [ -  + ]:         12 :         if (private == NULL)
    1154                 :          0 :                 fatal("%s: DSA_new failed", __func__);
    1155         [ -  + ]:         12 :         if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL,
    1156                 :            :             NULL, NULL))
    1157                 :          0 :                 fatal("%s: DSA_generate_parameters failed", __func__);
    1158         [ -  + ]:         12 :         if (!DSA_generate_key(private))
    1159                 :          0 :                 fatal("%s: DSA_generate_key failed.", __func__);
    1160                 :         12 :         return private;
    1161                 :            : }
    1162                 :            : 
    1163                 :            : int
    1164                 :         16 : key_ecdsa_bits_to_nid(int bits)
    1165                 :            : {
    1166   [ +  +  -  + ]:         32 :         switch (bits) {
           [ +  +  -  + ]
    1167                 :            : #ifdef OPENSSL_HAS_ECC
    1168                 :            :         case 256:
    1169                 :            :                 return NID_X9_62_prime256v1;
    1170                 :            :         case 384:
    1171                 :          1 :                 return NID_secp384r1;
    1172                 :            : # ifdef OPENSSL_HAS_NISTP521
    1173                 :            :         case 521:
    1174                 :          1 :                 return NID_secp521r1;
    1175                 :            : # endif
    1176                 :            : #endif
    1177                 :            :         default:
    1178                 :          0 :                 return -1;
    1179                 :            :         }
    1180                 :            : }
    1181                 :            : 
    1182                 :            : #ifdef OPENSSL_HAS_ECC
    1183                 :            : int
    1184                 :         90 : key_ecdsa_key_to_nid(EC_KEY *k)
    1185                 :            : {
    1186                 :            :         EC_GROUP *eg;
    1187                 :         90 :         int nids[] = {
    1188                 :            :                 NID_X9_62_prime256v1,
    1189                 :            :                 NID_secp384r1,
    1190                 :            : # ifdef OPENSSL_HAS_NISTP521
    1191                 :            :                 NID_secp521r1,
    1192                 :            : # endif
    1193                 :            :                 -1
    1194                 :            :         };
    1195                 :            :         int nid;
    1196                 :            :         u_int i;
    1197                 :            :         BN_CTX *bnctx;
    1198                 :         90 :         const EC_GROUP *g = EC_KEY_get0_group(k);
    1199                 :            : 
    1200                 :            :         /*
    1201                 :            :          * The group may be stored in a ASN.1 encoded private key in one of two
    1202                 :            :          * ways: as a "named group", which is reconstituted by ASN.1 object ID
    1203                 :            :          * or explicit group parameters encoded into the key blob. Only the
    1204                 :            :          * "named group" case sets the group NID for us, but we can figure
    1205                 :            :          * it out for the other case by comparing against all the groups that
    1206                 :            :          * are supported.
    1207                 :            :          */
    1208         [ -  + ]:         90 :         if ((nid = EC_GROUP_get_curve_name(g)) > 0)
    1209                 :            :                 return nid;
    1210         [ #  # ]:          0 :         if ((bnctx = BN_CTX_new()) == NULL)
    1211                 :          0 :                 fatal("%s: BN_CTX_new() failed", __func__);
    1212         [ #  # ]:          0 :         for (i = 0; nids[i] != -1; i++) {
    1213         [ #  # ]:          0 :                 if ((eg = EC_GROUP_new_by_curve_name(nids[i])) == NULL)
    1214                 :          0 :                         fatal("%s: EC_GROUP_new_by_curve_name failed",
    1215                 :            :                             __func__);
    1216         [ #  # ]:          0 :                 if (EC_GROUP_cmp(g, eg, bnctx) == 0)
    1217                 :            :                         break;
    1218                 :          0 :                 EC_GROUP_free(eg);
    1219                 :            :         }
    1220                 :          0 :         BN_CTX_free(bnctx);
    1221                 :          0 :         debug3("%s: nid = %d", __func__, nids[i]);
    1222         [ #  # ]:          0 :         if (nids[i] != -1) {
    1223                 :            :                 /* Use the group with the NID attached */
    1224                 :          0 :                 EC_GROUP_set_asn1_flag(eg, OPENSSL_EC_NAMED_CURVE);
    1225         [ #  # ]:          0 :                 if (EC_KEY_set_group(k, eg) != 1)
    1226                 :          0 :                         fatal("%s: EC_KEY_set_group", __func__);
    1227                 :            :         }
    1228                 :          0 :         return nids[i];
    1229                 :            : }
    1230                 :            : 
    1231                 :            : static EC_KEY*
    1232                 :         16 : ecdsa_generate_private_key(u_int bits, int *nid)
    1233                 :            : {
    1234                 :            :         EC_KEY *private;
    1235                 :            : 
    1236         [ -  + ]:         16 :         if ((*nid = key_ecdsa_bits_to_nid(bits)) == -1)
    1237                 :          0 :                 fatal("%s: invalid key length", __func__);
    1238         [ -  + ]:         16 :         if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL)
    1239                 :          0 :                 fatal("%s: EC_KEY_new_by_curve_name failed", __func__);
    1240         [ -  + ]:         16 :         if (EC_KEY_generate_key(private) != 1)
    1241                 :          0 :                 fatal("%s: EC_KEY_generate_key failed", __func__);
    1242                 :         16 :         EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE);
    1243                 :         16 :         return private;
    1244                 :            : }
    1245                 :            : #endif /* OPENSSL_HAS_ECC */
    1246                 :            : 
    1247                 :            : Key *
    1248                 :        152 : key_generate(int type, u_int bits)
    1249                 :            : {
    1250                 :        152 :         Key *k = key_new(KEY_UNSPEC);
    1251   [ +  +  +  +  :        152 :         switch (type) {
                   -  - ]
    1252                 :            :         case KEY_DSA:
    1253                 :         12 :                 k->dsa = dsa_generate_private_key(bits);
    1254                 :         12 :                 break;
    1255                 :            : #ifdef OPENSSL_HAS_ECC
    1256                 :            :         case KEY_ECDSA:
    1257                 :         16 :                 k->ecdsa = ecdsa_generate_private_key(bits, &k->ecdsa_nid);
    1258                 :         16 :                 break;
    1259                 :            : #endif
    1260                 :            :         case KEY_RSA:
    1261                 :            :         case KEY_RSA1:
    1262                 :        119 :                 k->rsa = rsa_generate_private_key(bits);
    1263                 :        119 :                 break;
    1264                 :            :         case KEY_ED25519:
    1265                 :          5 :                 k->ed25519_pk = xmalloc(ED25519_PK_SZ);
    1266                 :          5 :                 k->ed25519_sk = xmalloc(ED25519_SK_SZ);
    1267                 :          5 :                 crypto_sign_ed25519_keypair(k->ed25519_pk, k->ed25519_sk);
    1268                 :          5 :                 break;
    1269                 :            :         case KEY_RSA_CERT_V00:
    1270                 :            :         case KEY_DSA_CERT_V00:
    1271                 :            :         case KEY_RSA_CERT:
    1272                 :            :         case KEY_DSA_CERT:
    1273                 :          0 :                 fatal("key_generate: cert keys cannot be generated directly");
    1274                 :            :         default:
    1275                 :          0 :                 fatal("key_generate: unknown type %d", type);
    1276                 :            :         }
    1277                 :        152 :         k->type = type;
    1278                 :        152 :         return k;
    1279                 :            : }
    1280                 :            : 
    1281                 :            : void
    1282                 :        158 : key_cert_copy(const Key *from_key, struct Key *to_key)
    1283                 :            : {
    1284                 :            :         u_int i;
    1285                 :            :         const struct KeyCert *from;
    1286                 :            :         struct KeyCert *to;
    1287                 :            : 
    1288         [ +  - ]:        158 :         if (to_key->cert != NULL) {
    1289                 :        158 :                 cert_free(to_key->cert);
    1290                 :        158 :                 to_key->cert = NULL;
    1291                 :            :         }
    1292                 :            : 
    1293         [ +  - ]:        158 :         if ((from = from_key->cert) == NULL)
    1294                 :        158 :                 return;
    1295                 :            : 
    1296                 :        158 :         to = to_key->cert = cert_new();
    1297                 :            : 
    1298                 :        158 :         buffer_append(&to->certblob, buffer_ptr(&from->certblob),
    1299                 :            :             buffer_len(&from->certblob));
    1300                 :            : 
    1301                 :        316 :         buffer_append(&to->critical,
    1302                 :        158 :             buffer_ptr(&from->critical), buffer_len(&from->critical));
    1303                 :        316 :         buffer_append(&to->extensions,
    1304                 :        158 :             buffer_ptr(&from->extensions), buffer_len(&from->extensions));
    1305                 :            : 
    1306                 :        158 :         to->serial = from->serial;
    1307                 :        158 :         to->type = from->type;
    1308         [ +  - ]:        158 :         to->key_id = from->key_id == NULL ? NULL : xstrdup(from->key_id);
    1309                 :        158 :         to->valid_after = from->valid_after;
    1310                 :        158 :         to->valid_before = from->valid_before;
    1311                 :        316 :         to->signature_key = from->signature_key == NULL ?
    1312         [ +  - ]:        158 :             NULL : key_from_private(from->signature_key);
    1313                 :            : 
    1314                 :        158 :         to->nprincipals = from->nprincipals;
    1315         [ -  + ]:        158 :         if (to->nprincipals > CERT_MAX_PRINCIPALS)
    1316                 :          0 :                 fatal("%s: nprincipals (%u) > CERT_MAX_PRINCIPALS (%u)",
    1317                 :            :                     __func__, to->nprincipals, CERT_MAX_PRINCIPALS);
    1318         [ +  + ]:        158 :         if (to->nprincipals > 0) {
    1319                 :         68 :                 to->principals = xcalloc(from->nprincipals,
    1320                 :            :                     sizeof(*to->principals));
    1321         [ +  + ]:        208 :                 for (i = 0; i < to->nprincipals; i++)
    1322                 :        140 :                         to->principals[i] = xstrdup(from->principals[i]);
    1323                 :            :         }
    1324                 :            : }
    1325                 :            : 
    1326                 :            : Key *
    1327                 :        908 : key_from_private(const Key *k)
    1328                 :            : {
    1329                 :        908 :         Key *n = NULL;
    1330   [ +  +  +  +  :        908 :         switch (k->type) {
                      - ]
    1331                 :            :         case KEY_DSA:
    1332                 :            :         case KEY_DSA_CERT_V00:
    1333                 :            :         case KEY_DSA_CERT:
    1334                 :         82 :                 n = key_new(k->type);
    1335   [ +  -  +  - ]:        164 :                 if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
    1336         [ +  - ]:        164 :                     (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
    1337         [ -  + ]:        164 :                     (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
    1338                 :         82 :                     (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL))
    1339                 :          0 :                         fatal("key_from_private: BN_copy failed");
    1340                 :            :                 break;
    1341                 :            : #ifdef OPENSSL_HAS_ECC
    1342                 :            :         case KEY_ECDSA:
    1343                 :            :         case KEY_ECDSA_CERT:
    1344                 :        444 :                 n = key_new(k->type);
    1345                 :        444 :                 n->ecdsa_nid = k->ecdsa_nid;
    1346         [ -  + ]:        444 :                 if ((n->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid)) == NULL)
    1347                 :          0 :                         fatal("%s: EC_KEY_new_by_curve_name failed", __func__);
    1348         [ -  + ]:        444 :                 if (EC_KEY_set_public_key(n->ecdsa,
    1349                 :        444 :                     EC_KEY_get0_public_key(k->ecdsa)) != 1)
    1350                 :          0 :                         fatal("%s: EC_KEY_set_public_key failed", __func__);
    1351                 :            :                 break;
    1352                 :            : #endif
    1353                 :            :         case KEY_RSA:
    1354                 :            :         case KEY_RSA1:
    1355                 :            :         case KEY_RSA_CERT_V00:
    1356                 :            :         case KEY_RSA_CERT:
    1357                 :        364 :                 n = key_new(k->type);
    1358   [ +  -  -  + ]:        728 :                 if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
    1359                 :        364 :                     (BN_copy(n->rsa->e, k->rsa->e) == NULL))
    1360                 :          0 :                         fatal("key_from_private: BN_copy failed");
    1361                 :            :                 break;
    1362                 :            :         case KEY_ED25519:
    1363                 :            :         case KEY_ED25519_CERT:
    1364                 :         18 :                 n = key_new(k->type);
    1365         [ +  - ]:         18 :                 if (k->ed25519_pk != NULL) {
    1366                 :         18 :                         n->ed25519_pk = xmalloc(ED25519_PK_SZ);
    1367                 :         18 :                         memcpy(n->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
    1368                 :            :                 }
    1369                 :            :                 break;
    1370                 :            :         default:
    1371                 :          0 :                 fatal("key_from_private: unknown type %d", k->type);
    1372                 :            :                 break;
    1373                 :            :         }
    1374         [ +  + ]:        908 :         if (key_is_cert(k))
    1375                 :        158 :                 key_cert_copy(k, n);
    1376                 :        908 :         return n;
    1377                 :            : }
    1378                 :            : 
    1379                 :            : int
    1380                 :          0 : key_names_valid2(const char *names)
    1381                 :            : {
    1382                 :            :         char *s, *cp, *p;
    1383                 :            : 
    1384 [ #  # ][ #  # ]:          0 :         if (names == NULL || strcmp(names, "") == 0)
    1385                 :            :                 return 0;
    1386                 :          0 :         s = cp = xstrdup(names);
    1387 [ #  # ][ #  # ]:          0 :         for ((p = strsep(&cp, ",")); p && *p != '\0';
    1388                 :          0 :             (p = strsep(&cp, ","))) {
    1389         [ #  # ]:          0 :                 switch (key_type_from_name(p)) {
    1390                 :            :                 case KEY_RSA1:
    1391                 :            :                 case KEY_UNSPEC:
    1392                 :          0 :                         free(s);
    1393                 :          0 :                         return 0;
    1394                 :            :                 }
    1395                 :            :         }
    1396                 :          0 :         debug3("key names ok: [%s]", names);
    1397                 :          0 :         free(s);
    1398                 :          0 :         return 1;
    1399                 :            : }
    1400                 :            : 
    1401                 :            : static int
    1402                 :       2320 : cert_parse(Buffer *b, Key *key, const u_char *blob, u_int blen)
    1403                 :            : {
    1404                 :            :         u_char *principals, *critical, *exts, *sig_key, *sig;
    1405                 :            :         u_int signed_len, plen, clen, sklen, slen, kidlen, elen;
    1406                 :            :         Buffer tmp;
    1407                 :            :         char *principal;
    1408                 :       1160 :         int ret = -1;
    1409                 :       1160 :         int v00 = key->type == KEY_DSA_CERT_V00 ||
    1410                 :            :             key->type == KEY_RSA_CERT_V00;
    1411                 :            : 
    1412                 :       1160 :         buffer_init(&tmp);
    1413                 :            : 
    1414                 :            :         /* Copy the entire key blob for verification and later serialisation */
    1415                 :       1160 :         buffer_append(&key->cert->certblob, blob, blen);
    1416                 :            : 
    1417                 :       1160 :         elen = 0; /* Not touched for v00 certs */
    1418                 :       1160 :         principals = exts = critical = sig_key = sig = NULL;
    1419         [ +  + ]:       2320 :         if ((!v00 && buffer_get_int64_ret(&key->cert->serial, b) != 0) ||
           [ +  -  +  - ]
    1420         [ +  - ]:       2320 :             buffer_get_int_ret(&key->cert->type, b) != 0 ||
    1421         [ +  - ]:       2320 :             (key->cert->key_id = buffer_get_cstring_ret(b, &kidlen)) == NULL ||
    1422         [ +  - ]:       1160 :             (principals = buffer_get_string_ret(b, &plen)) == NULL ||
    1423         [ +  - ]:       2320 :             buffer_get_int64_ret(&key->cert->valid_after, b) != 0 ||
    1424         [ +  - ]:       2320 :             buffer_get_int64_ret(&key->cert->valid_before, b) != 0 ||
    1425         [ +  + ]:       1160 :             (critical = buffer_get_string_ret(b, &clen)) == NULL ||
    1426 [ +  - ][ +  + ]:       1160 :             (!v00 && (exts = buffer_get_string_ret(b, &elen)) == NULL) ||
    1427   [ +  -  +  - ]:       1426 :             (v00 && buffer_get_string_ptr_ret(b, NULL) == NULL) || /* nonce */
    1428         [ -  + ]:       2320 :             buffer_get_string_ptr_ret(b, NULL) == NULL || /* reserved */
    1429                 :            :             (sig_key = buffer_get_string_ret(b, &sklen)) == NULL) {
    1430                 :          0 :                 error("%s: parse error", __func__);
    1431                 :            :                 goto out;
    1432                 :            :         }
    1433                 :            : 
    1434                 :            :         /* Signature is left in the buffer so we can calculate this length */
    1435                 :       1160 :         signed_len = buffer_len(&key->cert->certblob) - buffer_len(b);
    1436                 :            : 
    1437         [ -  + ]:       1160 :         if ((sig = buffer_get_string_ret(b, &slen)) == NULL) {
    1438                 :          0 :                 error("%s: parse error", __func__);
    1439                 :            :                 goto out;
    1440                 :            :         }
    1441                 :            : 
    1442         [ -  + ]:       1160 :         if (key->cert->type != SSH2_CERT_TYPE_USER &&
    1443                 :            :             key->cert->type != SSH2_CERT_TYPE_HOST) {
    1444                 :          0 :                 error("Unknown certificate type %u", key->cert->type);
    1445                 :            :                 goto out;
    1446                 :            :         }
    1447                 :            : 
    1448                 :       1160 :         buffer_append(&tmp, principals, plen);
    1449         [ +  + ]:       2868 :         while (buffer_len(&tmp) > 0) {
    1450         [ -  + ]:       1708 :                 if (key->cert->nprincipals >= CERT_MAX_PRINCIPALS) {
    1451                 :          0 :                         error("%s: Too many principals", __func__);
    1452                 :            :                         goto out;
    1453                 :            :                 }
    1454         [ -  + ]:       1708 :                 if ((principal = buffer_get_cstring_ret(&tmp, &plen)) == NULL) {
    1455                 :          0 :                         error("%s: Principals data invalid", __func__);
    1456                 :            :                         goto out;
    1457                 :            :                 }
    1458                 :       1708 :                 key->cert->principals = xrealloc(key->cert->principals,
    1459                 :       1708 :                     key->cert->nprincipals + 1, sizeof(*key->cert->principals));
    1460                 :       1708 :                 key->cert->principals[key->cert->nprincipals++] = principal;
    1461                 :            :         }
    1462                 :            : 
    1463                 :       1160 :         buffer_clear(&tmp);
    1464                 :            : 
    1465                 :       1160 :         buffer_append(&key->cert->critical, critical, clen);
    1466                 :       1160 :         buffer_append(&tmp, critical, clen);
    1467                 :            :         /* validate structure */
    1468         [ +  + ]:       2390 :         while (buffer_len(&tmp) != 0) {
    1469   [ +  -  -  + ]:       2460 :                 if (buffer_get_string_ptr_ret(&tmp, NULL) == NULL ||
    1470                 :       1230 :                     buffer_get_string_ptr_ret(&tmp, NULL) == NULL) {
    1471                 :       1230 :                         error("%s: critical option data invalid", __func__);
    1472                 :            :                         goto out;
    1473                 :            :                 }
    1474                 :            :         }
    1475                 :       1160 :         buffer_clear(&tmp);
    1476                 :            : 
    1477                 :       1160 :         buffer_append(&key->cert->extensions, exts, elen);
    1478                 :       1160 :         buffer_append(&tmp, exts, elen);
    1479                 :            :         /* validate structure */
    1480         [ +  + ]:       5380 :         while (buffer_len(&tmp) != 0) {
    1481   [ +  -  -  + ]:       8440 :                 if (buffer_get_string_ptr_ret(&tmp, NULL) == NULL ||
    1482                 :       4220 :                     buffer_get_string_ptr_ret(&tmp, NULL) == NULL) {
    1483                 :       4220 :                         error("%s: extension data invalid", __func__);
    1484                 :            :                         goto out;
    1485                 :            :                 }
    1486                 :            :         }
    1487                 :       1160 :         buffer_clear(&tmp);
    1488                 :            : 
    1489         [ -  + ]:       1160 :         if ((key->cert->signature_key = key_from_blob2(sig_key, sklen, 0))
    1490                 :            :             == NULL) {
    1491                 :          0 :                 error("%s: Signature key invalid", __func__);
    1492                 :            :                 goto out;
    1493                 :            :         }
    1494         [ -  + ]:       1160 :         if (!key_type_is_valid_ca(key->cert->signature_key->type)) {
    1495                 :          0 :                 error("%s: Invalid signature key type %s (%d)", __func__,
    1496                 :            :                     key_type(key->cert->signature_key),
    1497                 :            :                     key->cert->signature_key->type);
    1498                 :            :                 goto out;
    1499                 :            :         }
    1500                 :            : 
    1501   [ +  -  -  - ]:       1160 :         switch (key_verify(key->cert->signature_key, sig, slen, 
    1502                 :       1160 :             buffer_ptr(&key->cert->certblob), signed_len)) {
    1503                 :            :         case 1:
    1504                 :       1160 :                 ret = 0;
    1505                 :            :                 break; /* Good signature */
    1506                 :            :         case 0:
    1507                 :          0 :                 error("%s: Invalid signature on certificate", __func__);
    1508                 :            :                 goto out;
    1509                 :            :         case -1:
    1510                 :          0 :                 error("%s: Certificate signature verification failed",
    1511                 :            :                     __func__);
    1512                 :            :                 goto out;
    1513                 :            :         }
    1514                 :            : 
    1515                 :            :  out:
    1516                 :       1160 :         buffer_free(&tmp);
    1517                 :       1160 :         free(principals);
    1518                 :       1160 :         free(critical);
    1519                 :       1160 :         free(exts);
    1520                 :       1160 :         free(sig_key);
    1521                 :       1160 :         free(sig);
    1522                 :       1160 :         return ret;
    1523                 :            : }
    1524                 :            : 
    1525                 :            : static Key *
    1526                 :      16285 : key_from_blob2(const u_char *blob, u_int blen, int allow_cert)
    1527                 :            : {
    1528                 :            :         Buffer b;
    1529                 :            :         int rlen, type;
    1530                 :            :         u_int len;
    1531                 :      16285 :         char *ktype = NULL, *curve = NULL;
    1532                 :      16285 :         u_char *pk = NULL;
    1533                 :      16285 :         Key *key = NULL;
    1534                 :            : #ifdef OPENSSL_HAS_ECC
    1535                 :      16285 :         EC_POINT *q = NULL;
    1536                 :      16285 :         int nid = -1;
    1537                 :            : #endif
    1538                 :            : 
    1539                 :            : #ifdef DEBUG_PK
    1540                 :            :         dump_base64(stderr, blob, blen);
    1541                 :            : #endif
    1542                 :      16285 :         buffer_init(&b);
    1543                 :      16285 :         buffer_append(&b, blob, blen);
    1544         [ -  + ]:      16285 :         if ((ktype = buffer_get_cstring_ret(&b, NULL)) == NULL) {
    1545                 :          0 :                 error("key_from_blob: can't read key type");
    1546                 :          0 :                 goto out;
    1547                 :            :         }
    1548                 :            : 
    1549                 :      16285 :         type = key_type_from_name(ktype);
    1550                 :            : #ifdef OPENSSL_HAS_ECC
    1551         [ +  + ]:      16285 :         if (key_type_plain(type) == KEY_ECDSA)
    1552                 :       1303 :                 nid = key_ecdsa_nid_from_name(ktype);
    1553                 :            : #endif
    1554 [ +  + ][ -  + ]:      17445 :         if (!allow_cert && key_type_is_cert(type)) {
    1555                 :          0 :                 error("key_from_blob: certificate not allowed in this context");
    1556                 :          0 :                 goto out;
    1557                 :            :         }
    1558   [ +  +  +  +  :      16285 :         switch (type) {
          +  +  +  +  -  
                      - ]
    1559                 :            :         case KEY_RSA_CERT:
    1560                 :        225 :                 (void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
    1561                 :            :                 /* FALLTHROUGH */
    1562                 :            :         case KEY_RSA:
    1563                 :            :         case KEY_RSA_CERT_V00:
    1564                 :      14265 :                 key = key_new(type);
    1565   [ +  -  +  + ]:      28530 :                 if (buffer_get_bignum2_ret(&b, key->rsa->e) == -1 ||
    1566                 :      14265 :                     buffer_get_bignum2_ret(&b, key->rsa->n) == -1) {
    1567                 :          2 :                         error("key_from_blob: can't read rsa key");
    1568                 :            :  badkey:
    1569                 :          2 :                         key_free(key);
    1570                 :          2 :                         key = NULL;
    1571                 :          2 :                         goto out;
    1572                 :            :                 }
    1573                 :            : #ifdef DEBUG_PK
    1574                 :            :                 RSA_print_fp(stderr, key->rsa, 8);
    1575                 :            : #endif
    1576                 :            :                 break;
    1577                 :            :         case KEY_DSA_CERT:
    1578                 :        153 :                 (void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
    1579                 :            :                 /* FALLTHROUGH */
    1580                 :            :         case KEY_DSA:
    1581                 :            :         case KEY_DSA_CERT_V00:
    1582                 :        482 :                 key = key_new(type);
    1583   [ +  -  +  - ]:        964 :                 if (buffer_get_bignum2_ret(&b, key->dsa->p) == -1 ||
    1584         [ +  - ]:        964 :                     buffer_get_bignum2_ret(&b, key->dsa->q) == -1 ||
    1585         [ -  + ]:        964 :                     buffer_get_bignum2_ret(&b, key->dsa->g) == -1 ||
    1586                 :        482 :                     buffer_get_bignum2_ret(&b, key->dsa->pub_key) == -1) {
    1587                 :          0 :                         error("key_from_blob: can't read dsa key");
    1588                 :          0 :                         goto badkey;
    1589                 :            :                 }
    1590                 :            : #ifdef DEBUG_PK
    1591                 :            :                 DSA_print_fp(stderr, key->dsa, 8);
    1592                 :            : #endif
    1593                 :            :                 break;
    1594                 :            : #ifdef OPENSSL_HAS_ECC
    1595                 :            :         case KEY_ECDSA_CERT:
    1596                 :        422 :                 (void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
    1597                 :            :                 /* FALLTHROUGH */
    1598                 :            :         case KEY_ECDSA:
    1599                 :       1303 :                 key = key_new(type);
    1600                 :       1303 :                 key->ecdsa_nid = nid;
    1601         [ -  + ]:       1303 :                 if ((curve = buffer_get_string_ret(&b, NULL)) == NULL) {
    1602                 :          0 :                         error("key_from_blob: can't read ecdsa curve");
    1603                 :          0 :                         goto badkey;
    1604                 :            :                 }
    1605         [ -  + ]:       1303 :                 if (key->ecdsa_nid != key_curve_name_to_nid(curve)) {
    1606                 :          0 :                         error("key_from_blob: ecdsa curve doesn't match type");
    1607                 :          0 :                         goto badkey;
    1608                 :            :                 }
    1609         [ -  + ]:       1303 :                 if (key->ecdsa != NULL)
    1610                 :          0 :                         EC_KEY_free(key->ecdsa);
    1611         [ -  + ]:       1303 :                 if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid))
    1612                 :            :                     == NULL)
    1613                 :          0 :                         fatal("key_from_blob: EC_KEY_new_by_curve_name failed");
    1614         [ -  + ]:       1303 :                 if ((q = EC_POINT_new(EC_KEY_get0_group(key->ecdsa))) == NULL)
    1615                 :          0 :                         fatal("key_from_blob: EC_POINT_new failed");
    1616         [ -  + ]:       1303 :                 if (buffer_get_ecpoint_ret(&b, EC_KEY_get0_group(key->ecdsa),
    1617                 :            :                     q) == -1) {
    1618                 :          0 :                         error("key_from_blob: can't read ecdsa key point");
    1619                 :          0 :                         goto badkey;
    1620                 :            :                 }
    1621         [ -  + ]:       1303 :                 if (key_ec_validate_public(EC_KEY_get0_group(key->ecdsa),
    1622                 :            :                     q) != 0)
    1623                 :            :                         goto badkey;
    1624         [ -  + ]:       1303 :                 if (EC_KEY_set_public_key(key->ecdsa, q) != 1)
    1625                 :          0 :                         fatal("key_from_blob: EC_KEY_set_public_key failed");
    1626                 :            : #ifdef DEBUG_PK
    1627                 :            :                 key_dump_ec_point(EC_KEY_get0_group(key->ecdsa), q);
    1628                 :            : #endif
    1629                 :            :                 break;
    1630                 :            : #endif /* OPENSSL_HAS_ECC */
    1631                 :            :         case KEY_ED25519_CERT:
    1632                 :         94 :                 (void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
    1633                 :            :                 /* FALLTHROUGH */
    1634                 :            :         case KEY_ED25519:
    1635         [ -  + ]:        235 :                 if ((pk = buffer_get_string_ret(&b, &len)) == NULL) {
    1636                 :          0 :                         error("key_from_blob: can't read ed25519 key");
    1637                 :          0 :                         goto badkey;
    1638                 :            :                 }
    1639         [ -  + ]:        235 :                 if (len != ED25519_PK_SZ) {
    1640                 :          0 :                         error("key_from_blob: ed25519 len %d != %d",
    1641                 :            :                             len, ED25519_PK_SZ);
    1642                 :          0 :                         goto badkey;
    1643                 :            :                 }
    1644                 :        235 :                 key = key_new(type);
    1645                 :        235 :                 key->ed25519_pk = pk;
    1646                 :        235 :                 pk = NULL;
    1647                 :        235 :                 break;
    1648                 :            :         case KEY_UNSPEC:
    1649                 :          0 :                 key = key_new(type);
    1650                 :          0 :                 break;
    1651                 :            :         default:
    1652                 :          0 :                 error("key_from_blob: cannot handle type %s", ktype);
    1653                 :          0 :                 goto out;
    1654                 :            :         }
    1655 [ +  + ][ -  + ]:      16283 :         if (key_is_cert(key) && cert_parse(&b, key, blob, blen) == -1) {
    1656                 :          0 :                 error("key_from_blob: can't parse cert data");
    1657                 :          0 :                 goto badkey;
    1658                 :            :         }
    1659                 :      16283 :         rlen = buffer_len(&b);
    1660         [ -  + ]:      16283 :         if (key != NULL && rlen != 0)
    1661                 :          0 :                 error("key_from_blob: remaining bytes in key blob %d", rlen);
    1662                 :            :  out:
    1663                 :      16285 :         free(ktype);
    1664                 :      16285 :         free(curve);
    1665                 :      16285 :         free(pk);
    1666                 :            : #ifdef OPENSSL_HAS_ECC
    1667         [ +  + ]:      16285 :         if (q != NULL)
    1668                 :       1303 :                 EC_POINT_free(q);
    1669                 :            : #endif
    1670                 :      16285 :         buffer_free(&b);
    1671                 :      16285 :         return key;
    1672                 :            : }
    1673                 :            : 
    1674                 :            : Key *
    1675                 :       5989 : key_from_blob(const u_char *blob, u_int blen)
    1676                 :            : {
    1677                 :      15125 :         return key_from_blob2(blob, blen, 1);
    1678                 :            : }
    1679                 :            : 
    1680                 :            : static int
    1681                 :      12176 : to_blob(const Key *key, u_char **blobp, u_int *lenp, int force_plain)
    1682                 :            : {
    1683                 :            :         Buffer b;
    1684                 :            :         int len, type;
    1685                 :            : 
    1686         [ +  - ]:      12176 :         if (blobp != NULL)
    1687                 :      12176 :                 *blobp = NULL;
    1688         [ +  - ]:      12176 :         if (lenp != NULL)
    1689                 :      12176 :                 *lenp = 0;
    1690         [ -  + ]:      12176 :         if (key == NULL) {
    1691                 :          0 :                 error("key_to_blob: key == NULL");
    1692                 :          0 :                 return 0;
    1693                 :            :         }
    1694                 :      12176 :         buffer_init(&b);
    1695         [ +  + ]:      12176 :         type = force_plain ? key_type_plain(key->type) : key->type;
    1696   [ +  +  +  +  :      12176 :         switch (type) {
                   +  - ]
    1697                 :            :         case KEY_DSA_CERT_V00:
    1698                 :            :         case KEY_RSA_CERT_V00:
    1699                 :            :         case KEY_DSA_CERT:
    1700                 :            :         case KEY_ECDSA_CERT:
    1701                 :            :         case KEY_RSA_CERT:
    1702                 :            :         case KEY_ED25519_CERT:
    1703                 :            :                 /* Use the existing blob */
    1704                 :        661 :                 buffer_append(&b, buffer_ptr(&key->cert->certblob),
    1705                 :        661 :                     buffer_len(&key->cert->certblob));
    1706                 :        661 :                 break;
    1707                 :            :         case KEY_DSA:
    1708                 :        385 :                 buffer_put_cstring(&b,
    1709                 :            :                     key_ssh_name_from_type_nid(type, key->ecdsa_nid));
    1710                 :        385 :                 buffer_put_bignum2(&b, key->dsa->p);
    1711                 :        385 :                 buffer_put_bignum2(&b, key->dsa->q);
    1712                 :        385 :                 buffer_put_bignum2(&b, key->dsa->g);
    1713                 :        385 :                 buffer_put_bignum2(&b, key->dsa->pub_key);
    1714                 :        385 :                 break;
    1715                 :            : #ifdef OPENSSL_HAS_ECC
    1716                 :            :         case KEY_ECDSA:
    1717                 :        851 :                 buffer_put_cstring(&b,
    1718                 :            :                     key_ssh_name_from_type_nid(type, key->ecdsa_nid));
    1719                 :        851 :                 buffer_put_cstring(&b, key_curve_nid_to_name(key->ecdsa_nid));
    1720                 :        851 :                 buffer_put_ecpoint(&b, EC_KEY_get0_group(key->ecdsa),
    1721                 :        851 :                     EC_KEY_get0_public_key(key->ecdsa));
    1722                 :        851 :                 break;
    1723                 :            : #endif
    1724                 :            :         case KEY_RSA:
    1725                 :      10072 :                 buffer_put_cstring(&b,
    1726                 :            :                     key_ssh_name_from_type_nid(type, key->ecdsa_nid));
    1727                 :      10072 :                 buffer_put_bignum2(&b, key->rsa->e);
    1728                 :      10072 :                 buffer_put_bignum2(&b, key->rsa->n);
    1729                 :      10072 :                 break;
    1730                 :            :         case KEY_ED25519:
    1731                 :        207 :                 buffer_put_cstring(&b,
    1732                 :            :                     key_ssh_name_from_type_nid(type, key->ecdsa_nid));
    1733                 :        207 :                 buffer_put_string(&b, key->ed25519_pk, ED25519_PK_SZ);
    1734                 :        207 :                 break;
    1735                 :            :         default:
    1736                 :          0 :                 error("key_to_blob: unsupported key type %d", key->type);
    1737                 :          0 :                 buffer_free(&b);
    1738                 :          0 :                 return 0;
    1739                 :            :         }
    1740                 :      12176 :         len = buffer_len(&b);
    1741         [ +  - ]:      12176 :         if (lenp != NULL)
    1742                 :      12176 :                 *lenp = len;
    1743         [ +  - ]:      12176 :         if (blobp != NULL) {
    1744                 :      12176 :                 *blobp = xmalloc(len);
    1745                 :      12176 :                 memcpy(*blobp, buffer_ptr(&b), len);
    1746                 :            :         }
    1747                 :      12176 :         explicit_bzero(buffer_ptr(&b), len);
    1748                 :      12176 :         buffer_free(&b);
    1749                 :      12176 :         return len;
    1750                 :            : }
    1751                 :            : 
    1752                 :            : int
    1753                 :       5085 : key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
    1754                 :            : {
    1755                 :      11670 :         return to_blob(key, blobp, lenp, 0);
    1756                 :            : }
    1757                 :            : 
    1758                 :            : int
    1759                 :       1519 : key_sign(
    1760                 :            :     const Key *key,
    1761                 :            :     u_char **sigp, u_int *lenp,
    1762                 :            :     const u_char *data, u_int datalen)
    1763                 :            : {
    1764   [ +  +  +  +  :       1519 :         switch (key->type) {
                      - ]
    1765                 :            :         case KEY_DSA_CERT_V00:
    1766                 :            :         case KEY_DSA_CERT:
    1767                 :            :         case KEY_DSA:
    1768                 :         49 :                 return ssh_dss_sign(key, sigp, lenp, data, datalen);
    1769                 :            : #ifdef OPENSSL_HAS_ECC
    1770                 :            :         case KEY_ECDSA_CERT:
    1771                 :            :         case KEY_ECDSA:
    1772                 :         84 :                 return ssh_ecdsa_sign(key, sigp, lenp, data, datalen);
    1773                 :            : #endif
    1774                 :            :         case KEY_RSA_CERT_V00:
    1775                 :            :         case KEY_RSA_CERT:
    1776                 :            :         case KEY_RSA:
    1777                 :       1361 :                 return ssh_rsa_sign(key, sigp, lenp, data, datalen);
    1778                 :            :         case KEY_ED25519:
    1779                 :            :         case KEY_ED25519_CERT:
    1780                 :         25 :                 return ssh_ed25519_sign(key, sigp, lenp, data, datalen);
    1781                 :            :         default:
    1782                 :          0 :                 error("key_sign: invalid key type %d", key->type);
    1783                 :          0 :                 return -1;
    1784                 :            :         }
    1785                 :            : }
    1786                 :            : 
    1787                 :            : /*
    1788                 :            :  * key_verify returns 1 for a correct signature, 0 for an incorrect signature
    1789                 :            :  * and -1 on error.
    1790                 :            :  */
    1791                 :            : int
    1792                 :       3034 : key_verify(
    1793                 :            :     const Key *key,
    1794                 :            :     const u_char *signature, u_int signaturelen,
    1795                 :            :     const u_char *data, u_int datalen)
    1796                 :            : {
    1797         [ +  - ]:       3034 :         if (signaturelen == 0)
    1798                 :            :                 return -1;
    1799                 :            : 
    1800   [ +  +  +  +  :       3034 :         switch (key->type) {
                      - ]
    1801                 :            :         case KEY_DSA_CERT_V00:
    1802                 :            :         case KEY_DSA_CERT:
    1803                 :            :         case KEY_DSA:
    1804                 :         47 :                 return ssh_dss_verify(key, signature, signaturelen, data, datalen);
    1805                 :            : #ifdef OPENSSL_HAS_ECC
    1806                 :            :         case KEY_ECDSA_CERT:
    1807                 :            :         case KEY_ECDSA:
    1808                 :        324 :                 return ssh_ecdsa_verify(key, signature, signaturelen, data, datalen);
    1809                 :            : #endif
    1810                 :            :         case KEY_RSA_CERT_V00:
    1811                 :            :         case KEY_RSA_CERT:
    1812                 :            :         case KEY_RSA:
    1813                 :       2635 :                 return ssh_rsa_verify(key, signature, signaturelen, data, datalen);
    1814                 :            :         case KEY_ED25519:
    1815                 :            :         case KEY_ED25519_CERT:
    1816                 :         28 :                 return ssh_ed25519_verify(key, signature, signaturelen, data, datalen);
    1817                 :            :         default:
    1818                 :          0 :                 error("key_verify: invalid key type %d", key->type);
    1819                 :          0 :                 return -1;
    1820                 :            :         }
    1821                 :            : }
    1822                 :            : 
    1823                 :            : /* Converts a private to a public key */
    1824                 :            : Key *
    1825                 :       1625 : key_demote(const Key *k)
    1826                 :            : {
    1827                 :            :         Key *pk;
    1828                 :            : 
    1829                 :       1625 :         pk = xcalloc(1, sizeof(*pk));
    1830                 :       1625 :         pk->type = k->type;
    1831                 :       1625 :         pk->flags = k->flags;
    1832                 :       1625 :         pk->ecdsa_nid = k->ecdsa_nid;
    1833                 :       1625 :         pk->dsa = NULL;
    1834                 :       1625 :         pk->ecdsa = NULL;
    1835                 :       1625 :         pk->rsa = NULL;
    1836                 :       1625 :         pk->ed25519_pk = NULL;
    1837                 :       1625 :         pk->ed25519_sk = NULL;
    1838                 :            : 
    1839   [ -  +  -  +  :       1625 :         switch (k->type) {
             -  +  -  +  
                      - ]
    1840                 :            :         case KEY_RSA_CERT_V00:
    1841                 :            :         case KEY_RSA_CERT:
    1842                 :          0 :                 key_cert_copy(k, pk);
    1843                 :            :                 /* FALLTHROUGH */
    1844                 :            :         case KEY_RSA1:
    1845                 :            :         case KEY_RSA:
    1846         [ -  + ]:       1602 :                 if ((pk->rsa = RSA_new()) == NULL)
    1847                 :          0 :                         fatal("key_demote: RSA_new failed");
    1848         [ -  + ]:       1602 :                 if ((pk->rsa->e = BN_dup(k->rsa->e)) == NULL)
    1849                 :          0 :                         fatal("key_demote: BN_dup failed");
    1850         [ -  + ]:       1602 :                 if ((pk->rsa->n = BN_dup(k->rsa->n)) == NULL)
    1851                 :          0 :                         fatal("key_demote: BN_dup failed");
    1852                 :            :                 break;
    1853                 :            :         case KEY_DSA_CERT_V00:
    1854                 :            :         case KEY_DSA_CERT:
    1855                 :          0 :                 key_cert_copy(k, pk);
    1856                 :            :                 /* FALLTHROUGH */
    1857                 :            :         case KEY_DSA:
    1858         [ -  + ]:          7 :                 if ((pk->dsa = DSA_new()) == NULL)
    1859                 :          0 :                         fatal("key_demote: DSA_new failed");
    1860         [ -  + ]:          7 :                 if ((pk->dsa->p = BN_dup(k->dsa->p)) == NULL)
    1861                 :          0 :                         fatal("key_demote: BN_dup failed");
    1862         [ -  + ]:          7 :                 if ((pk->dsa->q = BN_dup(k->dsa->q)) == NULL)
    1863                 :          0 :                         fatal("key_demote: BN_dup failed");
    1864         [ -  + ]:          7 :                 if ((pk->dsa->g = BN_dup(k->dsa->g)) == NULL)
    1865                 :          0 :                         fatal("key_demote: BN_dup failed");
    1866         [ -  + ]:          7 :                 if ((pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL)
    1867                 :          0 :                         fatal("key_demote: BN_dup failed");
    1868                 :            :                 break;
    1869                 :            : #ifdef OPENSSL_HAS_ECC
    1870                 :            :         case KEY_ECDSA_CERT:
    1871                 :          0 :                 key_cert_copy(k, pk);
    1872                 :            :                 /* FALLTHROUGH */
    1873                 :            :         case KEY_ECDSA:
    1874         [ -  + ]:         12 :                 if ((pk->ecdsa = EC_KEY_new_by_curve_name(pk->ecdsa_nid)) == NULL)
    1875                 :          0 :                         fatal("key_demote: EC_KEY_new_by_curve_name failed");
    1876         [ -  + ]:         12 :                 if (EC_KEY_set_public_key(pk->ecdsa,
    1877                 :         12 :                     EC_KEY_get0_public_key(k->ecdsa)) != 1)
    1878                 :          0 :                         fatal("key_demote: EC_KEY_set_public_key failed");
    1879                 :            :                 break;
    1880                 :            : #endif
    1881                 :            :         case KEY_ED25519_CERT:
    1882                 :          0 :                 key_cert_copy(k, pk);
    1883                 :            :                 /* FALLTHROUGH */
    1884                 :            :         case KEY_ED25519:
    1885         [ +  - ]:          4 :                 if (k->ed25519_pk != NULL) {
    1886                 :          4 :                         pk->ed25519_pk = xmalloc(ED25519_PK_SZ);
    1887                 :          4 :                         memcpy(pk->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
    1888                 :            :                 }
    1889                 :            :                 break;
    1890                 :            :         default:
    1891                 :          0 :                 fatal("key_demote: bad key type %d", k->type);
    1892                 :            :                 break;
    1893                 :            :         }
    1894                 :            : 
    1895                 :       1625 :         return (pk);
    1896                 :            : }
    1897                 :            : 
    1898                 :            : int
    1899                 :      35736 : key_is_cert(const Key *k)
    1900                 :            : {
    1901 [ +  - ][ +  + ]:     192941 :         if (k == NULL)
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1902                 :            :                 return 0;
    1903                 :      18500 :         return key_type_is_cert(k->type);
    1904                 :            : }
    1905                 :            : 
    1906                 :            : /* Return the cert-less equivalent to a certified key type */
    1907                 :            : int
    1908                 :      16629 : key_type_plain(int type)
    1909                 :            : {
    1910   [ +  +  +  -  :     122057 :         switch (type) {
           + ][ +  +  +  
           +  + ][ +  +  
           +  -  + ][ +  
             +  +  +  + ]
           [ -  +  -  +  
           - ][ +  +  +  
           +  + ][ +  +  
           +  +  + ][ +  
             +  +  +  + ]
           [ +  +  +  +  
           + ][ +  +  +  
           +  + ][ +  +  
           +  +  + ][ +  
             +  +  +  + ]
           [ +  +  +  +  
                      + ]
    1911                 :            :         case KEY_RSA_CERT_V00:
    1912                 :            :         case KEY_RSA_CERT:
    1913                 :            :                 return KEY_RSA;
    1914                 :            :         case KEY_DSA_CERT_V00:
    1915                 :            :         case KEY_DSA_CERT:
    1916                 :       1510 :                 return KEY_DSA;
    1917                 :            :         case KEY_ECDSA_CERT:
    1918                 :       2262 :                 return KEY_ECDSA;
    1919                 :            :         case KEY_ED25519_CERT:
    1920                 :        754 :                 return KEY_ED25519;
    1921                 :            :         default:
    1922                 :      10517 :                 return type;
    1923                 :            :         }
    1924                 :            : }
    1925                 :            : 
    1926                 :            : /* Convert a plain key to their _CERT equivalent */
    1927                 :            : int
    1928                 :         99 : key_to_certified(Key *k, int legacy)
    1929                 :            : {
    1930   [ -  +  +  +  :         99 :         switch (k->type) {
                      + ]
    1931                 :            :         case KEY_RSA:
    1932                 :         70 :                 k->cert = cert_new();
    1933         [ +  + ]:         70 :                 k->type = legacy ? KEY_RSA_CERT_V00 : KEY_RSA_CERT;
    1934                 :         70 :                 return 0;
    1935                 :            :         case KEY_DSA:
    1936                 :         12 :                 k->cert = cert_new();
    1937         [ +  + ]:         12 :                 k->type = legacy ? KEY_DSA_CERT_V00 : KEY_DSA_CERT;
    1938                 :         12 :                 return 0;
    1939                 :            :         case KEY_ECDSA:
    1940         [ -  + ]:         14 :                 if (legacy)
    1941                 :          0 :                         fatal("%s: legacy ECDSA certificates are not supported",
    1942                 :            :                             __func__);
    1943                 :         14 :                 k->cert = cert_new();
    1944                 :         14 :                 k->type = KEY_ECDSA_CERT;
    1945                 :         14 :                 return 0;
    1946                 :            :         case KEY_ED25519:
    1947         [ -  + ]:          3 :                 if (legacy)
    1948                 :          0 :                         fatal("%s: legacy ED25519 certificates are not "
    1949                 :            :                             "supported", __func__);
    1950                 :          3 :                 k->cert = cert_new();
    1951                 :          3 :                 k->type = KEY_ED25519_CERT;
    1952                 :          3 :                 return 0;
    1953                 :            :         default:
    1954                 :          0 :                 error("%s: key has incorrect type %s", __func__, key_type(k));
    1955                 :          0 :                 return -1;
    1956                 :            :         }
    1957                 :            : }
    1958                 :            : 
    1959                 :            : /* Convert a certificate to its raw key equivalent */
    1960                 :            : int
    1961                 :        158 : key_drop_cert(Key *k)
    1962                 :            : {
    1963         [ -  + ]:        158 :         if (!key_type_is_cert(k->type)) {
    1964                 :          0 :                 error("%s: key has incorrect type %s", __func__, key_type(k));
    1965                 :          0 :                 return -1;
    1966                 :            :         }
    1967                 :        158 :         cert_free(k->cert);
    1968                 :        158 :         k->cert = NULL;
    1969                 :        316 :         k->type = key_type_plain(k->type);
    1970                 :        158 :         return 0;
    1971                 :            : }
    1972                 :            : 
    1973                 :            : /* Sign a certified key, (re-)generating the signed certblob. */
    1974                 :            : int
    1975                 :         99 : key_certify(Key *k, Key *ca)
    1976                 :            : {
    1977                 :            :         Buffer principals;
    1978                 :            :         u_char *ca_blob, *sig_blob, nonce[32];
    1979                 :            :         u_int i, ca_len, sig_len;
    1980                 :            : 
    1981         [ -  + ]:         99 :         if (k->cert == NULL) {
    1982                 :          0 :                 error("%s: key lacks cert info", __func__);
    1983                 :          0 :                 return -1;
    1984                 :            :         }
    1985                 :            : 
    1986         [ -  + ]:         99 :         if (!key_is_cert(k)) {
    1987                 :          0 :                 error("%s: certificate has unknown type %d", __func__,
    1988                 :            :                     k->cert->type);
    1989                 :          0 :                 return -1;
    1990                 :            :         }
    1991                 :            : 
    1992         [ -  + ]:         99 :         if (!key_type_is_valid_ca(ca->type)) {
    1993                 :          0 :                 error("%s: CA key has unsupported type %s", __func__,
    1994                 :            :                     key_type(ca));
    1995                 :          0 :                 return -1;
    1996                 :            :         }
    1997                 :            : 
    1998                 :            :         key_to_blob(ca, &ca_blob, &ca_len);
    1999                 :            : 
    2000                 :         99 :         buffer_clear(&k->cert->certblob);
    2001                 :         99 :         buffer_put_cstring(&k->cert->certblob, key_ssh_name(k));
    2002                 :            : 
    2003                 :            :         /* -v01 certs put nonce first */
    2004                 :         99 :         arc4random_buf(&nonce, sizeof(nonce));
    2005         [ +  + ]:         99 :         if (!key_cert_is_legacy(k))
    2006                 :         60 :                 buffer_put_string(&k->cert->certblob, nonce, sizeof(nonce));
    2007                 :            : 
    2008                 :            :         /* XXX this substantially duplicates to_blob(); refactor */
    2009   [ -  +  +  +  :         99 :         switch (k->type) {
                      + ]
    2010                 :            :         case KEY_DSA_CERT_V00:
    2011                 :            :         case KEY_DSA_CERT:
    2012                 :         12 :                 buffer_put_bignum2(&k->cert->certblob, k->dsa->p);
    2013                 :         12 :                 buffer_put_bignum2(&k->cert->certblob, k->dsa->q);
    2014                 :         12 :                 buffer_put_bignum2(&k->cert->certblob, k->dsa->g);
    2015                 :         12 :                 buffer_put_bignum2(&k->cert->certblob, k->dsa->pub_key);
    2016                 :         12 :                 break;
    2017                 :            : #ifdef OPENSSL_HAS_ECC
    2018                 :            :         case KEY_ECDSA_CERT:
    2019                 :         14 :                 buffer_put_cstring(&k->cert->certblob,
    2020                 :            :                     key_curve_nid_to_name(k->ecdsa_nid));
    2021                 :         14 :                 buffer_put_ecpoint(&k->cert->certblob,
    2022                 :         14 :                     EC_KEY_get0_group(k->ecdsa),
    2023                 :         14 :                     EC_KEY_get0_public_key(k->ecdsa));
    2024                 :         14 :                 break;
    2025                 :            : #endif
    2026                 :            :         case KEY_RSA_CERT_V00:
    2027                 :            :         case KEY_RSA_CERT:
    2028                 :         70 :                 buffer_put_bignum2(&k->cert->certblob, k->rsa->e);
    2029                 :         70 :                 buffer_put_bignum2(&k->cert->certblob, k->rsa->n);
    2030                 :         70 :                 break;
    2031                 :            :         case KEY_ED25519_CERT:
    2032                 :          3 :                 buffer_put_string(&k->cert->certblob,
    2033                 :          3 :                     k->ed25519_pk, ED25519_PK_SZ);
    2034                 :          3 :                 break;
    2035                 :            :         default:
    2036                 :          0 :                 error("%s: key has incorrect type %s", __func__, key_type(k));
    2037                 :          0 :                 buffer_clear(&k->cert->certblob);
    2038                 :          0 :                 free(ca_blob);
    2039                 :          0 :                 return -1;
    2040                 :            :         }
    2041                 :            : 
    2042                 :            :         /* -v01 certs have a serial number next */
    2043         [ +  + ]:         99 :         if (!key_cert_is_legacy(k))
    2044                 :         60 :                 buffer_put_int64(&k->cert->certblob, k->cert->serial);
    2045                 :            : 
    2046                 :         99 :         buffer_put_int(&k->cert->certblob, k->cert->type);
    2047                 :         99 :         buffer_put_cstring(&k->cert->certblob, k->cert->key_id);
    2048                 :            : 
    2049                 :         99 :         buffer_init(&principals);
    2050         [ +  + ]:        215 :         for (i = 0; i < k->cert->nprincipals; i++)
    2051                 :        116 :                 buffer_put_cstring(&principals, k->cert->principals[i]);
    2052                 :         99 :         buffer_put_string(&k->cert->certblob, buffer_ptr(&principals),
    2053                 :            :             buffer_len(&principals));
    2054                 :         99 :         buffer_free(&principals);
    2055                 :            : 
    2056                 :         99 :         buffer_put_int64(&k->cert->certblob, k->cert->valid_after);
    2057                 :         99 :         buffer_put_int64(&k->cert->certblob, k->cert->valid_before);
    2058                 :        198 :         buffer_put_string(&k->cert->certblob,
    2059                 :         99 :             buffer_ptr(&k->cert->critical), buffer_len(&k->cert->critical));
    2060                 :            : 
    2061                 :            :         /* -v01 certs have non-critical options here */
    2062         [ +  + ]:         99 :         if (!key_cert_is_legacy(k)) {
    2063                 :        120 :                 buffer_put_string(&k->cert->certblob,
    2064                 :         60 :                     buffer_ptr(&k->cert->extensions),
    2065                 :         60 :                     buffer_len(&k->cert->extensions));
    2066                 :            :         }
    2067                 :            : 
    2068                 :            :         /* -v00 certs put the nonce at the end */
    2069         [ +  + ]:         99 :         if (key_cert_is_legacy(k))
    2070                 :         39 :                 buffer_put_string(&k->cert->certblob, nonce, sizeof(nonce));
    2071                 :            : 
    2072                 :         99 :         buffer_put_string(&k->cert->certblob, NULL, 0); /* reserved */
    2073                 :         99 :         buffer_put_string(&k->cert->certblob, ca_blob, ca_len);
    2074                 :         99 :         free(ca_blob);
    2075                 :            : 
    2076                 :            :         /* Sign the whole mess */
    2077         [ -  + ]:         99 :         if (key_sign(ca, &sig_blob, &sig_len, buffer_ptr(&k->cert->certblob),
    2078                 :         99 :             buffer_len(&k->cert->certblob)) != 0) {
    2079                 :          0 :                 error("%s: signature operation failed", __func__);
    2080                 :          0 :                 buffer_clear(&k->cert->certblob);
    2081                 :          0 :                 return -1;
    2082                 :            :         }
    2083                 :            :         /* Append signature and we are done */
    2084                 :         99 :         buffer_put_string(&k->cert->certblob, sig_blob, sig_len);
    2085                 :         99 :         free(sig_blob);
    2086                 :            : 
    2087                 :         99 :         return 0;
    2088                 :            : }
    2089                 :            : 
    2090                 :            : int
    2091                 :        312 : key_cert_check_authority(const Key *k, int want_host, int require_principal,
    2092                 :            :     const char *name, const char **reason)
    2093                 :            : {
    2094                 :            :         u_int i, principal_matches;
    2095                 :        312 :         time_t now = time(NULL);
    2096                 :            : 
    2097         [ +  + ]:        312 :         if (want_host) {
    2098         [ -  + ]:         20 :                 if (k->cert->type != SSH2_CERT_TYPE_HOST) {
    2099                 :          0 :                         *reason = "Certificate invalid: not a host certificate";
    2100                 :          0 :                         return -1;
    2101                 :            :                 }
    2102                 :            :         } else {
    2103         [ -  + ]:        292 :                 if (k->cert->type != SSH2_CERT_TYPE_USER) {
    2104                 :          0 :                         *reason = "Certificate invalid: not a user certificate";
    2105                 :          0 :                         return -1;
    2106                 :            :                 }
    2107                 :            :         }
    2108         [ -  + ]:        312 :         if (now < 0) {
    2109                 :          0 :                 error("%s: system clock lies before epoch", __func__);
    2110                 :          0 :                 *reason = "Certificate invalid: not yet valid";
    2111                 :          0 :                 return -1;
    2112                 :            :         }
    2113         [ -  + ]:        312 :         if ((u_int64_t)now < k->cert->valid_after) {
    2114                 :          0 :                 *reason = "Certificate invalid: not yet valid";
    2115                 :          0 :                 return -1;
    2116                 :            :         }
    2117         [ -  + ]:        312 :         if ((u_int64_t)now >= k->cert->valid_before) {
    2118                 :          0 :                 *reason = "Certificate invalid: expired";
    2119                 :          0 :                 return -1;
    2120                 :            :         }
    2121         [ +  + ]:        312 :         if (k->cert->nprincipals == 0) {
    2122         [ -  + ]:          8 :                 if (require_principal) {
    2123                 :          0 :                         *reason = "Certificate lacks principal list";
    2124                 :          0 :                         return -1;
    2125                 :            :                 }
    2126         [ +  + ]:        304 :         } else if (name != NULL) {
    2127                 :            :                 principal_matches = 0;
    2128         [ +  - ]:        184 :                 for (i = 0; i < k->cert->nprincipals; i++) {
    2129         [ +  + ]:        184 :                         if (strcmp(name, k->cert->principals[i]) == 0) {
    2130                 :            :                                 principal_matches = 1;
    2131                 :            :                                 break;
    2132                 :            :                         }
    2133                 :            :                 }
    2134         [ -  + ]:        168 :                 if (!principal_matches) {
    2135                 :          0 :                         *reason = "Certificate invalid: name is not a listed "
    2136                 :            :                             "principal";
    2137                 :          0 :                         return -1;
    2138                 :            :                 }
    2139                 :            :         }
    2140                 :            :         return 0;
    2141                 :            : }
    2142                 :            : 
    2143                 :            : int
    2144                 :        454 : key_cert_is_legacy(const Key *k)
    2145                 :            : {
    2146   [ +  +  +  + ]:        850 :         switch (k->type) {
         [ +  + ][ +  + ]
                 [ +  + ]
    2147                 :            :         case KEY_DSA_CERT_V00:
    2148                 :            :         case KEY_RSA_CERT_V00:
    2149                 :            :                 return 1;
    2150                 :            :         default:
    2151                 :        372 :                 return 0;
    2152                 :            :         }
    2153                 :            : }
    2154                 :            : 
    2155                 :            : /* XXX: these are really begging for a table-driven approach */
    2156                 :            : int
    2157                 :       1303 : key_curve_name_to_nid(const char *name)
    2158                 :            : {
    2159                 :            : #ifdef OPENSSL_HAS_ECC
    2160         [ +  + ]:       1303 :         if (strcmp(name, "nistp256") == 0)
    2161                 :            :                 return NID_X9_62_prime256v1;
    2162         [ +  + ]:         96 :         else if (strcmp(name, "nistp384") == 0)
    2163                 :            :                 return NID_secp384r1;
    2164                 :            : # ifdef OPENSSL_HAS_NISTP521
    2165         [ -  + ]:         48 :         else if (strcmp(name, "nistp521") == 0)
    2166                 :            :                 return NID_secp521r1;
    2167                 :            : # endif
    2168                 :            : #endif
    2169                 :            : 
    2170                 :          0 :         debug("%s: unsupported EC curve name \"%.100s\"", __func__, name);
    2171                 :          0 :         return -1;
    2172                 :            : }
    2173                 :            : 
    2174                 :            : u_int
    2175                 :        454 : key_curve_nid_to_bits(int nid)
    2176                 :            : {
    2177   [ +  +  -  + ]:        454 :         switch (nid) {
    2178                 :            : #ifdef OPENSSL_HAS_ECC
    2179                 :            :         case NID_X9_62_prime256v1:
    2180                 :            :                 return 256;
    2181                 :            :         case NID_secp384r1:
    2182                 :         24 :                 return 384;
    2183                 :            : # ifdef OPENSSL_HAS_NISTP521
    2184                 :            :         case NID_secp521r1:
    2185                 :         24 :                 return 521;
    2186                 :            : # endif
    2187                 :            : #endif
    2188                 :            :         default:
    2189                 :          0 :                 error("%s: unsupported EC curve nid %d", __func__, nid);
    2190                 :          0 :                 return 0;
    2191                 :            :         }
    2192                 :            : }
    2193                 :            : 
    2194                 :            : const char *
    2195                 :        955 : key_curve_nid_to_name(int nid)
    2196                 :            : {
    2197                 :            : #ifdef OPENSSL_HAS_ECC
    2198         [ +  + ]:        955 :         if (nid == NID_X9_62_prime256v1)
    2199                 :            :                 return "nistp256";
    2200         [ +  + ]:         98 :         else if (nid == NID_secp384r1)
    2201                 :            :                 return "nistp384";
    2202                 :            : # ifdef OPENSSL_HAS_NISTP521
    2203         [ -  + ]:         49 :         else if (nid == NID_secp521r1)
    2204                 :            :                 return "nistp521";
    2205                 :            : # endif
    2206                 :            : #endif
    2207                 :          0 :         error("%s: unsupported EC curve nid %d", __func__, nid);
    2208                 :          0 :         return NULL;
    2209                 :            : }
    2210                 :            : 
    2211                 :            : #ifdef OPENSSL_HAS_ECC
    2212                 :            : int
    2213                 :        408 : key_ec_nid_to_hash_alg(int nid)
    2214                 :            : {
    2215                 :        408 :         int kbits = key_curve_nid_to_bits(nid);
    2216                 :            : 
    2217         [ -  + ]:        408 :         if (kbits == 0)
    2218                 :          0 :                 fatal("%s: invalid nid %d", __func__, nid);
    2219                 :            :         /* RFC5656 section 6.2.1 */
    2220         [ +  + ]:        408 :         if (kbits <= 256)
    2221                 :            :                 return SSH_DIGEST_SHA256;
    2222         [ +  + ]:         24 :         else if (kbits <= 384)
    2223                 :            :                 return SSH_DIGEST_SHA384;
    2224                 :            :         else
    2225                 :         12 :                 return SSH_DIGEST_SHA512;
    2226                 :            : }
    2227                 :            : 
    2228                 :            : int
    2229                 :       1489 : key_ec_validate_public(const EC_GROUP *group, const EC_POINT *public)
    2230                 :            : {
    2231                 :            :         BN_CTX *bnctx;
    2232                 :       1489 :         EC_POINT *nq = NULL;
    2233                 :            :         BIGNUM *order, *x, *y, *tmp;
    2234                 :       1489 :         int ret = -1;
    2235                 :            : 
    2236         [ -  + ]:       1489 :         if ((bnctx = BN_CTX_new()) == NULL)
    2237                 :          0 :                 fatal("%s: BN_CTX_new failed", __func__);
    2238                 :       1489 :         BN_CTX_start(bnctx);
    2239                 :            : 
    2240                 :            :         /*
    2241                 :            :          * We shouldn't ever hit this case because bignum_get_ecpoint()
    2242                 :            :          * refuses to load GF2m points.
    2243                 :            :          */
    2244         [ -  + ]:       1489 :         if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
    2245                 :            :             NID_X9_62_prime_field) {
    2246                 :          0 :                 error("%s: group is not a prime field", __func__);
    2247                 :          0 :                 goto out;
    2248                 :            :         }
    2249                 :            : 
    2250                 :            :         /* Q != infinity */
    2251         [ -  + ]:       1489 :         if (EC_POINT_is_at_infinity(group, public)) {
    2252                 :          0 :                 error("%s: received degenerate public key (infinity)",
    2253                 :            :                     __func__);
    2254                 :          0 :                 goto out;
    2255                 :            :         }
    2256                 :            : 
    2257 [ +  - ][ +  - ]:       1489 :         if ((x = BN_CTX_get(bnctx)) == NULL ||
    2258         [ +  - ]:       1489 :             (y = BN_CTX_get(bnctx)) == NULL ||
    2259         [ -  + ]:       1489 :             (order = BN_CTX_get(bnctx)) == NULL ||
    2260                 :            :             (tmp = BN_CTX_get(bnctx)) == NULL)
    2261                 :          0 :                 fatal("%s: BN_CTX_get failed", __func__);
    2262                 :            : 
    2263                 :            :         /* log2(x) > log2(order)/2, log2(y) > log2(order)/2 */
    2264         [ -  + ]:       1489 :         if (EC_GROUP_get_order(group, order, bnctx) != 1)
    2265                 :          0 :                 fatal("%s: EC_GROUP_get_order failed", __func__);
    2266         [ -  + ]:       1489 :         if (EC_POINT_get_affine_coordinates_GFp(group, public,
    2267                 :            :             x, y, bnctx) != 1)
    2268                 :          0 :                 fatal("%s: EC_POINT_get_affine_coordinates_GFp", __func__);
    2269         [ -  + ]:       1489 :         if (BN_num_bits(x) <= BN_num_bits(order) / 2) {
    2270                 :          0 :                 error("%s: public key x coordinate too small: "
    2271                 :            :                     "bits(x) = %d, bits(order)/2 = %d", __func__,
    2272                 :          0 :                     BN_num_bits(x), BN_num_bits(order) / 2);
    2273                 :          0 :                 goto out;
    2274                 :            :         }
    2275         [ -  + ]:       1489 :         if (BN_num_bits(y) <= BN_num_bits(order) / 2) {
    2276                 :          0 :                 error("%s: public key y coordinate too small: "
    2277                 :            :                     "bits(y) = %d, bits(order)/2 = %d", __func__,
    2278                 :          0 :                     BN_num_bits(x), BN_num_bits(order) / 2);
    2279                 :          0 :                 goto out;
    2280                 :            :         }
    2281                 :            : 
    2282                 :            :         /* nQ == infinity (n == order of subgroup) */
    2283         [ -  + ]:       1489 :         if ((nq = EC_POINT_new(group)) == NULL)
    2284                 :          0 :                 fatal("%s: BN_CTX_tmp failed", __func__);
    2285         [ -  + ]:       1489 :         if (EC_POINT_mul(group, nq, NULL, public, order, bnctx) != 1)
    2286                 :          0 :                 fatal("%s: EC_GROUP_mul failed", __func__);
    2287         [ -  + ]:       1489 :         if (EC_POINT_is_at_infinity(group, nq) != 1) {
    2288                 :          0 :                 error("%s: received degenerate public key (nQ != infinity)",
    2289                 :            :                     __func__);
    2290                 :          0 :                 goto out;
    2291                 :            :         }
    2292                 :            : 
    2293                 :            :         /* x < order - 1, y < order - 1 */
    2294         [ -  + ]:       1489 :         if (!BN_sub(tmp, order, BN_value_one()))
    2295                 :          0 :                 fatal("%s: BN_sub failed", __func__);
    2296         [ -  + ]:       1489 :         if (BN_cmp(x, tmp) >= 0) {
    2297                 :          0 :                 error("%s: public key x coordinate >= group order - 1",
    2298                 :            :                     __func__);
    2299                 :          0 :                 goto out;
    2300                 :            :         }
    2301         [ -  + ]:       1489 :         if (BN_cmp(y, tmp) >= 0) {
    2302                 :          0 :                 error("%s: public key y coordinate >= group order - 1",
    2303                 :            :                     __func__);
    2304                 :          0 :                 goto out;
    2305                 :            :         }
    2306                 :            :         ret = 0;
    2307                 :            :  out:
    2308                 :       1489 :         BN_CTX_free(bnctx);
    2309                 :       1489 :         EC_POINT_free(nq);
    2310                 :       1489 :         return ret;
    2311                 :            : }
    2312                 :            : 
    2313                 :            : int
    2314                 :         90 : key_ec_validate_private(const EC_KEY *key)
    2315                 :            : {
    2316                 :            :         BN_CTX *bnctx;
    2317                 :            :         BIGNUM *order, *tmp;
    2318                 :         90 :         int ret = -1;
    2319                 :            : 
    2320         [ -  + ]:         90 :         if ((bnctx = BN_CTX_new()) == NULL)
    2321                 :          0 :                 fatal("%s: BN_CTX_new failed", __func__);
    2322                 :         90 :         BN_CTX_start(bnctx);
    2323                 :            : 
    2324 [ +  - ][ -  + ]:         90 :         if ((order = BN_CTX_get(bnctx)) == NULL ||
    2325                 :            :             (tmp = BN_CTX_get(bnctx)) == NULL)
    2326                 :          0 :                 fatal("%s: BN_CTX_get failed", __func__);
    2327                 :            : 
    2328                 :            :         /* log2(private) > log2(order)/2 */
    2329         [ -  + ]:         90 :         if (EC_GROUP_get_order(EC_KEY_get0_group(key), order, bnctx) != 1)
    2330                 :          0 :                 fatal("%s: EC_GROUP_get_order failed", __func__);
    2331         [ -  + ]:        180 :         if (BN_num_bits(EC_KEY_get0_private_key(key)) <=
    2332                 :         90 :             BN_num_bits(order) / 2) {
    2333                 :          0 :                 error("%s: private key too small: "
    2334                 :            :                     "bits(y) = %d, bits(order)/2 = %d", __func__,
    2335                 :            :                     BN_num_bits(EC_KEY_get0_private_key(key)),
    2336                 :          0 :                     BN_num_bits(order) / 2);
    2337                 :          0 :                 goto out;
    2338                 :            :         }
    2339                 :            : 
    2340                 :            :         /* private < order - 1 */
    2341         [ -  + ]:         90 :         if (!BN_sub(tmp, order, BN_value_one()))
    2342                 :          0 :                 fatal("%s: BN_sub failed", __func__);
    2343         [ -  + ]:         90 :         if (BN_cmp(EC_KEY_get0_private_key(key), tmp) >= 0) {
    2344                 :          0 :                 error("%s: private key >= group order - 1", __func__);
    2345                 :          0 :                 goto out;
    2346                 :            :         }
    2347                 :            :         ret = 0;
    2348                 :            :  out:
    2349                 :         90 :         BN_CTX_free(bnctx);
    2350                 :         90 :         return ret;
    2351                 :            : }
    2352                 :            : 
    2353                 :            : #if defined(DEBUG_KEXECDH) || defined(DEBUG_PK)
    2354                 :            : void
    2355                 :            : key_dump_ec_point(const EC_GROUP *group, const EC_POINT *point)
    2356                 :            : {
    2357                 :            :         BIGNUM *x, *y;
    2358                 :            :         BN_CTX *bnctx;
    2359                 :            : 
    2360                 :            :         if (point == NULL) {
    2361                 :            :                 fputs("point=(NULL)\n", stderr);
    2362                 :            :                 return;
    2363                 :            :         }
    2364                 :            :         if ((bnctx = BN_CTX_new()) == NULL)
    2365                 :            :                 fatal("%s: BN_CTX_new failed", __func__);
    2366                 :            :         BN_CTX_start(bnctx);
    2367                 :            :         if ((x = BN_CTX_get(bnctx)) == NULL || (y = BN_CTX_get(bnctx)) == NULL)
    2368                 :            :                 fatal("%s: BN_CTX_get failed", __func__);
    2369                 :            :         if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
    2370                 :            :             NID_X9_62_prime_field)
    2371                 :            :                 fatal("%s: group is not a prime field", __func__);
    2372                 :            :         if (EC_POINT_get_affine_coordinates_GFp(group, point, x, y, bnctx) != 1)
    2373                 :            :                 fatal("%s: EC_POINT_get_affine_coordinates_GFp", __func__);
    2374                 :            :         fputs("x=", stderr);
    2375                 :            :         BN_print_fp(stderr, x);
    2376                 :            :         fputs("\ny=", stderr);
    2377                 :            :         BN_print_fp(stderr, y);
    2378                 :            :         fputs("\n", stderr);
    2379                 :            :         BN_CTX_free(bnctx);
    2380                 :            : }
    2381                 :            : 
    2382                 :            : void
    2383                 :            : key_dump_ec_key(const EC_KEY *key)
    2384                 :            : {
    2385                 :            :         const BIGNUM *exponent;
    2386                 :            : 
    2387                 :            :         key_dump_ec_point(EC_KEY_get0_group(key), EC_KEY_get0_public_key(key));
    2388                 :            :         fputs("exponent=", stderr);
    2389                 :            :         if ((exponent = EC_KEY_get0_private_key(key)) == NULL)
    2390                 :            :                 fputs("(NULL)", stderr);
    2391                 :            :         else
    2392                 :            :                 BN_print_fp(stderr, EC_KEY_get0_private_key(key));
    2393                 :            :         fputs("\n", stderr);
    2394                 :            : }
    2395                 :            : #endif /* defined(DEBUG_KEXECDH) || defined(DEBUG_PK) */
    2396                 :            : #endif /* OPENSSL_HAS_ECC */
    2397                 :            : 
    2398                 :            : void
    2399                 :          8 : key_private_serialize(const Key *key, Buffer *b)
    2400                 :            : {
    2401                 :          8 :         buffer_put_cstring(b, key_ssh_name(key));
    2402   [ +  -  -  -  :          8 :         switch (key->type) {
             -  -  +  -  
                      - ]
    2403                 :            :         case KEY_RSA:
    2404                 :          2 :                 buffer_put_bignum2(b, key->rsa->n);
    2405                 :          2 :                 buffer_put_bignum2(b, key->rsa->e);
    2406                 :          2 :                 buffer_put_bignum2(b, key->rsa->d);
    2407                 :          2 :                 buffer_put_bignum2(b, key->rsa->iqmp);
    2408                 :          2 :                 buffer_put_bignum2(b, key->rsa->p);
    2409                 :          2 :                 buffer_put_bignum2(b, key->rsa->q);
    2410                 :          2 :                 break;
    2411                 :            :         case KEY_RSA_CERT_V00:
    2412                 :            :         case KEY_RSA_CERT:
    2413 [ #  # ][ #  # ]:          0 :                 if (key->cert == NULL || buffer_len(&key->cert->certblob) == 0)
    2414                 :          0 :                         fatal("%s: no cert/certblob", __func__);
    2415                 :          0 :                 buffer_put_string(b, buffer_ptr(&key->cert->certblob),
    2416                 :          0 :                     buffer_len(&key->cert->certblob));
    2417                 :          0 :                 buffer_put_bignum2(b, key->rsa->d);
    2418                 :          0 :                 buffer_put_bignum2(b, key->rsa->iqmp);
    2419                 :          0 :                 buffer_put_bignum2(b, key->rsa->p);
    2420                 :          0 :                 buffer_put_bignum2(b, key->rsa->q);
    2421                 :          0 :                 break;
    2422                 :            :         case KEY_DSA:
    2423                 :          0 :                 buffer_put_bignum2(b, key->dsa->p);
    2424                 :          0 :                 buffer_put_bignum2(b, key->dsa->q);
    2425                 :          0 :                 buffer_put_bignum2(b, key->dsa->g);
    2426                 :          0 :                 buffer_put_bignum2(b, key->dsa->pub_key);
    2427                 :          0 :                 buffer_put_bignum2(b, key->dsa->priv_key);
    2428                 :          0 :                 break;
    2429                 :            :         case KEY_DSA_CERT_V00:
    2430                 :            :         case KEY_DSA_CERT:
    2431 [ #  # ][ #  # ]:          0 :                 if (key->cert == NULL || buffer_len(&key->cert->certblob) == 0)
    2432                 :          0 :                         fatal("%s: no cert/certblob", __func__);
    2433                 :          0 :                 buffer_put_string(b, buffer_ptr(&key->cert->certblob),
    2434                 :          0 :                     buffer_len(&key->cert->certblob));
    2435                 :          0 :                 buffer_put_bignum2(b, key->dsa->priv_key);
    2436                 :          0 :                 break;
    2437                 :            : #ifdef OPENSSL_HAS_ECC
    2438                 :            :         case KEY_ECDSA:
    2439                 :          0 :                 buffer_put_cstring(b, key_curve_nid_to_name(key->ecdsa_nid));
    2440                 :          0 :                 buffer_put_ecpoint(b, EC_KEY_get0_group(key->ecdsa),
    2441                 :          0 :                     EC_KEY_get0_public_key(key->ecdsa));
    2442                 :          0 :                 buffer_put_bignum2(b, EC_KEY_get0_private_key(key->ecdsa));
    2443                 :          0 :                 break;
    2444                 :            :         case KEY_ECDSA_CERT:
    2445 [ #  # ][ #  # ]:          0 :                 if (key->cert == NULL || buffer_len(&key->cert->certblob) == 0)
    2446                 :          0 :                         fatal("%s: no cert/certblob", __func__);
    2447                 :          0 :                 buffer_put_string(b, buffer_ptr(&key->cert->certblob),
    2448                 :          0 :                     buffer_len(&key->cert->certblob));
    2449                 :          0 :                 buffer_put_bignum2(b, EC_KEY_get0_private_key(key->ecdsa));
    2450                 :          0 :                 break;
    2451                 :            : #endif /* OPENSSL_HAS_ECC */
    2452                 :            :         case KEY_ED25519:
    2453                 :          6 :                 buffer_put_string(b, key->ed25519_pk, ED25519_PK_SZ);
    2454                 :          6 :                 buffer_put_string(b, key->ed25519_sk, ED25519_SK_SZ);
    2455                 :          6 :                 break;
    2456                 :            :         case KEY_ED25519_CERT:
    2457 [ #  # ][ #  # ]:          0 :                 if (key->cert == NULL || buffer_len(&key->cert->certblob) == 0)
    2458                 :          0 :                         fatal("%s: no cert/certblob", __func__);
    2459                 :          0 :                 buffer_put_string(b, buffer_ptr(&key->cert->certblob),
    2460                 :          0 :                     buffer_len(&key->cert->certblob));
    2461                 :          0 :                 buffer_put_string(b, key->ed25519_pk, ED25519_PK_SZ);
    2462                 :          0 :                 buffer_put_string(b, key->ed25519_sk, ED25519_SK_SZ);
    2463                 :          0 :                 break;
    2464                 :            :         }
    2465                 :          8 : }
    2466                 :            : 
    2467                 :            : Key *
    2468                 :         28 : key_private_deserialize(Buffer *blob)
    2469                 :            : {
    2470                 :            :         char *type_name;
    2471                 :         28 :         Key *k = NULL;
    2472                 :            :         u_char *cert;
    2473                 :            :         u_int len, pklen, sklen;
    2474                 :            :         int type;
    2475                 :            : #ifdef OPENSSL_HAS_ECC
    2476                 :            :         char *curve;
    2477                 :            :         BIGNUM *exponent;
    2478                 :            :         EC_POINT *q;
    2479                 :            : #endif
    2480                 :            : 
    2481                 :         28 :         type_name = buffer_get_string(blob, NULL);
    2482                 :         28 :         type = key_type_from_name(type_name);
    2483   [ -  -  -  -  :         28 :         switch (type) {
             -  -  +  -  
                      - ]
    2484                 :            :         case KEY_DSA:
    2485                 :          0 :                 k = key_new_private(type);
    2486                 :          0 :                 buffer_get_bignum2(blob, k->dsa->p);
    2487                 :          0 :                 buffer_get_bignum2(blob, k->dsa->q);
    2488                 :          0 :                 buffer_get_bignum2(blob, k->dsa->g);
    2489                 :          0 :                 buffer_get_bignum2(blob, k->dsa->pub_key);
    2490                 :          0 :                 buffer_get_bignum2(blob, k->dsa->priv_key);
    2491                 :          0 :                 break;
    2492                 :            :         case KEY_DSA_CERT_V00:
    2493                 :            :         case KEY_DSA_CERT:
    2494                 :          0 :                 cert = buffer_get_string(blob, &len);
    2495         [ #  # ]:          0 :                 if ((k = key_from_blob(cert, len)) == NULL)
    2496                 :          0 :                         fatal("Certificate parse failed");
    2497                 :          0 :                 free(cert);
    2498                 :          0 :                 key_add_private(k);
    2499                 :          0 :                 buffer_get_bignum2(blob, k->dsa->priv_key);
    2500                 :          0 :                 break;
    2501                 :            : #ifdef OPENSSL_HAS_ECC
    2502                 :            :         case KEY_ECDSA:
    2503                 :          0 :                 k = key_new_private(type);
    2504                 :          0 :                 k->ecdsa_nid = key_ecdsa_nid_from_name(type_name);
    2505                 :          0 :                 curve = buffer_get_string(blob, NULL);
    2506         [ #  # ]:          0 :                 if (k->ecdsa_nid != key_curve_name_to_nid(curve))
    2507                 :          0 :                         fatal("%s: curve names mismatch", __func__);
    2508                 :          0 :                 free(curve);
    2509                 :          0 :                 k->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
    2510         [ #  # ]:          0 :                 if (k->ecdsa == NULL)
    2511                 :          0 :                         fatal("%s: EC_KEY_new_by_curve_name failed",
    2512                 :            :                             __func__);
    2513                 :          0 :                 q = EC_POINT_new(EC_KEY_get0_group(k->ecdsa));
    2514         [ #  # ]:          0 :                 if (q == NULL)
    2515                 :          0 :                         fatal("%s: BN_new failed", __func__);
    2516         [ #  # ]:          0 :                 if ((exponent = BN_new()) == NULL)
    2517                 :          0 :                         fatal("%s: BN_new failed", __func__);
    2518                 :          0 :                 buffer_get_ecpoint(blob,
    2519                 :          0 :                         EC_KEY_get0_group(k->ecdsa), q);
    2520                 :          0 :                 buffer_get_bignum2(blob, exponent);
    2521         [ #  # ]:          0 :                 if (EC_KEY_set_public_key(k->ecdsa, q) != 1)
    2522                 :          0 :                         fatal("%s: EC_KEY_set_public_key failed",
    2523                 :            :                             __func__);
    2524         [ #  # ]:          0 :                 if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1)
    2525                 :          0 :                         fatal("%s: EC_KEY_set_private_key failed",
    2526                 :            :                             __func__);
    2527         [ #  # ]:          0 :                 if (key_ec_validate_public(EC_KEY_get0_group(k->ecdsa),
    2528                 :          0 :                     EC_KEY_get0_public_key(k->ecdsa)) != 0)
    2529                 :          0 :                         fatal("%s: bad ECDSA public key", __func__);
    2530         [ #  # ]:          0 :                 if (key_ec_validate_private(k->ecdsa) != 0)
    2531                 :          0 :                         fatal("%s: bad ECDSA private key", __func__);
    2532                 :          0 :                 BN_clear_free(exponent);
    2533                 :          0 :                 EC_POINT_free(q);
    2534                 :          0 :                 break;
    2535                 :            :         case KEY_ECDSA_CERT:
    2536                 :          0 :                 cert = buffer_get_string(blob, &len);
    2537         [ #  # ]:          0 :                 if ((k = key_from_blob(cert, len)) == NULL)
    2538                 :          0 :                         fatal("Certificate parse failed");
    2539                 :          0 :                 free(cert);
    2540                 :          0 :                 key_add_private(k);
    2541         [ #  # ]:          0 :                 if ((exponent = BN_new()) == NULL)
    2542                 :          0 :                         fatal("%s: BN_new failed", __func__);
    2543                 :          0 :                 buffer_get_bignum2(blob, exponent);
    2544         [ #  # ]:          0 :                 if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1)
    2545                 :          0 :                         fatal("%s: EC_KEY_set_private_key failed",
    2546                 :            :                             __func__);
    2547         [ #  # ]:          0 :                 if (key_ec_validate_public(EC_KEY_get0_group(k->ecdsa),
    2548         [ #  # ]:          0 :                     EC_KEY_get0_public_key(k->ecdsa)) != 0 ||
    2549                 :          0 :                     key_ec_validate_private(k->ecdsa) != 0)
    2550                 :          0 :                         fatal("%s: bad ECDSA key", __func__);
    2551                 :          0 :                 BN_clear_free(exponent);
    2552                 :          0 :                 break;
    2553                 :            : #endif
    2554                 :            :         case KEY_RSA:
    2555                 :          0 :                 k = key_new_private(type);
    2556                 :          0 :                 buffer_get_bignum2(blob, k->rsa->n);
    2557                 :          0 :                 buffer_get_bignum2(blob, k->rsa->e);
    2558                 :          0 :                 buffer_get_bignum2(blob, k->rsa->d);
    2559                 :          0 :                 buffer_get_bignum2(blob, k->rsa->iqmp);
    2560                 :          0 :                 buffer_get_bignum2(blob, k->rsa->p);
    2561                 :          0 :                 buffer_get_bignum2(blob, k->rsa->q);
    2562                 :            : 
    2563                 :            :                 /* Generate additional parameters */
    2564                 :          0 :                 rsa_generate_additional_parameters(k->rsa);
    2565                 :          0 :                 break;
    2566                 :            :         case KEY_RSA_CERT_V00:
    2567                 :            :         case KEY_RSA_CERT:
    2568                 :          0 :                 cert = buffer_get_string(blob, &len);
    2569         [ #  # ]:          0 :                 if ((k = key_from_blob(cert, len)) == NULL)
    2570                 :          0 :                         fatal("Certificate parse failed");
    2571                 :          0 :                 free(cert);
    2572                 :          0 :                 key_add_private(k);
    2573                 :          0 :                 buffer_get_bignum2(blob, k->rsa->d);
    2574                 :          0 :                 buffer_get_bignum2(blob, k->rsa->iqmp);
    2575                 :          0 :                 buffer_get_bignum2(blob, k->rsa->p);
    2576                 :          0 :                 buffer_get_bignum2(blob, k->rsa->q);
    2577                 :          0 :                 break;
    2578                 :            :         case KEY_ED25519:
    2579                 :         28 :                 k = key_new_private(type);
    2580                 :         28 :                 k->ed25519_pk = buffer_get_string(blob, &pklen);
    2581                 :         28 :                 k->ed25519_sk = buffer_get_string(blob, &sklen);
    2582         [ -  + ]:         28 :                 if (pklen != ED25519_PK_SZ)
    2583                 :          0 :                         fatal("%s: ed25519 pklen %d != %d",
    2584                 :            :                             __func__, pklen, ED25519_PK_SZ);
    2585         [ -  + ]:         28 :                 if (sklen != ED25519_SK_SZ)
    2586                 :          0 :                         fatal("%s: ed25519 sklen %d != %d",
    2587                 :            :                             __func__, sklen, ED25519_SK_SZ);
    2588                 :            :                 break;
    2589                 :            :         case KEY_ED25519_CERT:
    2590                 :          0 :                 cert = buffer_get_string(blob, &len);
    2591         [ #  # ]:          0 :                 if ((k = key_from_blob(cert, len)) == NULL)
    2592                 :          0 :                         fatal("Certificate parse failed");
    2593                 :          0 :                 free(cert);
    2594                 :          0 :                 key_add_private(k);
    2595                 :          0 :                 k->ed25519_pk = buffer_get_string(blob, &pklen);
    2596                 :          0 :                 k->ed25519_sk = buffer_get_string(blob, &sklen);
    2597         [ #  # ]:          0 :                 if (pklen != ED25519_PK_SZ)
    2598                 :          0 :                         fatal("%s: ed25519 pklen %d != %d",
    2599                 :            :                             __func__, pklen, ED25519_PK_SZ);
    2600         [ #  # ]:          0 :                 if (sklen != ED25519_SK_SZ)
    2601                 :          0 :                         fatal("%s: ed25519 sklen %d != %d",
    2602                 :            :                             __func__, sklen, ED25519_SK_SZ);
    2603                 :            :                 break;
    2604                 :            :         default:
    2605                 :          0 :                 free(type_name);
    2606                 :          0 :                 buffer_clear(blob);
    2607                 :          0 :                 return NULL;
    2608                 :            :         }
    2609                 :         28 :         free(type_name);
    2610                 :            : 
    2611                 :            :         /* enable blinding */
    2612 [ +  - ][ +  - ]:         28 :         switch (k->type) {
    2613                 :            :         case KEY_RSA:
    2614                 :            :         case KEY_RSA_CERT_V00:
    2615                 :            :         case KEY_RSA_CERT:
    2616                 :            :         case KEY_RSA1:
    2617         [ #  # ]:          0 :                 if (RSA_blinding_on(k->rsa, NULL) != 1) {
    2618                 :          0 :                         error("%s: RSA_blinding_on failed", __func__);
    2619                 :          0 :                         key_free(k);
    2620                 :         28 :                         return NULL;
    2621                 :            :                 }
    2622                 :            :                 break;
    2623                 :            :         }
    2624                 :         28 :         return k;
    2625                 :            : }

Generated by: LCOV version 1.9