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

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 <stdio.h>
  34. #include "prio.h"
  35. #include "swforti.h"
  36. #include "maci.h"
  37. #include "secder.h"
  38. #include "blapi.h"
  39. void
  40. printkey(char *s, unsigned char *block) {
  41.  int i;
  42.  printf("%s n  0x",s);
  43.  for(i=0; i < 10; i++) printf("%02x",block[i]);
  44.  printf("n");
  45. }
  46. void
  47. printblock(char *s, unsigned char *block) {
  48.  int i;
  49.  printf("%s n  0x",s);
  50.  for(i=0; i < 8; i++) printf("%02x",block[i]);
  51.  printf("n  0x");
  52.  for(i=8; i < 16; i++) printf("%02x",block[i]);
  53.  printf("n");
  54. }
  55. static char *leafbits="THIS IS NOT LEAF";
  56. static void
  57. encryptCertEntry(fortProtectedData *pdata,FORTSkipjackKeyPtr Ks,
  58. unsigned char *data,int len)
  59. {
  60.     unsigned char *dataout;
  61.     int enc_len;
  62. /* XXX Make length */
  63.     pdata->dataIV.data = PORT_ZAlloc(24);
  64.     pdata->dataIV.len = 24;
  65.     PORT_Memcpy(pdata->dataIV.data,leafbits,SKIPJACK_LEAF_SIZE);
  66.     fort_GenerateRandom(&pdata->dataIV.data[SKIPJACK_LEAF_SIZE],
  67. SKIPJACK_BLOCK_SIZE);
  68.     enc_len = (len + (SKIPJACK_BLOCK_SIZE-1)) & ~(SKIPJACK_BLOCK_SIZE-1);
  69.     dataout = pdata->dataEncryptedWithKs.data = PORT_ZAlloc(enc_len);
  70.     pdata->dataEncryptedWithKs.len = enc_len;
  71.     fort_skipjackEncrypt(Ks,&pdata->dataIV.data[SKIPJACK_LEAF_SIZE],
  72. enc_len, data,dataout);
  73.     if (len > 255) {
  74. pdata->length.data = PORT_ZAlloc(2);
  75. pdata->length.data[0] = (len >> 8) & 0xff;
  76. pdata->length.data[1] = len & 0xff;
  77. pdata->length.len = 2;
  78.     } else {
  79. pdata->length.data = PORT_ZAlloc(1);
  80. pdata->length.data[0] = len & 0xff;
  81. pdata->length.len = 1;
  82.     }
  83. }
  84.     
  85. unsigned char issuer[30] = { 0 };
  86. void
  87. makeCertSlot(fortSlotEntry *entry,int index,char *label,SECItem *cert,
  88.  FORTSkipjackKeyPtr Ks, unsigned char *xKEA, unsigned char *xDSA, 
  89.  unsigned char *pubKey, int pubKeyLen, unsigned char *p, unsigned char *q, 
  90. unsigned char *g)
  91. {
  92.     unsigned char *key; /* private key */
  93.     entry->trusted.data = PORT_Alloc(1);
  94.     *entry->trusted.data = index == 0 ? 1 : 0;
  95.     entry->trusted.len = 1;
  96.     entry->certificateIndex.data = PORT_Alloc(1);
  97.     *entry->certificateIndex.data = index;
  98.     entry->certificateIndex.len = 1;
  99.     entry->certIndex = index;
  100.     encryptCertEntry(&entry->certificateLabel,Ks,
  101. (unsigned char *)label, strlen(label));
  102.     encryptCertEntry(&entry->certificateData,Ks, cert->data, cert->len);
  103.     if (xKEA) {
  104. entry->exchangeKeyInformation = PORT_ZNew(fortKeyInformation);
  105. entry->exchangeKeyInformation->keyFlags.data = PORT_ZAlloc(1);
  106. entry->exchangeKeyInformation->keyFlags.data[0] = 1;
  107. entry->exchangeKeyInformation->keyFlags.len = 1;
  108. key = PORT_Alloc(24);
  109. fort_skipjackWrap(Ks,24,xKEA,key);
  110. entry->exchangeKeyInformation->privateKeyWrappedWithKs.data = key;
  111. entry->exchangeKeyInformation->privateKeyWrappedWithKs.len = 24;
  112. entry->exchangeKeyInformation->derPublicKey.data = pubKey;
  113. entry->exchangeKeyInformation->derPublicKey.len = pubKeyLen;
  114. entry->exchangeKeyInformation->p.data = p;
  115. entry->exchangeKeyInformation->p.len = 128;
  116. entry->exchangeKeyInformation->q.data = q;
  117. entry->exchangeKeyInformation->q.len = 20;
  118. entry->exchangeKeyInformation->g.data = g;
  119. entry->exchangeKeyInformation->g.len = 128;
  120. entry->signatureKeyInformation = PORT_ZNew(fortKeyInformation);
  121. entry->signatureKeyInformation->keyFlags.data = PORT_ZAlloc(1);
  122. entry->signatureKeyInformation->keyFlags.data[0] = 1;
  123. entry->signatureKeyInformation->keyFlags.len = 1;
  124. key = PORT_Alloc(24);
  125. fort_skipjackWrap(Ks,24,xDSA,key);
  126. entry->signatureKeyInformation->privateKeyWrappedWithKs.data = key;
  127. entry->signatureKeyInformation->privateKeyWrappedWithKs.len = 24;
  128. entry->signatureKeyInformation->derPublicKey.data = pubKey;
  129. entry->signatureKeyInformation->derPublicKey.len = pubKeyLen;
  130. entry->signatureKeyInformation->p.data = p;
  131. entry->signatureKeyInformation->p.len = 128;
  132. entry->signatureKeyInformation->q.data = q;
  133. entry->signatureKeyInformation->q.len = 20;
  134. entry->signatureKeyInformation->g.data = g;
  135. entry->signatureKeyInformation->g.len = 128;
  136.     } else {
  137. entry->exchangeKeyInformation = NULL;
  138.         entry->signatureKeyInformation = NULL;
  139.     }
  140.     
  141.     return;
  142. }
  143. void
  144. makeProtectedPhrase(FORTSWFile *file, fortProtectedPhrase *prot_phrase,
  145.         FORTSkipjackKeyPtr Ks, FORTSkipjackKeyPtr Kinit, char *phrase)
  146. {
  147.     SHA1Context *sha;
  148.     unsigned char hashout[SHA1_LENGTH];
  149.     FORTSkipjackKey Kfek;
  150.     unsigned int len;
  151.     unsigned char cw[4];
  152.     unsigned char enc_version[2];
  153.     unsigned char *data = NULL;
  154.     int keySize;
  155.     int i,version;
  156.     char tmp_data[13];
  157.     if (strlen(phrase) < 12) {
  158.         PORT_Memset(tmp_data, ' ', sizeof(tmp_data));
  159.         PORT_Memcpy(tmp_data,phrase,strlen(phrase));
  160.         tmp_data[12] = 0;
  161.         phrase = tmp_data;
  162.     }
  163.     /* now calculate the PBE key for fortezza */
  164.     sha = SHA1_NewContext();
  165.     SHA1_Begin(sha);
  166.     version = DER_GetUInteger(&file->version);
  167.     enc_version[0] = (version >> 8) & 0xff;
  168.     enc_version[1] = version  & 0xff;
  169.     SHA1_Update(sha,enc_version,sizeof(enc_version));
  170.     SHA1_Update(sha,file->derIssuer.data, file->derIssuer.len);
  171.     SHA1_Update(sha,file->serialID.data, file->serialID.len);
  172.     SHA1_Update(sha,(unsigned char *)phrase,strlen(phrase));
  173.     SHA1_End(sha,hashout,&len,SHA1_LENGTH);
  174.     PORT_Memcpy(Kfek,hashout,sizeof(FORTSkipjackKey));
  175.     keySize = sizeof(CI_KEY);
  176.     if (Kinit) keySize = SKIPJACK_BLOCK_SIZE*2;
  177.     data = PORT_ZAlloc(keySize);
  178.     prot_phrase->wrappedKValue.data = data;
  179.     prot_phrase->wrappedKValue.len = keySize;
  180.     fort_skipjackWrap(Kfek,sizeof(CI_KEY),Ks,data);
  181.     /* first, decrypt the hashed/Encrypted Memphrase */
  182.     data = (unsigned char *) PORT_ZAlloc(SHA1_LENGTH+sizeof(cw));
  183.     /* now build the hash for comparisons */
  184.     SHA1_Begin(sha);
  185.     SHA1_Update(sha,(unsigned char *)phrase,strlen(phrase));
  186.     SHA1_End(sha,hashout,&len,SHA1_LENGTH);
  187.     SHA1_DestroyContext(sha,PR_TRUE);
  188.     /* now calcuate the checkword and compare it */
  189.     cw[0] = cw[1] = cw[2] = cw[3] = 0;
  190.     for (i=0; i <5 ; i++) {
  191. cw[0] = cw[0] ^ hashout[i*4];
  192. cw[1] = cw[1] ^ hashout[i*4+1];
  193. cw[2] = cw[2] ^ hashout[i*4+2];
  194. cw[3] = cw[3] ^ hashout[i*4+3];
  195.     }
  196.     PORT_Memcpy(data,hashout,len);
  197.     PORT_Memcpy(data+len,cw,sizeof(cw));
  198.     prot_phrase->memPhraseIV.data = PORT_ZAlloc(24);
  199.     prot_phrase->memPhraseIV.len = 24;
  200.     PORT_Memcpy(prot_phrase->memPhraseIV.data,leafbits,SKIPJACK_LEAF_SIZE);
  201.     fort_GenerateRandom(&prot_phrase->memPhraseIV.data[SKIPJACK_LEAF_SIZE],
  202. SKIPJACK_BLOCK_SIZE);
  203.     prot_phrase->kValueIV.data = PORT_ZAlloc(24);
  204.     prot_phrase->kValueIV.len = 24;
  205.     PORT_Memcpy(prot_phrase->kValueIV.data,leafbits,SKIPJACK_LEAF_SIZE);
  206.     fort_GenerateRandom(&prot_phrase->kValueIV.data[SKIPJACK_LEAF_SIZE],
  207. SKIPJACK_BLOCK_SIZE);
  208.     fort_skipjackEncrypt(Ks,&prot_phrase->memPhraseIV.data[SKIPJACK_LEAF_SIZE],
  209. len+sizeof(cw), data,data);
  210.     prot_phrase->hashedEncryptedMemPhrase.data = data;
  211.     prot_phrase->hashedEncryptedMemPhrase.len = len+sizeof(cw);
  212.     if (Kinit) {
  213.         fort_skipjackEncrypt(Kinit,
  214. &prot_phrase->kValueIV.data[SKIPJACK_LEAF_SIZE],
  215.                 prot_phrase->wrappedKValue.len,
  216.                 prot_phrase->wrappedKValue.data,
  217.                 prot_phrase->wrappedKValue.data );
  218.     }
  219.     return;
  220. }
  221. void
  222. fill_in(SECItem *item,unsigned char *data, int len)
  223. {
  224.     item->data = PORT_Alloc(len);
  225.     PORT_Memcpy(item->data,data,len);
  226.     item->len = len;
  227. }