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

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  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. #if defined(XP_UNIX) || defined(XP_BEOS) || defined(XP_OS2)
  35. #include <sys/types.h>
  36. #include <sys/socket.h>
  37. #include <netinet/in.h>
  38. #else
  39. #ifdef XP_MAC
  40. #include "macsocket.h"
  41. #include "string.h"
  42. #else
  43. #include <windows.h>
  44. #include <winsock.h>
  45. #endif
  46. #endif
  47. #include <errno.h>
  48. #include "cmtcmn.h"
  49. #include "cmtutils.h"
  50. #include "messages.h"
  51. #include "rsrcids.h"
  52. CMTStatus CMT_HashCreate(PCMT_CONTROL control, CMUint32 algID, 
  53.                          CMUint32 * connID)
  54. {
  55.     CMTItem message;
  56.     SingleNumMessage request;
  57.     DataConnectionReply reply;
  58.     /* Check passed in parameters */
  59.     if (!control) {
  60.         goto loser;
  61.     }
  62.     /* Set up the request */
  63.     request.value = algID;
  64.     /* Encode the request */
  65.     if (CMT_EncodeMessage(SingleNumMessageTemplate, &message, &request) != CMTSuccess) {
  66.         goto loser;
  67.     }
  68.     /* Set the message request type */
  69.     message.type = SSM_REQUEST_MESSAGE | SSM_DATA_CONNECTION | SSM_HASH_STREAM;
  70.     /* Send the message and get the response */
  71.     if (CMT_SendMessage(control, &message) == CMTFailure) {
  72.         goto loser;
  73.     }
  74.     /* Validate the response */
  75.     if (message.type != (SSM_REPLY_OK_MESSAGE | SSM_DATA_CONNECTION | SSM_HASH_STREAM)) {
  76.         goto loser;
  77.     }
  78.     /* Decode the reply */
  79.     if (CMT_DecodeMessage(DataConnectionReplyTemplate, &reply, &message) != CMTSuccess) {
  80.         goto loser;
  81.     }
  82.     /* Success */
  83.     if (reply.result == 0) {
  84.         CMTSocket sock;
  85.         sock = control->sockFuncs.socket(0);
  86.         if(sock == NULL) {
  87.             goto loser;
  88.         }
  89.         
  90.         if (control->sockFuncs.connect(sock, reply.port, NULL) != CMTSuccess) {
  91.             goto loser;
  92.         }
  93.         /* Send the hello message */
  94. control->sockFuncs.send(sock, control->nonce.data, control->nonce.len);
  95.         /* Save connection info */
  96.         if (CMT_AddDataConnection(control, sock, reply.connID)
  97.     != CMTSuccess) {
  98.             goto loser;
  99.         }
  100.         /* Set the connection ID */
  101.         *connID = reply.connID;
  102.         return CMTSuccess;
  103. loser:
  104.     *connID = 0;
  105. return CMTFailure;
  106. }
  107. CMTStatus CMT_HASH_Destroy(PCMT_CONTROL control, CMUint32 connectionID)
  108. {
  109.     if (!control) {
  110.         goto loser;
  111.     }
  112.     /* Get the cotext implementation data */
  113.     if (CMT_CloseDataConnection(control, connectionID) == CMTFailure) {
  114.         goto loser;
  115.     }
  116.     return CMTSuccess;
  117. loser:
  118.     return CMTFailure;
  119. }
  120. CMTStatus CMT_HASH_Begin(PCMT_CONTROL control, CMUint32 connectionID)
  121. {
  122.     return CMTSuccess;
  123. }
  124. CMTStatus CMT_HASH_Update(PCMT_CONTROL control, CMUint32 connectionID, const unsigned char * buf, CMUint32 len)
  125. {
  126.     CMTSocket sock;
  127.     CMUint32 sent;
  128.     /* Do some parameter checking */
  129.     if (!control || !buf) {
  130.         goto loser;
  131.     }
  132.     /* Get the data socket */
  133.     if (CMT_GetDataSocket(control, connectionID, &sock) == CMTFailure) {
  134.         goto loser;
  135.     }
  136.     /* Write the data to the socket */
  137.     sent = CMT_WriteThisMany(control, sock, (void*)buf, len);
  138.     if (sent != len) {
  139.         goto loser;
  140.     }
  141.     return CMTSuccess;
  142. loser:
  143.     return CMTFailure;
  144. }
  145. CMTStatus CMT_HASH_End(PCMT_CONTROL control, CMUint32 connectionID, 
  146.                        unsigned char * result, CMUint32 * resultlen, 
  147.                        CMUint32 maxLen)
  148. {
  149.     CMTItem hash = { 0, NULL, 0 };
  150.     /* Do some parameter checking */
  151.     if (!control || !result || !resultlen) {
  152.         goto loser;
  153.     }
  154.     /* Close the connection */
  155.     if (CMT_CloseDataConnection(control, connectionID) == CMTFailure) {
  156.         goto loser;
  157.     }
  158.     /* Get the context info */
  159.     if (CMT_GetStringAttribute(control, connectionID, SSM_FID_HASHCONN_RESULT,
  160.                                &hash) == CMTFailure) {
  161.         goto loser;
  162.     }
  163.     if (!hash.data) {
  164.         goto loser;
  165.     }
  166.     *resultlen = hash.len;
  167.     if (hash.len > maxLen) {
  168.         memcpy(result, hash.data, maxLen);
  169.     } else {
  170.         memcpy(result, hash.data, hash.len);
  171.     }   
  172.     if (hash.data) {
  173.         free(hash.data);
  174.     }
  175.     return CMTSuccess;
  176. loser:
  177.     if (hash.data) {
  178.         free(hash.data);
  179.     }
  180.     return CMTFailure;
  181. }