1/* 2 * Copyright (c) 2003-2004,2011,2014 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/* 24 * pkcs7Templates.h 25 */ 26 27#ifndef _PKCS7_TEMPLATES_H_ 28#define _PKCS7_TEMPLATES_H_ 29 30#include <Security/secasn1t.h> 31#include <Security/cssmtype.h> 32#include <Security/x509defs.h> 33 34#ifdef __cplusplus 35extern "C" { 36#endif 37 38/* 39 * DigestInfo ::= SEQUENCE { 40 * digestAlgorithm DigestAlgorithmIdentifier, 41 * digest Digest 42 * } 43 * 44 * Digest ::= OCTET STRING 45 */ 46typedef struct { 47 CSSM_X509_ALGORITHM_IDENTIFIER digestAlgorithm; 48 CSSM_DATA digest; 49} NSS_P7_DigestInfo; 50 51extern const SecAsn1Template NSS_P7_DigestInfoTemplate[]; 52 53/* 54 * Uninterpreted ContentInfo, with content stripped from its 55 * EXPLICIT CONTEXT_SPECIFIC wrapper 56 * 57 * ContentInfo ::= SEQUENCE { 58 * contentType ContentType, 59 * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL 60 * } 61 */ 62typedef struct { 63 CSSM_OID contentType; 64 CSSM_DATA content; 65} NSS_P7_RawContentInfo; 66 67extern const SecAsn1Template NSS_P7_RawContentInfoTemplate[]; 68 69#pragma mark ---- ContentInfo.content types ----- 70 71/* 72 * Expand beyond ASN_ANY/CSSM_DATA as needed 73 */ 74typedef CSSM_DATA NSS_P7_SignedData; 75typedef CSSM_DATA NSS_P7_EnvelData; 76typedef CSSM_DATA NSS_P7_SignEnvelData; 77typedef CSSM_DATA NSS_P7_DigestedData; 78 79/* EncryptedData */ 80 81/* 82 * EncryptedContentInfo ::= SEQUENCE { 83 * contentType ContentType, 84 * contentEncryptionAlgorithm 85 * ContentEncryptionAlgorithmIdentifier, 86 * encryptedContent 87 * [0] IMPLICIT EncryptedContent OPTIONAL 88 * } 89 * 90 * EncryptedContent ::= OCTET STRING 91 */ 92 93typedef struct { 94 CSSM_OID contentType; 95 CSSM_X509_ALGORITHM_IDENTIFIER encrAlg; 96 CSSM_DATA encrContent; 97} NSS_P7_EncrContentInfo; 98 99/* 100 * EncryptedData ::= SEQUENCE { 101 * version Version, 102 * encryptedContentInfo EncryptedContentInfo 103 * } 104 */ 105typedef struct { 106 CSSM_DATA version; 107 NSS_P7_EncrContentInfo contentInfo; 108} NSS_P7_EncryptedData; 109 110extern const SecAsn1Template NSS_P7_EncrContentInfoTemplate[]; 111extern const SecAsn1Template NSS_P7_EncryptedDataTemplate[]; 112extern const SecAsn1Template NSS_P7_PtrToEncryptedDataTemplate[]; 113 114/* the stub templates for unimplemented contentTypes */ 115#define NSS_P7_PtrToSignedDataTemplate kSecAsn1PointerToAnyTemplate 116#define NSS_P7_PtrToEnvelDataTemplate kSecAsn1PointerToAnyTemplate 117#define NSS_P7_PtrToSignEnvelDataTemplate kSecAsn1PointerToAnyTemplate 118#define NSS_P7_PtrToDigestedDataTemplate kSecAsn1PointerToAnyTemplate 119 120#pragma mark ---- decoded ContentInfo ----- 121 122/* 123 * For convenience, out dynamic template chooser for ContentInfo.content 124 * drops one of these into the decoded struct. Thus, higher level 125 * code doesn't have to grunge around comparing OIDs to figure out 126 * what's there. 127 */ 128typedef enum { 129 CT_None = 0, 130 CT_Data, 131 CT_SignedData, 132 CT_EnvData, 133 CT_SignedEnvData, 134 CT_DigestData, 135 CT_EncryptedData 136} NSS_P7_CI_Type; 137 138/* 139 * Decoded ContentInfo. Decoded via SEC_ASN1_DYNAMIC per contentType. 140 */ 141typedef struct { 142 CSSM_OID contentType; 143 NSS_P7_CI_Type type; 144 union { 145 CSSM_DATA *data; // CSSMOID_PKCS7_Data 146 // contents of Octet String 147 NSS_P7_SignedData *signedData; 148 // CSSMOID_PKCS7_SignedData 149 NSS_P7_EnvelData *envData; // CSSMOID_PKCS7_EnvelopedData 150 NSS_P7_SignEnvelData *signEnvelData; 151 // CSSMOID_PKCS7_SignedAndEnvelopedData 152 NSS_P7_DigestedData *digestedData; 153 // CSSMOID_PKCS7_DigestedData 154 NSS_P7_EncryptedData *encryptData; 155 //CSSMOID_PKCS7_EncryptedData 156 157 } content; 158} NSS_P7_DecodedContentInfo; 159 160extern const SecAsn1Template NSS_P7_DecodedContentInfoTemplate[]; 161 162#ifdef __cplusplus 163} 164#endif 165 166#endif /* _PKCS7_TEMPLATES_H_ */ 167 168