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

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.  * X.509 v3 Basic Constraints Extension 
  35.  */
  36. #include "prtypes.h"
  37. #include "mcom_db.h"
  38. #include "seccomon.h"
  39. #include "secdert.h"
  40. #include "secoidt.h"
  41. #include "secasn1t.h"
  42. #include "secasn1.h"
  43. #include "certt.h"
  44. #include "secder.h"
  45. #include "prprf.h"
  46. #include "secerr.h"
  47. typedef struct EncodedContext{
  48.     SECItem isCA;
  49.     SECItem pathLenConstraint;
  50.     SECItem encodedValue;
  51.     PRArenaPool *arena;
  52. }EncodedContext;
  53. static const SEC_ASN1Template CERTBasicConstraintsTemplate[] = {
  54.     { SEC_ASN1_SEQUENCE,
  55.   0, NULL, sizeof(EncodedContext) },
  56.     { SEC_ASN1_OPTIONAL | SEC_ASN1_BOOLEAN, /* XXX DER_DEFAULT */
  57.   offsetof(EncodedContext,isCA)},
  58.     { SEC_ASN1_OPTIONAL | SEC_ASN1_INTEGER,
  59.   offsetof(EncodedContext,pathLenConstraint) },
  60.     { 0, }
  61. };
  62. static unsigned char hexTrue = 0xff;
  63. static unsigned char hexFalse = 0x00;
  64. #define GEN_BREAK(status) rv = status; break;
  65. SECStatus CERT_EncodeBasicConstraintValue
  66.    (PRArenaPool *arena, CERTBasicConstraints *value, SECItem *encodedValue)
  67. {
  68.     EncodedContext encodeContext;
  69.     PRArenaPool *our_pool = NULL;   
  70.     SECStatus rv = SECSuccess;
  71.     do {
  72. PORT_Memset (&encodeContext, 0, sizeof (encodeContext));
  73. if (!value->isCA && value->pathLenConstraint >= 0) {
  74.     PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  75.     GEN_BREAK (SECFailure);
  76. }
  77.         encodeContext.arena = arena;
  78. if (value->isCA == PR_TRUE) {
  79.     encodeContext.isCA.data =  &hexTrue ;
  80.     encodeContext.isCA.len = 1;
  81. }
  82. /* If the pathLenConstraint is less than 0, then it should be
  83.  * omitted from the encoding.
  84.  */
  85. if (value->isCA && value->pathLenConstraint >= 0) {
  86.     our_pool = PORT_NewArena (SEC_ASN1_DEFAULT_ARENA_SIZE);
  87.     if (our_pool == NULL) {
  88. PORT_SetError (SEC_ERROR_NO_MEMORY);
  89. GEN_BREAK (SECFailure);
  90.     }
  91.     if (SEC_ASN1EncodeUnsignedInteger
  92. (our_pool, &encodeContext.pathLenConstraint,
  93.  (unsigned long)value->pathLenConstraint) == NULL) {
  94. PORT_SetError (SEC_ERROR_NO_MEMORY);
  95. GEN_BREAK (SECFailure);
  96.     }
  97. }
  98. if (SEC_ASN1EncodeItem (arena, encodedValue, &encodeContext,
  99. CERTBasicConstraintsTemplate) == NULL)
  100.     GEN_BREAK (SECFailure);
  101.     } while (0);
  102.     if (our_pool)
  103. PORT_FreeArena (our_pool, PR_FALSE);
  104.     return(rv);
  105. }
  106. SECStatus CERT_DecodeBasicConstraintValue
  107.    (CERTBasicConstraints *value, SECItem *encodedValue)
  108. {
  109.     EncodedContext decodeContext;
  110.     PRArenaPool *our_pool;
  111.     SECStatus rv = SECSuccess;
  112.     do {
  113. PORT_Memset (&decodeContext, 0, sizeof (decodeContext));
  114. /* initialize the value just in case we got "0x30 00", or when the
  115.    pathLenConstraint is omitted.
  116.          */
  117. decodeContext.isCA.data =&hexFalse;
  118. decodeContext.isCA.len = 1;
  119. our_pool = PORT_NewArena (SEC_ASN1_DEFAULT_ARENA_SIZE);
  120. if (our_pool == NULL) {
  121.     PORT_SetError (SEC_ERROR_NO_MEMORY);
  122.     GEN_BREAK (SECFailure);
  123. }
  124. rv = SEC_ASN1DecodeItem
  125.      (our_pool, &decodeContext, CERTBasicConstraintsTemplate, encodedValue);
  126. if (rv == SECFailure)
  127.     break;
  128. value->isCA = (PRBool)(*decodeContext.isCA.data);
  129. if (decodeContext.pathLenConstraint.data == NULL) {
  130.     /* if the pathLenConstraint is not encoded, and the current setting
  131.       is CA, then the pathLenConstraint should be set to a negative number
  132.       for unlimited certificate path.
  133.      */
  134.     if (value->isCA)
  135. value->pathLenConstraint = CERT_UNLIMITED_PATH_CONSTRAINT;
  136. }
  137. else if (value->isCA)
  138.     value->pathLenConstraint = DER_GetUInteger (&decodeContext.pathLenConstraint);
  139. else {
  140.     /* here we get an error where the subject is not a CA, but
  141.        the pathLenConstraint is set */
  142.     PORT_SetError (SEC_ERROR_BAD_DER);
  143.     GEN_BREAK (SECFailure);
  144.     break;
  145. }
  146.  
  147.     } while (0);
  148.     PORT_FreeArena (our_pool, PR_FALSE);
  149.     return (rv);
  150. }