Coverage Report

Created: 2025-12-31 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl35/crypto/cmp/cmp_asn.c
Line
Count
Source
1
/*
2
 * Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright Nokia 2007-2019
4
 * Copyright Siemens AG 2015-2019
5
 *
6
 * Licensed under the Apache License 2.0 (the "License").  You may not use
7
 * this file except in compliance with the License.  You can obtain a copy
8
 * in the file LICENSE in the source distribution or at
9
 * https://www.openssl.org/source/license.html
10
 */
11
12
#include <openssl/asn1t.h>
13
14
#include "cmp_local.h"
15
#include "internal/crmf.h"
16
17
/* explicit #includes not strictly needed since implied by the above: */
18
#include <openssl/cmp.h>
19
#include <openssl/crmf.h>
20
21
/* ASN.1 declarations from RFC 9810 */
22
ASN1_SEQUENCE(OSSL_CMP_REVANNCONTENT) = {
23
    /* OSSL_CMP_PKISTATUS is effectively ASN1_INTEGER so it is used directly */
24
    ASN1_SIMPLE(OSSL_CMP_REVANNCONTENT, status, ASN1_INTEGER),
25
    ASN1_SIMPLE(OSSL_CMP_REVANNCONTENT, certId, OSSL_CRMF_CERTID),
26
    ASN1_SIMPLE(OSSL_CMP_REVANNCONTENT, willBeRevokedAt, ASN1_GENERALIZEDTIME),
27
    ASN1_SIMPLE(OSSL_CMP_REVANNCONTENT, badSinceDate, ASN1_GENERALIZEDTIME),
28
    ASN1_OPT(OSSL_CMP_REVANNCONTENT, crlDetails, X509_EXTENSIONS)
29
52
} ASN1_SEQUENCE_END(OSSL_CMP_REVANNCONTENT)
30
52
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_REVANNCONTENT)
31
52
32
52
ASN1_SEQUENCE(OSSL_CMP_CHALLENGE) = {
33
52
    ASN1_OPT(OSSL_CMP_CHALLENGE, owf, X509_ALGOR),
34
52
    ASN1_SIMPLE(OSSL_CMP_CHALLENGE, witness, ASN1_OCTET_STRING),
35
52
    ASN1_SIMPLE(OSSL_CMP_CHALLENGE, challenge, ASN1_OCTET_STRING)
36
4.05k
} ASN1_SEQUENCE_END(OSSL_CMP_CHALLENGE)
37
4.05k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CHALLENGE)
38
4.05k
39
4.05k
ASN1_ITEM_TEMPLATE(OSSL_CMP_POPODECKEYCHALLCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
40
4.05k
    OSSL_CMP_POPODECKEYCHALLCONTENT, OSSL_CMP_CHALLENGE)
41
12.4k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_POPODECKEYCHALLCONTENT)
42
43
ASN1_ITEM_TEMPLATE(OSSL_CMP_POPODECKEYRESPCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
44
    OSSL_CMP_POPODECKEYRESPCONTENT, ASN1_INTEGER)
45
10.7k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_POPODECKEYRESPCONTENT)
46
47
ASN1_SEQUENCE(OSSL_CMP_CAKEYUPDANNCONTENT) = {
48
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
49
    ASN1_SIMPLE(OSSL_CMP_CAKEYUPDANNCONTENT, oldWithNew, X509),
50
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
51
    ASN1_SIMPLE(OSSL_CMP_CAKEYUPDANNCONTENT, newWithOld, X509),
52
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
53
    ASN1_SIMPLE(OSSL_CMP_CAKEYUPDANNCONTENT, newWithNew, X509)
54
482
} ASN1_SEQUENCE_END(OSSL_CMP_CAKEYUPDANNCONTENT)
55
482
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CAKEYUPDANNCONTENT)
56
482
57
482
ASN1_SEQUENCE(OSSL_CMP_ERRORMSGCONTENT) = {
58
482
    ASN1_SIMPLE(OSSL_CMP_ERRORMSGCONTENT, pKIStatusInfo, OSSL_CMP_PKISI),
59
482
    ASN1_OPT(OSSL_CMP_ERRORMSGCONTENT, errorCode, ASN1_INTEGER),
60
482
    /* OSSL_CMP_PKIFREETEXT is a ASN1_UTF8STRING sequence, so used directly */
61
482
    ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ERRORMSGCONTENT, errorDetails,
62
482
        ASN1_UTF8STRING)
63
87.3k
} ASN1_SEQUENCE_END(OSSL_CMP_ERRORMSGCONTENT)
64
87.3k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_ERRORMSGCONTENT)
65
87.3k
66
87.3k
ASN1_ADB_TEMPLATE(infotypeandvalue_default) = ASN1_OPT(OSSL_CMP_ITAV,
67
87.3k
    infoValue.other,
68
87.3k
    ASN1_ANY);
69
87.3k
/* ITAV means InfoTypeAndValue */
70
87.3k
ASN1_ADB(OSSL_CMP_ITAV) = {
71
87.3k
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
72
87.3k
    ADB_ENTRY(NID_id_it_caProtEncCert, ASN1_OPT(OSSL_CMP_ITAV, infoValue.caProtEncCert, X509)),
73
87.3k
    ADB_ENTRY(NID_id_it_signKeyPairTypes,
74
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV,
75
87.3k
            infoValue.signKeyPairTypes, X509_ALGOR)),
76
87.3k
    ADB_ENTRY(NID_id_it_encKeyPairTypes,
77
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV,
78
87.3k
            infoValue.encKeyPairTypes, X509_ALGOR)),
79
87.3k
    ADB_ENTRY(NID_id_it_preferredSymmAlg,
80
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.preferredSymmAlg,
81
87.3k
            X509_ALGOR)),
82
87.3k
    ADB_ENTRY(NID_id_it_caKeyUpdateInfo,
83
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.caKeyUpdateInfo,
84
87.3k
            OSSL_CMP_CAKEYUPDANNCONTENT)),
85
87.3k
    ADB_ENTRY(NID_id_it_currentCRL,
86
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.currentCRL, X509_CRL)),
87
87.3k
    ADB_ENTRY(NID_id_it_unsupportedOIDs,
88
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV,
89
87.3k
            infoValue.unsupportedOIDs, ASN1_OBJECT)),
90
87.3k
    ADB_ENTRY(NID_id_it_keyPairParamReq,
91
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.keyPairParamReq,
92
87.3k
            ASN1_OBJECT)),
93
87.3k
    ADB_ENTRY(NID_id_it_keyPairParamRep,
94
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.keyPairParamRep,
95
87.3k
            X509_ALGOR)),
96
87.3k
    ADB_ENTRY(NID_id_it_revPassphrase,
97
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.revPassphrase,
98
87.3k
            OSSL_CRMF_ENCRYPTEDVALUE)),
99
87.3k
    ADB_ENTRY(NID_id_it_implicitConfirm,
100
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.implicitConfirm,
101
87.3k
            ASN1_NULL)),
102
87.3k
    ADB_ENTRY(NID_id_it_confirmWaitTime,
103
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.confirmWaitTime,
104
87.3k
            ASN1_GENERALIZEDTIME)),
105
87.3k
    ADB_ENTRY(NID_id_it_origPKIMessage,
106
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.origPKIMessage,
107
87.3k
            OSSL_CMP_MSGS)),
108
87.3k
    ADB_ENTRY(NID_id_it_suppLangTags,
109
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV, infoValue.suppLangTagsValue,
110
87.3k
            ASN1_UTF8STRING)),
