~rdoering/ubuntu/karmic/erlang/fix-535090

« back to all changes in this revision

Viewing changes to lib/crypto/c_src/crypto_drv.c

  • Committer: Bazaar Package Importer
  • Author(s): Sergei Golovan
  • Date: 2009-02-15 16:42:52 UTC
  • mfrom: (3.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090215164252-q5x4rcf8a5pbesb1
Tags: 1:12.b.5-dfsg-2
Upload to unstable after lenny is released.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
#include <openssl/rsa.h>
46
46
#include <openssl/aes.h>
47
47
#include <openssl/md5.h>
 
48
#include <openssl/md4.h>
48
49
#include <openssl/sha.h>
49
50
#include <openssl/bn.h>
50
51
#include <openssl/objects.h>
164
165
#define DRV_RAND_UNIFORM        20
165
166
#define DRV_MOD_EXP             21
166
167
#define DRV_DSS_VERIFY          22
167
 
#define DRV_RSA_VERIFY          23
 
168
#define DRV_RSA_VERIFY_SHA      23
 
169
/* #define DRV_RSA_VERIFY_MD5      35 */ 
168
170
#define DRV_CBC_AES128_ENCRYPT  24
169
171
#define DRV_CBC_AES128_DECRYPT  25
170
172
#define DRV_XOR                 26
176
178
#define DRV_CBC_AES256_ENCRYPT  32
177
179
#define DRV_CBC_AES256_DECRYPT  33
178
180
#define DRV_INFO_LIB            34
 
181
/* #define DRV_RSA_VERIFY_SHA      23 */
 
182
#define DRV_RSA_VERIFY_MD5      35 
 
183
#define DRV_RSA_SIGN_SHA        36
 
184
#define DRV_RSA_SIGN_MD5        37
 
185
#define DRV_DSS_SIGN            38
 
186
#define DRV_RSA_PUBLIC_ENCRYPT  39
 
187
#define DRV_RSA_PRIVATE_DECRYPT 40
 
188
#define DRV_RSA_PRIVATE_ENCRYPT 41
 
189
#define DRV_RSA_PUBLIC_DECRYPT  42
 
190
#define DRV_DH_GENERATE_PARAMS  43
 
191
#define DRV_DH_CHECK            44
 
192
#define DRV_DH_GENERATE_KEY     45
 
193
#define DRV_DH_COMPUTE_KEY      46
 
194
#define DRV_MD4                 47
 
195
#define DRV_MD4_INIT            48
 
196
#define DRV_MD4_UPDATE          49
 
197
#define DRV_MD4_FINAL           50
 
198
 
 
199
#define SSL_VERSION_0_9_8 0
 
200
#if SSL_VERSION_0_9_8
 
201
#define DRV_SHA256              51
 
202
#define DRV_SHA256_INIT         52
 
203
#define DRV_SHA256_UPDATE       53
 
204
#define DRV_SHA256_FINAL        54
 
205
#define DRV_SHA512              55
 
206
#define DRV_SHA512_INIT         56
 
207
#define DRV_SHA512_UPDATE       57
 
208
#define DRV_SHA512_FINAL        58
 
209
#endif
 
210
 
179
211
/* #define DRV_CBC_IDEA_ENCRYPT    34 */
180
212
/* #define DRV_CBC_IDEA_DECRYPT    35 */
181
213
 
182
 
#define NUM_CRYPTO_FUNCS        34
 
214
/* Not DRV_DH_GENERATE_PARAMS DRV_DH_CHECK
 
215
 * Calc RSA_VERIFY_*  and RSA_SIGN once */
 
216
#define NUM_CRYPTO_FUNCS        46
183
217
 
184
218
#define MD5_CTX_LEN     (sizeof(MD5_CTX))
185
219
#define MD5_LEN         16
186
220
#define MD5_LEN_96      12
 
221
#define MD4_CTX_LEN     (sizeof(MD4_CTX))
 
222
#define MD4_LEN         16
187
223
#define SHA_CTX_LEN     (sizeof(SHA_CTX))
188
224
#define SHA_LEN         20
189
225
#define SHA_LEN_96      12
192
228
#define HMAC_IPAD       0x36
193
229
#define HMAC_OPAD       0x5c
194
230
 
 
231
#if SSL_VERSION_0_9_8
 
232
#define SHA256_CTX_LEN (sizeof(SHA256_CTX))
 
233
#define SHA256_LEN     32
 
234
 
 
235
#define SHA512_CTX_LEN (sizeof(SHA512_CTX))
 
236
#define SHA512_LEN     64
 
237
#endif
195
238
 
196
239
/* INITIALIZATION AFTER LOADING */
197
240
 
274
317
static int control(ErlDrvData drv_data, unsigned int command, char *buf, 
275
318
                   int len, char **rbuf, int rlen)
276
319
{
277
 
    int klen, dlen, i, j, macsize, from_len, to_len;
 
320
    int klen, dlen, macsize, from_len, to_len, i;
278
321
    int base_len, exponent_len, modulo_len;
279
322
    int data_len, dsa_p_len, dsa_q_len;
280
 
    int dsa_g_len, dsa_y_len;
281
 
    int rsa_e_len, rsa_n_len;
 
323
    int dsa_s_len, dsa_g_len, dsa_y_len;
 
324
    int rsa_e_len, rsa_n_len, rsa_d_len, padding;
282
325
    int or_mask;
283
 
    unsigned int rsa_s_len;
 
326
    int prime_len, generator;
 
327
    int privkey_len, pubkey_len, dh_p_len, dh_g_len;
 
328
    unsigned int rsa_s_len, j;
284
329
    char *key, *key2, *dbuf, *p;
285
330
    const_DES_cblock *des_key, *des_key2, *des_key3;
286
331
    const unsigned char *des_dbuf;
287
332
    BIGNUM *bn_from, *bn_to, *bn_rand, *bn_result;
288
333
    BIGNUM *bn_base, *bn_exponent, *bn_modulo;
289
 
    BIGNUM *dsa_p, *dsa_q, *dsa_r, *dsa_s, *dsa_g, *dsa_y;
290
 
    BIGNUM *rsa_n, *rsa_e;
 
334
    BIGNUM *dsa_p, *dsa_q, *dsa_r, *dsa_g, *dsa_y;
 
335
    BIGNUM *rsa_n, *rsa_e, *rsa_d;
 
336
    BIGNUM *dh_p, *dh_g, *privkey, *pubkey;
291
337
    DES_cblock *des_ivec;
292
338
    ErlDrvBinary *bin;
293
339
    DES_key_schedule schedule, schedule2, schedule3;
 
340
    DH *dh_params;
294
341
/*     IDEA_KEY_SCHEDULE idea, idea2; */
295
342
    unsigned char hmacbuf[SHA_DIGEST_LENGTH];
296
 
    unsigned char *rsa_s;
 
343
    unsigned char *rsa_s, *dsa_s;
297
344
    /* char hmacbuf[SHA_LEN]; */
 
345
#if SSL_VERSION_0_9_8
 
346
    SHA256_CTX sha256_ctx;
 
347
    SHA512_CTX sha512_ctx;
 
348
#endif
298
349
    MD5_CTX md5_ctx;
 
350
    MD4_CTX md4_ctx;
299
351
    SHA_CTX sha_ctx;
300
352
    int new_ivlen = 0;
301
353
    BN_CTX *bn_ctx;
302
354
    DSA *dsa;
303
355
    RSA *rsa;
304
 
    DSA_SIG *dsa_sig;
305
356
    AES_KEY aes_key;
306
357
    RC4_KEY rc4_key;
307
358
    RC2_KEY rc2_key;
310
361
 
311
362
    case DRV_INFO:
312
363
        *rbuf = (char*)(bin = driver_alloc_binary(NUM_CRYPTO_FUNCS));
 
364
        if (bin==NULL) return -1;
313
365
        for (i = 0; i < NUM_CRYPTO_FUNCS; i++) {
314
366
            bin->orig_bytes[i] = i + 1;
315
367
        }
316
368
        return NUM_CRYPTO_FUNCS;
317
369
 
318
370
    case DRV_MD5:
319
 
        *rbuf = (char*)(bin = driver_alloc_binary(MD5_LEN));
320
 
        MD5(buf, len, bin->orig_bytes);
 
371
       *rbuf = (char*)(bin = driver_alloc_binary(MD5_LEN));
 
372
       if (bin==NULL) return -1;
 
373
       MD5(buf, len, bin->orig_bytes);
321
374
        return MD5_LEN;
322
375
        break;
323
376
 
324
377
    case DRV_MD5_INIT:
325
378
        *rbuf = (char*)(bin = driver_alloc_binary(MD5_CTX_LEN));
 
379
        if (bin==NULL) return -1;
326
380
        MD5_Init((MD5_CTX *)bin->orig_bytes);
327
381
        return MD5_CTX_LEN;             
328
382
        break;
331
385
        if (len < MD5_CTX_LEN)
332
386
            return -1;
333
387
        *rbuf = (char*)(bin = driver_alloc_binary(MD5_CTX_LEN));
 
388
        if (bin==NULL) return -1;
334
389
        memcpy(bin->orig_bytes, buf, MD5_CTX_LEN);
335
390
        MD5_Update((MD5_CTX *)bin->orig_bytes, buf + MD5_CTX_LEN, 
336
391
                   len - MD5_CTX_LEN);
342
397
            return -1;
343
398
        memcpy(&md5_ctx, buf, MD5_CTX_LEN); /* XXX Use buf only? */
344
399
        *rbuf = (char *)(bin = driver_alloc_binary(MD5_LEN));
 
400
        if (bin==NULL) return -1;       
345
401
        MD5_Final(bin->orig_bytes, &md5_ctx);
346
402
        return MD5_LEN;         
347
403
        break;
348
404
 
349
405
    case DRV_SHA:
350
406
        *rbuf = (char *)(bin = driver_alloc_binary(SHA_LEN));
 
407
        if (bin==NULL) return -1;
351
408
        SHA1(buf, len, bin->orig_bytes);
352
409
        return SHA_LEN;
353
410
        break;
354
411
 
355
412
    case DRV_SHA_INIT:
356
413
        *rbuf = (char *)(bin = driver_alloc_binary(SHA_CTX_LEN));
 
414
        if (bin==NULL) return -1;
357
415
        SHA1_Init((SHA_CTX *)bin->orig_bytes);
358
416
        return SHA_CTX_LEN;             
359
417
        break;
362
420
        if (len < SHA_CTX_LEN)
363
421
            return -1;
364
422
        *rbuf = (char *)(bin = driver_alloc_binary(SHA_CTX_LEN)); 
 
423
        if (bin==NULL) return -1;
365
424
        memcpy(bin->orig_bytes, buf, SHA_CTX_LEN);
366
425
        SHA1_Update((SHA_CTX *)bin->orig_bytes, buf + SHA_CTX_LEN, 
367
426
                          len - SHA_CTX_LEN);
373
432
            return -1;
374
433
        memcpy(&sha_ctx, buf, SHA_CTX_LEN); /* XXX Use buf only? */
375
434
        *rbuf = (char *)(bin = driver_alloc_binary(SHA_LEN));
 
435
        if (bin==NULL) return -1;
376
436
        SHA1_Final(bin->orig_bytes, &sha_ctx);
377
437
        return SHA_LEN;         
378
438
        break;
387
447
        hmac_md5(key, klen, dbuf, dlen, hmacbuf);
388
448
        macsize = (command == DRV_MD5_MAC) ? MD5_LEN : MD5_LEN_96;
389
449
        *rbuf = (char *)(bin = driver_alloc_binary(macsize));
 
450
        if (bin==NULL) return -1;
390
451
        memcpy(bin->orig_bytes, hmacbuf, macsize);
391
452
        return macsize;
392
453
        break;
401
462
        hmac_sha1(key, klen, dbuf, dlen, hmacbuf);
402
463
        macsize = (command == DRV_SHA_MAC) ? SHA_LEN : SHA_LEN_96;
403
464
        *rbuf = (char *)(bin = driver_alloc_binary(macsize));
 
465
        if (bin==NULL) return -1;
404
466
        memcpy(bin->orig_bytes, hmacbuf, macsize);
405
467
        return macsize;
406
468
        break;
417
479
        des_ivec = (DES_cblock*)(buf + 8); 
418
480
        des_dbuf = buf + 16;
419
481
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
482
        if (bin==NULL) return -1;
420
483
        DES_set_key(des_key, &schedule);
421
484
        DES_ncbc_encrypt(des_dbuf, bin->orig_bytes, dlen, &schedule, des_ivec, 
422
485
                         (command == DRV_CBC_DES_ENCRYPT));
449
512
        if (dlen < 0)
450
513
            return -1;
451
514
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
515
        if (bin==NULL) return -1;
452
516
        RC2_set_key(&rc2_key, 5, buf, 40);
453
517
        RC2_cbc_encrypt(buf + 13, bin->orig_bytes, dlen, &rc2_key, buf + 5,
454
518
                        (command == DRV_CBC_RC2_40_ENCRYPT));
466
530
        des_ivec = (DES_cblock*) (buf + 24); 
467
531
        des_dbuf = buf + 32;
468
532
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
533
        if (bin==NULL) return -1;
469
534
        DES_set_key(des_key, &schedule);
470
535
        DES_set_key(des_key2, &schedule2);
471
536
        DES_set_key(des_key3, &schedule3);
482
547
        if (dlen < 0)
483
548
            return -1;
484
549
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
550
        if (bin==NULL) return -1;
485
551
        AES_set_encrypt_key(buf, 128, &aes_key);
486
552
        AES_cfb128_encrypt(buf+32, bin->orig_bytes, dlen, &aes_key,
487
553
                           buf+16, &new_ivlen,
495
561
        dlen = len - klen - 4;
496
562
        dbuf = key + klen;
497
563
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
564
        if (bin==NULL) return -1;
498
565
        RC4_set_key(&rc4_key, klen, key);
499
566
        RC4(&rc4_key, dlen, dbuf, bin->orig_bytes);
500
567
        return dlen;
503
570
        /* buf = key */
504
571
        dlen = sizeof(rc4_key);
505
572
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
573
        if (bin==NULL) return -1;
506
574
        RC4_set_key(&rc4_key, len, buf);
507
575
        memcpy(bin->orig_bytes, &rc4_key, dlen);
508
576
        return dlen;
514
582
        dlen = len - klen - 4;
515
583
        dbuf = key + klen;
516
584
        *rbuf = (char *)(bin = driver_alloc_binary(len));
 
585
        if (bin==NULL) return -1;
517
586
        memcpy(&rc4_key, key, klen);
518
587
        RC4(&rc4_key, dlen, dbuf, bin->orig_bytes + klen + 4);
519
588
        memcpy(bin->orig_bytes, buf, 4);
527
596
            return -1;
528
597
        rlen = get_int32(buf);
529
598
        *rbuf = (char *)(bin = driver_alloc_binary(rlen));
 
599
        if (bin==NULL) return -1;
530
600
        RAND_pseudo_bytes(bin->orig_bytes,rlen);
531
601
        or_mask = ((unsigned char*)buf)[4];
532
602
        bin->orig_bytes[rlen-1] |= or_mask; /* topmask */
556
626
      BN_add(bn_rand, bn_rand, bn_from);
557
627
      rlen = BN_num_bytes(bn_rand);
558
628
      *rbuf = (char *)(bin = driver_alloc_binary(rlen + 4));
 
629
      if (bin==NULL) return -1;
559
630
      put_int32(bin->orig_bytes, rlen);
560
631
      BN_bn2bin(bn_rand,(unsigned char*)(bin->orig_bytes + 4));
561
632
      BN_free(bn_rand);
594
665
                 bn_modulo, bn_ctx);
595
666
      rlen = BN_num_bytes(bn_result);
596
667
      *rbuf = (char *)(bin = driver_alloc_binary(rlen + 4));
 
668
      if (bin==NULL) return -1;
597
669
      put_int32(bin->orig_bytes, rlen);
598
670
      BN_bn2bin(bn_result,(unsigned char*)(bin->orig_bytes + 4));
599
671
      BN_free(bn_result);
605
677
      break;
606
678
 
607
679
    case DRV_DSS_VERIFY:
608
 
      /* buf = <<data_len:32/integer,data:data_len/binary,
609
 
       *         dsa_r:20/binary,
610
 
       *         dsa_s:20/binary,
 
680
      /* buf = <<data_len:32/integer, data:data_len/binary,
 
681
       *         dsa_s_len:32/integer, dsa_s:dsa_s_len/binary,
611
682
       *         dsa_p_len:32/integer, dsa_p:dsa_p_len/binary,
612
683
       *         dsa_q_len:32/integer, dsa_q:dsa_q_len/binary,
613
 
       *         dsa_g_len:32/integer, dsa_r:dsa_r_len/binary,
 
684
       *         dsa_g_len:32/integer, dsa_g:dsa_g_len/binary,
614
685
       *         dsa_y_len:32/integer, dsa_y:dsa_y_len/binary>> */
615
686
      i = 0;
616
687
      j = 0;
617
 
      if (len < 60)
618
 
        return -1;
 
688
      if (len < 24)
 
689
        return -1;
619
690
      data_len = get_int32(buf + i + j);
620
 
      j += data_len; i += 44;
621
 
      if (len < (60 + j))
622
 
        return -1;
 
691
      j += data_len; i += 4;
 
692
      if (len < (24 + j))
 
693
        return -1;
 
694
      dsa_s_len = get_int32(buf + i + j);
 
695
      j += dsa_s_len; i += 4;
 
696
      if (len < (24 + j))
 
697
         return -1;      
623
698
      dsa_p_len = get_int32(buf + i + j);
624
699
      j += dsa_p_len; i += 4;
625
 
      if (len < (60 + j))
 
700
      if (len < (24 + j))
626
701
        return -1;
627
702
      dsa_q_len = get_int32(buf + i + j);
628
703
      j += dsa_q_len; i += 4;
629
 
      if (len < (60 + j))
 
704
      if (len < (24 + j))
630
705
        return -1;
631
706
      dsa_g_len = get_int32(buf + i + j);
632
707
      j += dsa_g_len; i += 4;
633
 
      if (len < (60 + j))
 
708
      if (len < (24 + j))
634
709
        return -1;
635
710
      dsa_y_len = get_int32(buf + i + j);
636
711
      j += dsa_y_len;
637
 
      if (len < (60 + j))
 
712
      if (len != (24 + j))
638
713
        return -1;
639
714
      i = 4;
640
715
      SHA1((unsigned char *) (buf + i), data_len, hmacbuf);
641
 
      dsa_sig = DSA_SIG_new();
642
 
      dsa_r = BN_new();
643
 
      i += data_len;
644
 
      BN_bin2bn((unsigned char *)(buf + i), 20, dsa_r);
645
 
      i += 20;
646
 
      dsa_s = BN_new();
647
 
      BN_bin2bn((unsigned char *)(buf + i), 20, dsa_s);
648
 
      i += 24;
649
 
      dsa_sig->r = dsa_r;
650
 
      dsa_sig->s = dsa_s;
 
716
      i += data_len + 4;
 
717
      dsa_s = (unsigned char *)(buf + i);
 
718
      i += (dsa_s_len + 4);
651
719
      dsa_p = BN_new();
652
720
      BN_bin2bn((unsigned char *)(buf + i), dsa_p_len, dsa_p);
653
721
      i += (dsa_p_len + 4);
665
733
      dsa->g = dsa_g;
666
734
      dsa->priv_key = NULL;
667
735
      dsa->pub_key = dsa_y;
668
 
      i =  DSA_do_verify(hmacbuf, SHA_DIGEST_LENGTH,
669
 
                         dsa_sig, dsa);
 
736
      i =  DSA_verify(0, hmacbuf, SHA_DIGEST_LENGTH, dsa_s, dsa_s_len, dsa);
670
737
      *rbuf = (char *)(bin = driver_alloc_binary(1));
 
738
      if (bin==NULL) return -1;
 
739
 
 
740
      DSA_free(dsa);
 
741
      if(i > 0) {
 
742
         (bin->orig_bytes)[0] = 1;
 
743
      } else {
 
744
         (bin->orig_bytes)[0] = 0;
 
745
      }
 
746
      return 1;
 
747
      break;
 
748
      
 
749
    case DRV_DSS_SIGN:
 
750
      /* buf = <<data_len:32/integer, data:data_len/binary,
 
751
       *         dsa_p_len:32/integer, dsa_p:dsa_p_len/binary,
 
752
       *         dsa_q_len:32/integer, dsa_q:dsa_q_len/binary,
 
753
       *         dsa_g_len:32/integer, dsa_g:dsa_g_len/binary,
 
754
       *         dsa_y_len:32/integer, dsa_y:dsa_y_len/binary,
 
755
       *         dsa_x_len:32/integer, dsa_s:dsa_x_len/binary>> */
 
756
      i = 0;
 
757
      j = 0;
 
758
      if (len < 20)
 
759
         return -1;
 
760
      data_len = get_int32(buf + i + j);
 
761
      j += data_len; i += 4;
 
762
      if (len < (20 + j))
 
763
          return -1;
 
764
      dsa_p_len = get_int32(buf + i + j);
 
765
      j += dsa_p_len; i += 4;
 
766
      if (len < (20 + j))
 
767
         return -1;
 
768
      dsa_q_len = get_int32(buf + i + j);
 
769
      j += dsa_q_len; i += 4;
 
770
      if (len < (20 + j))
 
771
         return -1;
 
772
      dsa_g_len = get_int32(buf + i + j);
 
773
      j += dsa_g_len; i += 4;
 
774
      if (len < (20 + j))
 
775
         return -1;
 
776
      dsa_y_len = get_int32(buf + i + j);
 
777
      j += dsa_y_len;
 
778
      if (len < (20 + j))
 
779
         return -1;
 
780
      if (len != (20 + j))
 
781
         return -1;
 
782
 
 
783
      i = 4;
 
784
      SHA1((unsigned char *) (buf + i), data_len, hmacbuf);
 
785
      i += data_len + 4;
 
786
      dsa_p = BN_new();
 
787
      BN_bin2bn((unsigned char *)(buf + i), dsa_p_len, dsa_p);
 
788
      i += (dsa_p_len + 4);
 
789
      dsa_q = BN_new();
 
790
      BN_bin2bn((unsigned char *)(buf + i), dsa_q_len, dsa_q);
 
791
      i += (dsa_q_len + 4);
 
792
      dsa_g = BN_new();
 
793
      BN_bin2bn((unsigned char *)(buf + i), dsa_g_len, dsa_g);
 
794
      i += (dsa_g_len + 4);
 
795
      dsa_y = BN_new();
 
796
      BN_bin2bn((unsigned char *)(buf + i), dsa_y_len, dsa_y);
 
797
      /* i += (dsa_y_len + 4); */
 
798
 
 
799
      dsa = DSA_new();
 
800
      dsa->p = dsa_p;
 
801
      dsa->q = dsa_q;
 
802
      dsa->g = dsa_g;
 
803
      dsa->priv_key = dsa_y;
 
804
      dsa->pub_key  = NULL;
 
805
      dlen = DSA_size(dsa) + 1;
 
806
      *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
807
      if (bin==NULL) return -1;
 
808
      i =  DSA_sign(NID_sha1,
 
809
                    hmacbuf,SHA_DIGEST_LENGTH,
 
810
                    (unsigned char *) &bin->orig_bytes[1],
 
811
                    &dsa_s_len, dsa);
 
812
 
671
813
      (bin->orig_bytes)[0] = (char)(i & 0xff);
672
814
      DSA_free(dsa);
673
 
      DSA_SIG_free(dsa_sig);
674
 
      return 1;
 
815
      return dsa_s_len + 1;
675
816
      break;
676
817
 
677
 
    case DRV_RSA_VERIFY:
 
818
    case DRV_RSA_VERIFY_MD5:
 
819
    case DRV_RSA_VERIFY_SHA:
678
820
      /* buf = <<data_len:32/integer, data:data_len/binary,
679
821
       *         rsa_s_len:32/integer, rsa_s:rsa_s_len/binary,
680
822
       *         rsa_e_len:32/integer, rsa_e:rsa_e_len/binary,
682
824
      i = 0;
683
825
      j = 0;
684
826
      if (len < 16)
685
 
        return -1;
 
827
         return -1;
686
828
      data_len = get_int32(buf + i + j);
687
829
      j += data_len; i += 4;
688
830
      if (len < (16 + j))
697
839
        return -1;
698
840
      rsa_n_len = get_int32(buf + i + j);
699
841
      j += rsa_n_len; i += 4;
700
 
      if (len < (16 + j))
701
 
        return -1;
 
842
      if (len != (16 + j))
 
843
         return -1;
702
844
      i = 4;
703
 
      SHA1((unsigned char *) (buf + i), data_len, hmacbuf);
704
845
      i += (data_len + 4);
705
846
      rsa_s = (unsigned char *)(buf + i);
706
847
      i += (rsa_s_len + 4);
712
853
      rsa = RSA_new();
713
854
      rsa->n = rsa_n;
714
855
      rsa->e = rsa_e;
715
 
      i =  RSA_verify(NID_sha1, hmacbuf, SHA_DIGEST_LENGTH,
716
 
                      rsa_s, rsa_s_len, rsa);
 
856
      i = 4;
 
857
      if(command == DRV_RSA_VERIFY_SHA) {
 
858
         SHA1((unsigned char *) (buf + i), data_len, hmacbuf);
 
859
         i = RSA_verify(NID_sha1, hmacbuf, SHA_DIGEST_LENGTH,
 
860
                        rsa_s, rsa_s_len, rsa);
 
861
      } else {
 
862
         MD5((unsigned char *) (buf + i), data_len, hmacbuf);
 
863
         i =  RSA_verify(NID_md5, hmacbuf, MD5_DIGEST_LENGTH,
 
864
                         rsa_s, rsa_s_len, rsa);
 
865
      }
 
866
 
717
867
      *rbuf = (char *)(bin = driver_alloc_binary(1));
 
868
      if (bin==NULL) return -1;
718
869
      (bin->orig_bytes)[0] = (char)(i & 0xff);
719
870
      RSA_free(rsa);
720
871
      return 1;
721
872
      break;
722
873
 
 
874
    case DRV_RSA_SIGN_MD5:
 
875
    case DRV_RSA_SIGN_SHA:        
 
876
      /* buf = <<data_len:32/integer, data:data_len/binary,
 
877
       *         rsa_e_len:32/integer, rsa_e:rsa_e_len/binary,       
 
878
       *         rsa_n_len:32/integer, rsa_n:rsa_n_len/binary,
 
879
       *         rsa_d_len:32/integer, rsa_d:rsa_d_len/binary>> */ 
 
880
 
 
881
      i = 0;
 
882
      j = 0;
 
883
      
 
884
      if (len < 16)
 
885
         return -1;
 
886
      data_len = get_int32(buf + i + j);
 
887
      j += data_len; i += 4;
 
888
      if (len < (16 + j))
 
889
         return -1;
 
890
      rsa_e_len = get_int32(buf + i + j);
 
891
      j += rsa_e_len; i += 4;
 
892
      if (len < (16 + j))
 
893
         return -1;
 
894
      rsa_n_len = get_int32(buf + i + j);
 
895
      j += rsa_n_len; i += 4;
 
896
      if (len < (16 + j))
 
897
         return -1;
 
898
      rsa_d_len = get_int32(buf + i + j);
 
899
      j += rsa_d_len; i += 4;
 
900
      if (len != (16 + j))
 
901
         return -1;
 
902
 
 
903
      i = 4;
 
904
      i += (data_len + 4);
 
905
      rsa_e = BN_new();
 
906
      BN_bin2bn((unsigned char *)(buf + i), rsa_e_len, rsa_e);
 
907
      i += (rsa_e_len + 4);
 
908
      rsa_n = BN_new();
 
909
      BN_bin2bn((unsigned char *)(buf + i), rsa_n_len, rsa_n);
 
910
      i += (rsa_n_len + 4);
 
911
      rsa_d = BN_new();
 
912
      BN_bin2bn((unsigned char *)(buf + i), rsa_d_len, rsa_d);
 
913
      i += (rsa_d_len + 4);
 
914
  
 
915
      rsa = RSA_new();
 
916
      rsa->e = rsa_e;
 
917
      rsa->n = rsa_n;
 
918
      rsa->d = rsa_d;
 
919
      
 
920
      dlen = RSA_size(rsa) + 1;
 
921
      *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
922
      if (bin==NULL) return -1;
 
923
      i = 4;
 
924
      if (command == DRV_RSA_SIGN_MD5) {
 
925
         MD5((unsigned char *) (buf + i), data_len, hmacbuf);
 
926
         i = RSA_sign(NID_md5,
 
927
                      hmacbuf,MD5_DIGEST_LENGTH,
 
928
                      (unsigned char *) &bin->orig_bytes[1],
 
929
                      &rsa_s_len, rsa);
 
930
      } else {
 
931
         SHA1((unsigned char *) (buf + i), data_len, hmacbuf);
 
932
         i =  RSA_sign(NID_sha1,
 
933
                       hmacbuf,SHA_DIGEST_LENGTH,
 
934
                       (unsigned char *) &bin->orig_bytes[1],
 
935
                       &rsa_s_len, rsa);
 
936
      }
 
937
 
 
938
      (bin->orig_bytes)[0] = (char)(i & 0xff);
 
939
      RSA_free(rsa);
 
940
      return rsa_s_len + 1;
 
941
      break;
 
942
 
 
943
    case DRV_RSA_PRIVATE_DECRYPT:        
 
944
    case DRV_RSA_PRIVATE_ENCRYPT:        
 
945
       /* buf = <<data_len:32/integer, data:data_len/binary,
 
946
        *         rsa_e_len:32/integer, rsa_e:rsa_e_len/binary,       
 
947
        *         rsa_n_len:32/integer, rsa_n:rsa_n_len/binary,
 
948
        *         rsa_d_len:32/integer, rsa_d:rsa_d_len/binary,
 
949
        *         pad:8/integer >> */ 
 
950
 
 
951
       i = 0;
 
952
       j = 0;
 
953
      
 
954
       if (len < 17)
 
955
          return -1;
 
956
       data_len = get_int32(buf + i + j);
 
957
       j += data_len; i += 4;
 
958
       if (len < (17 + j))
 
959
          return -1;
 
960
       rsa_e_len = get_int32(buf + i + j);
 
961
       j += rsa_e_len; i += 4;
 
962
       if (len < (17 + j))
 
963
          return -1;
 
964
       rsa_n_len = get_int32(buf + i + j);
 
965
       j += rsa_n_len; i += 4;
 
966
       if (len < (17 + j))
 
967
          return -1;
 
968
       rsa_d_len = get_int32(buf + i + j);
 
969
       j += rsa_d_len; i += 4;
 
970
       padding = *(unsigned char *) (buf+i+j); 
 
971
       if (len != (17 + j))
 
972
          return -1;
 
973
 
 
974
       i = 4;
 
975
       i += (data_len + 4);
 
976
       rsa_e = BN_new();
 
977
       BN_bin2bn((unsigned char *)(buf + i), rsa_e_len, rsa_e);
 
978
       i += (rsa_e_len + 4);
 
979
       rsa_n = BN_new();
 
980
       BN_bin2bn((unsigned char *)(buf + i), rsa_n_len, rsa_n);
 
981
       i += (rsa_n_len + 4);
 
982
       rsa_d = BN_new();
 
983
       BN_bin2bn((unsigned char *)(buf + i), rsa_d_len, rsa_d);
 
984
       i += (rsa_d_len + 4);
 
985
       
 
986
       switch(padding) {
 
987
       case 0:
 
988
          padding = RSA_NO_PADDING;
 
989
          break;
 
990
       case 1:
 
991
          padding = RSA_PKCS1_PADDING;
 
992
          break;
 
993
       case 2:
 
994
          padding = RSA_PKCS1_OAEP_PADDING;
 
995
          break;
 
996
       case 3:
 
997
          padding = RSA_SSLV23_PADDING;
 
998
          break;
 
999
       default:
 
1000
          return -1;
 
1001
       }
 
1002
       
 
1003
       rsa = RSA_new();
 
1004
       rsa->e = rsa_e;
 
1005
       rsa->n = rsa_n;
 
1006
       rsa->d = rsa_d;
 
1007
      
 
1008
       dlen = RSA_size(rsa) + 1;
 
1009
       *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
1010
       if (bin==NULL) return -1;
 
1011
       i = 4;
 
1012
       if(command == DRV_RSA_PRIVATE_DECRYPT) {
 
1013
          i = RSA_private_decrypt(data_len, (unsigned char *) (buf+i),
 
1014
                                  (unsigned char *) &bin->orig_bytes[1],
 
1015
                                  rsa, padding);
 
1016
          if(i > 0) {
 
1017
             *rbuf = (char *) (bin = driver_realloc_binary(bin, i+1));
 
1018
             if (*rbuf==NULL) return -1;
 
1019
          }
 
1020
       } else {
 
1021
          i = RSA_private_encrypt(data_len, (unsigned char *) (buf+i),
 
1022
                                  (unsigned char *) &bin->orig_bytes[1],
 
1023
                                  rsa, padding);
 
1024
       }
 
1025
       RSA_free(rsa);
 
1026
       if(i > 0) {
 
1027
          (bin->orig_bytes)[0] = 1;
 
1028
          return i + 1;
 
1029
       } else {
 
1030
          (bin->orig_bytes)[0] = 0;
 
1031
          return 1;
 
1032
       }
 
1033
       break;
 
1034
 
 
1035
    case DRV_RSA_PUBLIC_ENCRYPT:
 
1036
    case DRV_RSA_PUBLIC_DECRYPT:
 
1037
       /* buf = <<data_len:32/integer, data:data_len/binary,
 
1038
        *         rsa_e_len:32/integer, rsa_e:rsa_e_len/binary,       
 
1039
        *         rsa_n_len:32/integer, rsa_n:rsa_n_len/binary,
 
1040
        *         pad:8/integer >> */ 
 
1041
 
 
1042
       i = 0;
 
1043
       j = 0;
 
1044
      
 
1045
       if (len < 13)
 
1046
          return -1;
 
1047
       data_len = get_int32(buf + i + j);
 
1048
       j += data_len; i += 4;
 
1049
       if (len < (13 + j))
 
1050
          return -1;
 
1051
       rsa_e_len = get_int32(buf + i + j);
 
1052
       j += rsa_e_len; i += 4;
 
1053
       if (len < (13 + j))
 
1054
          return -1;
 
1055
       rsa_n_len = get_int32(buf + i + j);
 
1056
       j += rsa_n_len; i += 4;
 
1057
       if (len < (13 + j))
 
1058
          return -1;
 
1059
       padding = *(unsigned char *) (buf + i + j);
 
1060
       if (len != (13 + j))
 
1061
          return -1;
 
1062
 
 
1063
       i = 4;
 
1064
       i += (data_len + 4);
 
1065
       rsa_e = BN_new();
 
1066
       BN_bin2bn((unsigned char *)(buf + i), rsa_e_len, rsa_e);
 
1067
       i += (rsa_e_len + 4);
 
1068
       rsa_n = BN_new();
 
1069
       BN_bin2bn((unsigned char *)(buf + i), rsa_n_len, rsa_n);
 
1070
       i += (rsa_n_len + 4);
 
1071
       
 
1072
       switch(padding) {
 
1073
       case 0:
 
1074
          padding = RSA_NO_PADDING;
 
1075
          break;
 
1076
       case 1:
 
1077
          padding = RSA_PKCS1_PADDING;
 
1078
          break;
 
1079
       case 2:
 
1080
          padding = RSA_PKCS1_OAEP_PADDING;
 
1081
          break;
 
1082
       case 3:
 
1083
          padding = RSA_SSLV23_PADDING;
 
1084
          break;
 
1085
       default:
 
1086
          return -1;
 
1087
       }
 
1088
       
 
1089
       rsa = RSA_new();
 
1090
       rsa->e = rsa_e;
 
1091
       rsa->n = rsa_n;
 
1092
      
 
1093
       dlen = RSA_size(rsa) + 1;
 
1094
       
 
1095
       *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
1096
       if (bin==NULL) return -1;
 
1097
       i = 4;
 
1098
       if(command == DRV_RSA_PUBLIC_ENCRYPT) {
 
1099
          i = RSA_public_encrypt(data_len, (unsigned char *) (buf+i),
 
1100
                                 (unsigned char *) &bin->orig_bytes[1],
 
1101
                                 rsa, padding);
 
1102
       } else {
 
1103
          i = RSA_public_decrypt(data_len, (unsigned char *) (buf+i),
 
1104
                                 (unsigned char *) &bin->orig_bytes[1],
 
1105
                                 rsa, padding);
 
1106
          if(i > 0) {
 
1107
             *rbuf = (char *) (bin = driver_realloc_binary(bin, i+1));
 
1108
             if (*rbuf==NULL) return -1;
 
1109
          }
 
1110
       }
 
1111
 
 
1112
       RSA_free(rsa);
 
1113
       if(i > 0) {
 
1114
          (bin->orig_bytes)[0] = 1;
 
1115
          return i + 1;
 
1116
       } else {
 
1117
/*        ERR_load_crypto_strings(); */
 
1118
/*        fprintf(stderr, "%d: %s \r\n", __LINE__, ERR_reason_error_string(ERR_get_error())); */
 
1119
          (bin->orig_bytes)[0] = 0;
 
1120
          return 1;
 
1121
       }
 
1122
       break;
 
1123
 
723
1124
    case DRV_CBC_AES128_ENCRYPT:
724
1125
    case DRV_CBC_AES256_ENCRYPT:
725
1126
    case DRV_CBC_AES128_DECRYPT:
742
1143
            AES_set_decrypt_key((unsigned char *) buf, klen*8, &aes_key);
743
1144
        }
744
1145
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
1146
        if (bin==NULL) return -1;
745
1147
        AES_cbc_encrypt((unsigned char *) (buf + klen+16),
746
1148
                        (unsigned char *) bin->orig_bytes,
747
1149
                        dlen,
778
1180
        if (len != dlen * 2)
779
1181
            return -1;
780
1182
        *rbuf = (char *)(bin = driver_alloc_binary(dlen));
 
1183
        if (bin==NULL) return -1;
781
1184
        p = bin->orig_bytes,
782
1185
        dbuf = buf + dlen;
783
1186
        for (key = buf, key2 = dbuf; key != dbuf; ++key, ++key2, ++p)
784
1187
            *p = *key ^ *key2;
785
1188
        return dlen;
786
1189
        break;
787
 
 
 
1190
        
 
1191
    case DRV_DH_GENERATE_PARAMS:
 
1192
       /* buf = <<PrimeLen:32 Generator:32>> */
 
1193
       if (len != 8) 
 
1194
          return -1;
 
1195
       prime_len = get_int32(buf);
 
1196
       generator = get_int32(buf+4);
 
1197
       dh_params = DH_generate_parameters(prime_len, generator, NULL, NULL);
 
1198
 
 
1199
       if(dh_params) {
 
1200
          dh_p_len = BN_num_bytes(dh_params->p);
 
1201
          dh_g_len = BN_num_bytes(dh_params->g);
 
1202
          *rbuf = (char *)(bin = driver_alloc_binary(1+4+4+dh_g_len+dh_p_len));
 
1203
          if (bin==NULL) return -1;
 
1204
          (bin->orig_bytes)[0] = 1;
 
1205
          put_int32(bin->orig_bytes+1, dh_p_len);
 
1206
          BN_bn2bin(dh_params->p, bin->orig_bytes+5);
 
1207
          put_int32(bin->orig_bytes+5+dh_p_len, dh_g_len);
 
1208
          BN_bn2bin(dh_params->g, bin->orig_bytes+5+dh_p_len+4);
 
1209
       } else {
 
1210
          *rbuf = (char *)(bin = driver_alloc_binary(1));
 
1211
          if (bin==NULL) return -1;
 
1212
          (bin->orig_bytes)[0] = 0;
 
1213
       }
 
1214
       DH_free(dh_params);
 
1215
       return 1;
 
1216
       break;
 
1217
 
 
1218
    case DRV_DH_CHECK:
 
1219
       /* buf = <<dh_p_len:32/integer, dh_p:dh_p_len/binary,
 
1220
        *         dh_g_len:32/integer, dh_g:dh_g_len/binary>> */
 
1221
       i = 0;
 
1222
       j = 0;
 
1223
       if(len < 8)        return -1;
 
1224
       dh_p_len = get_int32(buf + i + j);
 
1225
       j += dh_p_len; i += 4;
 
1226
       if (len < (8 + j)) return -1;
 
1227
       dh_g_len = get_int32(buf + i + j);
 
1228
       j += dh_g_len; i += 4;
 
1229
       if(len != (8+j))   return -1;
 
1230
       i=4;
 
1231
       dh_p = BN_new();
 
1232
       BN_bin2bn((unsigned char *)(buf + i), dh_p_len, dh_p);
 
1233
       i += (dh_p_len + 4);
 
1234
       dh_g = BN_new();
 
1235
       BN_bin2bn((unsigned char *)(buf + i), dh_g_len, dh_g);
 
1236
       /* i += (dsa_g_len + 4); */
 
1237
 
 
1238
       dh_params = DH_new();
 
1239
       dh_params->p = dh_p;
 
1240
       dh_params->g = dh_g;
 
1241
       
 
1242
       i=0;
 
1243
       *rbuf = (char *)(bin = driver_alloc_binary(4));
 
1244
       if (bin==NULL) return -1;
 
1245
       if(DH_check(dh_params, &i)) {
 
1246
          put_int32(bin->orig_bytes, i);
 
1247
       } else {
 
1248
          /* Check Failed */
 
1249
          put_int32(bin->orig_bytes, -1);
 
1250
       }
 
1251
       DH_free(dh_params);
 
1252
       return 1;
 
1253
       break;
 
1254
 
 
1255
    case DRV_DH_GENERATE_KEY:
 
1256
       /* buf = <<key_len:32,  key:key_len/binary,            *
 
1257
        *         dh_p_len:32/integer, dh_p:dh_p_len/binary,  *
 
1258
        *         dh_g_len:32/integer, dh_g:dh_g_len/binary>> */
 
1259
       i = 0;
 
1260
       j = 0;
 
1261
       if(len < 12)        return -1;
 
1262
       base_len = get_int32(buf + i + j);
 
1263
       j += base_len; i += 4;
 
1264
       if (len < (12 + j)) return -1;
 
1265
       dh_p_len = get_int32(buf + i + j);
 
1266
       j += dh_p_len; i += 4;
 
1267
       if (len < (12 + j)) return -1;
 
1268
       dh_g_len = get_int32(buf + i + j);
 
1269
       j += dh_g_len; i += 4;
 
1270
       if(len != (12 + j))   return -1;
 
1271
       i=4;
 
1272
       if(base_len > 0) {
 
1273
          bn_base = BN_new();
 
1274
          BN_bin2bn((unsigned char *)(buf + i), base_len, bn_base);
 
1275
       }
 
1276
       i += (base_len + 4);
 
1277
       dh_p = BN_new();
 
1278
       BN_bin2bn((unsigned char *)(buf + i), dh_p_len, dh_p);
 
1279
       i += (dh_p_len + 4);
 
1280
       dh_g = BN_new();
 
1281
       BN_bin2bn((unsigned char *)(buf + i), dh_g_len, dh_g);
 
1282
       /* i += (dsa_g_len + 4); */
 
1283
 
 
1284
       dh_params = DH_new();
 
1285
       dh_params->p = dh_p;
 
1286
       dh_params->g = dh_g;
 
1287
       if(base_len > 0) {
 
1288
          dh_params->priv_key = bn_base;
 
1289
       }
 
1290
       i=0;
 
1291
       if(DH_generate_key(dh_params)) {
 
1292
          privkey_len = BN_num_bytes(dh_params->priv_key);
 
1293
          pubkey_len = BN_num_bytes(dh_params->pub_key);
 
1294
          *rbuf = (char *)(bin = driver_alloc_binary(1+4+4+pubkey_len+privkey_len));
 
1295
          if (bin==NULL) return -1;
 
1296
          (bin->orig_bytes)[0] = 1;
 
1297
          put_int32(bin->orig_bytes+1, pubkey_len);
 
1298
          BN_bn2bin(dh_params->pub_key, bin->orig_bytes+5);
 
1299
          put_int32(bin->orig_bytes+5+pubkey_len, privkey_len);
 
1300
          BN_bn2bin(dh_params->priv_key, bin->orig_bytes+5+pubkey_len+4);
 
1301
       } else {
 
1302
          *rbuf = (char *)(bin = driver_alloc_binary(1));
 
1303
          if (bin==NULL) return -1;
 
1304
          (bin->orig_bytes)[0] = 0;
 
1305
       }
 
1306
       DH_free(dh_params);
 
1307
       return 1;
 
1308
       break;
 
1309
 
 
1310
    case DRV_DH_COMPUTE_KEY:
 
1311
       /* buf = <<pubkey_len:32,  pubkey:pubkey_len/binary,   *
 
1312
        *         privkey_len:32, privkey:privkey_len/binary, *
 
1313
        *         dh_p_len:32/integer, dh_p:dh_p_len/binary,  *
 
1314
        *         dh_g_len:32/integer, dh_g:dh_g_len/binary>> */
 
1315
       i = 0;
 
1316
       j = 0;
 
1317
       if(len < 16)        return -1;
 
1318
       pubkey_len = get_int32(buf + i + j);
 
1319
       j += pubkey_len; i += 4;
 
1320
       if (len < (16 + j)) return -1;
 
1321
       privkey_len = get_int32(buf + i + j);
 
1322
       j += privkey_len; i += 4;
 
1323
       if (len < (16 + j)) return -1;
 
1324
       dh_p_len = get_int32(buf + i + j);
 
1325
       j += dh_p_len; i += 4;
 
1326
       if (len < (16 + j)) return -1;
 
1327
       dh_g_len = get_int32(buf + i + j);
 
1328
       j += dh_g_len; i += 4;
 
1329
       if(len != (16 + j))   return -1;
 
1330
       i=4;
 
1331
       pubkey = BN_new();
 
1332
       BN_bin2bn((unsigned char *)(buf + i), pubkey_len, pubkey);
 
1333
       i += (pubkey_len + 4);
 
1334
       privkey = BN_new();
 
1335
       BN_bin2bn((unsigned char *)(buf + i), privkey_len, privkey);
 
1336
       i += (privkey_len + 4);
 
1337
       dh_p = BN_new();
 
1338
       BN_bin2bn((unsigned char *)(buf + i), dh_p_len, dh_p);
 
1339
       i += (dh_p_len + 4);
 
1340
       dh_g = BN_new();
 
1341
       BN_bin2bn((unsigned char *)(buf + i), dh_g_len, dh_g);
 
1342
       /* i += (dsa_g_len + 4); */
 
1343
 
 
1344
       dh_params = DH_new();
 
1345
       dh_params->p = dh_p;
 
1346
       dh_params->g = dh_g;
 
1347
       dh_params->priv_key = privkey;
 
1348
       
 
1349
       klen = DH_size(dh_params);
 
1350
       *rbuf = (char *)(bin = driver_alloc_binary(1+klen));       
 
1351
       if (bin==NULL) return -1;
 
1352
       i = DH_compute_key(&bin->orig_bytes[1],pubkey, dh_params);
 
1353
       if(i > 0) {
 
1354
          (bin->orig_bytes)[0] = 1;
 
1355
       } else {
 
1356
          (bin->orig_bytes)[0] = 0;
 
1357
       }
 
1358
       DH_free(dh_params);
 
1359
       return 1;
 
1360
       break;
 
1361
 
 
1362
    case DRV_MD4:
 
1363
       *rbuf = (char*) (bin = driver_alloc_binary(MD4_LEN));
 
1364
       MD4((unsigned char *)buf, len, (unsigned char *)bin->orig_bytes);
 
1365
       return MD4_LEN;
 
1366
       break;
 
1367
       
 
1368
    case DRV_MD4_INIT:
 
1369
       *rbuf = (char*) (bin = driver_alloc_binary(MD4_CTX_LEN));
 
1370
       MD4_Init((MD4_CTX *) bin->orig_bytes);
 
1371
       return MD4_CTX_LEN;
 
1372
       break;
 
1373
       
 
1374
    case DRV_MD4_UPDATE:
 
1375
       if (len < MD4_CTX_LEN)
 
1376
          return -1;
 
1377
       *rbuf = (char*) (bin = driver_alloc_binary(MD4_CTX_LEN));
 
1378
       memcpy(bin->orig_bytes, buf, MD4_CTX_LEN);
 
1379
       MD4_Update((MD4_CTX *) bin->orig_bytes, buf + MD4_CTX_LEN, len - MD4_CTX_LEN);
 
1380
       return MD4_CTX_LEN;
 
1381
       break;
 
1382
       
 
1383
    case DRV_MD4_FINAL:
 
1384
       if (len != MD4_CTX_LEN)
 
1385
          return -1;
 
1386
       memcpy(&md4_ctx, buf, MD4_CTX_LEN); /* XXX Use buf only? */
 
1387
       *rbuf = (char *) (bin = driver_alloc_binary(MD4_LEN));
 
1388
       MD4_Final((unsigned char *)bin->orig_bytes, &md4_ctx);
 
1389
       return MD4_LEN;
 
1390
       break;
 
1391
 
 
1392
#if SSL_VERSION_0_9_8
 
1393
    case DRV_SHA256:
 
1394
       *rbuf = (char *)(bin = driver_alloc_binary(SHA256_LEN));
 
1395
       SHA256(buf, len, bin->orig_bytes);
 
1396
       return SHA256_LEN;
 
1397
       break;
 
1398
       
 
1399
    case DRV_SHA256_INIT:
 
1400
       *rbuf = (char *)(bin = driver_alloc_binary(SHA256_CTX_LEN));
 
1401
       SHA256_Init((SHA256_CTX *)bin->orig_bytes);
 
1402
       return SHA256_CTX_LEN;           
 
1403
       break;
 
1404
 
 
1405
    case DRV_SHA256_UPDATE:
 
1406
       if (len < SHA256_CTX_LEN)
 
1407
          return -1;
 
1408
       *rbuf = (char *)(bin = driver_alloc_binary(SHA256_CTX_LEN)); 
 
1409
       memcpy(bin->orig_bytes, buf, SHA256_CTX_LEN);
 
1410
       SHA256_Update((SHA256_CTX *)bin->orig_bytes, buf + SHA256_CTX_LEN, 
 
1411
                     len - SHA256_CTX_LEN);
 
1412
       return SHA256_CTX_LEN;           
 
1413
       break;
 
1414
 
 
1415
    case DRV_SHA256_FINAL:
 
1416
       if (len != SHA256_CTX_LEN)
 
1417
          return -1;
 
1418
       memcpy(&sha256_ctx, buf, SHA256_CTX_LEN); /* XXX Use buf only? */
 
1419
       *rbuf = (char *)(bin = driver_alloc_binary(SHA256_LEN));
 
1420
       SHA256_Final(bin->orig_bytes, &sha256_ctx);
 
1421
       return SHA256_LEN;
 
1422
       break;
 
1423
 
 
1424
    case DRV_SHA512:
 
1425
       *rbuf = (char *)(bin = driver_alloc_binary(SHA512_LEN));
 
1426
       SHA512(buf, len, bin->orig_bytes);
 
1427
       return SHA512_LEN;
 
1428
       break;
 
1429
       
 
1430
    case DRV_SHA512_INIT:
 
1431
       *rbuf = (char *)(bin = driver_alloc_binary(SHA512_CTX_LEN));
 
1432
       SHA512_Init((SHA512_CTX *)bin->orig_bytes);
 
1433
       return SHA512_CTX_LEN;           
 
1434
       break;
 
1435
       
 
1436
    case DRV_SHA512_UPDATE:
 
1437
       if (len < SHA512_CTX_LEN)
 
1438
          return -1;
 
1439
       *rbuf = (char *)(bin = driver_alloc_binary(SHA512_CTX_LEN)); 
 
1440
       memcpy(bin->orig_bytes, buf, SHA512_CTX_LEN);
 
1441
       SHA512_Update((SHA512_CTX *)bin->orig_bytes, buf + SHA512_CTX_LEN, 
 
1442
                     len - SHA512_CTX_LEN);
 
1443
       return SHA512_CTX_LEN;           
 
1444
       break;
 
1445
       
 
1446
    case DRV_SHA512_FINAL:
 
1447
       if (len != SHA512_CTX_LEN)
 
1448
          return -1;
 
1449
       memcpy(&sha512_ctx, buf, SHA512_CTX_LEN); /* XXX Use buf only? */
 
1450
       *rbuf = (char *)(bin = driver_alloc_binary(SHA512_LEN));
 
1451
       SHA512_Final(bin->orig_bytes, &sha512_ctx);
 
1452
       return SHA512_LEN;               
 
1453
       break;
 
1454
#endif
 
1455
       
788
1456
    case DRV_INFO_LIB:  
789
 
        {/* <<DrvVer:8, NameSize:8, Name:NameSize/binary, VerNum:32, VerStr/binary>> */
790
 
            static const char libname[] = "OpenSSL";
791
 
            unsigned name_sz = strlen(libname);
792
 
            const char* ver = SSLeay_version(SSLEAY_VERSION);
793
 
            unsigned ver_sz = strlen(ver);
794
 
            *rbuf = (char*)(bin = driver_alloc_binary(1+1+name_sz+4+ver_sz));
795
 
            p = bin->orig_bytes;
796
 
            *p++ = 0; /* "driver version" for future use */
797
 
            *p++ = name_sz;
798
 
            memcpy(p, libname, name_sz);
799
 
            p += name_sz;
800
 
            put_int32(p,SSLeay()); /* OPENSSL_VERSION_NUMBER */
801
 
            p += 4;
802
 
            memcpy(p, ver, ver_sz);
803
 
        }
804
 
        return bin->orig_size; 
 
1457
       {/* <<DrvVer:8, NameSize:8, Name:NameSize/binary, VerNum:32, VerStr/binary>> */
 
1458
          static const char libname[] = "OpenSSL";
 
1459
          unsigned name_sz = strlen(libname);
 
1460
          const char* ver = SSLeay_version(SSLEAY_VERSION);
 
1461
          unsigned ver_sz = strlen(ver);
 
1462
          *rbuf = (char*)(bin = driver_alloc_binary(1+1+name_sz+4+ver_sz));
 
1463
          if (bin==NULL) return -1;
 
1464
          p = bin->orig_bytes;
 
1465
          *p++ = 0; /* "driver version" for future use */
 
1466
          *p++ = name_sz;
 
1467
          memcpy(p, libname, name_sz);
 
1468
          p += name_sz;
 
1469
          put_int32(p,SSLeay()); /* OPENSSL_VERSION_NUMBER */
 
1470
          p += 4;
 
1471
          memcpy(p, ver, ver_sz);
 
1472
       }
 
1473
       return bin->orig_size; 
805
1474
 
806
1475
    default:
807
 
        break;
 
1476
       break;
808
1477
    }
809
1478
    return -1;
810
1479
}