Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/security/nss/lib/pkcs12/p12tmpl.c
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5
#include "plarena.h"
6
#include "secitem.h"
7
#include "secoid.h"
8
#include "seccomon.h"
9
#include "secport.h"
10
#include "cert.h"
11
#include "secpkcs7.h"
12
#include "secasn1.h"
13
#include "p12t.h"
14
15
SEC_ASN1_MKSUB(SEC_AnyTemplate)
16
SEC_ASN1_MKSUB(sgn_DigestInfoTemplate)
17
18
static const SEC_ASN1Template *
19
sec_pkcs12_choose_safe_bag_type(void *src_or_dest, PRBool encoding)
20
0
{
21
0
    const SEC_ASN1Template *theTemplate;
22
0
    sec_PKCS12SafeBag *safeBag;
23
0
    SECOidData *oiddata;
24
0
25
0
    if (src_or_dest == NULL) {
26
0
        return NULL;
27
0
    }
28
0
29
0
    safeBag = (sec_PKCS12SafeBag *)src_or_dest;
30
0
31
0
    oiddata = SECOID_FindOID(&safeBag->safeBagType);
32
0
    if (oiddata == NULL) {
33
0
        return SEC_ASN1_GET(SEC_AnyTemplate);
34
0
    }
35
0
36
0
    switch (oiddata->offset) {
37
0
        default:
38
0
            theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
39
0
            break;
40
0
        case SEC_OID_PKCS12_V1_KEY_BAG_ID:
41
0
            theTemplate = SEC_ASN1_GET(SECKEY_PointerToPrivateKeyInfoTemplate);
42
0
            break;
43
0
        case SEC_OID_PKCS12_V1_CERT_BAG_ID:
44
0
            theTemplate = sec_PKCS12PointerToCertBagTemplate;
45
0
            break;
46
0
        case SEC_OID_PKCS12_V1_CRL_BAG_ID:
47
0
            theTemplate = sec_PKCS12PointerToCRLBagTemplate;
48
0
            break;
49
0
        case SEC_OID_PKCS12_V1_SECRET_BAG_ID:
50
0
            theTemplate = sec_PKCS12PointerToSecretBagTemplate;
51
0
            break;
52
0
        case SEC_OID_PKCS12_V1_PKCS8_SHROUDED_KEY_BAG_ID:
53
0
            theTemplate =
54
0
                SEC_ASN1_GET(SECKEY_PointerToEncryptedPrivateKeyInfoTemplate);
55
0
            break;
56
0
        case SEC_OID_PKCS12_V1_SAFE_CONTENTS_BAG_ID:
57
0
            if (encoding) {
58
0
                theTemplate = sec_PKCS12PointerToSafeContentsTemplate;
59
0
            } else {
60
0
                theTemplate = SEC_ASN1_GET(SEC_PointerToAnyTemplate);
61
0
            }
62
0
            break;
63
0
    }
64
0
    return theTemplate;
65
0
}
66
67
static const SEC_ASN1Template *
68
sec_pkcs12_choose_crl_bag_type(void *src_or_dest, PRBool encoding)
69
0
{
70
0
    const SEC_ASN1Template *theTemplate;
71
0
    sec_PKCS12CRLBag *crlbag;
72
0
    SECOidData *oiddata;
73
0
74
0
    if (src_or_dest == NULL) {
75
0
        return NULL;
76
0
    }
77
0
78
0
    crlbag = (sec_PKCS12CRLBag *)src_or_dest;
79
0
80
0
    oiddata = SECOID_FindOID(&crlbag->bagID);
81
0
    if (oiddata == NULL) {
82
0
        return SEC_ASN1_GET(SEC_AnyTemplate);
83
0
    }
84
0
85
0
    switch (oiddata->offset) {
86
0
        default:
87
0
            theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
88
0
            break;
89
0
        case SEC_OID_PKCS9_X509_CRL:
90
0
            theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
91
0
            break;
92
0
    }
93
0
    return theTemplate;
94
0
}
95
96
static const SEC_ASN1Template *
97
sec_pkcs12_choose_cert_bag_type(void *src_or_dest, PRBool encoding)
98
0
{
99
0
    const SEC_ASN1Template *theTemplate;
100
0
    sec_PKCS12CertBag *certbag;
101
0
    SECOidData *oiddata;
102
0
103
0
    if (src_or_dest == NULL) {
104
0
        return NULL;
105
0
    }
106
0
107
0
    certbag = (sec_PKCS12CertBag *)src_or_dest;
108
0
109
0
    oiddata = SECOID_FindOID(&certbag->bagID);
110
0
    if (oiddata == NULL) {
111
0
        return SEC_ASN1_GET(SEC_AnyTemplate);
112
0
    }
113
0
114
0
    switch (oiddata->offset) {
115
0
        default:
116
0
            theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
117
0
            break;
118
0
        case SEC_OID_PKCS9_X509_CERT:
119
0
            theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
120
0
            break;
121
0
        case SEC_OID_PKCS9_SDSI_CERT:
122
0
            theTemplate = SEC_ASN1_GET(SEC_IA5StringTemplate);
123
0
            break;
124
0
    }
125
0
    return theTemplate;
126
0
}
127
128
static const SEC_ASN1Template *
129
sec_pkcs12_choose_attr_type(void *src_or_dest, PRBool encoding)
130
0
{
131
0
    const SEC_ASN1Template *theTemplate;
132
0
    sec_PKCS12Attribute *attr;
133
0
    SECOidData *oiddata;
134
0
135
0
    if (src_or_dest == NULL) {
136
0
        return NULL;
137
0
    }
138
0
139
0
    attr = (sec_PKCS12Attribute *)src_or_dest;
140
0
141
0
    oiddata = SECOID_FindOID(&attr->attrType);
142
0
    if (oiddata == NULL) {
143
0
        return SEC_ASN1_GET(SEC_AnyTemplate);
144
0
    }
145
0
146
0
    switch (oiddata->offset) {
147
0
        default:
148
0
            theTemplate = SEC_ASN1_GET(SEC_AnyTemplate);
149
0
            break;
150
0
        case SEC_OID_PKCS9_FRIENDLY_NAME:
151
0
            theTemplate = SEC_ASN1_GET(SEC_BMPStringTemplate);
152
0
            break;
153
0
        case SEC_OID_PKCS9_LOCAL_KEY_ID:
154
0
            theTemplate = SEC_ASN1_GET(SEC_OctetStringTemplate);
155
0
            break;
156
0
        case SEC_OID_PKCS12_KEY_USAGE:
157
0
            theTemplate = SEC_ASN1_GET(SEC_BitStringTemplate);
158
0
            break;
159
0
    }
160
0
161
0
    return theTemplate;
162
0
}
163
164
const SEC_ASN1Template sec_PKCS12PointerToContentInfoTemplate[] = {
165
    { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, sec_PKCS7ContentInfoTemplate }
166
};
167
168
static const SEC_ASN1TemplateChooserPtr sec_pkcs12_crl_bag_chooser =
169
    sec_pkcs12_choose_crl_bag_type;
