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

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. /*
  34.   cmtsdr.c -- Support for the Secret Decoder Ring, which provides
  35.       encryption and decryption using stored keys.
  36.   Created by thayes 18 April 2000
  37.  */
  38. #include "stddef.h"
  39. #include "cmtcmn.h"
  40. #include "cmtutils.h"
  41. #include "messages.h"
  42. #include "protocolshr.h"
  43. #include "rsrcids.h"
  44. #include <string.h>
  45. #undef PROCESS_LOCALLY
  46. /* Encryption result - contains the key id and the resulting data */
  47. /* An empty key id indicates that NO encryption was performed */
  48. typedef struct EncryptionResult
  49. {
  50.   CMTItem keyid;
  51.   CMTItem data;
  52. } EncryptionResult;
  53. /* Constants for testing */
  54. static const char *kPrefix = "Encrypted:";
  55. static CMTItem
  56. CMT_CopyDataToItem(const unsigned char *data, CMUint32 len)
  57. {
  58.   CMTItem item;
  59.   item.data = (unsigned char*) calloc(len, 1);
  60.   item.len = len;
  61.   memcpy(item.data, data, len);
  62.   return item;
  63. }
  64. static CMTStatus
  65. tmp_SendMessage(PCMT_CONTROL control, CMTItem *message)
  66. {
  67. #ifndef PROCESS_LOCALLY
  68.   return CMT_SendMessage(control, message);
  69. #else
  70.   if (message->type == SSM_SDR_ENCRYPT_REQUEST) 
  71.     return CMT_DoEncryptionRequest(message);
  72.   else if (message->type == SSM_SDR_DECRYPT_REQUEST)
  73.     return CMT_DoDecryptionRequest(message);
  74.   return CMTFailure;
  75. #endif
  76. }
  77. /* End test code */
  78. CMTStatus
  79. CMT_SDREncrypt(PCMT_CONTROL control, void *ctx,
  80.                const unsigned char *key, CMUint32 keyLen,
  81.                const unsigned char *data, CMUint32 dataLen,
  82.                unsigned char **result, CMUint32 *resultLen)
  83. {
  84.   CMTStatus rv = CMTSuccess;
  85.   CMTItem message;
  86.   EncryptRequestMessage request;
  87.   SingleItemMessage reply;
  88.   /* Fill in the request */
  89.   request.keyid = CMT_CopyDataToItem(key, keyLen);
  90.   request.data = CMT_CopyDataToItem(data, dataLen);
  91.   request.ctx = CMT_CopyPtrToItem(ctx);
  92.   reply.item.data = 0;
  93.   reply.item.len = 0;
  94.   message.data = 0;
  95.   message.len = 0;
  96.   /* Encode */
  97.   rv = CMT_EncodeMessage(EncryptRequestTemplate, &message, &request);
  98.   if (rv != CMTSuccess) {
  99.     goto loser;
  100.   }
  101.   message.type = SSM_SDR_ENCRYPT_REQUEST;
  102.   /* Send */
  103.   /* if (CMT_SendMessage(control, &message) != CMTSuccess) goto loser; */
  104.   rv = tmp_SendMessage(control, &message);
  105.   if (rv != CMTSuccess) goto loser;
  106.   if (message.type != SSM_SDR_ENCRYPT_REPLY) { rv = CMTFailure; goto loser; }
  107.   rv = CMT_DecodeMessage(SingleItemMessageTemplate, &reply, &message);
  108.   if (rv != CMTSuccess)
  109.     goto loser;
  110.   *result = reply.item.data;
  111.   *resultLen = reply.item.len;
  112.   reply.item.data = 0;
  113. loser:
  114.   if (message.data) free(message.data);
  115.   if (request.keyid.data) free(request.keyid.data);
  116.   if (request.data.data) free(request.data.data);
  117.   if (request.ctx.data) free(request.ctx.data);
  118.   if (reply.item.data) free(reply.item.data);
  119.   return rv; /* need return value */
  120. }
  121. CMTStatus
  122. CMT_SDRDecrypt(PCMT_CONTROL control, void *ctx,
  123.                const unsigned char *data, CMUint32 dataLen,
  124.                unsigned char **result, CMUint32 *resultLen)
  125. {
  126.   CMTStatus rv;
  127.   CMTItem message;
  128.   DecryptRequestMessage request;
  129.   SingleItemMessage reply;
  130.   /* Fill in the request */
  131.   request.data = CMT_CopyDataToItem(data, dataLen);
  132.   request.ctx = CMT_CopyPtrToItem(ctx);
  133.   reply.item.data = 0;
  134.   reply.item.len = 0;
  135.   message.data = 0;
  136.   message.len = 0;
  137.   /* Encode */
  138.   rv = CMT_EncodeMessage(DecryptRequestTemplate, &message, &request);
  139.   if (rv != CMTSuccess) {
  140.     goto loser;
  141.   }
  142.   message.type = SSM_SDR_DECRYPT_REQUEST;
  143.   /* Send */
  144.   /* if (CMT_SendMessage(control, &message) != CMTSuccess) goto loser; */
  145.   rv = tmp_SendMessage(control, &message);
  146.   if (rv != CMTSuccess) goto loser;
  147.   if (message.type != SSM_SDR_DECRYPT_REPLY) { rv = CMTFailure; goto loser; }
  148.   rv = CMT_DecodeMessage(SingleItemMessageTemplate, &reply, &message);
  149.   if (rv != CMTSuccess)
  150.     goto loser;
  151.   *result = reply.item.data;
  152.   *resultLen = reply.item.len;
  153.   reply.item.data = 0;
  154. loser:
  155.   if (message.data) free(message.data);
  156.   if (request.data.data) free(request.data.data);
  157.   if (request.ctx.data) free(request.ctx.data);
  158.   if (reply.item.data) free(reply.item.data);
  159.   return rv; /* need return value */
  160. }
  161. CMTStatus
  162. CMT_SDRChangePassword(PCMT_CONTROL control, void *ctx)
  163. {
  164.   CMTStatus rv = CMTSuccess;
  165.   CMTItem message;
  166.   SingleItemMessage request;
  167.   SingleNumMessage reply;
  168.   /* Fill in the request */
  169.   request.item = CMT_CopyPtrToItem(ctx);
  170.   message.data = 0;
  171.   message.len = 0;
  172.   /* Encode */
  173.   rv = CMT_EncodeMessage(SingleItemMessageTemplate, &message, &request);
  174.   if (rv != CMTSuccess) {
  175.     goto loser;
  176.   }
  177.   message.type = (SSM_REQUEST_MESSAGE|SSM_MISC_ACTION|SSM_MISC_UI|SSM_UI_CHANGE_PASSWORD);
  178.   /* Send */
  179.   rv = CMT_SendMessage(control, &message);
  180.   if (rv != CMTSuccess) goto loser;
  181.   if (message.type != 
  182.      (SSM_REPLY_OK_MESSAGE|SSM_MISC_ACTION|SSM_MISC_UI|SSM_UI_CHANGE_PASSWORD)) { 
  183.     rv = CMTFailure;
  184.     goto loser; 
  185.   }
  186.   rv = CMT_DecodeMessage(SingleNumMessageTemplate, &reply, &message);
  187.   if (rv != CMTSuccess)
  188.     goto loser;
  189. loser:
  190.   if (request.item.data) free(request.item.data);
  191.   if (message.data) free(message.data);
  192.   return rv; /* need return value */
  193. }