111
87.3k
    ADB_ENTRY(NID_id_it_caCerts,
112
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV, infoValue.caCerts, X509)),
113
87.3k
    ADB_ENTRY(NID_id_it_rootCaCert,
114
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.rootCaCert, X509)),
115
87.3k
    ADB_ENTRY(NID_id_it_rootCaKeyUpdate,
116
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.rootCaKeyUpdate,
117
87.3k
            OSSL_CMP_ROOTCAKEYUPDATE)),
118
87.3k
    ADB_ENTRY(NID_id_it_certReqTemplate,
119
87.3k
        ASN1_OPT(OSSL_CMP_ITAV, infoValue.certReqTemplate,
120
87.3k
            OSSL_CMP_CERTREQTEMPLATE)),
121
87.3k
    ADB_ENTRY(NID_id_it_certProfile,
122
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV, infoValue.certProfile,
123
87.3k
            ASN1_UTF8STRING)),
124
87.3k
    ADB_ENTRY(NID_id_it_crlStatusList,
125
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV, infoValue.crlStatusList,
126
87.3k
            OSSL_CMP_CRLSTATUS)),
127
87.3k
    ADB_ENTRY(NID_id_it_crls,
128
87.3k
        ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ITAV, infoValue.crls, X509_CRL))
129
827k
} ASN1_ADB_END(OSSL_CMP_ITAV, 0, infoType, 0, &infotypeandvalue_default_tt, NULL);
130
131
ASN1_SEQUENCE(OSSL_CMP_ITAV) = {
132
    ASN1_SIMPLE(OSSL_CMP_ITAV, infoType, ASN1_OBJECT),
133
    ASN1_ADB_OBJECT(OSSL_CMP_ITAV)
134
664k
} ASN1_SEQUENCE_END(OSSL_CMP_ITAV)
135
664k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_ITAV)
136
664k
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CMP_ITAV)
137
664k
138
664k
ASN1_SEQUENCE(OSSL_CMP_ROOTCAKEYUPDATE) = {
139
664k
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
140
664k
    ASN1_SIMPLE(OSSL_CMP_ROOTCAKEYUPDATE, newWithNew, X509),
141
664k
    ASN1_EXP_OPT(OSSL_CMP_ROOTCAKEYUPDATE, newWithOld, X509, 0),
142
664k
    ASN1_EXP_OPT(OSSL_CMP_ROOTCAKEYUPDATE, oldWithNew, X509, 1)
143
664k
} ASN1_SEQUENCE_END(OSSL_CMP_ROOTCAKEYUPDATE)
144
83
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_ROOTCAKEYUPDATE)
145
83
146
83
ASN1_ITEM_TEMPLATE(OSSL_CMP_ATAVS) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
147
83
    OSSL_CMP_ATAVS, OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
148
83
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_ATAVS)
149
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_ATAVS)
150
151
ASN1_SEQUENCE(OSSL_CMP_CERTREQTEMPLATE) = {
152
    ASN1_SIMPLE(OSSL_CMP_CERTREQTEMPLATE, certTemplate, OSSL_CRMF_CERTTEMPLATE),
153
    ASN1_SEQUENCE_OF_OPT(OSSL_CMP_CERTREQTEMPLATE, keySpec,
154
        OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
155
92
} ASN1_SEQUENCE_END(OSSL_CMP_CERTREQTEMPLATE)
156
92
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CERTREQTEMPLATE)
157
92
158
92
ASN1_CHOICE(OSSL_CMP_CRLSOURCE) = {
159
92
    ASN1_EXP(OSSL_CMP_CRLSOURCE, value.dpn, DIST_POINT_NAME, 0),
160
92
    ASN1_EXP(OSSL_CMP_CRLSOURCE, value.issuer, GENERAL_NAMES, 1),
161
274
} ASN1_CHOICE_END(OSSL_CMP_CRLSOURCE)
162
274
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CRLSOURCE)
163
274
#define OSSL_CMP_CRLSOURCE_DPN 0
164
0
#define OSSL_CMP_CRLSOURCE_ISSUER 1
165
166
ASN1_SEQUENCE(OSSL_CMP_CRLSTATUS) = {
167
    ASN1_SIMPLE(OSSL_CMP_CRLSTATUS, source, OSSL_CMP_CRLSOURCE),
168
    ASN1_OPT(OSSL_CMP_CRLSTATUS, thisUpdate, ASN1_TIME)
169
108
} ASN1_SEQUENCE_END(OSSL_CMP_CRLSTATUS)
170
108
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CRLSTATUS)
171
108
172
108
OSSL_CMP_ITAV *OSSL_CMP_ITAV_create(ASN1_OBJECT *type, ASN1_TYPE *value)
173
108
{
174
0
    OSSL_CMP_ITAV *itav;
175
176
0
    if (type == NULL || (itav = OSSL_CMP_ITAV_new()) == NULL)
177
0
        return NULL;
178
0
    OSSL_CMP_ITAV_set0(itav, type, value);
179
0
    return itav;
180
0
}
181
182
void OSSL_CMP_ITAV_set0(OSSL_CMP_ITAV *itav, ASN1_OBJECT *type,
183
    ASN1_TYPE *value)
184
0
{
185
0
    itav->infoType = type;
186
0
    itav->infoValue.other = value;
187
0
}
188
189
ASN1_OBJECT *OSSL_CMP_ITAV_get0_type(const OSSL_CMP_ITAV *itav)
190
0
{
191
0
    if (itav == NULL)
192
0
        return NULL;
193
0
    return itav->infoType;
194
0
}
195
196
ASN1_TYPE *OSSL_CMP_ITAV_get0_value(const OSSL_CMP_ITAV *itav)
197
0
{
198
0
    if (itav == NULL)
199
0
        return NULL;
200
0
    return itav->infoValue.other;
201
0
}
202
203
int OSSL_CMP_ITAV_push0_stack_item(STACK_OF(OSSL_CMP_ITAV) **itav_sk_p,
204
    OSSL_CMP_ITAV *itav)
205
0
{
206
0
    int created = 0;
207
208
0
    if (itav_sk_p == NULL || itav == NULL) {
209
0
        ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
210
0
        goto err;
211
0
    }
212
213
0
    if (*itav_sk_p == NULL) {
214
0
        if ((*itav_sk_p = sk_OSSL_CMP_ITAV_new_null()) == NULL)
215
0
            goto err;
216
0
        created = 1;
217
0
    }
218
0
    if (!sk_OSSL_CMP_ITAV_push(*itav_sk_p, itav))
219
0
        goto err;
220
0
    return 1;
221
222
0
err:
223
0
    if (created) {
224
0
        sk_OSSL_CMP_ITAV_free(*itav_sk_p);
225
0
        *itav_sk_p = NULL;
226
0
    }
227
0
    return 0;
228
0
}
229
230
OSSL_CMP_ITAV
231
*OSSL_CMP_ITAV_new0_certProfile(STACK_OF(ASN1_UTF8STRING) *certProfile)
232
0
{
233
0
    OSSL_CMP_ITAV *itav;
234
235
0
    if ((itav = OSSL_CMP_ITAV_new()) == NULL)
236
0
        return NULL;
237
0
    itav->infoType = OBJ_nid2obj(NID_id_it_certProfile);
238
0
    itav->infoValue.certProfile = certProfile;
239
0
    return itav;
240
0
}
241
242
int OSSL_CMP_ITAV_get0_certProfile(const OSSL_CMP_ITAV *itav,
243
    STACK_OF(ASN1_UTF8STRING) **out)
