softrsa.c
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:26k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #include <time.h>
  5. //#include <winsock2.h>
  6. #include "setenv.h"
  7. #include "ca_common.h"
  8. #include "ca_error.h"
  9. #include "rsaref.h"
  10. #include "csp_api.h"
  11. #include "csp_self.h" 
  12. #define FIRST 1
  13. #define MID 2
  14. #define LAST 3
  15. #define ONLY 4
  16. #define SUCCESS 0
  17. static unsigned short static_inbuf[2560];  
  18. void gen_i_enkey(unsigned short *inkey, unsigned short *enkey_array);
  19. void gen_i_dekey(unsigned short *enkey_array, unsigned short *dekey_array);
  20. void cip(unsigned short *indata, unsigned short *outdata, unsigned short *key);
  21. int  ecb_encry_proc(unsigned short *indata,unsigned short indata_blk,
  22.                     unsigned short *outdata,unsigned short *key);
  23. int  ecb_decry_proc(unsigned short *indata,unsigned short indata_blk,
  24.                     unsigned short *outdata,unsigned short *key);
  25. int  ecb_mac_proc(unsigned short *indata1,unsigned short indata1_blk,
  26.                   unsigned short *outMAC,unsigned short *key);
  27. #define  maxim   65537
  28. unsigned short g_tempenkey[60],g_tempdekey[60];
  29. R_RANDOM_STRUCT  gRandomStruct;
  30. void gen_i_enkey(unsigned short *inkey, unsigned short *enkey_array)
  31. {
  32.     short i,k;
  33.     unsigned short *p;
  34.         k = 0;
  35.         for(i=0;i<8;i++){
  36.            enkey_array[k++] = inkey[i];
  37.         }
  38.         p = enkey_array;
  39.         for(i=0;i<6;i++){
  40.             enkey_array[k++] = (p[1] << 9) | (p[2] >> 7); /*  0 */
  41.             enkey_array[k++] = (p[2] << 9) | (p[3] >> 7); /*  1 */
  42.             enkey_array[k++] = (p[3] << 9) | (p[4] >> 7); /*  2 */
  43.             enkey_array[k++] = (p[4] << 9) | (p[5] >> 7); /*  3 */
  44.             enkey_array[k++] = (p[5] << 9) | (p[6] >> 7); /*  4 */
  45.             enkey_array[k++] = (p[6] << 9) | (p[7] >> 7); /*  5 */
  46.             enkey_array[k++] = (p[7] << 9) | (p[0] >> 7); /*  6 */
  47.             enkey_array[k++] = (p[0] << 9) | (p[1] >> 7); /*  7 */
  48.             p = p + 8;
  49.         }
  50.         return;
  51. }
  52. unsigned short inv(unsigned short xin)
  53. {
  54.     long n1,n2,q,r,b1,b2,t;
  55.         if(xin == 0){
  56.             b2 = 0;
  57.         }
  58.         else{
  59.             n1 = maxim;
  60.             n2 = xin;
  61.             b2 = 1;
  62.             b1 = 0;
  63.             do{
  64.                 r = (n1 % n2);
  65.                 q = n1/n2;
  66.                 if(r == 0){
  67.                     if(b2 < 0){
  68.                         b2 = maxim + b2;
  69.                     }
  70.                 }
  71.                 else{
  72.                     n1 = n2;
  73.                     n2 = r;
  74.                     t = b2;
  75.                     b2 = b1 - q*b2;
  76.                     b1 = t;
  77.                 }
  78.             }while(r != 0);
  79.         }
  80.         return (unsigned short)b2;
  81. }
  82. void gen_i_dekey(unsigned short *enkey_array, unsigned short *dekey_array)
  83. {
  84.     short i,k;
  85.     unsigned short *p;
  86.         p = enkey_array + 46;
  87.         k = 0;
  88.         dekey_array[k++] = inv(p[2]);
  89.         dekey_array[k++] = -p[3];
  90.         dekey_array[k++] = -p[4];
  91.         dekey_array[k++] = inv(p[5]);
  92.         dekey_array[k++] = p[0];
  93.         dekey_array[k++] = p[1];
  94.         p = p - 6;
  95.         for(i=0;i<7;i++){
  96.             dekey_array[k++] = inv(p[2]);
  97.             dekey_array[k++] = -p[4];
  98.             dekey_array[k++] = -p[3];
  99.             dekey_array[k++] = inv(p[5]);
  100.             dekey_array[k++] = p[0];
  101.             dekey_array[k++] = p[1];
  102.             if(i != 6){
  103.                 p = p - 6;
  104.             }
  105.         }
  106.         dekey_array[k++] = inv(enkey_array[0]);
  107.         dekey_array[k++] = -enkey_array[1];
  108.         dekey_array[k++] = -enkey_array[2];
  109.         dekey_array[k++] = inv(enkey_array[3]);
  110.         return;
  111. }
  112. unsigned short mul(unsigned short a, unsigned short b)
  113. {
  114.     unsigned long lx;
  115.     unsigned short low,high,x;
  116.         if(a){
  117.             if(b){
  118.                 lx = a;
  119.                 lx = lx*b;
  120. low = (unsigned short)lx;
  121. high = (unsigned short)(lx >>16);
  122.                 x = low - high;
  123.                 if(low < high){
  124.                     x++;
  125.                 }
  126.                 return (unsigned short)x;
  127.             }
  128.             else{
  129.                 return (unsigned short)(1-a);
  130.             }
  131.         }
  132.         else{
  133.             return (unsigned short)(1-b);
  134.         }
  135. }
  136. void cip(unsigned short *indata, unsigned short *outdata, unsigned short *key)
  137. {
  138. ideaCrypt( indata, outdata, key );
  139.  
  140. /*
  141. unsigned short x1,x2,x3,x4,t1,t2;
  142.     unsigned short *p,i;
  143.         p = key;
  144.         x1 = indata[0];
  145.         x2 = indata[1];
  146.         x3 = indata[2];
  147.         x4 = indata[3];
  148.         for(i=0;i<8;i++){
  149.             x1 = mul(x1,p[0]);
  150.             x2 = x2 + p[1];
  151.             x3 = x3 + p[2];
  152.             x4 = mul(x4,p[3]);
  153.             t2 = mul(x1 ^ x3,p[4]);
  154.             t1 = t2 + (x2^x4);
  155.             t1 = mul(t1,p[5]);
  156.             t2 = t1 + t2;
  157.             x1 = x1 ^ t1;
  158.             x4 = x4 ^ t2;
  159.             t2 = t2 ^ x2;
  160.             x2 = x3 ^ t1;
  161.             x3 = t2;
  162.             p = p + 6;
  163.         }
  164.         outdata[0] = mul(x1,p[0]);
  165.         outdata[1] = x3 + p[1];
  166.         outdata[2] = x2 + p[2];
  167.         outdata[3] = mul(x4,p[3]);
  168. */
  169.         return;
  170. }
  171. int  ecb_encry_proc(unsigned short *indata,unsigned short indata_blk,
  172.                     unsigned short *outdata,unsigned short *key)
  173. {
  174.     unsigned short i;
  175.     unsigned short *inp, *outp;
  176. WORD eKey[ 52 ], dKey[ 52 ];
  177.    ideaExpandKey( key, eKey, dKey );
  178. //       gen_i_enkey(key, g_tempenkey);
  179.         inp = indata;
  180.         outp = outdata;
  181.         for(i=0;i<indata_blk;i++){
  182.             cip(inp, outp, eKey);
  183. //outp[0]=htons(outp[0]);
  184. //outp[1]=htons(outp[1]);
  185. //outp[2]=htons(outp[2]);
  186. //outp[3]=htons(outp[3]);
  187.             inp = inp + 4;
  188.             outp = outp + 4;
  189.         }
  190.         return 0;
  191. }
  192. int  ecb_decry_proc(unsigned short *indata,unsigned short indata_blk,
  193.                     unsigned short *outdata,unsigned short *key)
  194. {
  195.     unsigned short i;
  196.     unsigned short *inp, *outp;
  197. WORD eKey[ 52 ], dKey[ 52 ];
  198.    ideaExpandKey( key, eKey, dKey );
  199. //        gen_i_enkey(key, g_tempenkey);
  200. //        gen_i_dekey(g_tempenkey, g_tempdekey);
  201.         inp = indata;
  202.         outp = outdata;
  203.         for(i=0;i<indata_blk;i++){
  204. //inp[0]=ntohs(inp[0]);
  205. //inp[1]=ntohs(inp[1]);
  206. //inp[2]=ntohs(inp[2]);
  207. //inp[3]=ntohs(inp[3]);
  208.             cip(inp, outp, dKey);
  209.             inp = inp + 4;
  210.             outp = outp + 4;
  211.         }
  212.         return 0;
  213. }
  214. int  ecb_mac_proc(unsigned short *indata1,unsigned short indata1_blk,
  215.                   unsigned short *outMAC,unsigned short *key)
  216. {
  217.     unsigned short i,j,k;
  218.     unsigned short tbuf[4];
  219.     unsigned short *inp;
  220.         gen_i_enkey(key, g_tempenkey);
  221.         inp = indata1;
  222.         tbuf[0] = outMAC[0];
  223.         tbuf[1] = outMAC[1];
  224.         tbuf[2] = outMAC[2];
  225.         tbuf[3] = outMAC[3];
  226.         j = indata1_blk;
  227.         for(i=0;i<j;i++){
  228.             for(k=0;k<4;k++){
  229.                 tbuf[k] ^= inp[k];
  230.             }
  231.             cip(tbuf, tbuf, g_tempenkey);
  232.             inp = inp + 4;
  233.         }
  234.         for(i=0;i<4;i++){
  235.             outMAC[i] = tbuf[i];
  236.         }
  237.         return 0;
  238. }
  239. BYTE generate_soft_mac_core(WORD c_status,BYTE *msg_text,WORD msg_size,
  240. BYTE *hash_text,WORD *hash_size,WORD *save_buf);
  241. BYTE enc_message_sdbi(WORD c_status,BYTE *plain_text,
  242. WORD plain_size, BYTE *cipher_text, WORD *cipher_size,WORD *save_buf);
  243. BYTE dec_message_sdbi(WORD c_status,BYTE *plain_text,WORD *plain_size,
  244. BYTE *cipher_text, WORD cipher_size,WORD *save_buf);
  245. /*------------------ API  functions prototype --------------*/
  246. WORD    Enc_Message_SDBI(WORD  status,BYTE *plain_text,
  247. WORD plain_size,BYTE *cipher_text,WORD *cipher_size,
  248. BYTE *save_buf);
  249. WORD    Dec_Message_SDBI(WORD  status,BYTE *plain_text,
  250. WORD *plain_size,BYTE *cipher_text,WORD cipher_size,
  251. BYTE *save_buf);
  252. WORD    Gen_MAC(WORD  status,BYTE *msg_text,WORD msg_size,
  253. BYTE *mac_text,BYTE *save_buf);
  254.  
  255.  
  256. WORD Enc_Message_SDBI(
  257. WORD  status,
  258. BYTE *plain_text,
  259. WORD plain_size,
  260. BYTE *cipher_text,
  261. WORD *cipher_size,
  262. BYTE *key)
  263. {
  264.  
  265. BYTE    func_serial, ret_val;
  266.   int     cipher_len = 0;
  267. WORD    kdormk = 1;
  268.  
  269. func_serial = E_M_S;
  270. if((status == MID) || (status == FIRST)) {
  271. if(plain_size != 2*MAX_TEXT_LEN) {
  272. return 0xc3;
  273. }
  274. }
  275. if((status == LAST) || (status == ONLY)) {
  276. if(plain_size > 2*MAX_TEXT_LEN) {
  277. return 0xc4;
  278. }
  279. }
  280.  
  281. if((ret_val = enc_message_sdbi(status,plain_text,
  282. plain_size,cipher_text,cipher_size,(WORD*)key)) !=0) {
  283. return(ret_val);
  284. }
  285. return(SUCCESS);
  286. }
  287. /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  288. *  Dec_Message_SDBI
  289. *  return : 0 --- success, else --- failure
  290. * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  291. WORD Dec_Message_SDBI(
  292. WORD  status,
  293. BYTE *plain_text,
  294. WORD *plain_size,
  295. BYTE *cipher_text,
  296. WORD cipher_size,
  297. BYTE *key)
  298. {
  299.  
  300. BYTE    func_serial, ret_val;
  301.   int     plain_len = 0;
  302.  
  303. func_serial = Dec_M_S;
  304. if((cipher_size % 8) != 0) {
  305. return 0xc9;
  306. }
  307. if((status == MID) || (status == FIRST)) {
  308. if(cipher_size != 2*MAX_TEXT_LEN) {
  309. return 0xc9;
  310. }
  311. }
  312. if((status == LAST) || (status == ONLY)) {
  313. if(cipher_size > 2*MAX_TEXT_LEN) {
  314. return 0xc4;
  315. }
  316. }
  317. if((ret_val = dec_message_sdbi(status,plain_text,
  318. plain_size,cipher_text,cipher_size,(WORD *)key)) !=0) {
  319. return ret_val;
  320. }
  321. return(SUCCESS);
  322. }
  323. /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  324. *  Gen_MAC
  325. *  return : 0 --- success, else --- failure
  326. * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
  327. WORD Gen_MAC(
  328. WORD  status,
  329. BYTE *msg_text,
  330. WORD msg_size,
  331. BYTE *mac_text,
  332. BYTE *key)   /* 16 bytes */
  333. {
  334.  
  335. BYTE    func_serial, ret_val;
  336. WORD     o_len;
  337.  
  338.  
  339. WORD    hashormac = 2;
  340.  
  341. func_serial = Gen_M;
  342. if((status == MID) || (status == FIRST)) {
  343. if(msg_size != 2*MAX_TEXT_LEN) {
  344. return 0xc8;
  345. }
  346. }
  347. if((status == LAST) || (status == ONLY)) {
  348. if(msg_size > 2*MAX_TEXT_LEN) {
  349. return 0xc4;
  350. }
  351. }
  352. if((ret_val = generate_soft_mac_core(status,msg_text,
  353. msg_size,mac_text,&o_len,(WORD *)key)) !=0) {
  354. return ret_val;
  355. }
  356. return(SUCCESS);
  357. }
  358.  
  359. BYTE enc_message_sdbi(WORD c_status,
  360. BYTE *plain_text,
  361. WORD plain_size,
  362. BYTE *cipher_text,
  363. WORD *cipher_size,
  364. WORD *save_buf)
  365. {
  366. WORD    *inbuf;
  367. int     i;
  368. WORD    *word_point, cfb_block=8;
  369. int pad_bytes,pad_zero_no;
  370. int first_sndword,tail_bytes,indata_len;
  371. BYTE  last8bytes[10];
  372. WORD kd_buf[64];
  373. inbuf=static_inbuf;
  374.   memcpy(kd_buf,save_buf,64);
  375. switch(c_status) {
  376.     case 1:
  377. if(plain_size!=(MAX_TEXT_LEN+MAX_TEXT_LEN)){
  378. return(0xc3);
  379. }
  380. ecb_encry_proc((unsigned short *)plain_text,MAX_TEXT_LEN/4,
  381.                     (WORD *)cipher_text,kd_buf);
  382. *cipher_size=MAX_TEXT_LEN*2;
  383. break;
  384.     case 2:
  385. if(plain_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  386. return(0xc3);
  387. }
  388. ecb_encry_proc((unsigned short *)plain_text,MAX_TEXT_LEN/4,
  389.                     (WORD*)cipher_text,kd_buf);
  390. *cipher_size=MAX_TEXT_LEN*2;
  391. break;
  392.     case 3:
  393. if(plain_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  394. return(0xc4);
  395. }
  396. cfb_block = 8;
  397. pad_bytes = cfb_block - (plain_size % cfb_block);
  398. pad_zero_no = pad_bytes - 1;
  399. tail_bytes = plain_size;
  400. first_sndword = tail_bytes >> 1;
  401. inbuf[0]=1+((tail_bytes+pad_bytes) >>1);
  402. inbuf[1]=ENC_MSG_LAST_ECB;
  403. word_point = (WORD *)plain_text;
  404. for(i=0;i<first_sndword;i++)
  405. inbuf[i+2] = word_point[i];
  406. if((tail_bytes % 2) ==1) {
  407. last8bytes[0]=plain_text[plain_size - 1];
  408. last8bytes[1]=1;
  409. for(i=0;i<pad_zero_no;i++)
  410. last8bytes[i+2]=0;
  411. }
  412. else {
  413. last8bytes[0]=1;
  414. for(i=0;i<pad_zero_no;i++)
  415. last8bytes[i+1]=0;
  416. }
  417. indata_len=(pad_bytes+1) >> 1;
  418. word_point = (WORD *)last8bytes;
  419. for(i=0;i<indata_len;i++)
  420. inbuf[i+2+first_sndword] = word_point[i];
  421. ecb_encry_proc((unsigned short *)&inbuf[2],(WORD)((inbuf[0]-1)/4),
  422.                     (WORD*)cipher_text,(WORD*)kd_buf);
  423. *cipher_size=(inbuf[0]-1)*2;
  424. break;
  425.     case 4:
  426. if(plain_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  427. return(0xc4);
  428. }
  429. cfb_block = 8;
  430. pad_bytes = cfb_block - (plain_size % cfb_block);
  431. pad_zero_no = pad_bytes - 1;
  432. tail_bytes = plain_size;
  433. first_sndword = tail_bytes >> 1;
  434. inbuf[0]=1+((tail_bytes+pad_bytes) >>1);
  435. word_point = (WORD *)plain_text;
  436. for(i=0;i<first_sndword;i++)
  437. inbuf[i+2] = word_point[i];
  438. if((tail_bytes % 2) ==1) {
  439. last8bytes[0]=plain_text[plain_size - 1];
  440. last8bytes[1]=1;
  441. for(i=0;i<pad_zero_no;i++)
  442. last8bytes[i+2]=0;
  443. }
  444. else {
  445. last8bytes[0]=1;
  446. for(i=0;i<pad_zero_no;i++)
  447. last8bytes[i+1]=0;
  448. }
  449. indata_len=(pad_bytes+1) >> 1;
  450. word_point = (WORD *)last8bytes;
  451. for(i=0;i<indata_len;i++)
  452. inbuf[i+2+first_sndword] = word_point[i];
  453. ecb_encry_proc((unsigned short *)&inbuf[2],(WORD)((inbuf[0]-1)/4),
  454.                     (WORD*)cipher_text,(WORD*)kd_buf);
  455. *cipher_size=(inbuf[0]-1)*2;
  456. break;
  457.     default:
  458. return(0xff);
  459. }
  460. return(SUCCESS);
  461. }
  462.  
  463. BYTE dec_message_sdbi(WORD c_status,BYTE *plain_text,WORD *plain_size,
  464. BYTE *cipher_text,WORD cipher_size,WORD *save_buf)
  465. {
  466. WORD    *inbuf;
  467.   int     i;
  468.   unsigned char *p;
  469. int tail_posi;
  470.   WORD kd_buf[64];
  471. inbuf=static_inbuf;
  472.   memcpy(kd_buf,save_buf,64);
  473.  
  474. switch(c_status) {
  475.     case 1:
  476. if(cipher_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  477. return(0xc3);
  478. }
  479. ecb_decry_proc((unsigned short *)cipher_text,MAX_TEXT_LEN/4,
  480.                     (WORD*)plain_text,kd_buf);
  481. *plain_size=MAX_TEXT_LEN*2;
  482. break;
  483.     case 2:
  484. if(cipher_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  485. return(0xc3);
  486. }
  487.     ecb_decry_proc((unsigned short *)cipher_text,MAX_TEXT_LEN/4,
  488.                     (WORD*)plain_text,kd_buf);
  489. *plain_size=MAX_TEXT_LEN*2;
  490. break;
  491.     case 3:
  492. if(cipher_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  493. return(0xc4);
  494. }
  495. ecb_decry_proc((unsigned short *)cipher_text,(WORD)(cipher_size/8),
  496.                     inbuf,(WORD*)kd_buf);
  497. i=0;
  498. p=(unsigned char*)inbuf;
  499. tail_posi=cipher_size-1; //-2; debug by david , 20001.2.26
  500. while(p[tail_posi] != 1) {
  501. i++;
  502. if(i>=8)
  503.     return(0xc5);
  504. tail_posi=tail_posi -1;
  505. }
  506. *plain_size=tail_posi;
  507. memcpy(plain_text,(unsigned char*)inbuf,*plain_size);
  508. break;
  509.     case 4:
  510. if(cipher_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  511. return(0xc4);
  512. }
  513. ecb_decry_proc((unsigned short *)cipher_text,(WORD)(cipher_size/8),
  514.                     inbuf,(WORD*)kd_buf);
  515. i=0;
  516. p=(unsigned char*)inbuf;
  517. tail_posi=cipher_size-1; //-2; debug by david , 20001.2.26
  518. while(p[tail_posi] != 1) {
  519. i++;
  520. if(i>=8)
  521.     return(0xc5);
  522. tail_posi=tail_posi -1;
  523. }
  524. *plain_size=tail_posi;
  525. memcpy(plain_text,(unsigned char*)inbuf,*plain_size);
  526. break;
  527.     default:
  528. return(0xff);
  529. }
  530. return 0;
  531. }
  532.  
  533. BYTE generate_soft_mac_core(WORD c_status,BYTE *msg_text,WORD msg_size,
  534. BYTE *hash_text, WORD *hash_size,WORD *save_buf)
  535. {
  536. WORD    *inbuf;
  537.   int     i;
  538. WORD    *word_point, cfb_block=8;
  539. int pad_bytes,pad_zero_no;
  540. int first_sndword,tail_bytes,indata_len;
  541. BYTE  last8bytes[100];
  542. WORD kd_buf[64];
  543.         inbuf = static_inbuf;
  544.  
  545.     memcpy(kd_buf,save_buf,64);
  546. switch(c_status) {
  547.     case 1:
  548. if(msg_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  549. return(0xc3);
  550. }
  551. memset(save_buf+32,0,64);
  552. ecb_mac_proc((unsigned short *)msg_text,(WORD)(MAX_TEXT_LEN/4),
  553.                   save_buf+32,(WORD*)(kd_buf+8));
  554. break;
  555.     case 2:
  556. if(msg_size != (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  557. return(0xc3);
  558. }
  559. ecb_mac_proc((unsigned short *)msg_text,MAX_TEXT_LEN/4,
  560.             save_buf+32,kd_buf+8);
  561. break;
  562.     case 3:
  563. if(msg_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  564. return(0xc4);
  565. }
  566. cfb_block = 8;
  567.                 memcpy(hash_text,save_buf+32,8);
  568. pad_bytes = cfb_block - (msg_size % cfb_block);
  569. pad_zero_no = pad_bytes - 1;
  570. tail_bytes = msg_size;
  571. first_sndword = tail_bytes >> 1;
  572. inbuf[0]=1+((tail_bytes+pad_bytes) >>1);
  573. word_point = (WORD *)msg_text;
  574. for(i=0;i<first_sndword;i++)
  575. inbuf[i+2] = word_point[i];
  576. if((tail_bytes % 2) ==1) {
  577. last8bytes[0]=msg_text[msg_size - 1];
  578. last8bytes[1]=1;
  579. for(i=0;i<pad_zero_no;i++)
  580. last8bytes[i+2]=0;
  581. }
  582. else {
  583. last8bytes[0]=1;
  584. for(i=0;i<pad_zero_no;i++)
  585. last8bytes[i+1]=0;
  586. }
  587. indata_len=(pad_bytes+1) >> 1;
  588. word_point = (WORD *)last8bytes;
  589. for(i=0;i<indata_len;i++)
  590. inbuf[i+2+first_sndword] = word_point[i];
  591. ecb_mac_proc((unsigned short *)&inbuf[2],(WORD)((inbuf[0]-1)/4),
  592.               (unsigned short*)hash_text,(WORD*)(kd_buf+8));
  593. break;
  594.     case 4:
  595. if(msg_size > (MAX_TEXT_LEN + MAX_TEXT_LEN)) {
  596. return(0xc4);
  597. }
  598. cfb_block = 8;
  599. memset(hash_text,0,8);
  600. pad_bytes = cfb_block - (msg_size % cfb_block);
  601. pad_zero_no = pad_bytes - 1;
  602. tail_bytes = msg_size;
  603. first_sndword=tail_bytes >> 1;
  604. inbuf[0]=1+((tail_bytes + pad_bytes) >>1);
  605. word_point = (WORD *)msg_text;
  606. for(i=0;i<first_sndword;i++)
  607. inbuf[i+2] = word_point[i];
  608. if((tail_bytes % 2) ==1) {
  609. last8bytes[0]=msg_text[msg_size - 1];
  610. last8bytes[1]=1;
  611. for(i=0;i<pad_zero_no;i++)
  612. last8bytes[i+2]=0;
  613. }
  614. else {
  615. last8bytes[0]=1;
  616. for(i=0;i<pad_zero_no;i++)
  617. last8bytes[i+1]=0;
  618. }
  619. indata_len=(pad_bytes+1) >> 1;
  620. word_point = (WORD *)last8bytes;
  621. for(i=0;i<indata_len;i++)
  622. inbuf[i+2+first_sndword] = word_point[i];
  623. ecb_mac_proc((unsigned short *)&inbuf[2],(WORD)((inbuf[0]-1)/4),
  624.               (unsigned short*)hash_text,(WORD*)(kd_buf+8));
  625. break;
  626.     default:
  627. return(0Xff);
  628. }
  629. return 0;
  630. }
  631. #define MAX_BLOCK_LEN 4096
  632. int  CSP_SDBIEncrypt(
  633.         UCHAR  *output,
  634.         ULONG  *outputLen,
  635.         UCHAR  *input,
  636.         ULONG  inputLen,
  637.         UCHAR  * SDBIKey,
  638.         ULONG  SDBIKeyLen
  639.     )
  640. {
  641. USHORT  retWord;
  642. USHORT  bytesLeft,bytesOver;
  643. USHORT inputLen_,outputLen_;
  644. if (SDBIKeyLen!=16)
  645. {
  646. ErrorLocation;
  647. SetError(ERR_CODE_KEYLENGTH);
  648. return RTN_ERR;
  649. }
  650. if (inputLen <= MAX_BLOCK_LEN)
  651. {
  652. inputLen_=(USHORT)inputLen;
  653. retWord = Enc_Message_SDBI(ONLY,input,inputLen_,output,&outputLen_,SDBIKey);
  654. if (retWord)
  655. {
  656. SetError(ERR_CODE_ENCSDBI);
  657. ErrorLocation;
  658. return RTN_ERR;
  659. }
  660.     else
  661. {
  662. *outputLen = (ULONG)outputLen_;
  663. return RTN_OK;
  664. }
  665. }
  666. else
  667. {
  668. bytesLeft = (USHORT)inputLen;
  669. bytesOver = 0;
  670. retWord = Enc_Message_SDBI(FIRST,input+bytesOver,MAX_BLOCK_LEN,output+bytesOver,&outputLen_,SDBIKey);
  671. if (retWord)
  672. {
  673. SetError(ERR_CODE_ENCSDBI);
  674. ErrorLocation;
  675. return RTN_ERR;
  676. }
  677. else
  678. {
  679. bytesLeft -= MAX_BLOCK_LEN;
  680. bytesOver += MAX_BLOCK_LEN;
  681. }
  682. while (bytesLeft > MAX_BLOCK_LEN)
  683. {
  684. retWord = Enc_Message_SDBI(MID,input+bytesOver,MAX_BLOCK_LEN,output+bytesOver,&outputLen_,SDBIKey);
  685. if (retWord)
  686. {
  687. SetError(ERR_CODE_ENCSDBI);
  688. ErrorLocation;
  689. return RTN_ERR;
  690. }
  691. else
  692. {
  693. bytesLeft -= MAX_BLOCK_LEN;
  694. bytesOver += MAX_BLOCK_LEN;
  695. }
  696. }
  697.     
  698. retWord = Enc_Message_SDBI(LAST,input+bytesOver,bytesLeft,output+bytesOver,&outputLen_,SDBIKey);
  699. if (retWord)
  700. {
  701. SetError(ERR_CODE_ENCSDBI);
  702. ErrorLocation;
  703. return RTN_ERR;
  704. }
  705. else
  706. {
  707. bytesLeft -= MAX_BLOCK_LEN;
  708. bytesOver += outputLen_;
  709. }
  710. *outputLen = (ULONG)bytesOver;
  711. return RTN_OK;
  712. }
  713. }
  714.  
  715. int  CSP_SDBIDecrypt(
  716.         UCHAR  *output,
  717.         ULONG  *outputLen,
  718.         UCHAR  *input,
  719.         ULONG  inputLen,
  720.         UCHAR  * SDBIKey,
  721.         ULONG  SDBIKeyLen
  722.     )
  723. {
  724. USHORT  retWord;
  725. USHORT  bytesLeft,bytesOver;
  726. USHORT inputLen_,outputLen_;
  727. if (SDBIKeyLen!=16)
  728. {
  729. ErrorLocation;
  730. SetError(ERR_CODE_KEYLENGTH);
  731. return RTN_ERR;
  732. }
  733. if (inputLen <= MAX_BLOCK_LEN)
  734. {
  735. inputLen_=(USHORT)inputLen;
  736. retWord = Dec_Message_SDBI(ONLY,output,&outputLen_,input,inputLen_,SDBIKey);
  737. if (retWord)
  738. {
  739. SetError(ERR_CODE_DECSDBI);
  740. ErrorLocation;
  741. return RTN_ERR;
  742. }
  743.     else
  744. {
  745. *outputLen = (ULONG)outputLen_;
  746. return RTN_OK;
  747. }
  748. }
  749. else
  750. {
  751. bytesLeft = (USHORT)inputLen;
  752. bytesOver = 0;
  753. retWord = Dec_Message_SDBI(FIRST,output+bytesOver,&outputLen_,input+bytesOver,MAX_BLOCK_LEN,SDBIKey);
  754. if (retWord)
  755. {
  756. SetError(ERR_CODE_DECSDBI);
  757. ErrorLocation;
  758. return RTN_ERR;
  759. }
  760. else
  761. {
  762. bytesLeft -= MAX_BLOCK_LEN;
  763. bytesOver += MAX_BLOCK_LEN;
  764. }
  765. while (bytesLeft > MAX_BLOCK_LEN)
  766. {
  767. retWord = Dec_Message_SDBI(MID,output+bytesOver,&outputLen_,input+bytesOver,MAX_BLOCK_LEN,SDBIKey);
  768. if (retWord)
  769. {
  770. SetError(ERR_CODE_DECSDBI);
  771. ErrorLocation;
  772. return RTN_ERR;
  773. }
  774. else
  775. {
  776. bytesLeft -= MAX_BLOCK_LEN;
  777. bytesOver += MAX_BLOCK_LEN;
  778. }
  779. }
  780.     
  781. retWord = Dec_Message_SDBI(LAST,output+bytesOver,&outputLen_,input+bytesOver,bytesLeft,SDBIKey);
  782. if (retWord)
  783. {
  784. SetError(ERR_CODE_DECSDBI);
  785. ErrorLocation;
  786. return RTN_ERR;
  787. }
  788. else
  789. {
  790. bytesLeft -= MAX_BLOCK_LEN;
  791. bytesOver += outputLen_;
  792. }
  793. *outputLen = (ULONG)bytesOver;
  794. return RTN_OK;
  795. }
  796. }
  797. /*
  798. int CSP_i2d_RSAPublicKey(
  799.         RSA_PUBLIC_KEY  *rsaPublicKey,
  800.         UCHAR  *rsaPublicKeyDERString,
  801.         ULONG  *rsaPublicKeyDERStringLen)
  802. {
  803. return(i2d_RSAPublicKey(rsaPublicKey,
  804. rsaPublicKeyDERString,
  805. rsaPublicKeyDERStringLen));
  806. }
  807. int CSP_d2i_RSAPublicKey(
  808.         UCHAR  *rsaPublicKeyDERString,
  809.         ULONG  rsaPublicKeyDERStringLen,
  810.         RSA_PUBLIC_KEY  *rsaPublicKey)
  811. {
  812. return(d2i_RSAPublicKey(rsaPublicKeyDERString,
  813. rsaPublicKeyDERStringLen,rsaPublicKey));
  814. }
  815. int CSP_i2d_RSAPrivateKey(
  816.         RSA_PRIVATE_KEY  *rsaPrivateKey,
  817.         UCHAR  *rsaPrivateKeyDERString,
  818.         ULONG  *rsaPrivateKeyDERStringLen)
  819. {
  820.      
  821. return(i2d_RSAPrivateKey(rsaPrivateKey,
  822. rsaPrivateKeyDERString,
  823. rsaPrivateKeyDERStringLen));
  824. }
  825. int CSP_d2i_RSAPrivateKey(
  826.         UCHAR  *rsaPrivateKeyDERString,
  827.         ULONG  rsaPrivateKeyDERStringLen,
  828.         RSA_PRIVATE_KEY  *rsaPrivateKey)
  829. {
  830.   return(d2i_RSAPrivateKey(rsaPrivateKeyDERString,
  831. rsaPrivateKeyDERStringLen,
  832. rsaPrivateKey));
  833. }
  834. */
  835. int  CSP_RSAPublicEncrypt(
  836. USHORT  keyNumber, 
  837.         UCHAR  *output,
  838.         ULONG  *outputLen,
  839.         UCHAR  *input,
  840.         ULONG  inputLen,
  841.         RSA_PUBLIC_KEY  *rsaPublicKey
  842.     )
  843. {
  844. int ret_code;
  845. ret_code = RSAPublicEncrypt
  846. (output, outputLen, input, inputLen, (R_RSA_PUBLIC_KEY*)rsaPublicKey, &gRandomStruct);
  847. if (ret_code)
  848. {
  849.     ErrorLocation;
  850. return RTN_ERR; 
  851. }
  852. return RTN_OK;
  853. }
  854. /*Decrypt data use RSA PublicKey;*/
  855. int  CSP_RSAPublicDecrypt(
  856. USHORT  keyNumber,
  857.         UCHAR  *output,
  858.         ULONG  *outputLen,
  859.         UCHAR  *input,
  860.         ULONG  inputLen,
  861.         RSA_PUBLIC_KEY  * rsaPublicKey
  862.     )
  863. {
  864. int ret_code;
  865. ret_code = RSAPublicDecrypt 
  866. (output, outputLen, input, inputLen, (R_RSA_PUBLIC_KEY*)rsaPublicKey);
  867. if (ret_code)
  868. {
  869. ErrorLocation;
  870. return RTN_ERR;
  871. }
  872. return RTN_OK;
  873. }
  874. /* Encrypt data use RSA PrivateKey;*/
  875. int  CSP_RSAPrivateEncrypt(
  876. USHORT  keyNumber,
  877.         UCHAR  *output, 
  878.         ULONG  *outputLen,
  879.         UCHAR  *input,
  880.         ULONG  inputLen, 
  881.         RSA_PRIVATE_KEY  *rsaPrivateKey  
  882.     )
  883. {
  884. int ret_code;
  885. ret_code = RSAPrivateEncrypt 
  886. (output, outputLen, input, inputLen, (R_RSA_PRIVATE_KEY*)rsaPrivateKey);
  887. if (ret_code)
  888. {
  889. ErrorLocation;
  890. return RTN_ERR;
  891. }
  892. return RTN_OK;
  893. }
  894. /*Decrypt data use PrivateKey;*/
  895. int  CSP_RSAPrivateDecrypt(
  896. USHORT  keyNumber,
  897.         UCHAR  *output,
  898.         ULONG  *outputLen,
  899.         UCHAR  *input,
  900.         ULONG  inputLen,
  901.         RSA_PRIVATE_KEY  *rsaPrivateKey 
  902.     )
  903. {
  904. int ret_code;
  905. ret_code =  RSAPrivateDecrypt 
  906. (output, outputLen, input, inputLen,(R_RSA_PRIVATE_KEY*)rsaPrivateKey);
  907. if (ret_code)
  908. {
  909. ErrorLocation;
  910. return RTN_ERR;
  911. }
  912. return RTN_OK;
  913. }
  914. static void InitRandomStruct (R_RANDOM_STRUCT * randomStruct)
  915. {
  916. unsigned int bytesNeeded;
  917. long t_time;
  918. R_RandomInit (randomStruct);
  919. /*
  920.  *Initialize with time seed.
  921.  */
  922. while (1) {
  923. R_GetRandomBytesNeeded (&bytesNeeded, randomStruct);
  924. if (bytesNeeded == 0)
  925. break;
  926. time(&t_time);
  927. R_RandomUpdate (randomStruct,(unsigned char*) &t_time, sizeof(t_time));
  928. }
  929. }
  930. int  CSP_GenRandomBytes(
  931.         UCHAR  *randomBytes,
  932.         ULONG  randomBytesLen,
  933.         UCHAR  *seedValue,
  934.         ULONG  seedLen
  935.      )
  936. {
  937. int rtn_code;
  938. InitRandomStruct (&gRandomStruct);
  939. if(randomBytesLen <1 || randomBytesLen>256)
  940. return -1;
  941. rtn_code = R_GenerateBytes(randomBytes,randomBytesLen,&gRandomStruct);
  942.   if(rtn_code == 0) return RTN_OK;
  943. else return RTN_ERR;
  944. }
  945. int  CSP_GenRSAKeyPair(
  946.         USHORT  keyNumber,/* if 0 then out the key else must be 1`5;*/
  947.         RSA_PUBLIC_KEY  *rsaPublicKey,
  948.         RSA_PRIVATE_KEY  *rsaPrivateKey
  949.     )
  950. {
  951.   R_RSA_PROTO_KEY protoKey;
  952. if(keyNumber == 0){
  953.   protoKey.bits = 1024;
  954.   protoKey.useFermat4 = 1;
  955.   InitRandomStruct(&gRandomStruct);
  956.   return R_GeneratePEMKeys((R_RSA_PUBLIC_KEY*)rsaPublicKey, (R_RSA_PRIVATE_KEY*)rsaPrivateKey, &protoKey, &gRandomStruct);
  957.     }
  958. return RTN_ERR;
  959. }
  960. /*Get out RSA PublicKey by Key Number;*/
  961. int  CSP_GetRSAPublicKey(
  962.         USHORT  keyNumber,
  963.         RSA_PUBLIC_KEY  *rsaPublicKey
  964.     )
  965. {
  966.     
  967. return RTN_ERR;
  968. }
  969. int  CSP_PutRSAKeyPair(
  970.         USHORT  keyNumber,
  971.         RSA_PUBLIC_KEY  *rsaPublicKey,
  972.         RSA_PRIVATE_KEY  *rsaPrivateKey
  973.     )
  974. {
  975. return RTN_ERR;
  976. }
  977. int  CSP_InitEnvironment(void)
  978. {
  979. return RTN_OK;
  980. }
  981. /*Clear Environment; Close Device...*/
  982. int  CSP_ClearEnvironment(void)
  983. {
  984. return RTN_OK;
  985. }