p12tmpl.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:9k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include "plarena.h"
  34. #include "secitem.h"
  35. #include "secoid.h"
  36. #include "seccomon.h"
  37. #include "secport.h"
  38. #include "cert.h"
  39. #include "secpkcs7.h"
  40. #include "secasn1.h"
  41. #include "p12t.h"
  42. static const SEC_ASN1Template *
  43. sec_pkcs12_choose_safe_bag_type(void *src_or_dest, PRBool encoding)
  44. {
  45.     const SEC_ASN1Template *theTemplate;
  46.     sec_PKCS12SafeBag *safeBag;
  47.     SECOidData *oiddata;
  48.     if (src_or_dest == NULL) {
  49. return NULL;
  50.     }
  51.     safeBag = (sec_PKCS12SafeBag*)src_or_dest;
  52.     oiddata = SECOID_FindOID(&safeBag->safeBagType);
  53.     if(oiddata == NULL) {
  54. return SEC_AnyTemplate;
  55.     }
  56.     switch (oiddata->offset) {
  57. default:
  58.     theTemplate = SEC_AnyTemplate;
  59.     break;
  60. case SEC_OID_PKCS12_V1_KEY_BAG_ID:
  61.     theTemplate = SECKEY_PointerToPrivateKeyInfoTemplate;
  62.     break;
  63. case SEC_OID_PKCS12_V1_CERT_BAG_ID:
  64.     theTemplate = sec_PKCS12PointerToCertBagTemplate;
  65.     break;
  66. case SEC_OID_PKCS12_V1_CRL_BAG_ID:
  67.     theTemplate = sec_PKCS12PointerToCRLBagTemplate;
  68.     break;
  69.         case SEC_OID_PKCS12_V1_SECRET_BAG_ID:
  70.     theTemplate = sec_PKCS12PointerToSecretBagTemplate;
  71.     break;
  72. case SEC_OID_PKCS12_V1_PKCS8_SHROUDED_KEY_BAG_ID:
  73.     theTemplate = SECKEY_PointerToEncryptedPrivateKeyInfoTemplate;
  74.     break;
  75. case SEC_OID_PKCS12_V1_SAFE_CONTENTS_BAG_ID:
  76.     if(encoding) {
  77. theTemplate = sec_PKCS12PointerToSafeContentsTemplate;
  78.     } else {
  79. theTemplate = SEC_PointerToAnyTemplate;
  80.     }
  81.     break;
  82.     }
  83.     return theTemplate;
  84. }
  85. static const SEC_ASN1Template *
  86. sec_pkcs12_choose_crl_bag_type(void *src_or_dest, PRBool encoding)
  87. {
  88.     const SEC_ASN1Template *theTemplate;
  89.     sec_PKCS12CRLBag *crlbag;
  90.     SECOidData *oiddata;
  91.     if (src_or_dest == NULL) {
  92. return NULL;
  93.     }
  94.     crlbag = (sec_PKCS12CRLBag*)src_or_dest;
  95.     oiddata = SECOID_FindOID(&crlbag->bagID);
  96.     if(oiddata == NULL) {
  97. return SEC_AnyTemplate;
  98.     }
  99.     switch (oiddata->offset) {
  100. default:
  101.     theTemplate = SEC_AnyTemplate;
  102.     break;
  103. case SEC_OID_PKCS9_X509_CRL:
  104.     theTemplate = SEC_OctetStringTemplate;
  105.     break;
  106.     }
  107.     return theTemplate;
  108. }
  109. static const SEC_ASN1Template *
  110. sec_pkcs12_choose_cert_bag_type(void *src_or_dest, PRBool encoding)
  111. {
  112.     const SEC_ASN1Template *theTemplate;
  113.     sec_PKCS12CertBag *certbag;
  114.     SECOidData *oiddata;
  115.     if (src_or_dest == NULL) {
  116. return NULL;
  117.     }
  118.     certbag = (sec_PKCS12CertBag*)src_or_dest;
  119.     oiddata = SECOID_FindOID(&certbag->bagID);
  120.     if(oiddata == NULL) {
  121. return SEC_AnyTemplate;
  122.     }
  123.     switch (oiddata->offset) {
  124. default:
  125.     theTemplate = SEC_AnyTemplate;
  126.     break;
  127. case SEC_OID_PKCS9_X509_CERT:
  128.     theTemplate = SEC_OctetStringTemplate;
  129.     break;
  130. case SEC_OID_PKCS9_SDSI_CERT:
  131.     theTemplate = SEC_IA5StringTemplate;
  132.     break;
  133.     }
  134.     return theTemplate;
  135. }
  136. static const SEC_ASN1Template *
  137. sec_pkcs12_choose_attr_type(void *src_or_dest, PRBool encoding)
  138. {
  139.     const SEC_ASN1Template *theTemplate;
  140.     sec_PKCS12Attribute *attr;
  141.     SECOidData *oiddata;
  142.     if (src_or_dest == NULL) {
  143. return NULL;
  144.     }
  145.     attr = (sec_PKCS12Attribute*)src_or_dest;
  146.     oiddata = SECOID_FindOID(&attr->attrType);
  147.     if(oiddata == NULL) {
  148. return SEC_AnyTemplate;
  149.     }
  150.     switch (oiddata->offset) {
  151. default:
  152.     theTemplate = SEC_AnyTemplate;
  153.     break;
  154. case SEC_OID_PKCS9_FRIENDLY_NAME:
  155.     theTemplate = SEC_BMPStringTemplate;
  156.     break;
  157. case SEC_OID_PKCS9_LOCAL_KEY_ID:
  158.     theTemplate = SEC_OctetStringTemplate;
  159.     break;
  160. case SEC_OID_PKCS12_KEY_USAGE:
  161.     theTemplate = SEC_BitStringTemplate;
  162.     break;
  163.     }
  164.     return theTemplate;
  165. }
  166. const SEC_ASN1Template sec_PKCS12PointerToContentInfoTemplate[] = {
  167.     { SEC_ASN1_POINTER | SEC_ASN1_MAY_STREAM, 0, sec_PKCS7ContentInfoTemplate }
  168. };
  169. static SEC_ChooseASN1TemplateFunc sec_pkcs12_crl_bag_chooser =
  170.     sec_pkcs12_choose_crl_bag_type;
  171. static SEC_ChooseASN1TemplateFunc sec_pkcs12_cert_bag_chooser =
  172.     sec_pkcs12_choose_cert_bag_type;
  173. static SEC_ChooseASN1TemplateFunc sec_pkcs12_safe_bag_chooser =
  174.     sec_pkcs12_choose_safe_bag_type;
  175. static SEC_ChooseASN1TemplateFunc sec_pkcs12_attr_chooser =
  176.     sec_pkcs12_choose_attr_type;
  177. const SEC_ASN1Template sec_PKCS12PointerToCertBagTemplate[] = {
  178.     { SEC_ASN1_POINTER, 0, sec_PKCS12CertBagTemplate }
  179. };
  180. const SEC_ASN1Template sec_PKCS12PointerToCRLBagTemplate[] = {
  181.     { SEC_ASN1_POINTER, 0, sec_PKCS12CRLBagTemplate }
  182. };
  183. const SEC_ASN1Template sec_PKCS12PointerToSecretBagTemplate[] = {
  184.     { SEC_ASN1_POINTER, 0, sec_PKCS12SecretBagTemplate }
  185. };
  186. const SEC_ASN1Template sec_PKCS12PointerToSafeContentsTemplate[] = {
  187.     { SEC_ASN1_POINTER, 0, sec_PKCS12SafeContentsTemplate }
  188. };
  189. const SEC_ASN1Template sec_PKCS12PFXItemTemplate[] = {
  190.     { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL, 
  191. sizeof(sec_PKCS12PFXItem) },
  192.     { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, 
  193. offsetof(sec_PKCS12PFXItem, version) },
  194.     { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM, 
  195. offsetof(sec_PKCS12PFXItem, encodedAuthSafe) },
  196.     { SEC_ASN1_ANY | SEC_ASN1_MAY_STREAM,
  197. offsetof(sec_PKCS12PFXItem, encodedMacData) },
  198.     { 0 }
  199. };
  200. const SEC_ASN1Template sec_PKCS12MacDataTemplate[] = {
  201.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12MacData) },
  202.     { SEC_ASN1_INLINE, offsetof(sec_PKCS12MacData, safeMac),
  203. sgn_DigestInfoTemplate },
  204.     { SEC_ASN1_OCTET_STRING, offsetof(sec_PKCS12MacData, macSalt) },
  205.     { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER, offsetof(sec_PKCS12MacData, iter) },
  206.     { 0 }
  207. };
  208. const SEC_ASN1Template sec_PKCS12AuthenticatedSafeTemplate[] = {
  209.     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, 
  210. offsetof(sec_PKCS12AuthenticatedSafe, encodedSafes), SEC_AnyTemplate }
  211. };
  212. const SEC_ASN1Template sec_PKCS12SafeBagTemplate[] = {
  213.     { SEC_ASN1_SEQUENCE | SEC_ASN1_MAY_STREAM, 0, NULL, 
  214. sizeof(sec_PKCS12SafeBag) },
  215.     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SafeBag, safeBagType) },
  216.     { SEC_ASN1_EXPLICIT | SEC_ASN1_DYNAMIC | SEC_ASN1_CONSTRUCTED |
  217. SEC_ASN1_MAY_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | 0, 
  218. offsetof(sec_PKCS12SafeBag, safeBagContent), 
  219. &sec_pkcs12_safe_bag_chooser },
  220.     { SEC_ASN1_SET_OF | SEC_ASN1_OPTIONAL, offsetof(sec_PKCS12SafeBag, attribs),
  221. sec_PKCS12AttributeTemplate },
  222.     { 0 }
  223. };
  224. const SEC_ASN1Template sec_PKCS12SafeContentsTemplate[] = {
  225.     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, 
  226. offsetof(sec_PKCS12SafeContents, safeBags),
  227. sec_PKCS12SafeBagTemplate }
  228. };
  229. const SEC_ASN1Template sec_PKCS12SequenceOfAnyTemplate[] = {
  230.     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, 0,
  231. SEC_AnyTemplate }
  232. };
  233. const SEC_ASN1Template sec_PKCS12NestedSafeContentsDecodeTemplate[] = {
  234.     { SEC_ASN1_EXPLICIT | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0,
  235. offsetof(sec_PKCS12SafeContents, encodedSafeBags),
  236. sec_PKCS12SequenceOfAnyTemplate }
  237. };
  238. const SEC_ASN1Template sec_PKCS12SafeContentsDecodeTemplate[] = {
  239.     { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_MAY_STREAM, 
  240. offsetof(sec_PKCS12SafeContents, encodedSafeBags),
  241. SEC_AnyTemplate }
  242. };
  243. const SEC_ASN1Template sec_PKCS12CRLBagTemplate[] = {
  244.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CRLBag) },
  245.     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CRLBag, bagID) },
  246.     { SEC_ASN1_DYNAMIC | SEC_ASN1_POINTER, 
  247. offsetof(sec_PKCS12CRLBag, value), &sec_pkcs12_crl_bag_chooser },
  248.     { 0 }
  249. };
  250. const SEC_ASN1Template sec_PKCS12CertBagTemplate[] = {
  251.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12CertBag) },
  252.     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12CertBag, bagID) },
  253.     { SEC_ASN1_DYNAMIC | SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED |
  254. SEC_ASN1_CONTEXT_SPECIFIC | 0,
  255. offsetof(sec_PKCS12CertBag, value), &sec_pkcs12_cert_bag_chooser },
  256.     { 0 }
  257. };
  258. const SEC_ASN1Template sec_PKCS12SecretBagTemplate[] = {
  259.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12SecretBag) },
  260.     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12SecretBag, secretType) },
  261.     { SEC_ASN1_ANY, offsetof(sec_PKCS12SecretBag, secretContent) },
  262.     { 0 }
  263. };
  264. const SEC_ASN1Template sec_PKCS12AttributeTemplate[] = {
  265.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(sec_PKCS12Attribute) },
  266.     { SEC_ASN1_OBJECT_ID, offsetof(sec_PKCS12Attribute, attrType) },
  267.     { SEC_ASN1_SET_OF | SEC_ASN1_DYNAMIC, 
  268. offsetof(sec_PKCS12Attribute, attrValue),
  269. &sec_pkcs12_attr_chooser },
  270.     { 0 }
  271. };