244
0
{
245
0
    if (itav == NULL || out == NULL) {
246
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
247
0
        return 0;
248
0
    }
249
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_certProfile) {
250
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
251
0
        return 0;
252
0
    }
253
0
    *out = itav->infoValue.certProfile;
254
0
    return 1;
255
0
}
256
257
OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_caCerts(const STACK_OF(X509) *caCerts)
258
0
{
259
0
    OSSL_CMP_ITAV *itav = OSSL_CMP_ITAV_new();
260
261
0
    if (itav == NULL)
262
0
        return NULL;
263
0
    if (sk_X509_num(caCerts) > 0
264
0
        && (itav->infoValue.caCerts = sk_X509_deep_copy(caCerts, X509_dup, X509_free)) == NULL) {
265
0
        OSSL_CMP_ITAV_free(itav);
266
0
        return NULL;
267
0
    }
268
0
    itav->infoType = OBJ_nid2obj(NID_id_it_caCerts);
269
0
    return itav;
270
0
}
271
272
int OSSL_CMP_ITAV_get0_caCerts(const OSSL_CMP_ITAV *itav, STACK_OF(X509) **out)
273
0
{
274
0
    if (itav == NULL || out == NULL) {
275
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
276
0
        return 0;
277
0
    }
278
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_caCerts) {
279
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
280
0
        return 0;
281
0
    }
282
0
    *out = sk_X509_num(itav->infoValue.caCerts) > 0
283
0
        ? itav->infoValue.caCerts
284
0
        : NULL;
285
0
    return 1;
286
0
}
287
288
OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_rootCaCert(const X509 *rootCaCert)
289
0
{
290
0
    OSSL_CMP_ITAV *itav = OSSL_CMP_ITAV_new();
291
292
0
    if (itav == NULL)
293
0
        return NULL;
294
0
    if (rootCaCert != NULL
295
0
        && (itav->infoValue.rootCaCert = X509_dup(rootCaCert)) == NULL) {
296
0
        OSSL_CMP_ITAV_free(itav);
297
0
        return NULL;
298
0
    }
299
0
    itav->infoType = OBJ_nid2obj(NID_id_it_rootCaCert);
300
0
    return itav;
301
0
}
302
303
int OSSL_CMP_ITAV_get0_rootCaCert(const OSSL_CMP_ITAV *itav, X509 **out)
304
0
{
305
0
    if (itav == NULL || out == NULL) {
306
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
307
0
        return 0;
308
0
    }
309
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_rootCaCert) {
310
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
311
0
        return 0;
312
0
    }
313
0
    *out = itav->infoValue.rootCaCert;
314
0
    return 1;
315
0
}
316
OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_rootCaKeyUpdate(const X509 *newWithNew,
317
    const X509 *newWithOld,
318
    const X509 *oldWithNew)
319
0
{
320
0
    OSSL_CMP_ITAV *itav;
321
0
    OSSL_CMP_ROOTCAKEYUPDATE *upd = NULL;
322
323
0
    if (newWithNew != NULL) {
324
0
        upd = OSSL_CMP_ROOTCAKEYUPDATE_new();
325
0
        if (upd == NULL)
326
0
            return NULL;
327
328
0
        if ((upd->newWithNew = X509_dup(newWithNew)) == NULL)
329
0
            goto err;
330
0
        if (newWithOld != NULL
331
0
            && (upd->newWithOld = X509_dup(newWithOld)) == NULL)
332
0
            goto err;
333
0
        if (oldWithNew != NULL
334
0
            && (upd->oldWithNew = X509_dup(oldWithNew)) == NULL)
335
0
            goto err;
336
0
    }
337
338
0
    if ((itav = OSSL_CMP_ITAV_new()) == NULL)
339
0
        goto err;
340
0
    itav->infoType = OBJ_nid2obj(NID_id_it_rootCaKeyUpdate);
341
0
    itav->infoValue.rootCaKeyUpdate = upd;
342
0
    return itav;
343
344
0
err:
345
0
    OSSL_CMP_ROOTCAKEYUPDATE_free(upd);
346
0
    return NULL;
347
0
}
348
349
int OSSL_CMP_ITAV_get0_rootCaKeyUpdate(const OSSL_CMP_ITAV *itav,
350
    X509 **newWithNew,
351
    X509 **newWithOld,
352
    X509 **oldWithNew)
353
0
{
354
0
    OSSL_CMP_ROOTCAKEYUPDATE *upd;
355
356
0
    if (itav == NULL || newWithNew == NULL) {
357
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
358
0
        return 0;
359
0
    }
360
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_rootCaKeyUpdate) {
361
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
362
0
        return 0;
363
0
    }
364
0
    upd = itav->infoValue.rootCaKeyUpdate;
365
0
    *newWithNew = upd != NULL ? upd->newWithNew : NULL;
366
0
    if (newWithOld != NULL)
367
0
        *newWithOld = upd != NULL ? upd->newWithOld : NULL;
368
0
    if (oldWithNew != NULL)
369
0
        *oldWithNew = upd != NULL ? upd->oldWithNew : NULL;
370
0
    return 1;
371
0
}
372
373
OSSL_CMP_ITAV
374
*OSSL_CMP_ITAV_new0_certReqTemplate(OSSL_CRMF_CERTTEMPLATE *certTemplate,
375
    OSSL_CMP_ATAVS *keySpec)
376
0
{
377
0
    OSSL_CMP_ITAV *itav;
378
0
    OSSL_CMP_CERTREQTEMPLATE *tmpl;
379
380
0
    if (certTemplate == NULL && keySpec != NULL) {
381
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
382
0
        return NULL;
383
0
    }
384
0
    if ((itav = OSSL_CMP_ITAV_new()) == NULL)
385
0
        return NULL;
386
0
    itav->infoType = OBJ_nid2obj(NID_id_it_certReqTemplate);
387
0
    if (certTemplate == NULL)
388
0
        return itav;
389
390
0
    if ((tmpl = OSSL_CMP_CERTREQTEMPLATE_new()) == NULL) {
391
0
        OSSL_CMP_ITAV_free(itav);
392
0
        return NULL;
393
0
    }
394
0
    itav->infoValue.certReqTemplate = tmpl;
395
0
    tmpl->certTemplate = certTemplate;
396
0
    tmpl->keySpec = keySpec;
397
0
    return itav;
398
0
}
399
400
int OSSL_CMP_ITAV_get1_certReqTemplate(const OSSL_CMP_ITAV *itav,
401
    OSSL_CRMF_CERTTEMPLATE **certTemplate,
402
    OSSL_CMP_ATAVS **keySpec)
403
0
{
404
0
    OSSL_CMP_CERTREQTEMPLATE *tpl;
405
406
0
    if (itav == NULL || certTemplate == NULL) {
407
0
        ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
408
0
        return 0;
409
0
    }
410
411
0
    *certTemplate = NULL;
412
0
    if (keySpec != NULL)
413
0
        *keySpec = NULL;
414
415
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_certReqTemplate) {
416
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
417
0
        return 0;
418
0
    }
419
0
    tpl = itav->infoValue.certReqTemplate;
420
0
    if (tpl == NULL) /* no requirements available */
421
0
        return 1;
422
423
0
    if ((*certTemplate = OSSL_CRMF_CERTTEMPLATE_dup(tpl->certTemplate)) == NULL)
