OpenCoverage

d2i_pr.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/asn1/d2i_pr.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: d2i_pr.c,v 1.16 2018/04/14 07:09:21 tb Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60-
61#include <openssl/opensslconf.h>-
62-
63#include <openssl/asn1.h>-
64#include <openssl/bn.h>-
65#include <openssl/err.h>-
66#include <openssl/evp.h>-
67#include <openssl/objects.h>-
68#include <openssl/x509.h>-
69-
70#ifndef OPENSSL_NO_ENGINE-
71#include <openssl/engine.h>-
72#endif-
73-
74#include "asn1_locl.h"-
75-
76EVP_PKEY *-
77d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, long length)-
78{-
79 EVP_PKEY *ret;-
80-
81 if ((a == NULL) || (*a == NULL)) {
(a == ((void *)0) )Description
TRUEevaluated 65 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
(*a == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0-65
82 if ((ret = EVP_PKEY_new()) == NULL) {
(ret = EVP_PKE...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 65 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-65
83 ASN1error(ERR_R_EVP_LIB);-
84 return (NULL);
never executed: return ( ((void *)0) );
0
85 }-
86 } else {
executed 65 times by 5 tests: end of block
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
65
87 ret = *a;-
88#ifndef OPENSSL_NO_ENGINE-
89 ENGINE_finish(ret->engine);-
90 ret->engine = NULL;-
91#endif-
92 }
never executed: end of block
0
93-
94 if (!EVP_PKEY_set_type(ret, type)) {
!EVP_PKEY_set_type(ret, type)Description
TRUEnever evaluated
FALSEevaluated 65 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-65
95 ASN1error(ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE);-
96 goto err;
never executed: goto err;
0
97 }-
98-
99 if (!ret->ameth->old_priv_decode ||
!ret->ameth->old_priv_decodeDescription
TRUEnever evaluated
FALSEevaluated 65 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-65
100 !ret->ameth->old_priv_decode(ret, pp, length)) {
!ret->ameth->o...t, pp, length)Description
TRUEnever evaluated
FALSEevaluated 65 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-65
101 if (ret->ameth->priv_decode) {
ret->ameth->priv_decodeDescription
TRUEnever evaluated
FALSEnever evaluated
0
102 PKCS8_PRIV_KEY_INFO *p8 = NULL;-
103 p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, pp, length);-
104 if (!p8)
!p8Description
TRUEnever evaluated
FALSEnever evaluated
0
105 goto err;
never executed: goto err;
0
106 EVP_PKEY_free(ret);-
107 ret = EVP_PKCS82PKEY(p8);-
108 PKCS8_PRIV_KEY_INFO_free(p8);-
109 } else {
never executed: end of block
0
110 ASN1error(ERR_R_ASN1_LIB);-
111 goto err;
never executed: goto err;
0
112 }-
113 }-
114 if (a != NULL)
a != ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 65 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-65
115 (*a) = ret;
never executed: (*a) = ret;
0
116 return (ret);
executed 65 times by 5 tests: return (ret);
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
65
117-
118err:-
119 if (a == NULL || *a != ret)
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*a != retDescription
TRUEnever evaluated
FALSEnever evaluated
0
120 EVP_PKEY_free(ret);
never executed: EVP_PKEY_free(ret);
0
121 return (NULL);
never executed: return ( ((void *)0) );
0
122}-
123-
124/* This works like d2i_PrivateKey() except it automatically works out the type */-
125-
126EVP_PKEY *-
127d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, long length)-
128{-
129 STACK_OF(ASN1_TYPE) *inkey;-
130 const unsigned char *p;-
131 int keytype;-
132-
133 p = *pp;-
134 /* Dirty trick: read in the ASN1 data into a STACK_OF(ASN1_TYPE):-
135 * by analyzing it we can determine the passed structure: this-
136 * assumes the input is surrounded by an ASN1 SEQUENCE.-
137 */-
138 inkey = d2i_ASN1_SEQUENCE_ANY(NULL, &p, length);-
139 /* Since we only need to discern "traditional format" RSA and DSA-
140 * keys we can just count the elements.-
141 */-
142 if (sk_ASN1_TYPE_num(inkey) == 6)
sk_num(((_STAC...YPE*)0))) == 6Description
TRUEnever evaluated
FALSEnever evaluated
0
143 keytype = EVP_PKEY_DSA;
never executed: keytype = 116;
0
144 else if (sk_ASN1_TYPE_num(inkey) == 4)
sk_num(((_STAC...YPE*)0))) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
145 keytype = EVP_PKEY_EC;
never executed: keytype = 408;
0
146 else if (sk_ASN1_TYPE_num(inkey) == 3) {
sk_num(((_STAC...YPE*)0))) == 3Description
TRUEnever evaluated
FALSEnever evaluated
0
147 /* This seems to be PKCS8, not traditional format */-
148 PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(-
149 NULL, pp, length);-
150 EVP_PKEY *ret;-
151-
152 sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free);-
153 if (!p8) {
!p8Description
TRUEnever evaluated
FALSEnever evaluated
0
154 ASN1error(ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE);-
155 return NULL;
never executed: return ((void *)0) ;
0
156 }-
157 ret = EVP_PKCS82PKEY(p8);-
158 PKCS8_PRIV_KEY_INFO_free(p8);-
159 if (a) {
aDescription
TRUEnever evaluated
FALSEnever evaluated
0
160 *a = ret;-
161 }
never executed: end of block
0
162 return ret;
never executed: return ret;
0
163 } else-
164 keytype = EVP_PKEY_RSA;
never executed: keytype = 6;
0
165 sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free);-
166 return d2i_PrivateKey(keytype, a, pp, length);
never executed: return d2i_PrivateKey(keytype, a, pp, length);
0
167}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2