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

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. #include "cmtutils.h"
  34. #include "cmtjs.h"
  35. #include "messages.h"
  36. CMTStatus
  37. CMT_GenerateKeyPair(PCMT_CONTROL control, CMUint32 keyGenContext, 
  38.     CMUint32 mechType, CMTItem *param, CMUint32 keySize, 
  39.     CMUint32 *keyPairId)
  40. {
  41.     CMTItem message;
  42.     CMTStatus rv;
  43.     KeyPairGenRequest request = {0, 0, 0, {0, NULL, 0}};
  44.     SingleNumMessage reply;
  45.     if (!control) {
  46.         return CMTFailure;
  47.     }
  48.     request.keyGenCtxtID = keyGenContext;
  49.     request.genMechanism = mechType;
  50.     if (param) {
  51.         request.params = *param;
  52.     }
  53.     request.keySize = keySize;
  54.     /* Encode the message */
  55.     if (CMT_EncodeMessage(KeyPairGenRequestTemplate, &message, &request) != CMTSuccess) {
  56.         goto loser;
  57.     }
  58.     message.type = SSM_REQUEST_MESSAGE | SSM_PKCS11_ACTION | SSM_CREATE_KEY_PAIR;
  59.     /* Send the message and get the response */
  60.     rv = CMT_SendMessage(control, &message); 
  61.     if (rv != CMTSuccess) {
  62.         goto loser;
  63.     }
  64.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_PKCS11_ACTION | SSM_CREATE_KEY_PAIR)) {
  65.         goto loser;
  66.     }
  67.     /* Decode the message */
  68.     if (CMT_DecodeMessage(SingleNumMessageTemplate, &reply, &message) != CMTSuccess) {
  69.         goto loser;
  70.     }
  71.     *keyPairId = reply.value;
  72.     return CMTSuccess;
  73.     
  74. loser:
  75.     *keyPairId = 0;
  76.     return CMTFailure;
  77. }
  78. CMTStatus
  79. CMT_CreateNewCRMFRequest(PCMT_CONTROL control, CMUint32 keyPairID, 
  80.  SSMKeyGenType keyGenType, CMUint32 *reqID)
  81. {
  82.     CMTItem message;
  83.     CMTStatus rv;
  84.     SingleNumMessage request;
  85.     SingleNumMessage reply;
  86.     
  87.     if (!control) {
  88.         return CMTFailure;
  89.     }
  90.     request.value = keyPairID;
  91.     if (CMT_EncodeMessage(SingleNumMessageTemplate, &message, &request) != CMTSuccess) {
  92.         goto loser;
  93.     }
  94.     message.type = SSM_REQUEST_MESSAGE | SSM_CRMF_ACTION | 
  95.                     SSM_CREATE_CRMF_REQ;
  96.     rv = CMT_SendMessage(control, &message);
  97.     if (rv != CMTSuccess) {
  98.         goto loser;
  99.     }
  100.   
  101.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_CRMF_ACTION | SSM_CREATE_CRMF_REQ)) {
  102.         goto loser;
  103.     }
  104.     if (CMT_DecodeMessage(SingleNumMessageTemplate, &reply, &message) != CMTSuccess) {
  105.         goto loser;
  106.     }
  107.     *reqID = reply.value;
  108.     rv = CMT_SetNumericAttribute(control, *reqID, SSM_FID_CRMFREQ_KEY_TYPE,
  109.  keyGenType);
  110.     if (rv != CMTSuccess) {
  111.         goto loser;
  112.     }
  113.     return CMTSuccess;
  114.  loser:
  115.     return CMTFailure;
  116. }
  117. CMTStatus
  118. CMT_EncodeCRMFRequest(PCMT_CONTROL control, CMUint32 *crmfReqID, 
  119.       CMUint32 numRequests, char ** der)
  120. {
  121.     CMTItem   message;
  122.     CMTStatus  rv;
  123.     EncodeCRMFReqRequest request;
  124.     SingleItemMessage reply;
  125.     if (!control) {
  126.         return CMTFailure;
  127.     }
  128.     request.numRequests = numRequests;
  129.     request.reqIDs = (long *) crmfReqID;
  130.     /* Encode the request */
  131.     if (CMT_EncodeMessage(EncodeCRMFReqRequestTemplate, &message, &request) != CMTSuccess) {
  132.         goto loser;
  133.     }
  134.     message.type = SSM_REQUEST_MESSAGE | SSM_CRMF_ACTION | SSM_DER_ENCODE_REQ;
  135.     rv = CMT_SendMessage(control, &message);
  136.     if (rv != CMTSuccess) {
  137.         goto loser;
  138.     }
  139.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_CRMF_ACTION | SSM_DER_ENCODE_REQ)) {
  140.         goto loser;
  141.     }
  142.     /* XXX Should this be a string? Decode the message */
  143.     if (CMT_DecodeMessage(SingleItemMessageTemplate, &reply, &message) != CMTSuccess) {
  144.         goto loser;
  145.     }
  146.     *der = (char *) reply.item.data;
  147.     return CMTSuccess;
  148. loser:
  149.     return CMTFailure;
  150. }
  151. CMTStatus
  152. CMT_ProcessCMMFResponse(PCMT_CONTROL control, char *nickname,
  153. char *certRepString, CMBool doBackup,
  154. void *clientContext)
  155. {
  156.     CMTItem   message;
  157.     CMTStatus  rv;
  158.     CMMFCertResponseRequest request;
  159.     if(!control) {
  160.         return CMTFailure;
  161.     }
  162.     request.nickname = nickname;
  163.     request.base64Der = certRepString;
  164.     request.doBackup = doBackup;
  165.     request.clientContext = CMT_CopyPtrToItem(clientContext);
  166.     /* Encode the request */
  167.     if (CMT_EncodeMessage(CMMFCertResponseRequestTemplate, &message, &request) != CMTSuccess) {
  168.         goto loser;
  169.     }
  170.     message.type =  SSM_REQUEST_MESSAGE | SSM_CRMF_ACTION | SSM_PROCESS_CMMF_RESP;
  171.     rv = CMT_SendMessage(control, &message);
  172.     if (rv != CMTSuccess) {
  173.         goto loser;
  174.     }
  175.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_CRMF_ACTION | SSM_PROCESS_CMMF_RESP)) {
  176.         goto loser;
  177.     }
  178.     return CMTSuccess;
  179. loser:
  180.     return CMTFailure;
  181. }
  182. CMTStatus
  183. CMT_CreateResource(PCMT_CONTROL control, SSMResourceType resType,
  184.    CMTItem *params, CMUint32 *rsrcId, CMUint32 *errorCode)
  185. {
  186.     CMTItem message;
  187.     CMTStatus rv;
  188.     CreateResourceRequest request = {0, {0, NULL, 0}};
  189.     CreateResourceReply reply;
  190.     request.type = resType;
  191.     if (params) {
  192.         request.params = *params;
  193.     } 
  194.     /* Encode the request */
  195.     if (CMT_EncodeMessage(CreateResourceRequestTemplate, &message, &request) != CMTSuccess) {
  196.         goto loser;
  197.     }
  198.     message.type = SSM_REQUEST_MESSAGE | SSM_RESOURCE_ACTION | SSM_CREATE_RESOURCE;
  199.     
  200.     rv = CMT_SendMessage(control, &message);
  201.     if (rv != CMTSuccess) {
  202.         goto loser;
  203.     }
  204.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_RESOURCE_ACTION | SSM_CREATE_RESOURCE)) {
  205.         goto loser;
  206.     }
  207.     /* Decode the message */
  208.     if (CMT_DecodeMessage(CreateResourceReplyTemplate, &reply, &message) != CMTSuccess) {
  209.         goto loser;
  210.     }
  211.     *rsrcId = reply.resID;
  212.     *errorCode = reply.result;
  213.     return CMTSuccess;
  214. loser:
  215.     return CMTFailure;
  216. }
  217. CMTStatus CMT_SignText(PCMT_CONTROL control, CMUint32 resID, char* stringToSign, char* hostName, char* caOption, CMInt32 numCAs, char** caNames)
  218. {
  219.     CMTItem message;
  220.     SignTextRequest request;
  221.     
  222.     /* So some basic parameter checking */
  223.     if (!control || !stringToSign) {
  224.         goto loser;
  225.     }
  226.     /* Set up the request */
  227.     request.resID = resID;
  228.     request.stringToSign = stringToSign;
  229.     request.hostName = hostName;
  230.     request.caOption = caOption;
  231.     request.numCAs = numCAs;
  232.     request.caNames = caNames;
  233.     /* Encode the message */
  234.     if (CMT_EncodeMessage(SignTextRequestTemplate, &message, &request) != CMTSuccess) {
  235.         goto loser;
  236.     }
  237.     /* Set the message request type */
  238.     message.type = SSM_REQUEST_MESSAGE | SSM_FORMSIGN_ACTION | SSM_SIGN_TEXT;
  239.     /* Send the message and get the response */
  240.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  241.         goto loser;
  242.     }
  243.     /* Validate the message reply type */
  244.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_FORMSIGN_ACTION | SSM_SIGN_TEXT)) {
  245.         goto loser;
  246.     }
  247.     return CMTSuccess;
  248. loser:
  249.     return CMTFailure;
  250. }
  251. CMTStatus
  252. CMT_ProcessChallengeResponse(PCMT_CONTROL control, char *challengeString,
  253.      char **responseString)
  254. {
  255.     CMTItem   message;
  256.     CMTStatus  rv;
  257.     SingleStringMessage request;
  258.     SingleStringMessage reply;
  259.     /* Set the request */
  260.     request.string = challengeString;
  261.     /* Encode the request */
  262.     if (CMT_EncodeMessage(SingleStringMessageTemplate, &message, &request) != CMTSuccess) {
  263.         goto loser;
  264.     }
  265.     /* Set the message request type */
  266.     message.type = SSM_REQUEST_MESSAGE | SSM_CRMF_ACTION | SSM_CHALLENGE;
  267.     /* Send the message */
  268.     rv = CMT_SendMessage(control, &message);
  269.     if (rv != CMTSuccess) {
  270.         goto loser;
  271.     }
  272.     
  273.     /* Validate the message reply type */
  274.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_CRMF_ACTION | SSM_CHALLENGE)) {
  275.         goto loser;
  276.     }
  277.     /* Decode the reply */
  278.     if (CMT_DecodeMessage(SingleStringMessageTemplate, &reply, &message) != CMTSuccess) {
  279.         goto loser;
  280.     }
  281.     *responseString = reply.string;
  282.     return CMTSuccess;
  283.  loser:
  284.     return CMTFailure;
  285. }
  286. CMTStatus
  287. CMT_FinishGeneratingKeys(PCMT_CONTROL control, CMUint32 keyGenContext)
  288. {
  289.     CMTItem message;
  290.     CMTStatus rv;
  291.     SingleNumMessage request;
  292.     /* Set up the request */
  293.     request.value = keyGenContext;
  294.     /* Encode the request */
  295.     if (CMT_EncodeMessage(SingleNumMessageTemplate, &message, &request) != CMTSuccess) {
  296.         goto loser;
  297.     }
  298.     /* Set the message request type */
  299.     message.type = SSM_REQUEST_MESSAGE | SSM_PKCS11_ACTION | SSM_FINISH_KEY_GEN;
  300.     /* Send the message */
  301.     rv = CMT_SendMessage(control, &message);
  302.     if (rv != CMTSuccess) {
  303.         goto loser;
  304.     }
  305.     /* Validate the reply */
  306.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_PKCS11_ACTION | SSM_FINISH_KEY_GEN)) {
  307.         goto loser;
  308.     }
  309.     return CMTSuccess;
  310.  loser:
  311.     return CMTFailure;
  312. }
  313. CMTStatus
  314. CMT_GetLocalizedString(PCMT_CONTROL        control,
  315.                        SSMLocalizedString  whichString,
  316.                        char              **localizedString)
  317. {
  318.     CMTItem message;
  319.     CMTStatus rv;
  320.     SingleNumMessage request;
  321.     GetLocalizedTextReply reply;
  322.     /* Set up the request */
  323.     request.value = whichString;
  324.     /* Encode the request */
  325.     if (CMT_EncodeMessage(SingleNumMessageTemplate, &message, &request) != CMTSuccess) {
  326.         goto loser;
  327.     }
  328.     /* Set the message request type */
  329.     message.type = SSM_REQUEST_MESSAGE | SSM_LOCALIZED_TEXT;
  330.     /* Send the message */
  331.     rv = CMT_SendMessage(control, &message);
  332.     if (rv != CMTSuccess) {
  333.         goto loser;
  334.     }
  335.     /* Validate the message reply type */
  336.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_LOCALIZED_TEXT)) {
  337.         goto loser;
  338.     }
  339.     /* Decode the reply */
  340.     if (CMT_DecodeMessage(GetLocalizedTextReplyTemplate, &reply, &message) != CMTSuccess) {
  341.         goto loser;
  342.     }
  343.     if (reply.whichString != whichString) {
  344.         goto loser;
  345.     }
  346.     *localizedString = reply.localizedString;
  347.     return CMTSuccess;
  348.  loser:
  349.     *localizedString = NULL;
  350.     return rv; 
  351. }
  352. CMTStatus
  353. CMT_AddNewModule(PCMT_CONTROL  control,
  354.                  char         *moduleName,
  355.                  char         *libraryPath,
  356.                  unsigned long pubMechFlags,
  357.                  unsigned long pubCipherFlags)
  358. {
  359.     CMTItem message;
  360.     CMTStatus rv;
  361.     AddNewSecurityModuleRequest request;
  362.     SingleNumMessage reply;
  363.     /* Set up the request */
  364.     request.moduleName = moduleName;
  365.     request.libraryPath = libraryPath;
  366.     request.pubMechFlags = pubMechFlags;
  367.     request.pubCipherFlags = pubCipherFlags;
  368.     /* Encode the request */
  369.     if (CMT_EncodeMessage(AddNewSecurityModuleRequestTemplate, &message, &request) != CMTSuccess) {
  370.         goto loser;
  371.     }
  372.     /* Set the message request type */
  373.     message.type = SSM_REQUEST_MESSAGE | SSM_PKCS11_ACTION | SSM_ADD_NEW_MODULE;
  374.     /* Send the message */
  375.     rv = CMT_SendMessage(control, &message);
  376.     if (rv != CMTSuccess) {
  377.         goto loser;
  378.     }
  379.     /* Validate the message reply type */
  380.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_PKCS11_ACTION | SSM_ADD_NEW_MODULE)) {
  381.         goto loser;
  382.     }
  383.     /* Decode the response */
  384.     if (CMT_DecodeMessage(SingleNumMessageTemplate, &reply, &message) != CMTSuccess) {
  385.         goto loser;
  386.     }
  387.     return (CMTStatus) reply.value;
  388.  loser:
  389.     return CMTFailure;
  390. }
  391. CMTStatus
  392. CMT_DeleteModule(PCMT_CONTROL  control,
  393.                  char         *moduleName,
  394.                  int          *moduleType)
  395. {
  396.     CMTItem message;
  397.     CMTStatus rv;
  398.     SingleStringMessage request;
  399.     SingleNumMessage reply;
  400.     /* Set up the request */
  401.     request.string = moduleName;
  402.     /* Encode the request */
  403.     if (CMT_EncodeMessage(SingleStringMessageTemplate, &message, &request) != CMTSuccess) {
  404.         goto loser;
  405.     }
  406.     /* Set the message request type */
  407.     message.type = SSM_REQUEST_MESSAGE | SSM_PKCS11_ACTION | SSM_DEL_MODULE;
  408.     /* Send the message */
  409.     rv = CMT_SendMessage(control, &message);
  410.     if (rv != CMTSuccess) {
  411.         goto loser;
  412.     }
  413.     /* Validate the message reply type */
  414.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_PKCS11_ACTION | SSM_DEL_MODULE)) {
  415.         goto loser;
  416.     }
  417.     /* Decode the reply */
  418.     if (CMT_DecodeMessage(SingleNumMessageTemplate, &reply, &message) != CMTSuccess) {
  419.         goto loser;
  420.     }
  421.     *moduleType = reply.value;
  422.     return CMTSuccess;
  423.  loser:
  424.     return CMTFailure;
  425. }
  426. CMTStatus CMT_LogoutAllTokens(PCMT_CONTROL control)
  427. {
  428.   CMTItem message;
  429.   CMTStatus rv;
  430.   message.type = SSM_REQUEST_MESSAGE | SSM_PKCS11_ACTION | SSM_LOGOUT_ALL;
  431.   message.data = NULL;
  432.   message.len  = 0;
  433.   rv = CMT_SendMessage(control, &message);
  434.   if (rv != CMTSuccess) {
  435.     return rv;
  436.   }
  437.   if (message.type !=  (SSM_REPLY_OK_MESSAGE | SSM_PKCS11_ACTION | 
  438. SSM_LOGOUT_ALL)) {
  439.     return CMTFailure;
  440.   }
  441.   return CMTSuccess;
  442. }
  443. CMTStatus CMT_GetSSLCapabilities(PCMT_CONTROL control, CMInt32 *capabilites)
  444. {
  445.     SingleNumMessage reply;
  446.     CMTItem message;
  447.     CMTStatus rv;
  448.     message.type = (SSM_REQUEST_MESSAGE | SSM_PKCS11_ACTION | 
  449.                     SSM_ENABLED_CIPHERS);
  450.     message.data = NULL;
  451.     message.len  = 0;
  452.     rv = CMT_SendMessage(control, &message);
  453.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_PKCS11_ACTION |
  454.  SSM_ENABLED_CIPHERS)) {
  455.         goto loser;
  456.     }
  457.     if (CMT_DecodeMessage(SingleNumMessageTemplate, &reply, 
  458.                           &message) != CMTSuccess) {
  459.         goto loser;
  460.     }
  461.     *capabilites = reply.value;
  462.     return CMTSuccess;
  463.  loser:
  464.     return CMTFailure;
  465. }