424
0
        return 0;
425
0
    if (keySpec != NULL && tpl->keySpec != NULL) {
426
0
        int i, n = sk_OSSL_CMP_ATAV_num(tpl->keySpec);
427
428
0
        *keySpec = sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_reserve(NULL, n);
429
0
        if (*keySpec == NULL)
430
0
            goto err;
431
0
        for (i = 0; i < n; i++) {
432
0
            OSSL_CMP_ATAV *atav = sk_OSSL_CMP_ATAV_value(tpl->keySpec, i);
433
0
            ASN1_OBJECT *type = OSSL_CMP_ATAV_get0_type(atav /* may be NULL */);
434
0
            int nid;
435
0
            const char *name;
436
437
0
            if (type == NULL) {
438
0
                ERR_raise_data(ERR_LIB_CMP, CMP_R_INVALID_KEYSPEC,
439
0
                    "keySpec with index %d in certReqTemplate does not exist",
440
0
                    i);
441
0
                goto err;
442
0
            }
443
0
            nid = OBJ_obj2nid(type);
444
445
0
            if (nid != NID_id_regCtrl_algId
446
0
                && nid != NID_id_regCtrl_rsaKeyLen) {
447
0
                name = OBJ_nid2ln(nid);
448
0
                if (name == NULL)
449
0
                    name = OBJ_nid2sn(nid);
450
0
                if (name == NULL)
451
0
                    name = "<undef>";
452
0
                ERR_raise_data(ERR_LIB_CMP, CMP_R_INVALID_KEYSPEC,
453
0
                    "keySpec with index %d in certReqTemplate has invalid type %s",
454
0
                    i, name);
455
0
                goto err;
456
0
            }
457
0
            OSSL_CMP_ATAV_push1(keySpec, atav);
458
0
        }
459
0
    }
460
0
    return 1;
461
462
0
err:
463
0
    OSSL_CRMF_CERTTEMPLATE_free(*certTemplate);
464
0
    *certTemplate = NULL;
465
0
    sk_OSSL_CMP_ATAV_pop_free(*keySpec, OSSL_CMP_ATAV_free);
466
0
    if (keySpec != NULL)
467
0
        *keySpec = NULL;
468
0
    return 0;
469
0
}
470
471
OSSL_CMP_ATAV *OSSL_CMP_ATAV_create(ASN1_OBJECT *type, ASN1_TYPE *value)
472
0
{
473
0
    OSSL_CMP_ATAV *atav;
474
475
0
    if ((atav = OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new()) == NULL)
476
0
        return NULL;
477
0
    OSSL_CMP_ATAV_set0(atav, type, value);
478
0
    return atav;
479
0
}
480
481
void OSSL_CMP_ATAV_set0(OSSL_CMP_ATAV *atav, ASN1_OBJECT *type,
482
    ASN1_TYPE *value)
483
0
{
484
0
    atav->type = type;
485
0
    atav->value.other = value;
486
0
}
487
488
ASN1_OBJECT *OSSL_CMP_ATAV_get0_type(const OSSL_CMP_ATAV *atav)
489
0
{
490
0
    if (atav == NULL)
491
0
        return NULL;
492
0
    return atav->type;
493
0
}
494
495
OSSL_CMP_ATAV *OSSL_CMP_ATAV_new_algId(const X509_ALGOR *alg)
496
0
{
497
0
    X509_ALGOR *dup;
498
0
    OSSL_CMP_ATAV *res;
499
500
0
    if (alg == NULL) {
501
0
        ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
502
0
        return NULL;
503
0
    }
504
0
    if ((dup = X509_ALGOR_dup(alg)) == NULL)
505
0
        return NULL;
506
0
    res = OSSL_CMP_ATAV_create(OBJ_nid2obj(NID_id_regCtrl_algId),
507
0
        (ASN1_TYPE *)dup);
508
0
    if (res == NULL)
509
0
        X509_ALGOR_free(dup);
510
0
    return res;
511
0
}
512
513
X509_ALGOR *OSSL_CMP_ATAV_get0_algId(const OSSL_CMP_ATAV *atav)
514
0
{
515
0
    if (atav == NULL || OBJ_obj2nid(atav->type) != NID_id_regCtrl_algId)
516
0
        return NULL;
517
0
    return atav->value.algId;
518
0
}
519
520
OSSL_CMP_ATAV *OSSL_CMP_ATAV_new_rsaKeyLen(int len)
521
0
{
522
0
    ASN1_INTEGER *aint;
523
0
    OSSL_CMP_ATAV *res = NULL;
524
525
0
    if (len <= 0) {
526
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
527
0
        return NULL;
528
0
    }
529
0
    if ((aint = ASN1_INTEGER_new()) == NULL)
530
0
        return NULL;
531
0
    if (!ASN1_INTEGER_set(aint, len)
532
0
        || (res = OSSL_CMP_ATAV_create(OBJ_nid2obj(NID_id_regCtrl_rsaKeyLen),
533
0
                (ASN1_TYPE *)aint))
534
0
            == NULL)
535
0
        ASN1_INTEGER_free(aint);
536
0
    return res;
537
0
}
538
539
int OSSL_CMP_ATAV_get_rsaKeyLen(const OSSL_CMP_ATAV *atav)
540
0
{
541
0
    int64_t val;
542
543
0
    if (atav == NULL || OBJ_obj2nid(atav->type) != NID_id_regCtrl_rsaKeyLen
544
0
        || !ASN1_INTEGER_get_int64(&val, atav->value.rsaKeyLen))
545
0
        return -1;
546
0
    if (val <= 0 || val > INT_MAX)
547
0
        return -2;
548
0
    return (int)val;
549
0
}
550
551
ASN1_TYPE *OSSL_CMP_ATAV_get0_value(const OSSL_CMP_ATAV *atav)
552
0
{
553
0
    if (atav == NULL)
554
0
        return NULL;
555
0
    return atav->value.other;
556
0
}
557
558
int OSSL_CMP_ATAV_push1(OSSL_CMP_ATAVS **sk_p, const OSSL_CMP_ATAV *atav)
559
0
{
560
0
    int created = 0;
561
0
    OSSL_CMP_ATAV *dup;
562
563
0
    if (sk_p == NULL || atav == NULL) {
564
0
        ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
565
0
        goto err;
566
0
    }
567
568
0
    if (*sk_p == NULL) {
569
0
        if ((*sk_p = sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_null()) == NULL)
570
0
            goto err;
571
0
        created = 1;
572
0
    }
573
574
0
    if ((dup = OSSL_CRMF_ATTRIBUTETYPEANDVALUE_dup((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)atav)) == NULL)
575
0
        goto err;
576
0
    if (sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push(*sk_p, dup))
577
0
        return 1;
578
0
    OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(dup);
579
580
0
err:
581
0
    if (created) {
582
0
        sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(*sk_p);
583
0
        *sk_p = NULL;
584
0
    }
585
0
    return 0;
586
0
}
587
588
OSSL_CMP_ITAV
589
*OSSL_CMP_ITAV_new0_crlStatusList(STACK_OF(OSSL_CMP_CRLSTATUS) *crlStatusList)
590
0
{
591
0
    OSSL_CMP_ITAV *itav;
592
593
0
    if ((itav = OSSL_CMP_ITAV_new()) == NULL)
594
0
        return NULL;
595
0
    itav->infoType = OBJ_nid2obj(NID_id_it_crlStatusList);
596
0
    itav->infoValue.crlStatusList = crlStatusList;
597
0
    return itav;
598
0
}
599
600
int OSSL_CMP_ITAV_get0_crlStatusList(const OSSL_CMP_ITAV *itav,
601
    STACK_OF(OSSL_CMP_CRLSTATUS) **out)
