1/* 2 * Copyright (c) 2003-2004,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 * SecAsn1Templates.c - Common ASN1 templates for use with libsecurity_asn1. 24 */ 25 26#include "secasn1t.h" 27#include "seccomon.h" 28#include <stddef.h> 29 30/* 31 * Generic templates for individual/simple items and pointers to 32 * and sets of same. 33 * 34 * If you need to add a new one, please note the following: 35 * - For each new basic type you should add *four* templates: 36 * one plain, one PointerTo, one SequenceOf and one SetOf. 37 * - If the new type can be constructed (meaning, it is a 38 * *string* type according to BER/DER rules), then you should 39 * or-in SEC_ASN1_MAY_STREAM to the type in the basic template. 40 * See the definition of the OctetString template for an example. 41 * - It may not be obvious, but these are in *alphabetical* 42 * order based on the SEC_ASN1_XXX name; so put new ones in 43 * the appropriate place. 44 */ 45 46const SecAsn1Template kSecAsn1AnyTemplate[] = { 47 { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 48}; 49 50const SecAsn1Template kSecAsn1PointerToAnyTemplate[] = { 51 { SEC_ASN1_POINTER, 0, kSecAsn1AnyTemplate } 52}; 53 54const SecAsn1Template kSecAsn1SequenceOfAnyTemplate[] = { 55 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1AnyTemplate } 56}; 57 58const SecAsn1Template kSecAsn1SetOfAnyTemplate[] = { 59 { SEC_ASN1_SET_OF, 0, kSecAsn1AnyTemplate } 60}; 61 62const SecAsn1Template kSecAsn1BitStringTemplate[] = { 63 { SEC_ASN1_BIT_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 64}; 65 66const SecAsn1Template kSecAsn1PointerToBitStringTemplate[] = { 67 { SEC_ASN1_POINTER, 0, kSecAsn1BitStringTemplate } 68}; 69 70const SecAsn1Template kSecAsn1SequenceOfBitStringTemplate[] = { 71 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1BitStringTemplate } 72}; 73 74const SecAsn1Template kSecAsn1SetOfBitStringTemplate[] = { 75 { SEC_ASN1_SET_OF, 0, kSecAsn1BitStringTemplate } 76}; 77 78const SecAsn1Template kSecAsn1BMPStringTemplate[] = { 79 { SEC_ASN1_BMP_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 80}; 81 82const SecAsn1Template kSecAsn1PointerToBMPStringTemplate[] = { 83 { SEC_ASN1_POINTER, 0, kSecAsn1BMPStringTemplate } 84}; 85 86const SecAsn1Template kSecAsn1SequenceOfBMPStringTemplate[] = { 87 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1BMPStringTemplate } 88}; 89 90const SecAsn1Template kSecAsn1SetOfBMPStringTemplate[] = { 91 { SEC_ASN1_SET_OF, 0, kSecAsn1BMPStringTemplate } 92}; 93 94const SecAsn1Template kSecAsn1BooleanTemplate[] = { 95 { SEC_ASN1_BOOLEAN, 0, NULL, sizeof(SecAsn1Item) } 96}; 97 98const SecAsn1Template kSecAsn1PointerToBooleanTemplate[] = { 99 { SEC_ASN1_POINTER, 0, kSecAsn1BooleanTemplate } 100}; 101 102const SecAsn1Template kSecAsn1SequenceOfBooleanTemplate[] = { 103 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1BooleanTemplate } 104}; 105 106const SecAsn1Template kSecAsn1SetOfBooleanTemplate[] = { 107 { SEC_ASN1_SET_OF, 0, kSecAsn1BooleanTemplate } 108}; 109 110const SecAsn1Template kSecAsn1EnumeratedTemplate[] = { 111 { SEC_ASN1_ENUMERATED, 0, NULL, sizeof(SecAsn1Item) } 112}; 113 114const SecAsn1Template kSecAsn1PointerToEnumeratedTemplate[] = { 115 { SEC_ASN1_POINTER, 0, kSecAsn1EnumeratedTemplate } 116}; 117 118const SecAsn1Template kSecAsn1SequenceOfEnumeratedTemplate[] = { 119 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1EnumeratedTemplate } 120}; 121 122const SecAsn1Template kSecAsn1SetOfEnumeratedTemplate[] = { 123 { SEC_ASN1_SET_OF, 0, kSecAsn1EnumeratedTemplate } 124}; 125 126const SecAsn1Template kSecAsn1GeneralizedTimeTemplate[] = { 127 { SEC_ASN1_GENERALIZED_TIME | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)} 128}; 129 130const SecAsn1Template kSecAsn1PointerToGeneralizedTimeTemplate[] = { 131 { SEC_ASN1_POINTER, 0, kSecAsn1GeneralizedTimeTemplate } 132}; 133 134const SecAsn1Template kSecAsn1SequenceOfGeneralizedTimeTemplate[] = { 135 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1GeneralizedTimeTemplate } 136}; 137 138const SecAsn1Template kSecAsn1SetOfGeneralizedTimeTemplate[] = { 139 { SEC_ASN1_SET_OF, 0, kSecAsn1GeneralizedTimeTemplate } 140}; 141 142const SecAsn1Template kSecAsn1IA5StringTemplate[] = { 143 { SEC_ASN1_IA5_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 144}; 145 146const SecAsn1Template kSecAsn1PointerToIA5StringTemplate[] = { 147 { SEC_ASN1_POINTER, 0, kSecAsn1IA5StringTemplate } 148}; 149 150const SecAsn1Template kSecAsn1SequenceOfIA5StringTemplate[] = { 151 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1IA5StringTemplate } 152}; 153 154const SecAsn1Template kSecAsn1SetOfIA5StringTemplate[] = { 155 { SEC_ASN1_SET_OF, 0, kSecAsn1IA5StringTemplate } 156}; 157 158const SecAsn1Template kSecAsn1IntegerTemplate[] = { 159 { SEC_ASN1_INTEGER | SEC_ASN1_SIGNED_INT, 0, NULL, sizeof(SecAsn1Item) } 160}; 161 162const SecAsn1Template kSecAsn1UnsignedIntegerTemplate[] = { 163 { SEC_ASN1_INTEGER, 0, NULL, sizeof(SecAsn1Item) } 164}; 165 166const SecAsn1Template kSecAsn1PointerToIntegerTemplate[] = { 167 { SEC_ASN1_POINTER, 0, kSecAsn1IntegerTemplate } 168}; 169 170const SecAsn1Template kSecAsn1SequenceOfIntegerTemplate[] = { 171 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1IntegerTemplate } 172}; 173 174const SecAsn1Template kSecAsn1SetOfIntegerTemplate[] = { 175 { SEC_ASN1_SET_OF, 0, kSecAsn1IntegerTemplate } 176}; 177 178const SecAsn1Template kSecAsn1NullTemplate[] = { 179 { SEC_ASN1_NULL, 0, NULL, sizeof(SecAsn1Item) } 180}; 181 182const SecAsn1Template kSecAsn1PointerToNullTemplate[] = { 183 { SEC_ASN1_POINTER, 0, kSecAsn1NullTemplate } 184}; 185 186const SecAsn1Template kSecAsn1SequenceOfNullTemplate[] = { 187 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1NullTemplate } 188}; 189 190const SecAsn1Template kSecAsn1SetOfNullTemplate[] = { 191 { SEC_ASN1_SET_OF, 0, kSecAsn1NullTemplate } 192}; 193 194const SecAsn1Template kSecAsn1ObjectIDTemplate[] = { 195 { SEC_ASN1_OBJECT_ID, 0, NULL, sizeof(SecAsn1Item) } 196}; 197 198const SecAsn1Template kSecAsn1PointerToObjectIDTemplate[] = { 199 { SEC_ASN1_POINTER, 0, kSecAsn1ObjectIDTemplate } 200}; 201 202const SecAsn1Template kSecAsn1SequenceOfObjectIDTemplate[] = { 203 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1ObjectIDTemplate } 204}; 205 206const SecAsn1Template kSecAsn1SetOfObjectIDTemplate[] = { 207 { SEC_ASN1_SET_OF, 0, kSecAsn1ObjectIDTemplate } 208}; 209 210const SecAsn1Template kSecAsn1OctetStringTemplate[] = { 211 { SEC_ASN1_OCTET_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 212}; 213 214const SecAsn1Template kSecAsn1PointerToOctetStringTemplate[] = { 215 { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, kSecAsn1OctetStringTemplate } 216}; 217 218const SecAsn1Template kSecAsn1SequenceOfOctetStringTemplate[] = { 219 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1OctetStringTemplate } 220}; 221 222const SecAsn1Template kSecAsn1SetOfOctetStringTemplate[] = { 223 { SEC_ASN1_SET_OF, 0, kSecAsn1OctetStringTemplate } 224}; 225 226const SecAsn1Template kSecAsn1PrintableStringTemplate[] = { 227 { SEC_ASN1_PRINTABLE_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)} 228}; 229 230const SecAsn1Template kSecAsn1PointerToPrintableStringTemplate[] = { 231 { SEC_ASN1_POINTER, 0, kSecAsn1PrintableStringTemplate } 232}; 233 234const SecAsn1Template kSecAsn1SequenceOfPrintableStringTemplate[] = { 235 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1PrintableStringTemplate } 236}; 237 238const SecAsn1Template kSecAsn1SetOfPrintableStringTemplate[] = { 239 { SEC_ASN1_SET_OF, 0, kSecAsn1PrintableStringTemplate } 240}; 241 242#ifdef __APPLE__ 243const SecAsn1Template kSecAsn1TeletexStringTemplate[] = { 244 { SEC_ASN1_TELETEX_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)} 245}; 246 247const SecAsn1Template kSecAsn1PointerToTeletexStringTemplate[] = { 248 { SEC_ASN1_POINTER, 0, kSecAsn1TeletexStringTemplate } 249}; 250 251const SecAsn1Template kSecAsn1SequenceOfTeletexStringTemplate[] = { 252 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1TeletexStringTemplate } 253}; 254 255const SecAsn1Template kSecAsn1SetOfTeletexStringTemplate[] = { 256 { SEC_ASN1_SET_OF, 0, kSecAsn1TeletexStringTemplate } 257}; 258#endif /* __APPLE__ */ 259 260const SecAsn1Template kSecAsn1T61StringTemplate[] = { 261 { SEC_ASN1_T61_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 262}; 263 264const SecAsn1Template kSecAsn1PointerToT61StringTemplate[] = { 265 { SEC_ASN1_POINTER, 0, kSecAsn1T61StringTemplate } 266}; 267 268const SecAsn1Template kSecAsn1SequenceOfT61StringTemplate[] = { 269 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1T61StringTemplate } 270}; 271 272const SecAsn1Template kSecAsn1SetOfT61StringTemplate[] = { 273 { SEC_ASN1_SET_OF, 0, kSecAsn1T61StringTemplate } 274}; 275 276const SecAsn1Template kSecAsn1UniversalStringTemplate[] = { 277 { SEC_ASN1_UNIVERSAL_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)} 278}; 279 280const SecAsn1Template kSecAsn1PointerToUniversalStringTemplate[] = { 281 { SEC_ASN1_POINTER, 0, kSecAsn1UniversalStringTemplate } 282}; 283 284const SecAsn1Template kSecAsn1SequenceOfUniversalStringTemplate[] = { 285 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1UniversalStringTemplate } 286}; 287 288const SecAsn1Template kSecAsn1SetOfUniversalStringTemplate[] = { 289 { SEC_ASN1_SET_OF, 0, kSecAsn1UniversalStringTemplate } 290}; 291 292const SecAsn1Template kSecAsn1UTCTimeTemplate[] = { 293 { SEC_ASN1_UTC_TIME | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 294}; 295 296const SecAsn1Template kSecAsn1PointerToUTCTimeTemplate[] = { 297 { SEC_ASN1_POINTER, 0, kSecAsn1UTCTimeTemplate } 298}; 299 300const SecAsn1Template kSecAsn1SequenceOfUTCTimeTemplate[] = { 301 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1UTCTimeTemplate } 302}; 303 304const SecAsn1Template kSecAsn1SetOfUTCTimeTemplate[] = { 305 { SEC_ASN1_SET_OF, 0, kSecAsn1UTCTimeTemplate } 306}; 307 308const SecAsn1Template kSecAsn1UTF8StringTemplate[] = { 309 { SEC_ASN1_UTF8_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item)} 310}; 311 312const SecAsn1Template kSecAsn1PointerToUTF8StringTemplate[] = { 313 { SEC_ASN1_POINTER, 0, kSecAsn1UTF8StringTemplate } 314}; 315 316const SecAsn1Template kSecAsn1SequenceOfUTF8StringTemplate[] = { 317 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1UTF8StringTemplate } 318}; 319 320const SecAsn1Template kSecAsn1SetOfUTF8StringTemplate[] = { 321 { SEC_ASN1_SET_OF, 0, kSecAsn1UTF8StringTemplate } 322}; 323 324const SecAsn1Template kSecAsn1VisibleStringTemplate[] = { 325 { SEC_ASN1_VISIBLE_STRING | SEC_ASN1_MAY_STREAM, 0, NULL, sizeof(SecAsn1Item) } 326}; 327 328const SecAsn1Template kSecAsn1PointerToVisibleStringTemplate[] = { 329 { SEC_ASN1_POINTER, 0, kSecAsn1VisibleStringTemplate } 330}; 331 332const SecAsn1Template kSecAsn1SequenceOfVisibleStringTemplate[] = { 333 { SEC_ASN1_SEQUENCE_OF, 0, kSecAsn1VisibleStringTemplate } 334}; 335 336const SecAsn1Template kSecAsn1SetOfVisibleStringTemplate[] = { 337 { SEC_ASN1_SET_OF, 0, kSecAsn1VisibleStringTemplate } 338}; 339 340 341/* 342 * Template for skipping a subitem. 343 * 344 * Note that it only makes sense to use this for decoding (when you want 345 * to decode something where you are only interested in one or two of 346 * the fields); you cannot encode a SKIP! 347 */ 348const SecAsn1Template kSecAsn1SkipTemplate[] = { 349 { SEC_ASN1_SKIP } 350}; 351 352#ifndef __APPLE__ 353 354/* These functions simply return the address of the above-declared templates. 355** This is necessary for Windows DLLs. Sigh. 356*/ 357SEC_ASN1_CHOOSER_IMPLEMENT(SEC_AnyTemplate) 358SEC_ASN1_CHOOSER_IMPLEMENT(SEC_BMPStringTemplate) 359SEC_ASN1_CHOOSER_IMPLEMENT(SEC_BooleanTemplate) 360SEC_ASN1_CHOOSER_IMPLEMENT(SEC_BitStringTemplate) 361SEC_ASN1_CHOOSER_IMPLEMENT(SEC_IA5StringTemplate) 362SEC_ASN1_CHOOSER_IMPLEMENT(SEC_GeneralizedTimeTemplate) 363SEC_ASN1_CHOOSER_IMPLEMENT(SEC_IntegerTemplate) 364SEC_ASN1_CHOOSER_IMPLEMENT(SEC_NullTemplate) 365SEC_ASN1_CHOOSER_IMPLEMENT(SEC_ObjectIDTemplate) 366SEC_ASN1_CHOOSER_IMPLEMENT(SEC_OctetStringTemplate) 367SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToAnyTemplate) 368SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToOctetStringTemplate) 369SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SetOfAnyTemplate) 370SEC_ASN1_CHOOSER_IMPLEMENT(SEC_UTCTimeTemplate) 371SEC_ASN1_CHOOSER_IMPLEMENT(SEC_UTF8StringTemplate) 372 373#endif /* __APPLE__ */ 374