summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/p8_pkey.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/asn1/p8_pkey.c75
1 files changed, 30 insertions, 45 deletions
diff --git a/src/lib/libcrypto/asn1/p8_pkey.c b/src/lib/libcrypto/asn1/p8_pkey.c
index 71d579456a..8f5e303e41 100644
--- a/src/lib/libcrypto/asn1/p8_pkey.c
+++ b/src/lib/libcrypto/asn1/p8_pkey.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p8_pkey.c,v 1.17 2015/09/10 15:56:25 jsing Exp $ */ 1/* $OpenBSD: p8_pkey.c,v 1.18 2018/08/24 20:07:41 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 1999. 3 * project 1999.
4 */ 4 */
@@ -69,11 +69,8 @@ pkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
69 /* Since the structure must still be valid use ASN1_OP_FREE_PRE */ 69 /* Since the structure must still be valid use ASN1_OP_FREE_PRE */
70 if (operation == ASN1_OP_FREE_PRE) { 70 if (operation == ASN1_OP_FREE_PRE) {
71 PKCS8_PRIV_KEY_INFO *key = (PKCS8_PRIV_KEY_INFO *)*pval; 71 PKCS8_PRIV_KEY_INFO *key = (PKCS8_PRIV_KEY_INFO *)*pval;
72 if (key->pkey != NULL && 72 if (key->pkey != NULL)
73 key->pkey->type == V_ASN1_OCTET_STRING && 73 explicit_bzero(key->pkey->data, key->pkey->length);
74 key->pkey->value.octet_string != NULL)
75 explicit_bzero(key->pkey->value.octet_string->data,
76 key->pkey->value.octet_string->length);
77 } 74 }
78 return 1; 75 return 1;
79} 76}
@@ -95,7 +92,7 @@ static const ASN1_TEMPLATE PKCS8_PRIV_KEY_INFO_seq_tt[] = {
95 { 92 {
96 .offset = offsetof(PKCS8_PRIV_KEY_INFO, pkey), 93 .offset = offsetof(PKCS8_PRIV_KEY_INFO, pkey),
97 .field_name = "pkey", 94 .field_name = "pkey",
98 .item = &ASN1_ANY_it, 95 .item = &ASN1_OCTET_STRING_it,
99 }, 96 },
100 { 97 {
101 .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL, 98 .flags = ASN1_TFLG_IMPLICIT | ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL,
@@ -145,33 +142,14 @@ int
145PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, int version, 142PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, int version,
146 int ptype, void *pval, unsigned char *penc, int penclen) 143 int ptype, void *pval, unsigned char *penc, int penclen)
147{ 144{
148 unsigned char **ppenc = NULL;
149
150 if (version >= 0) { 145 if (version >= 0) {
151 if (!ASN1_INTEGER_set(priv->version, version)) 146 if (!ASN1_INTEGER_set(priv->version, version))
152 return 0; 147 return 0;
153 } 148 }
154 if (penc) { 149 if (!X509_ALGOR_set0(priv->pkeyalg, aobj, ptype, pval))
155 int pmtype;
156 ASN1_OCTET_STRING *oct;
157 oct = ASN1_OCTET_STRING_new();
158 if (!oct)
159 return 0;
160 oct->data = penc;
161 ppenc = &oct->data;
162 oct->length = penclen;
163 if (priv->broken == PKCS8_NO_OCTET)
164 pmtype = V_ASN1_SEQUENCE;
165 else
166 pmtype = V_ASN1_OCTET_STRING;
167 ASN1_TYPE_set(priv->pkey, pmtype, oct);
168 }
169 if (!X509_ALGOR_set0(priv->pkeyalg, aobj, ptype, pval)) {
170 /* If call fails do not swallow 'enc' */
171 if (ppenc)
172 *ppenc = NULL;
173 return 0; 150 return 0;
174 } 151 if (penc != NULL)
152 ASN1_STRING_set0(priv->pkey, penc, penclen);
175 return 1; 153 return 1;
176} 154}
177 155
@@ -179,23 +157,30 @@ int
179PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, const unsigned char **pk, int *ppklen, 157PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, const unsigned char **pk, int *ppklen,
180 X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8) 158 X509_ALGOR **pa, PKCS8_PRIV_KEY_INFO *p8)
181{ 159{
182 if (ppkalg) 160 if (ppkalg != NULL)
183 *ppkalg = p8->pkeyalg->algorithm; 161 *ppkalg = p8->pkeyalg->algorithm;
184 if (p8->pkey->type == V_ASN1_OCTET_STRING) { 162 if (pk != NULL) {
185 p8->broken = PKCS8_OK; 163 *pk = ASN1_STRING_data(p8->pkey);
186 if (pk) { 164 *ppklen = ASN1_STRING_length(p8->pkey);
187 *pk = p8->pkey->value.octet_string->data; 165 }
188 *ppklen = p8->pkey->value.octet_string->length; 166 if (pa != NULL)
189 }
190 } else if (p8->pkey->type == V_ASN1_SEQUENCE) {
191 p8->broken = PKCS8_NO_OCTET;
192 if (pk) {
193 *pk = p8->pkey->value.sequence->data;
194 *ppklen = p8->pkey->value.sequence->length;
195 }
196 } else
197 return 0;
198 if (pa)
199 *pa = p8->pkeyalg; 167 *pa = p8->pkeyalg;
200 return 1; 168 return 1;
201} 169}
170
171const STACK_OF(X509_ATTRIBUTE) *
172PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8)
173{
174 return p8->attributes;
175}
176
177int
178PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type,
179 const unsigned char *bytes, int len)
180{
181 if (X509at_add1_attr_by_NID(&p8->attributes, nid, type, bytes,
182 len) != NULL)
183 return 1;
184 return 0;
185}
186