Import from 1.9a8 tarball
[mozilla-nss.git] / security / nss / lib / certdb / xauthkid.c
blob8fb5a01220e0467e9abbb910916a1932b47dbd0d
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
12 * License.
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.
21 * Contributor(s):
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
42 #include "prtypes.h"
43 #include "mcom_db.h"
44 #include "seccomon.h"
45 #include "secdert.h"
46 #include "secoidt.h"
47 #include "secasn1t.h"
48 #include "secasn1.h"
49 #include "secport.h"
50 #include "certt.h"
51 #include "genname.h"
52 #include "secerr.h"
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},
63 { 0 }
68 SECStatus CERT_EncodeAuthKeyID (PRArenaPool *arena, CERTAuthKeyID *value, SECItem *encodedValue)
70 SECStatus rv = SECFailure;
72 PORT_Assert (value);
73 PORT_Assert (arena);
74 PORT_Assert (value->DERAuthCertIssuer == NULL);
75 PORT_Assert (encodedValue);
77 do {
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
81 is not.
83 if (value->authCertIssuer) {
84 if (!value->authCertSerialNumber.data) {
85 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
86 break;
89 value->DERAuthCertIssuer = cert_EncodeGeneralNames
90 (arena, value->authCertIssuer);
91 if (!value->DERAuthCertIssuer) {
92 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
93 break;
96 else if (value->authCertSerialNumber.data) {
97 PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
98 break;
101 if (SEC_ASN1EncodeItem (arena, encodedValue, value,
102 CERTAuthKeyIDTemplate) == NULL)
103 break;
104 rv = SECSuccess;
106 } while (0);
107 return(rv);
110 CERTAuthKeyID *
111 CERT_DecodeAuthKeyID (PRArenaPool *arena, SECItem *encodedValue)
113 CERTAuthKeyID * value = NULL;
114 SECStatus rv = SECFailure;
115 void * mark;
116 SECItem newEncodedValue;
118 PORT_Assert (arena);
120 do {
121 mark = PORT_ArenaMark (arena);
122 value = (CERTAuthKeyID*)PORT_ArenaZAlloc (arena, sizeof (*value));
123 if (value == NULL)
124 break;
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 ) {
130 break;
133 rv = SEC_QuickDERDecodeItem
134 (arena, value, CERTAuthKeyIDTemplate, &newEncodedValue);
135 if (rv != SECSuccess)
136 break;
138 value->authCertIssuer = cert_DecodeGeneralNames (arena, value->DERAuthCertIssuer);
139 if (value->authCertIssuer == NULL)
140 break;
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);
148 break;
150 } while (0);
152 if (rv != SECSuccess) {
153 PORT_ArenaRelease (arena, mark);
154 return ((CERTAuthKeyID *)NULL);
156 PORT_ArenaUnmark(arena, mark);
157 return (value);