OpenCoverage

pem_pk8.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/pem/pem_pk8.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.-
3 *-
4 * Licensed under the OpenSSL license (the "License"). You may not use-
5 * this file except in compliance with the License. You can obtain a copy-
6 * in the file LICENSE in the source distribution or at-
7 * https://www.openssl.org/source/license.html-
8 */-
9-
10#include <stdio.h>-
11#include "internal/cryptlib.h"-
12#include <openssl/buffer.h>-
13#include <openssl/objects.h>-
14#include <openssl/evp.h>-
15#include <openssl/x509.h>-
16#include <openssl/pkcs12.h>-
17#include <openssl/pem.h>-
18-
19static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder,-
20 int nid, const EVP_CIPHER *enc,-
21 char *kstr, int klen, pem_password_cb *cb, void *u);-
22-
23#ifndef OPENSSL_NO_STDIO-
24static int do_pk8pkey_fp(FILE *bp, EVP_PKEY *x, int isder,-
25 int nid, const EVP_CIPHER *enc,-
26 char *kstr, int klen, pem_password_cb *cb, void *u);-
27#endif-
28/*-
29 * These functions write a private key in PKCS#8 format: it is a "drop in"-
30 * replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'-
31 * is NULL then it uses the unencrypted private key form. The 'nid' versions-
32 * uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0.-
33 */-
34-
35int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,-
36 char *kstr, int klen,-
37 pem_password_cb *cb, void *u)-
38{-
39 return do_pk8pkey(bp, x, 0, nid, NULL, kstr, klen, cb, u);
never executed: return do_pk8pkey(bp, x, 0, nid, ((void *)0) , kstr, klen, cb, u);
0
40}-
41-
42int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,-
43 char *kstr, int klen,-
44 pem_password_cb *cb, void *u)-
45{-
46 return do_pk8pkey(bp, x, 0, -1, enc, kstr, klen, cb, u);
executed 25 times by 1 test: return do_pk8pkey(bp, x, 0, -1, enc, kstr, klen, cb, u);
Executed by:
  • libcrypto.so.1.1
25
47}-
48-
49int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,-
50 char *kstr, int klen,-
51 pem_password_cb *cb, void *u)-
52{-
53 return do_pk8pkey(bp, x, 1, -1, enc, kstr, klen, cb, u);
never executed: return do_pk8pkey(bp, x, 1, -1, enc, kstr, klen, cb, u);
0
54}-
55-
56int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid,-
57 char *kstr, int klen,-
58 pem_password_cb *cb, void *u)-
59{-
60 return do_pk8pkey(bp, x, 1, nid, NULL, kstr, klen, cb, u);
never executed: return do_pk8pkey(bp, x, 1, nid, ((void *)0) , kstr, klen, cb, u);
0
61}-
62-
63static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid,-
64 const EVP_CIPHER *enc, char *kstr, int klen,-
65 pem_password_cb *cb, void *u)-
66{-
67 X509_SIG *p8;-
68 PKCS8_PRIV_KEY_INFO *p8inf;-
69 char buf[PEM_BUFSIZE];-
70 int ret;-
71-
72 if ((p8inf = EVP_PKEY2PKCS8(x)) == NULL) {
(p8inf = EVP_P...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 25 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-25
73 PEMerr(PEM_F_DO_PK8PKEY, PEM_R_ERROR_CONVERTING_PRIVATE_KEY);-
74 return 0;
never executed: return 0;
0
75 }-
76 if (enc || (nid != -1)) {
encDescription
TRUEnever evaluated
FALSEevaluated 25 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(nid != -1)Description
TRUEnever evaluated
FALSEevaluated 25 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-25
77 if (!kstr) {
!kstrDescription
TRUEnever evaluated
FALSEnever evaluated
0
78 if (!cb)
!cbDescription
TRUEnever evaluated
FALSEnever evaluated
0
79 klen = PEM_def_callback(buf, PEM_BUFSIZE, 1, u);
never executed: klen = PEM_def_callback(buf, 1024, 1, u);
0
80 else-
81 klen = cb(buf, PEM_BUFSIZE, 1, u);
never executed: klen = cb(buf, 1024, 1, u);
0
82 if (klen <= 0) {
klen <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
83 PEMerr(PEM_F_DO_PK8PKEY, PEM_R_READ_KEY);-
84 PKCS8_PRIV_KEY_INFO_free(p8inf);-
85 return 0;
never executed: return 0;
0
86 }-
87-
88 kstr = buf;-
89 }
never executed: end of block
0
90 p8 = PKCS8_encrypt(nid, enc, kstr, klen, NULL, 0, 0, p8inf);-
91 if (kstr == buf)
kstr == bufDescription
TRUEnever evaluated
FALSEnever evaluated
0
92 OPENSSL_cleanse(buf, klen);
never executed: OPENSSL_cleanse(buf, klen);
0
93 PKCS8_PRIV_KEY_INFO_free(p8inf);-
94 if (p8 == NULL)
p8 == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
95 return 0;
never executed: return 0;
0
96 if (isder)
isderDescription
TRUEnever evaluated
FALSEnever evaluated
0
97 ret = i2d_PKCS8_bio(bp, p8);
never executed: ret = i2d_PKCS8_bio(bp, p8);
0
98 else-
99 ret = PEM_write_bio_PKCS8(bp, p8);
never executed: ret = PEM_write_bio_PKCS8(bp, p8);
0
100 X509_SIG_free(p8);-
101 return ret;
never executed: return ret;
0
102 } else {-
103 if (isder)
isderDescription
TRUEnever evaluated
FALSEevaluated 25 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-25
104 ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
never executed: ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
0
105 else-
106 ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(bp, p8inf);
executed 25 times by 1 test: ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(bp, p8inf);
Executed by:
  • libcrypto.so.1.1
25
107 PKCS8_PRIV_KEY_INFO_free(p8inf);-
108 return ret;
executed 25 times by 1 test: return ret;
Executed by:
  • libcrypto.so.1.1
25
109 }-
110}-
111-
112EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb,-
113 void *u)-
114{-
115 PKCS8_PRIV_KEY_INFO *p8inf = NULL;-
116 X509_SIG *p8 = NULL;-
117 int klen;-
118 EVP_PKEY *ret;-
119 char psbuf[PEM_BUFSIZE];-
120 p8 = d2i_PKCS8_bio(bp, NULL);-
121 if (!p8)
!p8Description
TRUEnever evaluated
FALSEnever evaluated
0
122 return NULL;
never executed: return ((void *)0) ;
0
123 if (cb)
cbDescription
TRUEnever evaluated
FALSEnever evaluated
0
124 klen = cb(psbuf, PEM_BUFSIZE, 0, u);
never executed: klen = cb(psbuf, 1024, 0, u);
0
125 else-
126 klen = PEM_def_callback(psbuf, PEM_BUFSIZE, 0, u);
never executed: klen = PEM_def_callback(psbuf, 1024, 0, u);
0
127 if (klen < 0) {
klen < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
128 PEMerr(PEM_F_D2I_PKCS8PRIVATEKEY_BIO, PEM_R_BAD_PASSWORD_READ);-
129 X509_SIG_free(p8);-
130 return NULL;
never executed: return ((void *)0) ;
0
131 }-
132 p8inf = PKCS8_decrypt(p8, psbuf, klen);-
133 X509_SIG_free(p8);-
134 OPENSSL_cleanse(psbuf, klen);-
135 if (!p8inf)
!p8infDescription
TRUEnever evaluated
FALSEnever evaluated
0
136 return NULL;
never executed: return ((void *)0) ;
0
137 ret = EVP_PKCS82PKEY(p8inf);-
138 PKCS8_PRIV_KEY_INFO_free(p8inf);-
139 if (!ret)
!retDescription
TRUEnever evaluated
FALSEnever evaluated
0
140 return NULL;
never executed: return ((void *)0) ;
0
141 if (x) {
xDescription
TRUEnever evaluated
FALSEnever evaluated
0
142 EVP_PKEY_free(*x);-
143 *x = ret;-
144 }
never executed: end of block
0
145 return ret;
never executed: return ret;
0
146}-
147-
148#ifndef OPENSSL_NO_STDIO-
149-
150int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,-
151 char *kstr, int klen, pem_password_cb *cb, void *u)-
152{-
153 return do_pk8pkey_fp(fp, x, 1, -1, enc, kstr, klen, cb, u);
never executed: return do_pk8pkey_fp(fp, x, 1, -1, enc, kstr, klen, cb, u);
0
154}-
155-
156int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid,-
157 char *kstr, int klen,-
158 pem_password_cb *cb, void *u)-
159{-
160 return do_pk8pkey_fp(fp, x, 1, nid, NULL, kstr, klen, cb, u);
never executed: return do_pk8pkey_fp(fp, x, 1, nid, ((void *)0) , kstr, klen, cb, u);
0
161}-
162-
163int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,-
164 char *kstr, int klen,-
165 pem_password_cb *cb, void *u)-
166{-
167 return do_pk8pkey_fp(fp, x, 0, nid, NULL, kstr, klen, cb, u);
never executed: return do_pk8pkey_fp(fp, x, 0, nid, ((void *)0) , kstr, klen, cb, u);
0
168}-
169-
170int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,-
171 char *kstr, int klen, pem_password_cb *cb,-
172 void *u)-
173{-
174 return do_pk8pkey_fp(fp, x, 0, -1, enc, kstr, klen, cb, u);
never executed: return do_pk8pkey_fp(fp, x, 0, -1, enc, kstr, klen, cb, u);
0
175}-
176-
177static int do_pk8pkey_fp(FILE *fp, EVP_PKEY *x, int isder, int nid,-
178 const EVP_CIPHER *enc, char *kstr, int klen,-
179 pem_password_cb *cb, void *u)-
180{-
181 BIO *bp;-
182 int ret;-
183-
184 if ((bp = BIO_new_fp(fp, BIO_NOCLOSE)) == NULL) {
(bp = BIO_new_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
185 PEMerr(PEM_F_DO_PK8PKEY_FP, ERR_R_BUF_LIB);-
186 return 0;
never executed: return 0;
0
187 }-
188 ret = do_pk8pkey(bp, x, isder, nid, enc, kstr, klen, cb, u);-
189 BIO_free(bp);-
190 return ret;
never executed: return ret;
0
191}-
192-
193EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb,-
194 void *u)-
195{-
196 BIO *bp;-
197 EVP_PKEY *ret;-
198-
199 if ((bp = BIO_new_fp(fp, BIO_NOCLOSE)) == NULL) {
(bp = BIO_new_...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
200 PEMerr(PEM_F_D2I_PKCS8PRIVATEKEY_FP, ERR_R_BUF_LIB);-
201 return NULL;
never executed: return ((void *)0) ;
0
202 }-
203 ret = d2i_PKCS8PrivateKey_bio(bp, x, cb, u);-
204 BIO_free(bp);-
205 return ret;
never executed: return ret;
0
206}-
207-
208#endif-
209-
210IMPLEMENT_PEM_rw(PKCS8, X509_SIG, PEM_STRING_PKCS8, X509_SIG)
never executed: return PEM_ASN1_read_bio((d2i_of_void *)d2i_X509_SIG, "ENCRYPTED PRIVATE KEY",bp,(void **)x,cb,u);
never executed: return PEM_ASN1_read((d2i_of_void *)d2i_X509_SIG, "ENCRYPTED PRIVATE KEY",fp,(void **)x,cb,u);
never executed: return PEM_ASN1_write_bio((i2d_of_void *)i2d_X509_SIG,"ENCRYPTED PRIVATE KEY",bp,x, ((void *)0) , ((void *)0) ,0, ((void *)0) , ((void *)0) );
never executed: return PEM_ASN1_write((i2d_of_void *)i2d_X509_SIG,"ENCRYPTED PRIVATE KEY",fp,x, ((void *)0) , ((void *)0) ,0, ((void *)0) , ((void *)0) );
0
211-
212-
213IMPLEMENT_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO, PEM_STRING_PKCS8INF,
never executed: return PEM_ASN1_read_bio((d2i_of_void *)d2i_PKCS8_PRIV_KEY_INFO, "PRIVATE KEY",bp,(void **)x,cb,u);
never executed: return PEM_ASN1_read((d2i_of_void *)d2i_PKCS8_PRIV_KEY_INFO, "PRIVATE KEY",fp,(void **)x,cb,u);
executed 25 times by 1 test: return PEM_ASN1_write_bio((i2d_of_void *)i2d_PKCS8_PRIV_KEY_INFO,"PRIVATE KEY",bp,x, ((void *)0) , ((void *)0) ,0, ((void *)0) , ((void *)0) );
Executed by:
  • libcrypto.so.1.1
never executed: return PEM_ASN1_write((i2d_of_void *)i2d_PKCS8_PRIV_KEY_INFO,"PRIVATE KEY",fp,x, ((void *)0) , ((void *)0) ,0, ((void *)0) , ((void *)0) );
0-25
214 PKCS8_PRIV_KEY_INFO)-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2