170
171
static const SEC_ASN1TemplateChooserPtr sec_pkcs12_cert_bag_chooser =
172
    sec_pkcs12_choose_cert_bag_type;
173
174
static const SEC_ASN1TemplateChooserPtr sec_pkcs12_safe_bag_chooser =
175
    sec_pkcs12_choose_safe_bag_type;
176
177
static const SEC_ASN1TemplateChooserPtr sec_pkcs12_attr_chooser =
178
    sec_pkcs12_choose_attr_type;
179
180
const SEC_ASN1Template sec_PKCS12PointerToCertBagTemplate[] = {
181
    { SEC_ASN1_POINTER, 0, sec_PKCS12CertBagTemplate }
182
};
183
184
const SEC_ASN1Template sec_PKCS12PointerToCRLBagTemplate[] = {
185
    { SEC_ASN1_POINTER, 0, sec_PKCS12CRLBagTemplate }
186
};
187
188
const SEC_ASN1Template sec_PKCS12PointerToSecretBagTemplate[] = {
189
    { SEC_ASN1_POINTER, 0, sec_PKCS12SecretBagTemplate }
190
};
191
192
const SEC_ASN1Template sec_PKCS12PointerToSafeContentsTemplate[] = {
193
    { SEC_ASN1_POINTER, 0, sec_PKCS12SafeContentsTemplate }
194
};
195
196
const SEC_ASN1Template sec_PKCS12PFXItemTemplate[] = {
197
    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL,
198
      sizeof(sec_PKCS12PFXItem) },
199
    { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER,
200
      offsetof(sec_PKCS12PFXItem, version) },
201
    { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM,
202
      offsetof(sec_PKCS12PFXItem, encodedAuthSafe) },