602
0
{
603
0
    if (itav == NULL || out == NULL) {
604
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
605
0
        return 0;
606
0
    }
607
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_crlStatusList) {
608
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
609
0
        return 0;
610
0
    }
611
0
    *out = itav->infoValue.crlStatusList;
612
0
    return 1;
613
0
}
614
615
OSSL_CMP_CRLSTATUS *OSSL_CMP_CRLSTATUS_new1(const DIST_POINT_NAME *dpn,
616
    const GENERAL_NAMES *issuer,
617
    const ASN1_TIME *thisUpdate)
618
0
{
619
0
    OSSL_CMP_CRLSOURCE *crlsource;
620
0
    OSSL_CMP_CRLSTATUS *crlstatus;
621
622
0
    if (dpn == NULL && issuer == NULL) {
623
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
624
0
        return NULL;
625
0
    }
626
0
    if (dpn != NULL && issuer != NULL) {
627
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
628
0
        return NULL;
629
0
    }
630
631
0
    if ((crlstatus = OSSL_CMP_CRLSTATUS_new()) == NULL)
632
0
        return NULL;
633
0
    crlsource = crlstatus->source;
634
635
0
    if (dpn != NULL) {
636
0
        crlsource->type = OSSL_CMP_CRLSOURCE_DPN;
637
0
        if ((crlsource->value.dpn = DIST_POINT_NAME_dup(dpn)) == NULL)
638
0
            goto err;
639
0
    } else {
640
0
        crlsource->type = OSSL_CMP_CRLSOURCE_ISSUER;
641
0
        if ((crlsource->value.issuer = sk_GENERAL_NAME_deep_copy(issuer, GENERAL_NAME_dup,
642
0
                 GENERAL_NAME_free))
643
0
            == NULL)
644
0
            goto err;
645
0
    }
646
647
0
    if (thisUpdate != NULL
648
0
        && (crlstatus->thisUpdate = ASN1_TIME_dup(thisUpdate)) == NULL)
649
0
        goto err;
650
0
    return crlstatus;
651
652
0
err:
653
0
    OSSL_CMP_CRLSTATUS_free(crlstatus);
654
0
    return NULL;
655
0
}
656
657
static GENERAL_NAMES *gennames_new(const X509_NAME *nm)
658
0
{
659
0
    GENERAL_NAMES *names;
660
0
    GENERAL_NAME *name = NULL;
661
662
0
    if ((names = sk_GENERAL_NAME_new_reserve(NULL, 1)) == NULL)
663
0
        return NULL;
664
0
    if (!GENERAL_NAME_set1_X509_NAME(&name, nm)) {
665
0
        sk_GENERAL_NAME_free(names);
666
0
        return NULL;
667
0
    }
668
0
    (void)sk_GENERAL_NAME_push(names, name); /* cannot fail */
669
0
    return names;
670
0
}
671
672
static int gennames_allowed(GENERAL_NAMES *names, int only_DN)
673
0
{
674
0
    if (names == NULL)
675
0
        return 0;
676
0
    if (!only_DN)
677
0
        return 1;
678
0
    return sk_GENERAL_NAME_num(names) == 1
679
0
        && sk_GENERAL_NAME_value(names, 0)->type == GEN_DIRNAME;
680
0
}
681
682
OSSL_CMP_CRLSTATUS *OSSL_CMP_CRLSTATUS_create(const X509_CRL *crl,
683
    const X509 *cert, int only_DN)
684
0
{
685
0
    STACK_OF(DIST_POINT) *crldps = NULL;
686
0
    ISSUING_DIST_POINT *idp = NULL;
687
0
    DIST_POINT_NAME *dpn = NULL;
688
0
    AUTHORITY_KEYID *akid = NULL;
689
0
    GENERAL_NAMES *issuers = NULL;
690
0
    const GENERAL_NAMES *CRLissuer = NULL;
691
0
    const ASN1_TIME *last = crl == NULL ? NULL : X509_CRL_get0_lastUpdate(crl);
692
0
    OSSL_CMP_CRLSTATUS *status = NULL;
693
0
    int i, NID_akid = NID_authority_key_identifier;
694
695
    /*
696
     * Note:
697
     * X509{,_CRL}_get_ext_d2i(..., NID, ..., NULL) return the 1st extension with
698
     * given NID that is available, if any. If there are more, this is an error.
699
     */
700
0
    if (cert != NULL) {
701
0
        crldps = X509_get_ext_d2i(cert, NID_crl_distribution_points, NULL, NULL);
702
        /* if available, take the first suitable element */
703
0
        for (i = 0; i < sk_DIST_POINT_num(crldps); i++) {
704
0
            DIST_POINT *dp = sk_DIST_POINT_value(crldps, i);
705
706
0
            if (dp == NULL)
707
0
                continue;
708
0
            if ((dpn = dp->distpoint) != NULL) {
709
0
                CRLissuer = NULL;
710
0
                break;
711
0
            }
712
0
            if (gennames_allowed(dp->CRLissuer, only_DN) && CRLissuer == NULL)
713
                /* don't break because any dp->distpoint in list is preferred */
714
0
                CRLissuer = dp->CRLissuer;
715
0
        }
716
0
    } else {
717
0
        if (crl == NULL) {
718
0
            ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
719
0
            return NULL;
720
0
        }
721
0
        idp = X509_CRL_get_ext_d2i(crl,
722
0
            NID_issuing_distribution_point, NULL, NULL);
723
0
        if (idp != NULL && idp->distpoint != NULL)
724
0
            dpn = idp->distpoint;
725
0
    }
726
727
0
    if (dpn == NULL && CRLissuer == NULL) {
728
0
        if (cert != NULL) {
729
0
            akid = X509_get_ext_d2i(cert, NID_akid, NULL, NULL);
730
0
            if (akid != NULL && gennames_allowed(akid->issuer, only_DN))
731
0
                CRLissuer = akid->issuer;
732
0
            else
733
0
                CRLissuer = issuers = gennames_new(X509_get_issuer_name(cert));
734
0
        }
735
0
        if (CRLissuer == NULL && crl != NULL) {
736
0
            akid = X509_CRL_get_ext_d2i(crl, NID_akid, NULL, NULL);
737
0
            if (akid != NULL && gennames_allowed(akid->issuer, only_DN))
738
0
                CRLissuer = akid->issuer;
739
0
            else
740
0
                CRLissuer = issuers = gennames_new(X509_CRL_get_issuer(crl));
741
0
        }
742
0
        if (CRLissuer == NULL)
743
0
            goto end;
744
0
    }
745
746
0
    status = OSSL_CMP_CRLSTATUS_new1(dpn, CRLissuer, last);
747
0
end:
748
0
    sk_DIST_POINT_pop_free(crldps, DIST_POINT_free);
749
0
    ISSUING_DIST_POINT_free(idp);
750
0
    AUTHORITY_KEYID_free(akid);
751
0
    sk_GENERAL_NAME_pop_free(issuers, GENERAL_NAME_free);
752
0
    return status;
753
0
}
754
755
int OSSL_CMP_CRLSTATUS_get0(const OSSL_CMP_CRLSTATUS *crlstatus,
756
    DIST_POINT_NAME **dpn, GENERAL_NAMES **issuer,
757
    ASN1_TIME **thisUpdate)
