diff options
author | tb <> | 2018-08-24 20:07:42 +0000 |
---|---|---|
committer | tb <> | 2018-08-24 20:07:42 +0000 |
commit | 41189be79309f39d1bf45f50b75751b6ac97529c (patch) | |
tree | a927084dd419f630a1ec6130a8df811d9d3bf37f | |
parent | 7e3bb11deae929ede0edfffa60cf9dc2d6be0b51 (diff) | |
download | openbsd-41189be79309f39d1bf45f50b75751b6ac97529c.tar.gz openbsd-41189be79309f39d1bf45f50b75751b6ac97529c.tar.bz2 openbsd-41189be79309f39d1bf45f50b75751b6ac97529c.zip |
Remove EVP_PKEY2PKCS8_broken() and PKCS8_set_broken()
Provide PKCS8_pkey_add1_attr_by_NID() and PKCS8_pkey_get0_attrs().
Remove the whole broken code and simplify pkcs8_priv_key_info_st
accordingly. Based on OpenSSL commit
54dbf42398e23349b59f258a3dd60387bbc5ba13 plus some const that was
added later.
tested in a bulk build by sthen
ok jsing
-rw-r--r-- | src/lib/libcrypto/Symbols.list | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/p8_pkey.c | 75 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/evp_pkey.c | 32 | ||||
-rw-r--r-- | src/lib/libcrypto/pkcs12/p12_attr.c | 12 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509.h | 21 |
5 files changed, 46 insertions, 98 deletions
diff --git a/src/lib/libcrypto/Symbols.list b/src/lib/libcrypto/Symbols.list index 191e967e34..ea5c93995b 100644 --- a/src/lib/libcrypto/Symbols.list +++ b/src/lib/libcrypto/Symbols.list | |||
@@ -1350,7 +1350,6 @@ EVP_PBE_cleanup | |||
1350 | EVP_PBE_find | 1350 | EVP_PBE_find |
1351 | EVP_PKCS82PKEY | 1351 | EVP_PKCS82PKEY |
1352 | EVP_PKEY2PKCS8 | 1352 | EVP_PKEY2PKCS8 |
1353 | EVP_PKEY2PKCS8_broken | ||
1354 | EVP_PKEY_CTX_ctrl | 1353 | EVP_PKEY_CTX_ctrl |
1355 | EVP_PKEY_CTX_ctrl_str | 1354 | EVP_PKEY_CTX_ctrl_str |
1356 | EVP_PKEY_CTX_dup | 1355 | EVP_PKEY_CTX_dup |
@@ -2193,9 +2192,10 @@ PKCS8_PRIV_KEY_INFO_new | |||
2193 | PKCS8_add_keyusage | 2192 | PKCS8_add_keyusage |
2194 | PKCS8_decrypt | 2193 | PKCS8_decrypt |
2195 | PKCS8_encrypt | 2194 | PKCS8_encrypt |
2195 | PKCS8_pkey_add1_attr_by_NID | ||
2196 | PKCS8_pkey_get0 | 2196 | PKCS8_pkey_get0 |
2197 | PKCS8_pkey_get0_attrs | ||
2197 | PKCS8_pkey_set0 | 2198 | PKCS8_pkey_set0 |
2198 | PKCS8_set_broken | ||
2199 | PKEY_USAGE_PERIOD_free | 2199 | PKEY_USAGE_PERIOD_free |
2200 | PKEY_USAGE_PERIOD_it | 2200 | PKEY_USAGE_PERIOD_it |
2201 | PKEY_USAGE_PERIOD_new | 2201 | PKEY_USAGE_PERIOD_new |
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 | |||
145 | PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, int version, | 142 | PKCS8_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 | |||
179 | PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, const unsigned char **pk, int *ppklen, | 157 | PKCS8_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 | |||
171 | const STACK_OF(X509_ATTRIBUTE) * | ||
172 | PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8) | ||
173 | { | ||
174 | return p8->attributes; | ||
175 | } | ||
176 | |||
177 | int | ||
178 | PKCS8_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 | |||
diff --git a/src/lib/libcrypto/evp/evp_pkey.c b/src/lib/libcrypto/evp/evp_pkey.c index 6e0d5cc3a2..aa075d6392 100644 --- a/src/lib/libcrypto/evp/evp_pkey.c +++ b/src/lib/libcrypto/evp/evp_pkey.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: evp_pkey.c,v 1.20 2018/05/13 06:48:00 tb Exp $ */ | 1 | /* $OpenBSD: evp_pkey.c,v 1.21 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 | */ |
@@ -105,16 +105,10 @@ error: | |||
105 | return NULL; | 105 | return NULL; |
106 | } | 106 | } |
107 | 107 | ||
108 | PKCS8_PRIV_KEY_INFO * | ||
109 | EVP_PKEY2PKCS8(EVP_PKEY *pkey) | ||
110 | { | ||
111 | return EVP_PKEY2PKCS8_broken(pkey, PKCS8_OK); | ||
112 | } | ||
113 | |||
114 | /* Turn a private key into a PKCS8 structure */ | 108 | /* Turn a private key into a PKCS8 structure */ |
115 | 109 | ||
116 | PKCS8_PRIV_KEY_INFO * | 110 | PKCS8_PRIV_KEY_INFO * |
117 | EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken) | 111 | EVP_PKEY2PKCS8(EVP_PKEY *pkey) |
118 | { | 112 | { |
119 | PKCS8_PRIV_KEY_INFO *p8; | 113 | PKCS8_PRIV_KEY_INFO *p8; |
120 | 114 | ||
@@ -122,7 +116,6 @@ EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken) | |||
122 | EVPerror(ERR_R_MALLOC_FAILURE); | 116 | EVPerror(ERR_R_MALLOC_FAILURE); |
123 | return NULL; | 117 | return NULL; |
124 | } | 118 | } |
125 | p8->broken = broken; | ||
126 | 119 | ||
127 | if (pkey->ameth) { | 120 | if (pkey->ameth) { |
128 | if (pkey->ameth->priv_encode) { | 121 | if (pkey->ameth->priv_encode) { |
@@ -145,27 +138,6 @@ error: | |||
145 | return NULL; | 138 | return NULL; |
146 | } | 139 | } |
147 | 140 | ||
148 | PKCS8_PRIV_KEY_INFO * | ||
149 | PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken) | ||
150 | { | ||
151 | switch (broken) { | ||
152 | case PKCS8_OK: | ||
153 | p8->broken = PKCS8_OK; | ||
154 | return p8; | ||
155 | break; | ||
156 | |||
157 | case PKCS8_NO_OCTET: | ||
158 | p8->broken = PKCS8_NO_OCTET; | ||
159 | p8->pkey->type = V_ASN1_SEQUENCE; | ||
160 | return p8; | ||
161 | break; | ||
162 | |||
163 | default: | ||
164 | EVPerror(EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE); | ||
165 | return NULL; | ||
166 | } | ||
167 | } | ||
168 | |||
169 | /* EVP_PKEY attribute functions */ | 141 | /* EVP_PKEY attribute functions */ |
170 | 142 | ||
171 | int | 143 | int |
diff --git a/src/lib/libcrypto/pkcs12/p12_attr.c b/src/lib/libcrypto/pkcs12/p12_attr.c index 78d510b100..65bfaa039e 100644 --- a/src/lib/libcrypto/pkcs12/p12_attr.c +++ b/src/lib/libcrypto/pkcs12/p12_attr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: p12_attr.c,v 1.11 2018/05/13 14:15:01 tb Exp $ */ | 1 | /* $OpenBSD: p12_attr.c,v 1.12 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 | */ |
@@ -77,14 +77,10 @@ PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen) | |||
77 | int | 77 | int |
78 | PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage) | 78 | PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage) |
79 | { | 79 | { |
80 | unsigned char us_val; | 80 | unsigned char us_val = (unsigned char)usage; |
81 | 81 | ||
82 | us_val = (unsigned char) usage; | 82 | return PKCS8_pkey_add1_attr_by_NID(p8, NID_key_usage, V_ASN1_BIT_STRING, |
83 | if (X509at_add1_attr_by_NID(&p8->attributes, NID_key_usage, | 83 | &us_val, 1); |
84 | V_ASN1_BIT_STRING, &us_val, 1)) | ||
85 | return 1; | ||
86 | else | ||
87 | return 0; | ||
88 | } | 84 | } |
89 | 85 | ||
90 | /* Add a friendlyname to a safebag */ | 86 | /* Add a friendlyname to a safebag */ |
diff --git a/src/lib/libcrypto/x509/x509.h b/src/lib/libcrypto/x509/x509.h index 25af8314b2..6c1f8eb6e9 100644 --- a/src/lib/libcrypto/x509/x509.h +++ b/src/lib/libcrypto/x509/x509.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509.h,v 1.71 2018/08/24 19:59:32 tb Exp $ */ | 1 | /* $OpenBSD: x509.h,v 1.72 2018/08/24 20:07:42 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -561,19 +561,12 @@ X509_ALGOR *prf; | |||
561 | 561 | ||
562 | /* PKCS#8 private key info structure */ | 562 | /* PKCS#8 private key info structure */ |
563 | 563 | ||
564 | struct pkcs8_priv_key_info_st | 564 | struct pkcs8_priv_key_info_st { |
565 | { | ||
566 | int broken; /* Flag for various broken formats */ | ||
567 | #define PKCS8_OK 0 | ||
568 | #define PKCS8_NO_OCTET 1 | ||
569 | #define PKCS8_EMBEDDED_PARAM 2 | ||
570 | #define PKCS8_NS_DB 3 | ||
571 | #define PKCS8_NEG_PRIVKEY 4 | ||
572 | ASN1_INTEGER *version; | 565 | ASN1_INTEGER *version; |
573 | X509_ALGOR *pkeyalg; | 566 | X509_ALGOR *pkeyalg; |
574 | ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */ | 567 | ASN1_OCTET_STRING *pkey; |
575 | STACK_OF(X509_ATTRIBUTE) *attributes; | 568 | STACK_OF(X509_ATTRIBUTE) *attributes; |
576 | }; | 569 | }; |
577 | 570 | ||
578 | #ifdef __cplusplus | 571 | #ifdef __cplusplus |
579 | } | 572 | } |
@@ -1296,8 +1289,6 @@ extern const ASN1_ITEM PKCS8_PRIV_KEY_INFO_it; | |||
1296 | 1289 | ||
1297 | EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); | 1290 | EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); |
1298 | PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); | 1291 | PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); |
1299 | PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); | ||
1300 | PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); | ||
1301 | 1292 | ||
1302 | int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, | 1293 | int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, |
1303 | int version, int ptype, void *pval, | 1294 | int version, int ptype, void *pval, |
@@ -1307,6 +1298,10 @@ int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, | |||
1307 | X509_ALGOR **pa, | 1298 | X509_ALGOR **pa, |
1308 | PKCS8_PRIV_KEY_INFO *p8); | 1299 | PKCS8_PRIV_KEY_INFO *p8); |
1309 | 1300 | ||
1301 | const STACK_OF(X509_ATTRIBUTE) *PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8); | ||
1302 | int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type, | ||
1303 | const unsigned char *bytes, int len); | ||
1304 | |||
1310 | int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, | 1305 | int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, |
1311 | int ptype, void *pval, | 1306 | int ptype, void *pval, |
1312 | unsigned char *penc, int penclen); | 1307 | unsigned char *penc, int penclen); |