203
    { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM,
204
      offsetof(sec_PKCS12PFXItem, encodedMacData) },
205
    { 0 }
206
};
207
208
const SEC_ASN1Template sec_PKCS12MacDataTemplate[] = {
209
    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12MacData) },
210
    { SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(sec_PKCS12MacData, safeMac),
211
      SEC_ASN1_SUB(sgn_DigestInfoTemplate) },
212
    { SEC_ASN1_OCTET_STRING, offsetof(sec_PKCS12MacData, macSalt) },
213
    { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, offsetof(sec_PKCS12MacData, iter) },
214
    { 0 }
215
};
216
217
const SEC_ASN1Template sec_PKCS12AuthenticatedSafeTemplate[] = {
218
    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN,
219
      offsetof(sec_PKCS12AuthenticatedSafe, encodedSafes),
220
      SEC_ASN1_SUB(SEC_AnyTemplate) }
221
};
222
223
const SEC_ASN1Template sec_PKCS12SafeBagTemplate[] = {
224
    { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL,
225
      sizeof(sec_PKCS12SafeBag) },
226
    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SafeBag, safeBagType) },
227
    { SEC_ASN1_EXPLICIT | SEC_ASN1_DYNAMIC | SEC_ASN1_CONSTRUCTED |
228
          SEC_ASN1_MAY_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | 0,
229
      offsetof(sec_PKCS12SafeBag, safeBagContent),
230
      &sec_pkcs12_safe_bag_chooser },
231
    { SEC_ASN1_SET_OF | SEC_ASN1_OPTIONAL, offsetof(sec_PKCS12SafeBag, attribs),
232
      sec_PKCS12AttributeTemplate },
233
    { 0 }
234
};
235
236
const SEC_ASN1Template sec_PKCS12SafeContentsTemplate[] = {
237
    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM,
238
      offsetof(sec_PKCS12SafeContents, safeBags),
239
      sec_PKCS12SafeBagTemplate }
240
};
241
242
const SEC_ASN1Template sec_PKCS12SequenceOfAnyTemplate[] = {
243
    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN, 0,
244
      SEC_ASN1_SUB(SEC_AnyTemplate) }
245
};
246
247
const SEC_ASN1Template sec_PKCS12NestedSafeContentsDecodeTemplate[] = {
248
    { SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0,
249
      offsetof(sec_PKCS12SafeContents, encodedSafeBags),
250
      sec_PKCS12SequenceOfAnyTemplate }
251
};
252
253
const SEC_ASN1Template sec_PKCS12SafeContentsDecodeTemplate[] = {
254
    { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM | SEC_ASN1_XTRN,
255
      offsetof(sec_PKCS12SafeContents, encodedSafeBags),
256
      SEC_ASN1_SUB(SEC_AnyTemplate) }
257
};
258
259
const SEC_ASN1Template sec_PKCS12CRLBagTemplate[] = {
260
    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CRLBag) },
261
    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CRLBag, bagID) },
262
    { SEC_ASN1_DYNAMIC | SEC_ASN1_POINTER,
263
      offsetof(sec_PKCS12CRLBag, value), &sec_pkcs12_crl_bag_chooser },
264
    { 0 }
265
};
266
267
const SEC_ASN1Template sec_PKCS12CertBagTemplate[] = {
268
    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CertBag) },
269
    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CertBag, bagID) },
270
    { SEC_ASN1_DYNAMIC | SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED |
271
          SEC_ASN1_CONTEXT_SPECIFIC | 0,
272
      offsetof(sec_PKCS12CertBag, value), &sec_pkcs12_cert_bag_chooser },
273
    { 0 }
274
};
275
276
const SEC_ASN1Template sec_PKCS12SecretBagTemplate[] = {
277
    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12SecretBag) },
278
    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SecretBag, secretType) },
279
    { SEC_ASN1_ANY, offsetof(sec_PKCS12SecretBag, secretContent) },
280
    { 0 }
281
};
282
283
const SEC_ASN1Template sec_PKCS12AttributeTemplate[] = {
284
    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12Attribute) },
285
    { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12Attribute, attrType) },
286
    { SEC_ASN1_SET_OF | SEC_ASN1_DYNAMIC,
287
      offsetof(sec_PKCS12Attribute, attrValue),
288
      &sec_pkcs12_attr_chooser },
289
    { 0 }
290
};