758
0
{
759
0
    OSSL_CMP_CRLSOURCE *crlsource;
760
761
0
    if (crlstatus == NULL || dpn == NULL || issuer == NULL) {
762
0
        ERR_raise(ERR_LIB_CMP, CMP_R_NULL_ARGUMENT);
763
0
        return 0;
764
0
    }
765
0
    if ((crlsource = crlstatus->source) == NULL) {
766
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
767
0
        return 0;
768
0
    }
769
770
0
    if (crlsource->type == OSSL_CMP_CRLSOURCE_DPN) {
771
0
        *dpn = crlsource->value.dpn;
772
0
        *issuer = NULL;
773
0
    } else if (crlsource->type == OSSL_CMP_CRLSOURCE_ISSUER) {
774
0
        *dpn = NULL;
775
0
        *issuer = crlsource->value.issuer;
776
0
    } else {
777
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
778
0
        return 0;
779
0
    }
780
0
    if (thisUpdate != NULL)
781
0
        *thisUpdate = crlstatus->thisUpdate;
782
0
    return 1;
783
0
}
784
785
OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_crls(const X509_CRL *crl)
786
0
{
787
0
    OSSL_CMP_ITAV *itav;
788
0
    X509_CRL *crl_copy = NULL;
789
0
    STACK_OF(X509_CRL) *crls = NULL;
790
791
0
    if ((itav = OSSL_CMP_ITAV_new()) == NULL)
792
0
        return NULL;
793
794
0
    if (crl != NULL) {
795
0
        if ((crls = sk_X509_CRL_new_reserve(NULL, 1)) == NULL
796
0
            || (crl_copy = X509_CRL_dup(crl)) == NULL
797
0
            || !sk_X509_CRL_push(crls, crl_copy))
798
0
            goto err;
799
0
        crl_copy = NULL; /* ownership transferred to crls */
800
0
    }
801
802
0
    itav->infoType = OBJ_nid2obj(NID_id_it_crls);
803
0
    itav->infoValue.crls = crls;
804
0
    return itav;
805
806
0
err:
807
0
    OPENSSL_free(crl_copy);
808
0
    sk_X509_CRL_free(crls);
809
0
    OSSL_CMP_ITAV_free(itav);
810
0
    return NULL;
811
0
}
812
813
int OSSL_CMP_ITAV_get0_crls(const OSSL_CMP_ITAV *itav, STACK_OF(X509_CRL) **out)
814
0
{
815
0
    if (itav == NULL || out == NULL) {
816
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_NULL_PARAMETER);
817
0
        return 0;
818
0
    }
819
0
    if (OBJ_obj2nid(itav->infoType) != NID_id_it_crls) {
820
0
        ERR_raise(ERR_LIB_CMP, ERR_R_PASSED_INVALID_ARGUMENT);
821
0
        return 0;
822
0
    }
823
0
    *out = itav->infoValue.crls;
824
0
    return 1;
825
0
}
826
827
/* get ASN.1 encoded integer, return -2 on error; -1 is valid for certReqId */
828
int ossl_cmp_asn1_get_int(const ASN1_INTEGER *a)
829
151
{
830
151
    int64_t res;
831
832
151
    if (!ASN1_INTEGER_get_int64(&res, a)) {
833
11
        ERR_raise(ERR_LIB_CMP, ASN1_R_INVALID_NUMBER);
834
11
        return -2;
835
11
    }
836
140
    if (res < INT_MIN) {
837
45
        ERR_raise(ERR_LIB_CMP, ASN1_R_TOO_SMALL);
838
45
        return -2;
839
45
    }
840
95
    if (res > INT_MAX) {
841
3
        ERR_raise(ERR_LIB_CMP, ASN1_R_TOO_LARGE);
842
3
        return -2;
843
3
    }
844
92
    return (int)res;
845
95
}
846
847
static int ossl_cmp_msg_cb(int operation, ASN1_VALUE **pval,
848
    ossl_unused const ASN1_ITEM *it, void *exarg)
849
1.27M
{
850
1.27M
    OSSL_CMP_MSG *msg = (OSSL_CMP_MSG *)*pval;
851
852
1.27M
    switch (operation) {
853
139k
    case ASN1_OP_FREE_POST:
854
139k
        OPENSSL_free(msg->propq);
855
139k
        break;
856
857
0
    case ASN1_OP_DUP_POST: {
858
0
        OSSL_CMP_MSG *old = exarg;
859
860
0
        if (!ossl_cmp_msg_set0_libctx(msg, old->libctx, old->propq))
861
0
            return 0;
862
0
    } break;
863
0
    case ASN1_OP_GET0_LIBCTX: {
864
0
        OSSL_LIB_CTX **libctx = exarg;
865
866
0
        *libctx = msg->libctx;
867
0
    } break;
868
0
    case ASN1_OP_GET0_PROPQ: {
869
0
        const char **propq = exarg;
870
871
0
        *propq = msg->propq;
872
0
    } break;
873
1.13M
    default:
874
1.13M
        break;
875
1.27M
    }
876
877
1.27M
    return 1;
878
1.27M
}
879
880
ASN1_CHOICE(OSSL_CMP_CERTORENCCERT) = {
881
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
882
    ASN1_EXP(OSSL_CMP_CERTORENCCERT, value.certificate, X509, 0),
883
    ASN1_EXP(OSSL_CMP_CERTORENCCERT, value.encryptedCert,
884
        OSSL_CRMF_ENCRYPTEDKEY, 1),
885
2.69k
} ASN1_CHOICE_END(OSSL_CMP_CERTORENCCERT)
886
2.69k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CERTORENCCERT)
887
2.69k
888
2.69k
ASN1_SEQUENCE(OSSL_CMP_CERTIFIEDKEYPAIR) = {
889
2.69k
    ASN1_SIMPLE(OSSL_CMP_CERTIFIEDKEYPAIR, certOrEncCert,
890
2.69k
        OSSL_CMP_CERTORENCCERT),
891
2.69k
    ASN1_EXP_OPT(OSSL_CMP_CERTIFIEDKEYPAIR, privateKey,
892
2.69k
        OSSL_CRMF_ENCRYPTEDKEY, 0),
893
2.69k
    ASN1_EXP_OPT(OSSL_CMP_CERTIFIEDKEYPAIR, publicationInfo,
894
2.69k
        OSSL_CRMF_PKIPUBLICATIONINFO, 1)
895
42.6k
} ASN1_SEQUENCE_END(OSSL_CMP_CERTIFIEDKEYPAIR)
896
42.6k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CERTIFIEDKEYPAIR)
897
42.6k
898
42.6k
ASN1_SEQUENCE(OSSL_CMP_REVDETAILS) = {
899
42.6k
    ASN1_SIMPLE(OSSL_CMP_REVDETAILS, certDetails, OSSL_CRMF_CERTTEMPLATE),
900
42.6k
    ASN1_OPT(OSSL_CMP_REVDETAILS, crlEntryDetails, X509_EXTENSIONS)
901
1.98M
} ASN1_SEQUENCE_END(OSSL_CMP_REVDETAILS)
902
1.98M
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_REVDETAILS)
903
1.98M
904
1.98M
ASN1_ITEM_TEMPLATE(OSSL_CMP_REVREQCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, OSSL_CMP_REVREQCONTENT,
905
1.98M
    OSSL_CMP_REVDETAILS)
