security/nss/lib/certhigh/ocspti.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

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

mercurial