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

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. /*
  34.  * Code for dealing with x.509 v3 CRL Distribution Point extension.
  35.  */
  36. #include "genname.h"
  37. #include "certt.h"
  38. #include "secerr.h"
  39. extern void PrepareBitStringForEncoding (SECItem *bitMap, SECItem *value);
  40. static const SEC_ASN1Template FullNameTemplate[] = {
  41.     {SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0,
  42. offsetof (CRLDistributionPoint,derFullName), CERT_GeneralNamesTemplate}
  43. };
  44. static const SEC_ASN1Template RelativeNameTemplate[] = {
  45.     {SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 1, 
  46. offsetof (CRLDistributionPoint,distPoint.relativeName), CERT_RDNTemplate}
  47. };
  48.  
  49. static const SEC_ASN1Template CRLDistributionPointTemplate[] = {
  50.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRLDistributionPoint) },
  51. { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC |
  52.     SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | 0,
  53.     offsetof(CRLDistributionPoint,derDistPoint), SEC_AnyTemplate},
  54. { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | 1,
  55.     offsetof(CRLDistributionPoint,bitsmap), SEC_BitStringTemplate},
  56. { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC |
  57.     SEC_ASN1_CONSTRUCTED | 2,
  58.     offsetof(CRLDistributionPoint, derCrlIssuer), CERT_GeneralNamesTemplate},
  59.     { 0 }
  60. };
  61. const SEC_ASN1Template CERTCRLDistributionPointsTemplate[] = {
  62.     {SEC_ASN1_SEQUENCE_OF, 0, CRLDistributionPointTemplate}
  63. };
  64. SECStatus
  65. CERT_EncodeCRLDistributionPoints (PRArenaPool *arena, CERTCrlDistributionPoints *value,
  66.   SECItem *derValue)
  67. {
  68.     CRLDistributionPoint **pointList, *point;
  69.     PRArenaPool *ourPool = NULL;
  70.     SECStatus rv = SECSuccess;
  71.     PORT_Assert (derValue);
  72.     PORT_Assert (value && value->distPoints);
  73.     do {
  74. ourPool = PORT_NewArena (SEC_ASN1_DEFAULT_ARENA_SIZE);
  75. if (ourPool == NULL) {
  76.     rv = SECFailure;
  77.     break;
  78. }    
  79. pointList = value->distPoints;
  80. while (*pointList) {
  81.     point = *pointList;
  82.     point->derFullName = NULL;
  83.     point->derDistPoint.data = NULL;
  84.     if (point->distPointType == generalName) {
  85. point->derFullName = cert_EncodeGeneralNames
  86.     (ourPool, point->distPoint.fullName);
  87. if (point->derFullName) {
  88.     rv = (SEC_ASN1EncodeItem (ourPool, &point->derDistPoint,
  89.   point, FullNameTemplate) == NULL) ? SECFailure : SECSuccess;
  90. } else {
  91.     rv = SECFailure;
  92. }
  93.     }
  94.     else if (point->distPointType == relativeDistinguishedName) {
  95. if (SEC_ASN1EncodeItem
  96.      (ourPool, &point->derDistPoint, 
  97.       point, RelativeNameTemplate) == NULL) 
  98.     rv = SECFailure;
  99.     }
  100.     /* distributionPointName is omitted */
  101.     else if (point->distPointType != 0) {
  102. PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  103. rv = SECFailure;
  104.     }
  105.     if (rv != SECSuccess)
  106. break;
  107.     if (point->reasons.data)
  108. PrepareBitStringForEncoding (&point->bitsmap, &point->reasons);
  109.     if (point->crlIssuer) {
  110. point->derCrlIssuer = cert_EncodeGeneralNames
  111.     (ourPool, point->crlIssuer);
  112. if (!point->crlIssuer)
  113.     break;
  114.     }
  115.     
  116.     ++pointList;
  117. }
  118. if (rv != SECSuccess)
  119.     break;
  120. if (SEC_ASN1EncodeItem
  121.      (arena, derValue, value, CERTCRLDistributionPointsTemplate) == NULL) {
  122.     rv = SECFailure;
  123.     break;
  124. }
  125.     } while (0);
  126.     PORT_FreeArena (ourPool, PR_FALSE);
  127.     return (rv);
  128. }
  129. CERTCrlDistributionPoints *
  130. CERT_DecodeCRLDistributionPoints (PRArenaPool *arena, SECItem *encodedValue)
  131. {
  132.    CERTCrlDistributionPoints *value = NULL;    
  133.    CRLDistributionPoint **pointList, *point;    
  134.    SECStatus rv;
  135.    PORT_Assert (arena);
  136.    do {
  137. value = (CERTCrlDistributionPoints*)PORT_ArenaZAlloc (arena, sizeof (*value));
  138. if (value == NULL) {
  139.     rv = SECFailure;
  140.     break;
  141. }
  142.     
  143. rv = SEC_ASN1DecodeItem
  144.      (arena, &value->distPoints, CERTCRLDistributionPointsTemplate,
  145.       encodedValue);
  146. if (rv != SECSuccess)
  147.     break;
  148. pointList = value->distPoints;
  149. while (*pointList) {
  150.     point = *pointList;
  151.     /* get the data if the distributionPointName is not omitted */
  152.     if (point->derDistPoint.data != NULL) {
  153. point->distPointType = (DistributionPointTypes)
  154. ((point->derDistPoint.data[0] & 0x1f) +1);
  155. if (point->distPointType == generalName) {
  156.     SECItem innerDER;
  157.     innerDER.data = NULL;
  158.     rv = SEC_ASN1DecodeItem
  159.  (arena, point, FullNameTemplate, &(point->derDistPoint));
  160.     if (rv != SECSuccess)
  161. break;
  162.     point->distPoint.fullName = cert_DecodeGeneralNames
  163. (arena, point->derFullName);
  164.     if (!point->distPoint.fullName)
  165. break;
  166. }
  167. else if ( relativeDistinguishedName) {
  168.     rv = SEC_ASN1DecodeItem
  169.  (arena, point, RelativeNameTemplate, &(point->derDistPoint));
  170.     if (rv != SECSuccess)
  171. break;
  172. }
  173. else {
  174.     PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  175.     break;
  176. }
  177.     }
  178.     /* Get the reason code if it's not omitted in the encoding */
  179.     if (point->bitsmap.data != NULL) {
  180. point->reasons.data = (unsigned char*) PORT_ArenaAlloc
  181.       (arena, (point->bitsmap.len + 7) >> 3);
  182. if (!point->reasons.data) {
  183.     rv = SECFailure;
  184.     break;
  185. }
  186. PORT_Memcpy (point->reasons.data, point->bitsmap.data,
  187.      point->reasons.len = ((point->bitsmap.len + 7) >> 3));
  188.     }
  189.     /* Get the crl issuer name if it's not omitted in the encoding */
  190.     if (point->derCrlIssuer != NULL) {
  191. point->crlIssuer = cert_DecodeGeneralNames
  192.     (arena, point->derCrlIssuer);
  193. if (!point->crlIssuer)
  194.     break;
  195.     }
  196.     ++pointList;
  197. }
  198.    } while (0);
  199.    return (rv == SECSuccess ? value : NULL);
  200. }