906
1.98M
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_REVREQCONTENT)
907
908
ASN1_SEQUENCE(OSSL_CMP_REVREPCONTENT) = {
909
    ASN1_SEQUENCE_OF(OSSL_CMP_REVREPCONTENT, status, OSSL_CMP_PKISI),
910
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_REVREPCONTENT, revCerts, OSSL_CRMF_CERTID,
911
        0),
912
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_REVREPCONTENT, crls, X509_CRL, 1)
913
16.7k
} ASN1_SEQUENCE_END(OSSL_CMP_REVREPCONTENT)
914
16.7k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_REVREPCONTENT)
915
16.7k
916
16.7k
ASN1_SEQUENCE(OSSL_CMP_KEYRECREPCONTENT) = {
917
16.7k
    ASN1_SIMPLE(OSSL_CMP_KEYRECREPCONTENT, status, OSSL_CMP_PKISI),
918
16.7k
    ASN1_EXP_OPT(OSSL_CMP_KEYRECREPCONTENT, newSigCert, X509, 0),
919
16.7k
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_KEYRECREPCONTENT, caCerts, X509, 1),
920
16.7k
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_KEYRECREPCONTENT, keyPairHist,
921
16.7k
        OSSL_CMP_CERTIFIEDKEYPAIR, 2)
922
16.7k
} ASN1_SEQUENCE_END(OSSL_CMP_KEYRECREPCONTENT)
923
3.44k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_KEYRECREPCONTENT)
924
3.44k
925
3.44k
ASN1_ITEM_TEMPLATE(OSSL_CMP_PKISTATUS) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_UNIVERSAL, 0, status, ASN1_INTEGER)
926
489k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_PKISTATUS)
927
928
ASN1_SEQUENCE(OSSL_CMP_PKISI) = {
929
    ASN1_SIMPLE(OSSL_CMP_PKISI, status, OSSL_CMP_PKISTATUS),
930
    /* OSSL_CMP_PKIFREETEXT is a ASN1_UTF8STRING sequence, so used directly */
931
    ASN1_SEQUENCE_OF_OPT(OSSL_CMP_PKISI, statusString, ASN1_UTF8STRING),
932
    /* OSSL_CMP_PKIFAILUREINFO is effectively ASN1_BIT_STRING, used directly */
933
    ASN1_OPT(OSSL_CMP_PKISI, failInfo, ASN1_BIT_STRING)
934
330k
} ASN1_SEQUENCE_END(OSSL_CMP_PKISI)
935
330k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_PKISI)
936
330k
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CMP_PKISI)
937
330k
938
330k
ASN1_SEQUENCE(OSSL_CMP_CERTSTATUS) = {
939
330k
    ASN1_SIMPLE(OSSL_CMP_CERTSTATUS, certHash, ASN1_OCTET_STRING),
940
330k
    ASN1_SIMPLE(OSSL_CMP_CERTSTATUS, certReqId, ASN1_INTEGER),
941
330k
    ASN1_OPT(OSSL_CMP_CERTSTATUS, statusInfo, OSSL_CMP_PKISI),
942
330k
    ASN1_EXP_OPT(OSSL_CMP_CERTSTATUS, hashAlg, X509_ALGOR, 0)
943
330k
} ASN1_SEQUENCE_END(OSSL_CMP_CERTSTATUS)
944
1.97k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CERTSTATUS)
945
1.97k
946
1.97k
ASN1_ITEM_TEMPLATE(OSSL_CMP_CERTCONFIRMCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, OSSL_CMP_CERTCONFIRMCONTENT,
947
1.97k
    OSSL_CMP_CERTSTATUS)
948
15.7k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_CERTCONFIRMCONTENT)
949
950
ASN1_SEQUENCE(OSSL_CMP_CERTRESPONSE) = {
951
    ASN1_SIMPLE(OSSL_CMP_CERTRESPONSE, certReqId, ASN1_INTEGER),
952
    ASN1_SIMPLE(OSSL_CMP_CERTRESPONSE, status, OSSL_CMP_PKISI),
953
    ASN1_OPT(OSSL_CMP_CERTRESPONSE, certifiedKeyPair,
954
        OSSL_CMP_CERTIFIEDKEYPAIR),
955
    ASN1_OPT(OSSL_CMP_CERTRESPONSE, rspInfo, ASN1_OCTET_STRING)
956
37.7k
} ASN1_SEQUENCE_END(OSSL_CMP_CERTRESPONSE)
957
37.7k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CERTRESPONSE)
958
37.7k
959
37.7k
ASN1_SEQUENCE(OSSL_CMP_POLLREQ) = {
960
37.7k
    ASN1_SIMPLE(OSSL_CMP_POLLREQ, certReqId, ASN1_INTEGER)
961
37.7k
} ASN1_SEQUENCE_END(OSSL_CMP_POLLREQ)
962
4.32k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_POLLREQ)
963
4.32k
964
4.32k
ASN1_ITEM_TEMPLATE(OSSL_CMP_POLLREQCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, OSSL_CMP_POLLREQCONTENT,
965
4.32k
    OSSL_CMP_POLLREQ)
966
5.27k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_POLLREQCONTENT)
967
968
ASN1_SEQUENCE(OSSL_CMP_POLLREP) = {
969
    ASN1_SIMPLE(OSSL_CMP_POLLREP, certReqId, ASN1_INTEGER),
970
    ASN1_SIMPLE(OSSL_CMP_POLLREP, checkAfter, ASN1_INTEGER),
971
    ASN1_SEQUENCE_OF_OPT(OSSL_CMP_POLLREP, reason, ASN1_UTF8STRING),
972
4.49k
} ASN1_SEQUENCE_END(OSSL_CMP_POLLREP)
973
4.49k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_POLLREP)
974
4.49k
975
4.49k
ASN1_ITEM_TEMPLATE(OSSL_CMP_POLLREPCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
976
4.49k
    OSSL_CMP_POLLREPCONTENT,
977
4.49k
    OSSL_CMP_POLLREP)
978
38.7k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_POLLREPCONTENT)
979
980
ASN1_SEQUENCE(OSSL_CMP_CERTREPMESSAGE) = {
981
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
982
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_CERTREPMESSAGE, caPubs, X509, 1),
983
    ASN1_SEQUENCE_OF(OSSL_CMP_CERTREPMESSAGE, response, OSSL_CMP_CERTRESPONSE)
984
33.3k
} ASN1_SEQUENCE_END(OSSL_CMP_CERTREPMESSAGE)
985
33.3k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_CERTREPMESSAGE)
986
33.3k
987
33.3k
ASN1_ITEM_TEMPLATE(OSSL_CMP_GENMSGCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, OSSL_CMP_GENMSGCONTENT,
988
33.3k
    OSSL_CMP_ITAV)
989
33.3k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_GENMSGCONTENT)
990
991
ASN1_ITEM_TEMPLATE(OSSL_CMP_GENREPCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, OSSL_CMP_GENREPCONTENT,
992
    OSSL_CMP_ITAV)
993
12.3k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_GENREPCONTENT)
994
995
ASN1_ITEM_TEMPLATE(OSSL_CMP_CRLANNCONTENT) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
996
    OSSL_CMP_CRLANNCONTENT, X509_CRL)
