1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
14 * The Original Code is the Netscape security libraries.
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1994-2000
19 * the Initial Developer. All Rights Reserved.
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
38 * X.509 v3 Subject Key Usage Extension
55 const SEC_ASN1Template CERTAuthKeyIDTemplate
[] = {
56 { SEC_ASN1_SEQUENCE
, 0, NULL
, sizeof(CERTAuthKeyID
) },
57 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONTEXT_SPECIFIC
| 0,
58 offsetof(CERTAuthKeyID
,keyID
), SEC_OctetStringTemplate
},
59 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONSTRUCTED
| SEC_ASN1_CONTEXT_SPECIFIC
| 1,
60 offsetof(CERTAuthKeyID
, DERAuthCertIssuer
), CERT_GeneralNamesTemplate
},
61 { SEC_ASN1_OPTIONAL
| SEC_ASN1_CONTEXT_SPECIFIC
| 2,
62 offsetof(CERTAuthKeyID
,authCertSerialNumber
), SEC_IntegerTemplate
},
68 SECStatus
CERT_EncodeAuthKeyID (PRArenaPool
*arena
, CERTAuthKeyID
*value
, SECItem
*encodedValue
)
70 SECStatus rv
= SECFailure
;
74 PORT_Assert (value
->DERAuthCertIssuer
== NULL
);
75 PORT_Assert (encodedValue
);
79 /* If both of the authCertIssuer and the serial number exist, encode
80 the name first. Otherwise, it is an error if one exist and the other
83 if (value
->authCertIssuer
) {
84 if (!value
->authCertSerialNumber
.data
) {
85 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID
);
89 value
->DERAuthCertIssuer
= cert_EncodeGeneralNames
90 (arena
, value
->authCertIssuer
);
91 if (!value
->DERAuthCertIssuer
) {
92 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID
);
96 else if (value
->authCertSerialNumber
.data
) {
97 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID
);
101 if (SEC_ASN1EncodeItem (arena
, encodedValue
, value
,
102 CERTAuthKeyIDTemplate
) == NULL
)
111 CERT_DecodeAuthKeyID (PRArenaPool
*arena
, SECItem
*encodedValue
)
113 CERTAuthKeyID
* value
= NULL
;
114 SECStatus rv
= SECFailure
;
116 SECItem newEncodedValue
;
121 mark
= PORT_ArenaMark (arena
);
122 value
= (CERTAuthKeyID
*)PORT_ArenaZAlloc (arena
, sizeof (*value
));
125 value
->DERAuthCertIssuer
= NULL
;
126 /* copy the DER into the arena, since Quick DER returns data that points
127 into the DER input, which may get freed by the caller */
128 rv
= SECITEM_CopyItem(arena
, &newEncodedValue
, encodedValue
);
129 if ( rv
!= SECSuccess
) {
133 rv
= SEC_QuickDERDecodeItem
134 (arena
, value
, CERTAuthKeyIDTemplate
, &newEncodedValue
);
135 if (rv
!= SECSuccess
)
138 value
->authCertIssuer
= cert_DecodeGeneralNames (arena
, value
->DERAuthCertIssuer
);
139 if (value
->authCertIssuer
== NULL
)
142 /* what if the general name contains other format but not URI ?
145 if ((value
->authCertSerialNumber
.data
&& !value
->authCertIssuer
) ||
146 (!value
->authCertSerialNumber
.data
&& value
->authCertIssuer
)){
147 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID
);
152 if (rv
!= SECSuccess
) {
153 PORT_ArenaRelease (arena
, mark
);
154 return ((CERTAuthKeyID
*)NULL
);
156 PORT_ArenaUnmark(arena
, mark
);