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

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.  * Private header defining OCSP types.
  35.  *
  36.  * $Id: ocspti.h,v 1.1 2000/03/31 19:43:04 relyea%netscape.com Exp $
  37.  */
  38. #ifndef _OCSPTI_H_
  39. #define _OCSPTI_H_
  40. #include "ocspt.h"
  41. #include "certt.h"
  42. #include "plarena.h"
  43. #include "seccomon.h"
  44. #include "secoidt.h"
  45. /*
  46.  * Some notes about naming conventions...
  47.  *
  48.  * The public data types all start with "CERTOCSP" (e.g. CERTOCSPRequest).
  49.  * (Even the public types are opaque, however.  Only their names are
  50.  * "exported".)
  51.  *
  52.  * Internal-only data types drop the "CERT" prefix and use only the
  53.  * lower-case "ocsp" (e.g. ocspTBSRequest), for brevity sake.
  54.  *
  55.  * In either case, the base/suffix of the type name usually matches the
  56.  * name as defined in the OCSP specification.  The exceptions to this are:
  57.  *  - When there is overlap between the "OCSP" or "ocsp" prefix and
  58.  *    the name used in the standard.  That is, you cannot strip off the
  59.  *    "CERTOCSP" or "ocsp" prefix and necessarily get the name of the
  60.  *    type as it is defined in the standard; the "real" name will be
  61.  *    *either* "OCSPSuffix" or just "Suffix".
  62.  *  - When the name in the standard was a little too generic.  (e.g. The
  63.  *    standard defines "Request" but we call it a "SingleRequest".)
  64.  *    In this case a comment above the type definition calls attention
  65.  *    to the difference.
  66.  *
  67.  * The definitions laid out in this header file are intended to follow
  68.  * the same order as the definitions in the OCSP specification itself.
  69.  * With the OCSP standard in hand, you should be able to move through
  70.  * this file and follow along.  To future modifiers of this file: please
  71.  * try to keep it that way.  The only exceptions are the few cases where
  72.  * we need to define a type before it is referenced (e.g. enumerations),
  73.  * whereas in the OCSP specification these are usually defined the other
  74.  * way around (reference before definition).
  75.  */
  76. /*
  77.  * Forward-declarations of internal-only data structures.
  78.  *
  79.  * These are in alphabetical order (case-insensitive); please keep it that way!
  80.  */
  81. typedef struct ocspBasicOCSPResponseStr ocspBasicOCSPResponse;
  82. typedef struct ocspCertStatusStr ocspCertStatus;
  83. typedef struct ocspResponderIDStr ocspResponderID;
  84. typedef struct ocspResponseBytesStr ocspResponseBytes;
  85. typedef struct ocspResponseDataStr ocspResponseData;
  86. typedef struct ocspRevokedInfoStr ocspRevokedInfo;
  87. typedef struct ocspServiceLocatorStr ocspServiceLocator;
  88. typedef struct ocspSignatureStr ocspSignature;
  89. typedef struct ocspSingleRequestStr ocspSingleRequest;
  90. typedef struct ocspSingleResponseStr ocspSingleResponse;
  91. typedef struct ocspTBSRequestStr ocspTBSRequest;
  92. /*
  93.  * An OCSPRequest; this is what is sent (encoded) to an OCSP responder.
  94.  */
  95. struct CERTOCSPRequestStr {
  96.     PRArenaPool *arena; /* local; not part of encoding */
  97.     ocspTBSRequest *tbsRequest;
  98.     ocspSignature *optionalSignature;
  99. };
  100. /*
  101.  * A TBSRequest; when an OCSPRequest is signed, the encoding of this
  102.  * is what the signature is actually applied to.  ("TBS" == To Be Signed)
  103.  * Whether signed or not, however, this structure will be present, and
  104.  * is the "meat" of the OCSPRequest.
  105.  *
  106.  * Note that the "requestorName" field cannot be encoded/decoded in the
  107.  * same pass as the entire request -- it needs to be handled with a special
  108.  * call to convert to/from our internal form of a GeneralName.  Thus the
  109.  * "derRequestorName" field, which is the actual DER-encoded bytes.
  110.  *
  111.  * The "extensionHandle" field is used on creation only; it holds
  112.  * in-progress extensions as they are optionally added to the request.
  113.  */
  114. struct ocspTBSRequestStr {
  115.     SECItem version; /* an INTEGER */
  116.     SECItem *derRequestorName; /* encoded GeneralName; see above */
  117.     CERTGeneralNameList *requestorName; /* local; not part of encoding */
  118.     ocspSingleRequest **requestList;
  119.     CERTCertExtension **requestExtensions;
  120.     void *extensionHandle; /* local; not part of encoding */
  121. };
  122. /*
  123.  * This is the actual signature information for an OCSPRequest (applied to
  124.  * the TBSRequest structure) or for a BasicOCSPResponse (applied to a
  125.  * ResponseData structure).
  126.  *
  127.  * Note that the "signature" field itself is a BIT STRING; operations on
  128.  * it need to keep that in mind, converting the length to bytes as needed
  129.  * and back again afterward (so that the length is usually expressing bits).
  130.  *
  131.  * The "cert" field is the signer's certificate.  In the case of a received
  132.  * signature, it will be filled in when the signature is verified.  In the
  133.  * case of a created signature, it is filled in on creation and will be the
  134.  * cert used to create the signature when the signing-and-encoding occurs,
  135.  * as well as the cert (and its chain) to fill in derCerts if requested.
  136.  *
  137.  * The extra fields cache information about the signature after we have
  138.  * attempted a verification.  "wasChecked", if true, means the signature
  139.  * has been checked against the appropriate data and thus that "status"
  140.  * contains the result of that verification.  If "status" is not SECSuccess,
  141.  * "failureReason" is a copy of the error code that was set at the time;
  142.  * presumably it tells why the signature verification failed.
  143.  */
  144. struct ocspSignatureStr {
  145.     SECAlgorithmID signatureAlgorithm;
  146.     SECItem signature; /* a BIT STRING */
  147.     SECItem **derCerts; /* a SEQUENCE OF Certificate */
  148.     CERTCertificate *cert; /* local; not part of encoding */
  149.     PRBool wasChecked; /* local; not part of encoding */
  150.     SECStatus status; /* local; not part of encoding */
  151.     int failureReason; /* local; not part of encoding */
  152. };
  153. /*
  154.  * An OCSPRequest contains a SEQUENCE OF these, one for each certificate
  155.  * whose status is being checked.
  156.  *
  157.  * Note that in the OCSP specification this is just called "Request",
  158.  * but since that seemed confusing (vs. an OCSPRequest) and to be more
  159.  * consistent with the parallel type "SingleResponse", I called it a
  160.  * "SingleRequest".
  161.  * 
  162.  * XXX figure out how to get rid of that arena -- there must be a way
  163.  */
  164. struct ocspSingleRequestStr {
  165.     PRArenaPool *arena; /* just a copy of the response arena,
  166.  * needed here for extension handling
  167.  * routines, on creation only */
  168.     CERTOCSPCertID *reqCert;
  169.     CERTCertExtension **singleRequestExtensions;
  170. };
  171. /*
  172.  * A CertID is the means of identifying a certificate, used both in requests
  173.  * and in responses.
  174.  *
  175.  * When in a SingleRequest it specifies the certificate to be checked.
  176.  * When in a SingleResponse it is the cert whose status is being given.
  177.  */
  178. struct CERTOCSPCertIDStr {
  179.     SECAlgorithmID hashAlgorithm;
  180.     SECItem issuerNameHash; /* an OCTET STRING */
  181.     SECItem issuerKeyHash; /* an OCTET STRING */
  182.     SECItem serialNumber; /* an INTEGER */
  183. };
  184. /*
  185.  * This describes the value of the responseStatus field in an OCSPResponse.
  186.  * The corresponding ASN.1 definition is:
  187.  *
  188.  * OCSPResponseStatus ::= ENUMERATED {
  189.  * successful (0), --Response has valid confirmations
  190.  * malformedRequest (1), --Illegal confirmation request
  191.  * internalError (2), --Internal error in issuer
  192.  * tryLater (3), --Try again later
  193.  * --(4) is not used
  194.  * sigRequired (5), --Must sign the request
  195.  * unauthorized (6), --Request unauthorized
  196.  * }
  197.  */
  198. typedef enum {
  199.     ocspResponse_successful = 0,
  200.     ocspResponse_malformedRequest = 1,
  201.     ocspResponse_internalError = 2,
  202.     ocspResponse_tryLater = 3,
  203.     ocspResponse_unused = 4,
  204.     ocspResponse_sigRequired = 5,
  205.     ocspResponse_unauthorized = 6,
  206.     ocspResponse_other /* unknown/unrecognized value */
  207. } ocspResponseStatus;
  208. /*
  209.  * An OCSPResponse is what is sent (encoded) by an OCSP responder.
  210.  *
  211.  * The field "responseStatus" is the ASN.1 encoded value; the field
  212.  * "statusValue" is simply that same value translated into our local
  213.  * type ocspResponseStatus.
  214.  */
  215. struct CERTOCSPResponseStr {
  216.     PRArenaPool *arena; /* local; not part of encoding */
  217.     SECItem responseStatus; /* an ENUMERATED, see above */
  218.     ocspResponseStatus statusValue; /* local; not part of encoding */
  219.     ocspResponseBytes *responseBytes; /* only when status is successful */
  220. };
  221. /*
  222.  * A ResponseBytes (despite appearances) is what contains the meat
  223.  * of a successful response -- but still in encoded form.  The type
  224.  * given as "responseType" tells you how to decode the string.
  225.  *
  226.  * We look at the OID and translate it into our local OID representation
  227.  * "responseTypeTag", and use that value to tell us how to decode the
  228.  * actual response itself.  For now the only kind of OCSP response we
  229.  * know about is a BasicOCSPResponse.  However, the intention in the
  230.  * OCSP specification is to allow for other response types, so we are
  231.  * building in that flexibility from the start and thus put a pointer
  232.  * to that data structure inside of a union.  Whenever OCSP adds more
  233.  * response types, just add them to the union.
  234.  */
  235. struct ocspResponseBytesStr {
  236.     SECItem responseType; /* an OBJECT IDENTIFIER */
  237.     SECOidTag responseTypeTag; /* local; not part of encoding */
  238.     SECItem response; /* an OCTET STRING */
  239.     union {
  240. ocspBasicOCSPResponse *basic; /* when type is id-pkix-ocsp-basic */
  241.     } decodedResponse; /* local; not part of encoding */
  242. };
  243. /*
  244.  * A BasicOCSPResponse -- when the responseType in a ResponseBytes is
  245.  * id-pkix-ocsp-basic, the "response" OCTET STRING above is the DER
  246.  * encoding of one of these.
  247.  *
  248.  * Note that in the OCSP specification, the signature fields are not
  249.  * part of a separate sub-structure.  But since they are the same fields
  250.  * as we define for the signature in a request, it made sense to share
  251.  * the C data structure here and in some shared code to operate on them.
  252.  */
  253. struct ocspBasicOCSPResponseStr {
  254.     ocspResponseData *tbsResponseData; /* "tbs" == To Be Signed */
  255.     ocspSignature responseSignature;
  256. };
  257. /*
  258.  * A ResponseData is the part of a BasicOCSPResponse that is signed
  259.  * (after it is DER encoded).  It contains the real details of the response
  260.  * (a per-certificate status).
  261.  */
  262. struct ocspResponseDataStr {
  263.     SECItem version; /* an INTEGER */
  264.     SECItem derResponderID;
  265.     ocspResponderID *responderID; /* local; not part of encoding */
  266.     SECItem producedAt; /* a GeneralizedTime */
  267.     CERTOCSPSingleResponse **responses;
  268.     CERTCertExtension **responseExtensions;
  269. };
  270. /*
  271.  * A ResponderID identifies the responder -- or more correctly, the
  272.  * signer of the response.  The ASN.1 definition of a ResponderID is:
  273.  *
  274.  * ResponderID ::= CHOICE {
  275.  * byName [1] EXPLICIT Name,
  276.  * byKey [2] EXPLICIT KeyHash }
  277.  *
  278.  * Because it is CHOICE, the type of identification used and the
  279.  * identification itself are actually encoded together.  To represent
  280.  * this same information internally, we explicitly define a type and
  281.  * save it, along with the value, into a data structure.
  282.  */
  283. typedef enum {
  284.     ocspResponderID_byName,
  285.     ocspResponderID_byKey,
  286.     ocspResponderID_other /* unknown kind of responderID */
  287. } ocspResponderIDType;
  288. struct ocspResponderIDStr {
  289.     ocspResponderIDType responderIDType;/* local; not part of encoding */
  290.     union {
  291. CERTName name; /* when ocspResponderID_byName */
  292. SECItem keyHash; /* when ocspResponderID_byKey */
  293. SECItem other; /* when ocspResponderID_other */
  294.     } responderIDValue;
  295. };
  296. /*
  297.  * The ResponseData in a BasicOCSPResponse contains a SEQUENCE OF
  298.  * SingleResponse -- one for each certificate whose status is being supplied.
  299.  * 
  300.  * XXX figure out how to get rid of that arena -- there must be a way
  301.  */
  302. struct CERTOCSPSingleResponseStr {
  303.     PRArenaPool *arena; /* just a copy of the response arena,
  304.  * needed here for extension handling
  305.  * routines, on creation only */
  306.     CERTOCSPCertID *certID;
  307.     SECItem derCertStatus;
  308.     ocspCertStatus *certStatus; /* local; not part of encoding */
  309.     SECItem thisUpdate; /* a GeneralizedTime */
  310.     SECItem *nextUpdate; /* a GeneralizedTime */
  311.     CERTCertExtension **singleExtensions;
  312. };
  313. /*
  314.  * A CertStatus is the actual per-certificate status.  Its ASN.1 definition:
  315.  *
  316.  * CertStatus ::= CHOICE {
  317.  * good [0] IMPLICIT NULL,
  318.  * revoked [1] IMPLICIT RevokedInfo,
  319.  * unknown [2] IMPLICIT UnknownInfo }
  320.  *
  321.  * (where for now UnknownInfo is defined to be NULL but in the
  322.  * future may be replaced with an enumeration).
  323.  *
  324.  * Because it is CHOICE, the status value and its associated information
  325.  * (if any) are actually encoded together.  To represent this same
  326.  * information internally, we explicitly define a type and save it,
  327.  * along with the value, into a data structure.
  328.  */
  329. typedef enum {
  330.     ocspCertStatus_good, /* cert is not revoked */
  331.     ocspCertStatus_revoked, /* cert is revoked */
  332.     ocspCertStatus_unknown, /* cert was unknown to the responder */
  333.     ocspCertStatus_other /* status was not an expected value */
  334. } ocspCertStatusType;
  335. /*
  336.  * This is the actual per-certificate status.
  337.  *
  338.  * The "goodInfo" and "unknownInfo" items are only place-holders for a NULL.
  339.  * (Though someday OCSP may replace UnknownInfo with an enumeration that
  340.  * gives more detailed information.)
  341.  */
  342. struct ocspCertStatusStr {
  343.     ocspCertStatusType certStatusType; /* local; not part of encoding */
  344.     union {
  345. SECItem *goodInfo; /* when ocspCertStatus_good */
  346. ocspRevokedInfo *revokedInfo; /* when ocspCertStatus_revoked */
  347. SECItem *unknownInfo; /* when ocspCertStatus_unknown */
  348. SECItem *otherInfo; /* when ocspCertStatus_other */
  349.     } certStatusInfo; 
  350. };
  351. /*
  352.  * A RevokedInfo gives information about a revoked certificate -- when it
  353.  * was revoked and why.
  354.  */
  355. struct ocspRevokedInfoStr {
  356.     SECItem revocationTime; /* a GeneralizedTime */
  357.     SECItem *revocationReason; /* a CRLReason; ignored for now */
  358. };
  359. /*
  360.  * ServiceLocator can be included as one of the singleRequestExtensions.
  361.  * When added, it specifies the (name of the) issuer of the cert being
  362.  * checked, and optionally the value of the AuthorityInfoAccess extension
  363.  * if the cert has one.
  364.  */
  365. struct ocspServiceLocatorStr {
  366.     CERTName *issuer;
  367.     SECItem locator; /* DER encoded authInfoAccess extension from cert */
  368. };
  369. #endif /* _OCSPTI_H_ */