ocsp_prn.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:10k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* ocsp_prn.c */
  2. /* Written by Tom Titchener <Tom_Titchener@groove.net> for the OpenSSL
  3.  * project. */
  4. /* History:
  5.    This file was originally part of ocsp.c and was transfered to Richard
  6.    Levitte from CertCo by Kathy Weinhold in mid-spring 2000 to be included
  7.    in OpenSSL or released as a patch kit. */
  8. /* ====================================================================
  9.  * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  *
  15.  * 1. Redistributions of source code must retain the above copyright
  16.  *    notice, this list of conditions and the following disclaimer. 
  17.  *
  18.  * 2. Redistributions in binary form must reproduce the above copyright
  19.  *    notice, this list of conditions and the following disclaimer in
  20.  *    the documentation and/or other materials provided with the
  21.  *    distribution.
  22.  *
  23.  * 3. All advertising materials mentioning features or use of this
  24.  *    software must display the following acknowledgment:
  25.  *    "This product includes software developed by the OpenSSL Project
  26.  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  27.  *
  28.  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  29.  *    endorse or promote products derived from this software without
  30.  *    prior written permission. For written permission, please contact
  31.  *    openssl-core@openssl.org.
  32.  *
  33.  * 5. Products derived from this software may not be called "OpenSSL"
  34.  *    nor may "OpenSSL" appear in their names without prior written
  35.  *    permission of the OpenSSL Project.
  36.  *
  37.  * 6. Redistributions of any form whatsoever must retain the following
  38.  *    acknowledgment:
  39.  *    "This product includes software developed by the OpenSSL Project
  40.  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  41.  *
  42.  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  43.  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  44.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  45.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
  46.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  47.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  48.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  49.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  50.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  51.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  52.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  53.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  54.  * ====================================================================
  55.  *
  56.  * This product includes cryptographic software written by Eric Young
  57.  * (eay@cryptsoft.com).  This product includes software written by Tim
  58.  * Hudson (tjh@cryptsoft.com).
  59.  *
  60.  */
  61. #include <openssl/bio.h>
  62. #include <openssl/err.h>
  63. #include <openssl/ocsp.h>
  64. #include <openssl/pem.h>
  65. static int ocsp_certid_print(BIO *bp, OCSP_CERTID* a, int indent)
  66.         {
  67. BIO_printf(bp, "%*sCertificate ID:n", indent, "");
  68. indent += 2;
  69. BIO_printf(bp, "%*sHash Algorithm: ", indent, "");
  70. i2a_ASN1_OBJECT(bp, a->hashAlgorithm->algorithm);
  71. BIO_printf(bp, "n%*sIssuer Name Hash: ", indent, "");
  72. i2a_ASN1_STRING(bp, a->issuerNameHash, V_ASN1_OCTET_STRING);
  73. BIO_printf(bp, "n%*sIssuer Key Hash: ", indent, "");
  74. i2a_ASN1_STRING(bp, a->issuerKeyHash, V_ASN1_OCTET_STRING);
  75. BIO_printf(bp, "n%*sSerial Number: ", indent, "");
  76. i2a_ASN1_INTEGER(bp, a->serialNumber);
  77. BIO_printf(bp, "n");
  78. return 1;
  79. }
  80. typedef struct
  81. {
  82. long t;
  83. char *m;
  84. } OCSP_TBLSTR;
  85. static char *table2string(long s, OCSP_TBLSTR *ts, int len)
  86. {
  87. OCSP_TBLSTR *p;
  88. for (p=ts; p < ts + len; p++)
  89.         if (p->t == s)
  90.          return p->m;
  91. return "(UNKNOWN)";
  92. }
  93. char *OCSP_response_status_str(long s)
  94.         {
  95. static OCSP_TBLSTR rstat_tbl[] = {
  96.         { OCSP_RESPONSE_STATUS_SUCCESSFUL, "successful" },
  97.         { OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, "malformedrequest" },
  98.         { OCSP_RESPONSE_STATUS_INTERNALERROR, "internalerror" },
  99.         { OCSP_RESPONSE_STATUS_TRYLATER, "trylater" },
  100.         { OCSP_RESPONSE_STATUS_SIGREQUIRED, "sigrequired" },
  101.         { OCSP_RESPONSE_STATUS_UNAUTHORIZED, "unauthorized" } };
  102. return table2string(s, rstat_tbl, 6);
  103. char *OCSP_cert_status_str(long s)
  104.         {
  105. static OCSP_TBLSTR cstat_tbl[] = {
  106.         { V_OCSP_CERTSTATUS_GOOD, "good" },
  107.         { V_OCSP_CERTSTATUS_REVOKED, "revoked" },
  108.         { V_OCSP_CERTSTATUS_UNKNOWN, "unknown" } };
  109. return table2string(s, cstat_tbl, 3);
  110. char *OCSP_crl_reason_str(long s)
  111.         {
  112. OCSP_TBLSTR reason_tbl[] = {
  113.   { OCSP_REVOKED_STATUS_UNSPECIFIED, "unspecified" },
  114.           { OCSP_REVOKED_STATUS_KEYCOMPROMISE, "keyCompromise" },
  115.           { OCSP_REVOKED_STATUS_CACOMPROMISE, "cACompromise" },
  116.           { OCSP_REVOKED_STATUS_AFFILIATIONCHANGED, "affiliationChanged" },
  117.           { OCSP_REVOKED_STATUS_SUPERSEDED, "superseded" },
  118.           { OCSP_REVOKED_STATUS_CESSATIONOFOPERATION, "cessationOfOperation" },
  119.           { OCSP_REVOKED_STATUS_CERTIFICATEHOLD, "certificateHold" },
  120.           { OCSP_REVOKED_STATUS_REMOVEFROMCRL, "removeFromCRL" } };
  121. return table2string(s, reason_tbl, 8);
  122. int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* o, unsigned long flags)
  123.         {
  124. int i;
  125. long l;
  126. OCSP_CERTID* cid = NULL;
  127. OCSP_ONEREQ *one = NULL;
  128. OCSP_REQINFO *inf = o->tbsRequest;
  129. OCSP_SIGNATURE *sig = o->optionalSignature;
  130. if (BIO_write(bp,"OCSP Request Data:n",19) <= 0) goto err;
  131. l=ASN1_INTEGER_get(inf->version);
  132. if (BIO_printf(bp,"    Version: %lu (0x%lx)",l+1,l) <= 0) goto err;
  133. if (inf->requestorName != NULL)
  134.         {
  135. if (BIO_write(bp,"n    Requestor Name: ",21) <= 0) 
  136.         goto err;
  137. GENERAL_NAME_print(bp, inf->requestorName);
  138. }
  139. if (BIO_write(bp,"n    Requestor List:n",21) <= 0) goto err;
  140. for (i = 0; i < sk_OCSP_ONEREQ_num(inf->requestList); i++)
  141.         {
  142. one = sk_OCSP_ONEREQ_value(inf->requestList, i);
  143. cid = one->reqCert;
  144. ocsp_certid_print(bp, cid, 8);
  145. if (!X509V3_extensions_print(bp,
  146. "Request Single Extensions",
  147. one->singleRequestExtensions, flags, 8))
  148. goto err;
  149. }
  150. if (!X509V3_extensions_print(bp, "Request Extensions",
  151. inf->requestExtensions, flags, 4))
  152. goto err;
  153. if (sig)
  154.         {
  155. X509_signature_print(bp, sig->signatureAlgorithm, sig->signature);
  156. for (i=0; i<sk_X509_num(sig->certs); i++)
  157. {
  158. X509_print(bp, sk_X509_value(sig->certs,i));
  159. PEM_write_bio_X509(bp,sk_X509_value(sig->certs,i));
  160. }
  161. }
  162. return 1;
  163. err:
  164. return 0;
  165. }
  166. int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags)
  167.         {
  168. int i, ret = 0;
  169. long l;
  170. unsigned char *p;
  171. OCSP_CERTID *cid = NULL;
  172. OCSP_BASICRESP *br = NULL;
  173. OCSP_RESPID *rid = NULL;
  174. OCSP_RESPDATA  *rd = NULL;
  175. OCSP_CERTSTATUS *cst = NULL;
  176. OCSP_REVOKEDINFO *rev = NULL;
  177. OCSP_SINGLERESP *single = NULL;
  178. OCSP_RESPBYTES *rb = o->responseBytes;
  179. if (BIO_puts(bp,"OCSP Response Data:n") <= 0) goto err;
  180. l=ASN1_ENUMERATED_get(o->responseStatus);
  181. if (BIO_printf(bp,"    OCSP Response Status: %s (0x%lx)n",
  182.        OCSP_response_status_str(l), l) <= 0) goto err;
  183. if (rb == NULL) return 1;
  184.         if (BIO_puts(bp,"    Response Type: ") <= 0)
  185.         goto err;
  186. if(i2a_ASN1_OBJECT(bp, rb->responseType) <= 0)
  187.         goto err;
  188. if (OBJ_obj2nid(rb->responseType) != NID_id_pkix_OCSP_basic) 
  189.         {
  190. BIO_puts(bp," (unknown response type)n");
  191. return 1;
  192. }
  193. p = ASN1_STRING_data(rb->response);
  194. i = ASN1_STRING_length(rb->response);
  195. if (!(br = OCSP_response_get1_basic(o))) goto err;
  196. rd = br->tbsResponseData;
  197. l=ASN1_INTEGER_get(rd->version);
  198. if (BIO_printf(bp,"n    Version: %lu (0x%lx)n",
  199.        l+1,l) <= 0) goto err;
  200. if (BIO_puts(bp,"    Responder Id: ") <= 0) goto err;
  201. rid =  rd->responderId;
  202. switch (rid->type)
  203. {
  204. case V_OCSP_RESPID_NAME:
  205.         X509_NAME_print_ex(bp, rid->value.byName, 0, XN_FLAG_ONELINE);
  206.         break;
  207. case V_OCSP_RESPID_KEY:
  208.         i2a_ASN1_STRING(bp, rid->value.byKey, V_ASN1_OCTET_STRING);
  209.         break;
  210. }
  211. if (BIO_printf(bp,"n    Produced At: ")<=0) goto err;
  212. if (!ASN1_GENERALIZEDTIME_print(bp, rd->producedAt)) goto err;
  213. if (BIO_printf(bp,"n    Responses:n") <= 0) goto err;
  214. for (i = 0; i < sk_OCSP_SINGLERESP_num(rd->responses); i++)
  215.         {
  216. if (! sk_OCSP_SINGLERESP_value(rd->responses, i)) continue;
  217. single = sk_OCSP_SINGLERESP_value(rd->responses, i);
  218. cid = single->certId;
  219. if(ocsp_certid_print(bp, cid, 4) <= 0) goto err;
  220. cst = single->certStatus;
  221. if (BIO_printf(bp,"    Cert Status: %s",
  222.        OCSP_cert_status_str(cst->type)) <= 0)
  223.         goto err;
  224. if (cst->type == V_OCSP_CERTSTATUS_REVOKED)
  225.         {
  226.         rev = cst->value.revoked;
  227. if (BIO_printf(bp, "n    Revocation Time: ") <= 0) 
  228.         goto err;
  229. if (!ASN1_GENERALIZEDTIME_print(bp, 
  230. rev->revocationTime)) 
  231. goto err;
  232. if (rev->revocationReason) 
  233.         {
  234. l=ASN1_ENUMERATED_get(rev->revocationReason);
  235. if (BIO_printf(bp, 
  236.  "n    Revocation Reason: %s (0x%lx)",
  237.        OCSP_crl_reason_str(l), l) <= 0)
  238.         goto err;
  239. }
  240. }
  241. if (BIO_printf(bp,"n    This Update: ") <= 0) goto err;
  242. if (!ASN1_GENERALIZEDTIME_print(bp, single->thisUpdate)) 
  243. goto err;
  244. if (single->nextUpdate)
  245.         {
  246. if (BIO_printf(bp,"n    Next Update: ") <= 0)goto err;
  247. if (!ASN1_GENERALIZEDTIME_print(bp,single->nextUpdate))
  248. goto err;
  249. }
  250. if (!BIO_write(bp,"n",1)) goto err;
  251. if (!X509V3_extensions_print(bp,
  252. "Response Single Extensions",
  253. single->singleExtensions, flags, 8))
  254. goto err;
  255. if (!BIO_write(bp,"n",1)) goto err;
  256. }
  257. if (!X509V3_extensions_print(bp, "Response Extensions",
  258. rd->responseExtensions, flags, 4))
  259. if(X509_signature_print(bp, br->signatureAlgorithm, br->signature) <= 0)
  260. goto err;
  261. for (i=0; i<sk_X509_num(br->certs); i++)
  262. {
  263. X509_print(bp, sk_X509_value(br->certs,i));
  264. PEM_write_bio_X509(bp,sk_X509_value(br->certs,i));
  265. }
  266. ret = 1;
  267. err:
  268. OCSP_BASICRESP_free(br);
  269. return ret;
  270. }