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

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 8 -*-*/
  2. /*
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. #include "crmf.h"
  35. #include "crmfi.h"
  36. #include "keyhi.h"
  37. #include "secder.h"
  38. CRMFPOPChoice
  39. CRMF_CertReqMsgGetPOPType(CRMFCertReqMsg *inCertReqMsg)
  40. {
  41.     PORT_Assert(inCertReqMsg != NULL);
  42.     if (inCertReqMsg != NULL && inCertReqMsg->pop != NULL) {
  43.         return inCertReqMsg->pop->popUsed;
  44.     }
  45.     return crmfNoPOPChoice;
  46. }
  47. static SECStatus
  48. crmf_destroy_validity(CRMFOptionalValidity *inValidity, PRBool freeit)
  49. {
  50.     if (inValidity != NULL){
  51.         if (inValidity->notBefore.data != NULL) {
  52.     PORT_Free(inValidity->notBefore.data);
  53. }
  54. if (inValidity->notAfter.data != NULL) {
  55.     PORT_Free(inValidity->notAfter.data);
  56. }
  57. if (freeit) {
  58.     PORT_Free(inValidity);
  59. }
  60.     }
  61.     return SECSuccess;
  62. }
  63. static SECStatus 
  64. crmf_copy_cert_request_validity(PRArenaPool           *poolp,
  65. CRMFOptionalValidity **destValidity,
  66. CRMFOptionalValidity  *srcValidity)
  67. {
  68.     CRMFOptionalValidity *myValidity = NULL;
  69.     SECStatus             rv;
  70.     *destValidity = myValidity = (poolp == NULL) ?
  71.                                   PORT_ZNew(CRMFOptionalValidity) :
  72.                                   PORT_ArenaZNew(poolp, CRMFOptionalValidity);
  73.     if (myValidity == NULL) {
  74.         goto loser;
  75.     }
  76.     if (srcValidity->notBefore.data != NULL) {
  77.         rv = SECITEM_CopyItem(poolp, &myValidity->notBefore, 
  78.       &srcValidity->notBefore);
  79. if (rv != SECSuccess) {
  80.     goto loser;
  81. }
  82.     }
  83.     if (srcValidity->notAfter.data != NULL) {
  84.         rv = SECITEM_CopyItem(poolp, &myValidity->notAfter, 
  85.       &srcValidity->notAfter);
  86. if (rv != SECSuccess) {
  87.     goto loser;
  88. }
  89.     }
  90.     return SECSuccess;
  91.  loser:
  92.     if (myValidity != NULL && poolp == NULL) {
  93.         crmf_destroy_validity(myValidity, PR_TRUE);
  94.     }
  95.     return SECFailure;
  96. }
  97. static SECStatus
  98. crmf_copy_extensions(PRArenaPool        *poolp, 
  99.      CRMFCertTemplate   *destTemplate,
  100.      CRMFCertExtension **srcExt)
  101. {
  102.     int       numExt = 0, i;
  103.     CRMFCertExtension **myExtArray = NULL;
  104.     while (srcExt[numExt] != NULL) {
  105.         numExt++;
  106.     }
  107.     if (numExt == 0) {
  108.         /*No extensions to copy.*/
  109.         destTemplate->extensions = NULL;
  110. destTemplate->numExtensions = 0;
  111.         return SECSuccess;
  112.     }
  113.     destTemplate->extensions = myExtArray = 
  114.                            PORT_NewArray(CRMFCertExtension*, numExt+1);
  115.     if (myExtArray == NULL) {
  116.         goto loser;
  117.     }
  118.      
  119.     for (i=0; i<numExt; i++) {
  120.         myExtArray[i] = crmf_copy_cert_extension(poolp, srcExt[i]);
  121. if (myExtArray[i] == NULL) {
  122.     goto loser;
  123. }
  124.     }
  125.     destTemplate->numExtensions = numExt;
  126.     myExtArray[numExt] = NULL;
  127.     return SECSuccess;
  128.  loser:
  129.     if (myExtArray != NULL) {
  130.         if (poolp == NULL) {
  131.     for (i=0; myExtArray[i] != NULL; i++) {
  132.         CRMF_DestroyCertExtension(myExtArray[i]);
  133.     }
  134. }
  135. PORT_Free(myExtArray);
  136.     }
  137.     destTemplate->extensions = NULL;
  138.     destTemplate->numExtensions = 0;
  139.     return SECFailure;
  140. }
  141. static SECStatus
  142. crmf_copy_cert_request_template(PRArenaPool      *poolp, 
  143. CRMFCertTemplate *destTemplate,
  144. CRMFCertTemplate *srcTemplate)
  145. {
  146.     SECStatus rv;
  147.     if (srcTemplate->version.data != NULL) {
  148.         rv = SECITEM_CopyItem(poolp, &destTemplate->version, 
  149.       &srcTemplate->version);
  150. if (rv != SECSuccess) {
  151.     goto loser;
  152. }
  153.     }
  154.     if (srcTemplate->serialNumber.data != NULL) {
  155.         rv = SECITEM_CopyItem(poolp, &destTemplate->serialNumber,
  156.       &srcTemplate->serialNumber);
  157. if (rv != SECSuccess) {
  158.     goto loser;
  159. }
  160.     }
  161.     if (srcTemplate->signingAlg != NULL) {
  162.         rv = crmf_template_copy_secalg(poolp, &destTemplate->signingAlg,
  163.        srcTemplate->signingAlg);
  164. if (rv != SECSuccess) {
  165.     goto loser;
  166. }
  167.     }
  168.     if (srcTemplate->issuer != NULL) {
  169.         rv = crmf_copy_cert_name(poolp, &destTemplate->issuer,
  170.  srcTemplate->issuer);
  171. if (rv != SECSuccess) {
  172.     goto loser;
  173. }
  174.     }
  175.     if (srcTemplate->validity != NULL) {
  176.         rv = crmf_copy_cert_request_validity(poolp, &destTemplate->validity,
  177.      srcTemplate->validity);
  178. if (rv != SECSuccess) {
  179.     goto loser;
  180. }
  181.     }
  182.     if (srcTemplate->subject != NULL) {
  183.         rv = crmf_copy_cert_name(poolp, &destTemplate->subject, 
  184.  srcTemplate->subject);
  185. if (rv != SECSuccess) {
  186.     goto loser;
  187. }
  188.     }
  189.     if (srcTemplate->publicKey != NULL) {
  190.         rv = crmf_template_add_public_key(poolp, &destTemplate->publicKey,
  191.   srcTemplate->publicKey);
  192. if (rv != SECSuccess) {
  193.     goto loser;
  194. }
  195.     }
  196.     if (srcTemplate->issuerUID.data != NULL) {
  197.         rv = crmf_make_bitstring_copy(poolp, &destTemplate->issuerUID,
  198.       &srcTemplate->issuerUID);
  199. if (rv != SECSuccess) {
  200.     goto loser;
  201. }
  202.     }
  203.     if (srcTemplate->subjectUID.data != NULL) {
  204.         rv = crmf_make_bitstring_copy(poolp, &destTemplate->subjectUID,
  205.       &srcTemplate->subjectUID);
  206. if (rv != SECSuccess) {
  207.     goto loser;
  208. }
  209.     }
  210.     if (srcTemplate->extensions != NULL) {
  211.         rv = crmf_copy_extensions(poolp, destTemplate,
  212.   srcTemplate->extensions);
  213. if (rv != SECSuccess) {
  214.     goto loser;
  215. }
  216.     }
  217.     return SECSuccess;
  218.  loser:
  219.     return SECFailure;
  220. }
  221. static CRMFControl*
  222. crmf_copy_control(PRArenaPool *poolp, CRMFControl *srcControl)
  223. {
  224.     CRMFControl *newControl;
  225.     SECStatus    rv;
  226.     newControl = (poolp == NULL) ? PORT_ZNew(CRMFControl) :
  227.                                    PORT_ArenaZNew(poolp, CRMFControl);
  228.     if (newControl == NULL) {
  229.         goto loser;
  230.     }
  231.     newControl->tag = srcControl->tag;
  232.     rv = SECITEM_CopyItem(poolp, &newControl->derTag, &srcControl->derTag);
  233.     if (rv != SECSuccess) {
  234.         goto loser;
  235.     }
  236.     rv = SECITEM_CopyItem(poolp, &newControl->derValue, &srcControl->derValue);
  237.     if (rv != SECSuccess) {
  238.         goto loser;
  239.     }
  240.     /* We only handle PKIArchiveOptions Control right now.  But if in
  241.      * the future, more controls that are part of the union are added,
  242.      * then they need to be handled here as well.
  243.      */
  244.     switch (newControl->tag) {
  245.     case SEC_OID_PKIX_REGCTRL_PKI_ARCH_OPTIONS:
  246.         rv = crmf_copy_pkiarchiveoptions(poolp, 
  247.  &newControl->value.archiveOptions,
  248.  &srcControl->value.archiveOptions);
  249.       break;
  250.     default:
  251.         rv = SECSuccess;
  252.     }
  253.     if (rv != SECSuccess) {
  254.         goto loser;
  255.     }
  256.     return newControl;
  257.  loser:
  258.     if (poolp == NULL && newControl != NULL) {
  259.         CRMF_DestroyControl(newControl);
  260.     }
  261.     return NULL;
  262. }
  263. static SECStatus
  264. crmf_copy_cert_request_controls(PRArenaPool     *poolp, 
  265. CRMFCertRequest *destReq, 
  266. CRMFCertRequest *srcReq)
  267. {
  268.     int           numControls, i;
  269.     CRMFControl **myControls = NULL;
  270.     numControls = CRMF_CertRequestGetNumControls(srcReq);
  271.     if (numControls == 0) {
  272.         /* No Controls To Copy*/
  273.         return SECSuccess;
  274.     }
  275.     myControls = destReq->controls = PORT_NewArray(CRMFControl*, 
  276.    numControls+1);
  277.     if (myControls == NULL) {
  278.         goto loser;
  279.     }
  280.     for (i=0; i<numControls; i++) {
  281.         myControls[i] = crmf_copy_control(poolp, srcReq->controls[i]);
  282. if (myControls[i] == NULL) {
  283.     goto loser;
  284. }
  285.     }
  286.     myControls[numControls] = NULL;
  287.     return SECSuccess;
  288.  loser:
  289.     if (myControls != NULL) {
  290.         if (poolp == NULL) {
  291.     for (i=0; myControls[i] != NULL; i++) {
  292.         CRMF_DestroyControl(myControls[i]);
  293.     }
  294. }
  295. PORT_Free(myControls);
  296.     }
  297.     return SECFailure;
  298. }
  299. CRMFCertRequest*
  300. crmf_copy_cert_request(PRArenaPool *poolp, CRMFCertRequest *srcReq)
  301. {
  302.     CRMFCertRequest *newReq = NULL;
  303.     SECStatus        rv;
  304.     if (srcReq == NULL) {
  305.         return NULL;
  306.     }
  307.     newReq = (poolp == NULL) ? PORT_ZNew(CRMFCertRequest) :
  308.                                PORT_ArenaZNew(poolp, CRMFCertRequest);
  309.     if (newReq == NULL) {
  310.         goto loser;
  311.     }
  312.     rv = SECITEM_CopyItem(poolp, &newReq->certReqId, &srcReq->certReqId);
  313.     if (rv != SECSuccess) {
  314.         goto loser;
  315.     }
  316.     rv = crmf_copy_cert_request_template(poolp, &newReq->certTemplate, 
  317.  &srcReq->certTemplate);
  318.     if (rv != SECSuccess) {
  319.         goto loser;
  320.     }
  321.     rv = crmf_copy_cert_request_controls(poolp, newReq, srcReq);
  322.     if (rv != SECSuccess) {
  323.         goto loser;
  324.     }
  325.     return newReq;
  326.  loser:
  327.     if (newReq != NULL && poolp == NULL) {
  328.         CRMF_DestroyCertRequest(newReq);
  329.     }
  330.     return NULL;
  331. }
  332. SECStatus 
  333. CRMF_DestroyGetValidity(CRMFGetValidity *inValidity)
  334. {
  335.     PORT_Assert(inValidity != NULL);
  336.     if (inValidity != NULL) {
  337.         if (inValidity->notAfter) {
  338.     PORT_Free(inValidity->notAfter);
  339.     inValidity->notAfter = NULL;
  340. }
  341. if (inValidity->notBefore) {
  342.     PORT_Free(inValidity->notBefore);
  343.     inValidity->notBefore = NULL;
  344. }
  345.     }
  346.     return SECSuccess;
  347. }
  348. SECStatus
  349. crmf_make_bitstring_copy(PRArenaPool *arena, SECItem *dest, SECItem *src)
  350. {
  351.     int origLenBits;
  352.     int bytesToCopy;
  353.     SECStatus rv;
  354.     origLenBits = src->len;
  355.     bytesToCopy = CRMF_BITS_TO_BYTES(origLenBits);
  356.     src->len = bytesToCopy;         
  357.     rv = SECITEM_CopyItem(arena, dest, src);
  358.     src->len = origLenBits;
  359.     if (rv != SECSuccess) {
  360.         return rv;
  361.     }
  362.     dest->len = origLenBits;
  363.     return SECSuccess;
  364. }
  365. int
  366. CRMF_CertRequestGetNumberOfExtensions(CRMFCertRequest *inCertReq)
  367. {
  368.     CRMFCertTemplate *certTemplate;
  369.     int count = 0;
  370.     
  371.     certTemplate = &inCertReq->certTemplate;
  372.     if (certTemplate->extensions) {
  373.         while (certTemplate->extensions[count] != NULL)
  374.     count++;
  375.     }
  376.     return count;
  377. }
  378. SECOidTag
  379. CRMF_CertExtensionGetOidTag(CRMFCertExtension *inExtension)
  380. {
  381.     PORT_Assert(inExtension != NULL);
  382.     if (inExtension == NULL) {
  383.         return SEC_OID_UNKNOWN;
  384.     }
  385.     return SECOID_FindOIDTag(&inExtension->id);
  386. }
  387. PRBool
  388. CRMF_CertExtensionGetIsCritical(CRMFCertExtension *inExt)
  389. {
  390.     PORT_Assert(inExt != NULL);
  391.     if (inExt == NULL) {
  392.         return PR_FALSE;
  393.     }
  394.     return inExt->critical.data != NULL;
  395. }
  396. SECItem*
  397. CRMF_CertExtensionGetValue(CRMFCertExtension *inExtension)
  398. {
  399.     PORT_Assert(inExtension != NULL);
  400.     if (inExtension == NULL) {
  401.         return NULL;
  402.     }
  403.     
  404.     return SECITEM_DupItem(&inExtension->value);
  405. }
  406.   
  407. SECStatus
  408. CRMF_DestroyPOPOSigningKey(CRMFPOPOSigningKey *inKey)
  409. {
  410.     PORT_Assert(inKey != NULL);
  411.     if (inKey != NULL) {
  412.         if (inKey->derInput.data != NULL) {
  413.     SECITEM_FreeItem(&inKey->derInput, PR_FALSE);
  414. }
  415. if (inKey->algorithmIdentifier != NULL) {
  416.     SECOID_DestroyAlgorithmID(inKey->algorithmIdentifier, PR_TRUE);
  417. }
  418. if (inKey->signature.data != NULL) {
  419.     SECITEM_FreeItem(&inKey->signature, PR_FALSE);
  420. }
  421. PORT_Free(inKey);
  422.     }
  423.     return SECSuccess;
  424. }
  425. SECStatus
  426. CRMF_DestroyPOPOPrivKey(CRMFPOPOPrivKey *inPrivKey)
  427. {
  428.     PORT_Assert(inPrivKey != NULL);
  429.     if (inPrivKey != NULL) {
  430.         SECITEM_FreeItem(&inPrivKey->message.thisMessage, PR_FALSE);
  431. PORT_Free(inPrivKey);
  432.     }
  433.     return SECSuccess;
  434. }
  435. int
  436. CRMF_CertRequestGetNumControls(CRMFCertRequest *inCertReq)
  437. {
  438.     int              count = 0;
  439.     PORT_Assert(inCertReq != NULL);
  440.     if (inCertReq == NULL) {
  441.         return 0;
  442.     }
  443.     if (inCertReq->controls) {
  444.         while (inCertReq->controls[count] != NULL)
  445.     count++;
  446.     }
  447.     return count;
  448. }