comparison nss/lib/certdb/xauthkid.c @ 0:1e5118fa0cb1

This is NSS with a Cmake Buildsyste To compile a static NSS library for Windows we've used the Chromium-NSS fork and added a Cmake buildsystem to compile it statically for Windows. See README.chromium for chromium changes and README.trustbridge for our modifications.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 28 Jul 2014 10:47:06 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1e5118fa0cb1
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 /*
6 * X.509 v3 Subject Key Usage Extension
7 *
8 */
9
10 #include "prtypes.h"
11 #include "seccomon.h"
12 #include "secdert.h"
13 #include "secoidt.h"
14 #include "secasn1t.h"
15 #include "secasn1.h"
16 #include "secport.h"
17 #include "certt.h"
18 #include "genname.h"
19 #include "secerr.h"
20
21 SEC_ASN1_MKSUB(SEC_IntegerTemplate)
22 SEC_ASN1_MKSUB(SEC_OctetStringTemplate)
23
24 const SEC_ASN1Template CERTAuthKeyIDTemplate[] = {
25 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTAuthKeyID) },
26 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
27 offsetof(CERTAuthKeyID,keyID), SEC_ASN1_SUB(SEC_OctetStringTemplate)},
28 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
29 offsetof(CERTAuthKeyID, DERAuthCertIssuer), CERT_GeneralNamesTemplate},
30 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 2,
31 offsetof(CERTAuthKeyID,authCertSerialNumber),
32 SEC_ASN1_SUB(SEC_IntegerTemplate) },
33 { 0 }
34 };
35
36
37
38 SECStatus CERT_EncodeAuthKeyID (PLArenaPool *arena, CERTAuthKeyID *value, SECItem *encodedValue)
39 {
40 SECStatus rv = SECFailure;
41
42 PORT_Assert (value);
43 PORT_Assert (arena);
44 PORT_Assert (value->DERAuthCertIssuer == NULL);
45 PORT_Assert (encodedValue);
46
47 do {
48
49 /* If both of the authCertIssuer and the serial number exist, encode
50 the name first. Otherwise, it is an error if one exist and the other
51 is not.
52 */
53 if (value->authCertIssuer) {
54 if (!value->authCertSerialNumber.data) {
55 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
56 break;
57 }
58
59 value->DERAuthCertIssuer = cert_EncodeGeneralNames
60 (arena, value->authCertIssuer);
61 if (!value->DERAuthCertIssuer) {
62 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
63 break;
64 }
65 }
66 else if (value->authCertSerialNumber.data) {
67 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
68 break;
69 }
70
71 if (SEC_ASN1EncodeItem (arena, encodedValue, value,
72 CERTAuthKeyIDTemplate) == NULL)
73 break;
74 rv = SECSuccess;
75
76 } while (0);
77 return(rv);
78 }
79
80 CERTAuthKeyID *
81 CERT_DecodeAuthKeyID (PLArenaPool *arena, const SECItem *encodedValue)
82 {
83 CERTAuthKeyID * value = NULL;
84 SECStatus rv = SECFailure;
85 void * mark;
86 SECItem newEncodedValue;
87
88 PORT_Assert (arena);
89
90 do {
91 mark = PORT_ArenaMark (arena);
92 value = (CERTAuthKeyID*)PORT_ArenaZAlloc (arena, sizeof (*value));
93 if (value == NULL)
94 break;
95 value->DERAuthCertIssuer = NULL;
96 /* copy the DER into the arena, since Quick DER returns data that points
97 into the DER input, which may get freed by the caller */
98 rv = SECITEM_CopyItem(arena, &newEncodedValue, encodedValue);
99 if ( rv != SECSuccess ) {
100 break;
101 }
102
103 rv = SEC_QuickDERDecodeItem
104 (arena, value, CERTAuthKeyIDTemplate, &newEncodedValue);
105 if (rv != SECSuccess)
106 break;
107
108 value->authCertIssuer = cert_DecodeGeneralNames (arena, value->DERAuthCertIssuer);
109 if (value->authCertIssuer == NULL)
110 break;
111
112 /* what if the general name contains other format but not URI ?
113 hl
114 */
115 if ((value->authCertSerialNumber.data && !value->authCertIssuer) ||
116 (!value->authCertSerialNumber.data && value->authCertIssuer)){
117 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
118 break;
119 }
120 } while (0);
121
122 if (rv != SECSuccess) {
123 PORT_ArenaRelease (arena, mark);
124 return ((CERTAuthKeyID *)NULL);
125 }
126 PORT_ArenaUnmark(arena, mark);
127 return (value);
128 }
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)