1*b0d17251Schristos /*
2*b0d17251Schristos * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved.
3*b0d17251Schristos *
4*b0d17251Schristos * Licensed under the Apache License 2.0 (the "License"). You may not use
5*b0d17251Schristos * this file except in compliance with the License. You can obtain a copy
6*b0d17251Schristos * in the file LICENSE in the source distribution or at
7*b0d17251Schristos * https://www.openssl.org/source/license.html
8*b0d17251Schristos */
9*b0d17251Schristos
10*b0d17251Schristos #include <stdio.h>
11*b0d17251Schristos #include "internal/cryptlib.h"
12*b0d17251Schristos #include <openssl/conf.h>
13*b0d17251Schristos #include <openssl/asn1.h>
14*b0d17251Schristos #include <openssl/asn1t.h>
15*b0d17251Schristos #include <openssl/x509v3.h>
16*b0d17251Schristos #include "crypto/x509.h"
17*b0d17251Schristos #include "ext_dat.h"
18*b0d17251Schristos
19*b0d17251Schristos static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
20*b0d17251Schristos AUTHORITY_KEYID *akeyid,
21*b0d17251Schristos STACK_OF(CONF_VALUE)
22*b0d17251Schristos *extlist);
23*b0d17251Schristos static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
24*b0d17251Schristos X509V3_CTX *ctx,
25*b0d17251Schristos STACK_OF(CONF_VALUE) *values);
26*b0d17251Schristos
27*b0d17251Schristos const X509V3_EXT_METHOD ossl_v3_akey_id = {
28*b0d17251Schristos NID_authority_key_identifier,
29*b0d17251Schristos X509V3_EXT_MULTILINE, ASN1_ITEM_ref(AUTHORITY_KEYID),
30*b0d17251Schristos 0, 0, 0, 0,
31*b0d17251Schristos 0, 0,
32*b0d17251Schristos (X509V3_EXT_I2V) i2v_AUTHORITY_KEYID,
33*b0d17251Schristos (X509V3_EXT_V2I)v2i_AUTHORITY_KEYID,
34*b0d17251Schristos 0, 0,
35*b0d17251Schristos NULL
36*b0d17251Schristos };
37*b0d17251Schristos
STACK_OF(CONF_VALUE)38*b0d17251Schristos static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
39*b0d17251Schristos AUTHORITY_KEYID *akeyid,
40*b0d17251Schristos STACK_OF(CONF_VALUE)
41*b0d17251Schristos *extlist)
42*b0d17251Schristos {
43*b0d17251Schristos char *tmp = NULL;
44*b0d17251Schristos STACK_OF(CONF_VALUE) *origextlist = extlist, *tmpextlist;
45*b0d17251Schristos
46*b0d17251Schristos if (akeyid->keyid) {
47*b0d17251Schristos tmp = OPENSSL_buf2hexstr(akeyid->keyid->data, akeyid->keyid->length);
48*b0d17251Schristos if (tmp == NULL) {
49*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
50*b0d17251Schristos return NULL;
51*b0d17251Schristos }
52*b0d17251Schristos if (!X509V3_add_value((akeyid->issuer || akeyid->serial) ? "keyid" : NULL,
53*b0d17251Schristos tmp, &extlist)) {
54*b0d17251Schristos OPENSSL_free(tmp);
55*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, ERR_R_X509_LIB);
56*b0d17251Schristos goto err;
57*b0d17251Schristos }
58*b0d17251Schristos OPENSSL_free(tmp);
59*b0d17251Schristos }
60*b0d17251Schristos if (akeyid->issuer) {
61*b0d17251Schristos tmpextlist = i2v_GENERAL_NAMES(NULL, akeyid->issuer, extlist);
62*b0d17251Schristos if (tmpextlist == NULL) {
63*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, ERR_R_X509_LIB);
64*b0d17251Schristos goto err;
65*b0d17251Schristos }
66*b0d17251Schristos extlist = tmpextlist;
67*b0d17251Schristos }
68*b0d17251Schristos if (akeyid->serial) {
69*b0d17251Schristos tmp = OPENSSL_buf2hexstr(akeyid->serial->data, akeyid->serial->length);
70*b0d17251Schristos if (tmp == NULL) {
71*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
72*b0d17251Schristos goto err;
73*b0d17251Schristos }
74*b0d17251Schristos if (!X509V3_add_value("serial", tmp, &extlist)) {
75*b0d17251Schristos OPENSSL_free(tmp);
76*b0d17251Schristos goto err;
77*b0d17251Schristos }
78*b0d17251Schristos OPENSSL_free(tmp);
79*b0d17251Schristos }
80*b0d17251Schristos return extlist;
81*b0d17251Schristos err:
82*b0d17251Schristos if (origextlist == NULL)
83*b0d17251Schristos sk_CONF_VALUE_pop_free(extlist, X509V3_conf_free);
84*b0d17251Schristos return NULL;
85*b0d17251Schristos }
86*b0d17251Schristos
87*b0d17251Schristos /*-
88*b0d17251Schristos * Currently two options:
89*b0d17251Schristos * keyid: use the issuers subject keyid, the value 'always' means its is
90*b0d17251Schristos * an error if the issuer certificate doesn't have a key id.
91*b0d17251Schristos * issuer: use the issuers cert issuer and serial number. The default is
92*b0d17251Schristos * to only use this if keyid is not present. With the option 'always'
93*b0d17251Schristos * this is always included.
94*b0d17251Schristos */
95*b0d17251Schristos
v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD * method,X509V3_CTX * ctx,STACK_OF (CONF_VALUE)* values)96*b0d17251Schristos static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
97*b0d17251Schristos X509V3_CTX *ctx,
98*b0d17251Schristos STACK_OF(CONF_VALUE) *values)
99*b0d17251Schristos {
100*b0d17251Schristos char keyid = 0, issuer = 0;
101*b0d17251Schristos int i, n = sk_CONF_VALUE_num(values);
102*b0d17251Schristos CONF_VALUE *cnf;
103*b0d17251Schristos ASN1_OCTET_STRING *ikeyid = NULL;
104*b0d17251Schristos X509_NAME *isname = NULL;
105*b0d17251Schristos GENERAL_NAMES *gens = NULL;
106*b0d17251Schristos GENERAL_NAME *gen = NULL;
107*b0d17251Schristos ASN1_INTEGER *serial = NULL;
108*b0d17251Schristos X509_EXTENSION *ext;
109*b0d17251Schristos X509 *issuer_cert;
110*b0d17251Schristos int same_issuer, ss;
111*b0d17251Schristos AUTHORITY_KEYID *akeyid = AUTHORITY_KEYID_new();
112*b0d17251Schristos
113*b0d17251Schristos if (akeyid == NULL)
114*b0d17251Schristos goto err;
115*b0d17251Schristos
116*b0d17251Schristos if (n == 1 && strcmp(sk_CONF_VALUE_value(values, 0)->name, "none") == 0) {
117*b0d17251Schristos return akeyid;
118*b0d17251Schristos }
119*b0d17251Schristos
120*b0d17251Schristos for (i = 0; i < n; i++) {
121*b0d17251Schristos cnf = sk_CONF_VALUE_value(values, i);
122*b0d17251Schristos if (strcmp(cnf->name, "keyid") == 0) {
123*b0d17251Schristos keyid = 1;
124*b0d17251Schristos if (cnf->value && strcmp(cnf->value, "always") == 0)
125*b0d17251Schristos keyid = 2;
126*b0d17251Schristos } else if (strcmp(cnf->name, "issuer") == 0) {
127*b0d17251Schristos issuer = 1;
128*b0d17251Schristos if (cnf->value && strcmp(cnf->value, "always") == 0)
129*b0d17251Schristos issuer = 2;
130*b0d17251Schristos } else {
131*b0d17251Schristos ERR_raise_data(ERR_LIB_X509V3, X509V3_R_UNKNOWN_OPTION,
132*b0d17251Schristos "name=%s", cnf->name);
133*b0d17251Schristos goto err;
134*b0d17251Schristos }
135*b0d17251Schristos }
136*b0d17251Schristos
137*b0d17251Schristos if (ctx != NULL && (ctx->flags & X509V3_CTX_TEST) != 0)
138*b0d17251Schristos return akeyid;
139*b0d17251Schristos
140*b0d17251Schristos if (ctx == NULL) {
141*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, ERR_R_PASSED_NULL_PARAMETER);
142*b0d17251Schristos goto err;
143*b0d17251Schristos }
144*b0d17251Schristos if ((issuer_cert = ctx->issuer_cert) == NULL) {
145*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, X509V3_R_NO_ISSUER_CERTIFICATE);
146*b0d17251Schristos goto err;
147*b0d17251Schristos }
148*b0d17251Schristos same_issuer = ctx->subject_cert == ctx->issuer_cert;
149*b0d17251Schristos ERR_set_mark();
150*b0d17251Schristos if (ctx->issuer_pkey != NULL)
151*b0d17251Schristos ss = X509_check_private_key(ctx->subject_cert, ctx->issuer_pkey);
152*b0d17251Schristos else
153*b0d17251Schristos ss = same_issuer;
154*b0d17251Schristos ERR_pop_to_mark();
155*b0d17251Schristos
156*b0d17251Schristos /* unless forced with "always", AKID is suppressed for self-signed certs */
157*b0d17251Schristos if (keyid == 2 || (keyid == 1 && !ss)) {
158*b0d17251Schristos /*
159*b0d17251Schristos * prefer any pre-existing subject key identifier of the issuer cert
160*b0d17251Schristos * except issuer cert is same as subject cert and is not self-signed
161*b0d17251Schristos */
162*b0d17251Schristos i = X509_get_ext_by_NID(issuer_cert, NID_subject_key_identifier, -1);
163*b0d17251Schristos if (i >= 0 && (ext = X509_get_ext(issuer_cert, i)) != NULL
164*b0d17251Schristos && !(same_issuer && !ss))
165*b0d17251Schristos ikeyid = X509V3_EXT_d2i(ext);
166*b0d17251Schristos if (ikeyid == NULL && same_issuer && ctx->issuer_pkey != NULL) {
167*b0d17251Schristos /* generate fallback AKID, emulating s2i_skey_id(..., "hash") */
168*b0d17251Schristos X509_PUBKEY *pubkey = NULL;
169*b0d17251Schristos
170*b0d17251Schristos if (X509_PUBKEY_set(&pubkey, ctx->issuer_pkey))
171*b0d17251Schristos ikeyid = ossl_x509_pubkey_hash(pubkey);
172*b0d17251Schristos X509_PUBKEY_free(pubkey);
173*b0d17251Schristos }
174*b0d17251Schristos if ((keyid == 2 || issuer == 0)
175*b0d17251Schristos && (ikeyid == NULL
176*b0d17251Schristos || ASN1_STRING_length(ikeyid) <= 2) /* indicating "none" */) {
177*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID);
178*b0d17251Schristos goto err;
179*b0d17251Schristos }
180*b0d17251Schristos }
181*b0d17251Schristos
182*b0d17251Schristos if (issuer == 2 || (issuer == 1 && ikeyid == NULL)) {
183*b0d17251Schristos isname = X509_NAME_dup(X509_get_issuer_name(issuer_cert));
184*b0d17251Schristos serial = ASN1_INTEGER_dup(X509_get0_serialNumber(issuer_cert));
185*b0d17251Schristos if (isname == NULL || serial == NULL) {
186*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS);
187*b0d17251Schristos goto err;
188*b0d17251Schristos }
189*b0d17251Schristos }
190*b0d17251Schristos
191*b0d17251Schristos if (isname != NULL) {
192*b0d17251Schristos if ((gens = sk_GENERAL_NAME_new_null()) == NULL
193*b0d17251Schristos || (gen = GENERAL_NAME_new()) == NULL
194*b0d17251Schristos || !sk_GENERAL_NAME_push(gens, gen)) {
195*b0d17251Schristos ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
196*b0d17251Schristos goto err;
197*b0d17251Schristos }
198*b0d17251Schristos gen->type = GEN_DIRNAME;
199*b0d17251Schristos gen->d.dirn = isname;
200*b0d17251Schristos }
201*b0d17251Schristos
202*b0d17251Schristos akeyid->issuer = gens;
203*b0d17251Schristos gen = NULL;
204*b0d17251Schristos gens = NULL;
205*b0d17251Schristos akeyid->serial = serial;
206*b0d17251Schristos akeyid->keyid = ikeyid;
207*b0d17251Schristos
208*b0d17251Schristos return akeyid;
209*b0d17251Schristos
210*b0d17251Schristos err:
211*b0d17251Schristos sk_GENERAL_NAME_free(gens);
212*b0d17251Schristos GENERAL_NAME_free(gen);
213*b0d17251Schristos X509_NAME_free(isname);
214*b0d17251Schristos ASN1_INTEGER_free(serial);
215*b0d17251Schristos ASN1_OCTET_STRING_free(ikeyid);
216*b0d17251Schristos AUTHORITY_KEYID_free(akeyid);
217*b0d17251Schristos return NULL;
218*b0d17251Schristos }
219