1/*
2 * Copyright (c) 2003-2006,2008,2010 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 *
23 * keyTemplate.cpp -  ASN1 templates for asymmetric keys and related
24 * structs.
25 */
26
27#include "SecAsn1Templates.h"
28#include <stddef.h>
29#include "keyTemplates.h"
30
31/* AlgorithmIdentifier : SecAsn1AlgId */
32const SecAsn1Template kSecAsn1AlgorithmIDTemplate[] = {
33    { SEC_ASN1_SEQUENCE,
34	  0, NULL, sizeof(SecAsn1AlgId) },
35    { SEC_ASN1_OBJECT_ID,
36	  offsetof(SecAsn1AlgId,algorithm), },
37    { SEC_ASN1_OPTIONAL | SEC_ASN1_ANY,
38	  offsetof(SecAsn1AlgId,parameters), },
39    { 0, }
40};
41
42/* SubjectPublicKeyInfo : SecAsn1PubKeyInfo */
43const SecAsn1Template kSecAsn1SubjectPublicKeyInfoTemplate[] = {
44    { SEC_ASN1_SEQUENCE,
45	  0, NULL, sizeof(SecAsn1PubKeyInfo) },
46    { SEC_ASN1_INLINE,
47	  offsetof(SecAsn1PubKeyInfo,algorithm),
48	  kSecAsn1AlgorithmIDTemplate },
49    { SEC_ASN1_BIT_STRING,
50	  offsetof(SecAsn1PubKeyInfo,subjectPublicKey), },
51    { 0, }
52};
53
54/* Attribute : NSS_Attribute */
55const SecAsn1Template kSecAsn1AttributeTemplate[] = {
56    { SEC_ASN1_SEQUENCE,
57        0, NULL, sizeof(NSS_Attribute) },
58    { SEC_ASN1_OBJECT_ID, offsetof(NSS_Attribute, attrType) },
59    { SEC_ASN1_SET_OF, offsetof(NSS_Attribute, attrValue),
60        kSecAsn1AnyTemplate },
61    { 0 }
62};
63
64const SecAsn1Template kSecAsn1SetOfAttributeTemplate[] = {
65    { SEC_ASN1_SET_OF, 0, kSecAsn1AttributeTemplate },
66};
67
68/* PKCS8 PrivateKeyInfo : NSS_PrivateKeyInfo */
69const SecAsn1Template kSecAsn1PrivateKeyInfoTemplate[] = {
70    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_PrivateKeyInfo) },
71    { SEC_ASN1_INTEGER, offsetof(NSS_PrivateKeyInfo,version) },
72    { SEC_ASN1_INLINE, offsetof(NSS_PrivateKeyInfo,algorithm),
73        kSecAsn1AlgorithmIDTemplate },
74    { SEC_ASN1_OCTET_STRING, offsetof(NSS_PrivateKeyInfo,privateKey) },
75    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED |
76	  SEC_ASN1_CONTEXT_SPECIFIC | 0,
77        offsetof(NSS_PrivateKeyInfo,attributes),
78        kSecAsn1SetOfAttributeTemplate },
79    { 0 }
80};
81
82/* NSS_EncryptedPrivateKeyInfo */
83const SecAsn1Template kSecAsn1EncryptedPrivateKeyInfoTemplate[] = {
84    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_EncryptedPrivateKeyInfo) },
85    { SEC_ASN1_INLINE,
86	  offsetof(NSS_EncryptedPrivateKeyInfo,algorithm),
87	  kSecAsn1AlgorithmIDTemplate },
88    { SEC_ASN1_OCTET_STRING,
89	  offsetof(NSS_EncryptedPrivateKeyInfo,encryptedData) },
90    { 0 }
91};
92
93/* DigestInfo: NSS_DigestInfo */
94const SecAsn1Template kSecAsn1DigestInfoTemplate[] = {
95    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DigestInfo) },
96    { SEC_ASN1_INLINE, offsetof(NSS_DigestInfo,digestAlgorithm),
97        kSecAsn1AlgorithmIDTemplate },
98    { SEC_ASN1_OCTET_STRING, offsetof(NSS_DigestInfo,digest) },
99    { 0 }
100};
101
102// MARK: -
103// MARK: *** RSA ***
104
105/*** RSA public key, PKCS1 format : NSS_RSAPublicKeyPKCS1 ***/
106const SecAsn1Template kSecAsn1RSAPublicKeyPKCS1Template[] = {
107    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_RSAPublicKeyPKCS1) },
108    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPublicKeyPKCS1,modulus) },
109    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPublicKeyPKCS1,publicExponent) },
110    { 0, }
111};
112
113/*** RSA private key key, PKCS1 format : NSS_RSAPrivateKeyPKCS1 ***/
114const SecAsn1Template kSecAsn1RSAPrivateKeyPKCS1Template[] = {
115    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_RSAPrivateKeyPKCS1) },
116    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,version) },
117    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,modulus) },
118    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,publicExponent) },
119    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,privateExponent) },
120    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,prime1) },
121    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,prime2) },
122    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,exponent1) },
123    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,exponent2) },
124    { SEC_ASN1_INTEGER, offsetof(NSS_RSAPrivateKeyPKCS1,coefficient) },
125    { 0, }
126};
127
128// MARK: -
129// MARK: *** Diffie-Hellman ***
130
131/****
132 **** Diffie-Hellman, from PKCS3.
133 ****/
134const SecAsn1Template kSecAsn1DHParameterTemplate[] = {
135	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHParameter) },
136    { SEC_ASN1_INTEGER, offsetof(NSS_DHParameter,prime) },
137    { SEC_ASN1_INTEGER, offsetof(NSS_DHParameter,base) },
138    { SEC_ASN1_INTEGER | SEC_ASN1_OPTIONAL, offsetof(NSS_DHParameter,privateValueLength) },
139	{ 0, }
140};
141
142const SecAsn1Template kSecAsn1DHParameterBlockTemplate[] = {
143	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHParameterBlock) },
144	{ SEC_ASN1_OBJECT_ID, offsetof(NSS_DHParameterBlock, oid) },
145    { SEC_ASN1_INLINE,
146	  offsetof(NSS_DHParameterBlock, params),
147	  kSecAsn1DHParameterTemplate },
148	{ 0, }
149};
150
151const SecAsn1Template kSecAsn1DHPrivateKeyTemplate[] = {
152	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHPrivateKey) },
153	{ SEC_ASN1_OBJECT_ID, offsetof(NSS_DHPrivateKey, dhOid) },
154    { SEC_ASN1_INLINE,
155	  offsetof(NSS_DHPrivateKey, params),
156	  kSecAsn1DHParameterTemplate },
157    { SEC_ASN1_INTEGER, offsetof(NSS_DHPrivateKey,secretPart) },
158	{ 0, }
159};
160
161/*
162 * Diffie-Hellman, X9.42 style.
163 */
164const SecAsn1Template kSecAsn1DHValidationParamsTemplate[] = {
165	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHValidationParams) },
166	{ SEC_ASN1_BIT_STRING, offsetof(NSS_DHValidationParams, seed) },
167	{ SEC_ASN1_INTEGER, offsetof(NSS_DHValidationParams, pGenCounter) },
168	{ 0, }
169};
170
171const SecAsn1Template kSecAsn1DHDomainParamsX942Template[] = {
172	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHDomainParamsX942) },
173	{ SEC_ASN1_INTEGER, offsetof(NSS_DHDomainParamsX942, p) },
174	{ SEC_ASN1_INTEGER, offsetof(NSS_DHDomainParamsX942, g) },
175	{ SEC_ASN1_INTEGER, offsetof(NSS_DHDomainParamsX942, q) },
176	{ SEC_ASN1_INTEGER | SEC_ASN1_OPTIONAL,
177	  offsetof(NSS_DHDomainParamsX942, j) },
178	{ SEC_ASN1_POINTER | SEC_ASN1_OPTIONAL,
179	  offsetof(NSS_DHDomainParamsX942, valParams),
180	  kSecAsn1DHValidationParamsTemplate },
181	{ 0, }
182};
183
184const SecAsn1Template kSecAsn1DHAlgorithmIdentifierX942Template[] = {
185	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHAlgorithmIdentifierX942) },
186	{ SEC_ASN1_OBJECT_ID, offsetof(NSS_DHAlgorithmIdentifierX942, oid) },
187    { SEC_ASN1_INLINE,
188	  offsetof(NSS_DHAlgorithmIdentifierX942, params),
189	  kSecAsn1DHDomainParamsX942Template },
190	{ 0, }
191};
192
193const SecAsn1Template kSecAsn1DHPrivateKeyPKCS8Template[] = {
194	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHPrivateKeyPKCS8) },
195    { SEC_ASN1_INTEGER, offsetof(NSS_DHPrivateKeyPKCS8,version) },
196    { SEC_ASN1_INLINE, offsetof(NSS_DHPrivateKeyPKCS8,algorithm),
197        kSecAsn1DHAlgorithmIdentifierX942Template },
198    { SEC_ASN1_OCTET_STRING, offsetof(NSS_DHPrivateKeyPKCS8,privateKey) },
199    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED |
200	  SEC_ASN1_CONTEXT_SPECIFIC | 0,
201        offsetof(NSS_DHPrivateKeyPKCS8,attributes),
202        kSecAsn1SetOfAttributeTemplate },
203    { 0 }
204};
205
206const SecAsn1Template kSecAsn1DHPublicKeyX509Template[] = {
207	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_DHPublicKeyX509) },
208    { SEC_ASN1_INLINE, offsetof(NSS_DHPublicKeyX509,algorithm),
209        kSecAsn1DHAlgorithmIdentifierX942Template },
210	{ SEC_ASN1_BIT_STRING, offsetof(NSS_DHPublicKeyX509, publicKey) },
211    { 0 }
212};
213
214/* ECDSA Private key */
215const SecAsn1Template kSecAsn1ECDSAPrivateKeyInfoTemplate[] = {
216	{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(NSS_ECDSA_PrivateKey) },
217    { SEC_ASN1_INTEGER, offsetof(NSS_ECDSA_PrivateKey,version) },
218    { SEC_ASN1_OCTET_STRING, offsetof(NSS_ECDSA_PrivateKey,privateKey) },
219    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | 0,
220	  offsetof(NSS_ECDSA_PrivateKey,params), kSecAsn1AnyTemplate},
221    { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | 1,
222	  offsetof(NSS_ECDSA_PrivateKey,pubKey), kSecAsn1BitStringTemplate },
223    { 0, }
224};
225
226