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

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 Subject Key Usage Extension 
  35.  *
  36.  */
  37. #include "prtypes.h"
  38. #include "mcom_db.h"
  39. #include "seccomon.h"
  40. #include "secdert.h"
  41. #include "secoidt.h"
  42. #include "secasn1t.h"
  43. #include "secasn1.h"
  44. #include "secport.h"
  45. #include "certt.h"  
  46. #include "genname.h"
  47. #include "secerr.h"
  48.    
  49. const SEC_ASN1Template CERTAuthKeyIDTemplate[] = {
  50.     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTAuthKeyID) },
  51.     { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | 0,
  52.   offsetof(CERTAuthKeyID,keyID), SEC_OctetStringTemplate},
  53.     { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC  | 1,
  54.           offsetof(CERTAuthKeyID, DERAuthCertIssuer), CERT_GeneralNamesTemplate},
  55.     { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | 2,
  56.   offsetof(CERTAuthKeyID,authCertSerialNumber), SEC_IntegerTemplate},
  57.     { 0 }
  58. };
  59. SECStatus CERT_EncodeAuthKeyID (PRArenaPool *arena, CERTAuthKeyID *value, SECItem *encodedValue)
  60. {
  61.     SECStatus rv = SECFailure;
  62.  
  63.     PORT_Assert (value);
  64.     PORT_Assert (arena);
  65.     PORT_Assert (value->DERAuthCertIssuer == NULL);
  66.     PORT_Assert (encodedValue);
  67.     do {
  68. /* If both of the authCertIssuer and the serial number exist, encode
  69.    the name first.  Otherwise, it is an error if one exist and the other
  70.    is not.
  71.  */
  72. if (value->authCertIssuer) {
  73.     if (!value->authCertSerialNumber.data) {
  74. PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  75. break;
  76.     }
  77.     value->DERAuthCertIssuer = cert_EncodeGeneralNames
  78. (arena, value->authCertIssuer);
  79.     if (!value->DERAuthCertIssuer) {
  80. PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  81. break;
  82.     }
  83. }
  84. else if (value->authCertSerialNumber.data) {
  85. PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  86. break;
  87. }
  88. if (SEC_ASN1EncodeItem (arena, encodedValue, value,
  89. CERTAuthKeyIDTemplate) == NULL)
  90.     break;
  91. rv = SECSuccess;
  92.     } while (0);
  93.      return(rv);
  94. }
  95. CERTAuthKeyID *
  96. CERT_DecodeAuthKeyID (PRArenaPool *arena, SECItem *encodedValue)
  97. {
  98.     CERTAuthKeyID * value = NULL;
  99.     SECStatus       rv    = SECFailure;
  100.     void *          mark;
  101.     PORT_Assert (arena);
  102.    
  103.     do {
  104. mark = PORT_ArenaMark (arena);
  105.         value = (CERTAuthKeyID*)PORT_ArenaZAlloc (arena, sizeof (*value));
  106. value->DERAuthCertIssuer = NULL;
  107. if (value == NULL)
  108.     break;
  109. rv = SEC_ASN1DecodeItem
  110.      (arena, value, CERTAuthKeyIDTemplate, encodedValue);
  111. if (rv != SECSuccess)
  112.     break;
  113.         value->authCertIssuer = cert_DecodeGeneralNames (arena, value->DERAuthCertIssuer);
  114. if (value->authCertIssuer == NULL)
  115.     break;
  116. /* what if the general name contains other format but not URI ?
  117.    hl
  118.  */
  119. if ((value->authCertSerialNumber.data && !value->authCertIssuer) ||
  120.     (!value->authCertSerialNumber.data && value->authCertIssuer)){
  121.     PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
  122.     break;
  123. }
  124.     } while (0);
  125.     if (rv != SECSuccess) {
  126. PORT_ArenaRelease (arena, mark);
  127. return ((CERTAuthKeyID *)NULL);     
  128.     } 
  129.     PORT_ArenaUnmark(arena, mark);
  130.     return (value);
  131. }