997
14.0k
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_CRLANNCONTENT)
998
999
ASN1_CHOICE(OSSL_CMP_PKIBODY) = {
1000
    ASN1_EXP(OSSL_CMP_PKIBODY, value.ir, OSSL_CRMF_MSGS, 0),
1001
    ASN1_EXP(OSSL_CMP_PKIBODY, value.ip, OSSL_CMP_CERTREPMESSAGE, 1),
1002
    ASN1_EXP(OSSL_CMP_PKIBODY, value.cr, OSSL_CRMF_MSGS, 2),
1003
    ASN1_EXP(OSSL_CMP_PKIBODY, value.cp, OSSL_CMP_CERTREPMESSAGE, 3),
1004
    ASN1_EXP(OSSL_CMP_PKIBODY, value.p10cr, X509_REQ, 4),
1005
    ASN1_EXP(OSSL_CMP_PKIBODY, value.popdecc,
1006
        OSSL_CMP_POPODECKEYCHALLCONTENT, 5),
1007
    ASN1_EXP(OSSL_CMP_PKIBODY, value.popdecr,
1008
        OSSL_CMP_POPODECKEYRESPCONTENT, 6),
1009
    ASN1_EXP(OSSL_CMP_PKIBODY, value.kur, OSSL_CRMF_MSGS, 7),
1010
    ASN1_EXP(OSSL_CMP_PKIBODY, value.kup, OSSL_CMP_CERTREPMESSAGE, 8),
1011
    ASN1_EXP(OSSL_CMP_PKIBODY, value.krr, OSSL_CRMF_MSGS, 9),
1012
    ASN1_EXP(OSSL_CMP_PKIBODY, value.krp, OSSL_CMP_KEYRECREPCONTENT, 10),
1013
    ASN1_EXP(OSSL_CMP_PKIBODY, value.rr, OSSL_CMP_REVREQCONTENT, 11),
1014
    ASN1_EXP(OSSL_CMP_PKIBODY, value.rp, OSSL_CMP_REVREPCONTENT, 12),
1015
    ASN1_EXP(OSSL_CMP_PKIBODY, value.ccr, OSSL_CRMF_MSGS, 13),
1016
    ASN1_EXP(OSSL_CMP_PKIBODY, value.ccp, OSSL_CMP_CERTREPMESSAGE, 14),
1017
    ASN1_EXP(OSSL_CMP_PKIBODY, value.ckuann, OSSL_CMP_CAKEYUPDANNCONTENT, 15),
1018
    ASN1_EXP(OSSL_CMP_PKIBODY, value.cann, X509, 16),
1019
    ASN1_EXP(OSSL_CMP_PKIBODY, value.rann, OSSL_CMP_REVANNCONTENT, 17),
1020
    ASN1_EXP(OSSL_CMP_PKIBODY, value.crlann, OSSL_CMP_CRLANNCONTENT, 18),
1021
    ASN1_EXP(OSSL_CMP_PKIBODY, value.pkiconf, ASN1_ANY, 19),
1022
    ASN1_EXP(OSSL_CMP_PKIBODY, value.nested, OSSL_CMP_MSGS, 20),
1023
    ASN1_EXP(OSSL_CMP_PKIBODY, value.genm, OSSL_CMP_GENMSGCONTENT, 21),
1024
    ASN1_EXP(OSSL_CMP_PKIBODY, value.genp, OSSL_CMP_GENREPCONTENT, 22),
1025
    ASN1_EXP(OSSL_CMP_PKIBODY, value.error, OSSL_CMP_ERRORMSGCONTENT, 23),
1026
    ASN1_EXP(OSSL_CMP_PKIBODY, value.certConf, OSSL_CMP_CERTCONFIRMCONTENT, 24),
1027
    ASN1_EXP(OSSL_CMP_PKIBODY, value.pollReq, OSSL_CMP_POLLREQCONTENT, 25),
1028
    ASN1_EXP(OSSL_CMP_PKIBODY, value.pollRep, OSSL_CMP_POLLREPCONTENT, 26),
1029
1.75M
} ASN1_CHOICE_END(OSSL_CMP_PKIBODY)
1030
1.75M
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_PKIBODY)
1031
1.75M
1032
1.75M
ASN1_SEQUENCE(OSSL_CMP_PKIHEADER) = {
1033
1.75M
    ASN1_SIMPLE(OSSL_CMP_PKIHEADER, pvno, ASN1_INTEGER),
1034
1.75M
    ASN1_SIMPLE(OSSL_CMP_PKIHEADER, sender, GENERAL_NAME),
1035
1.75M
    ASN1_SIMPLE(OSSL_CMP_PKIHEADER, recipient, GENERAL_NAME),
1036
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, messageTime, ASN1_GENERALIZEDTIME, 0),
1037
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, protectionAlg, X509_ALGOR, 1),
1038
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, senderKID, ASN1_OCTET_STRING, 2),
1039
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, recipKID, ASN1_OCTET_STRING, 3),
1040
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, transactionID, ASN1_OCTET_STRING, 4),
1041
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, senderNonce, ASN1_OCTET_STRING, 5),
1042
1.75M
    ASN1_EXP_OPT(OSSL_CMP_PKIHEADER, recipNonce, ASN1_OCTET_STRING, 6),
1043
1.75M
    /* OSSL_CMP_PKIFREETEXT is a ASN1_UTF8STRING sequence, so used directly */
1044
1.75M
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_PKIHEADER, freeText, ASN1_UTF8STRING, 7),
1045
1.75M
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_PKIHEADER, generalInfo,
1046
1.75M
        OSSL_CMP_ITAV, 8)
1047
1.75M
} ASN1_SEQUENCE_END(OSSL_CMP_PKIHEADER)
1048
893k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_PKIHEADER)
1049
893k
1050
893k
ASN1_SEQUENCE(OSSL_CMP_PROTECTEDPART) = {
1051
893k
    ASN1_SIMPLE(OSSL_CMP_MSG, header, OSSL_CMP_PKIHEADER),
1052
893k
    ASN1_SIMPLE(OSSL_CMP_MSG, body, OSSL_CMP_PKIBODY)
1053
893k
} ASN1_SEQUENCE_END(OSSL_CMP_PROTECTEDPART)
1054
4.21k
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_PROTECTEDPART)
1055
4.21k
1056
4.21k
ASN1_SEQUENCE_cb(OSSL_CMP_MSG, ossl_cmp_msg_cb) = {
1057
4.21k
    ASN1_SIMPLE(OSSL_CMP_MSG, header, OSSL_CMP_PKIHEADER),
1058
4.21k
    ASN1_SIMPLE(OSSL_CMP_MSG, body, OSSL_CMP_PKIBODY),
1059
4.21k
    ASN1_EXP_OPT(OSSL_CMP_MSG, protection, ASN1_BIT_STRING, 0),
1060
4.21k
    /* OSSL_CMP_CMPCERTIFICATE is effectively X509 so it is used directly */
1061
4.21k
    ASN1_EXP_SEQUENCE_OF_OPT(OSSL_CMP_MSG, extraCerts, X509, 1)
1062
4.21k
} ASN1_SEQUENCE_END_cb(OSSL_CMP_MSG, OSSL_CMP_MSG)
1063
4.21k
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CMP_MSG)
1064
4.21k
1065
4.21k
ASN1_ITEM_TEMPLATE(OSSL_CMP_MSGS) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, OSSL_CMP_MSGS,
1066
4.21k
    OSSL_CMP_MSG)
1067
ASN1_ITEM_TEMPLATE_END(OSSL_CMP_MSGS)