ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenSSL/OpenSSL.xs
Revision: 1.2
Committed: Sat Oct 27 02:40:45 2001 UTC (22 years, 6 months ago) by root
Branch: MAIN
Changes since 1.1: +15 -14 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 stefan 1.1 #include "EXTERN.h"
2     #include "perl.h"
3     #include "XSUB.h"
4    
5     #include <openssl/bio.h>
6     #include <openssl/err.h>
7     #include <openssl/pem.h>
8     #include <openssl/evp.h>
9     #include <openssl/hmac.h>
10     #include <openssl/x509.h>
11     #include <openssl/x509v3.h>
12     #include <openssl/asn1.h>
13     #include <openssl/bn.h>
14     #include <openssl/pkcs12.h>
15     #include <openssl/rand.h>
16     #include <sys/types.h>
17     #include <openssl/md2.h>
18     #include <openssl/md4.h>
19     #include <openssl/md5.h>
20     #include <openssl/mdc2.h>
21     #include <openssl/ripemd.h>
22     #include <openssl/bn.h>
23     #include <openssl/rsa.h>
24     #include <openssl/sha.h> // fingerprint.
25     #include <openssl/blowfish.h> // single packet blowfish encoding.
26     #include <openssl/rand.h> // random generator.
27    
28     //#define EDEBUG 1
29     #ifdef EDEBUG
30     #define XD(...) fprintf(stderr, __VA_ARGS__); fflush(stderr)
31     #else
32     #define XD(...)
33     #endif
34    
35     static const char *ssl_error(void);
36    
37     #define GEN_INPUT(type,class) \
38     static inline type * input_##type(SV *sv) { \
39     XD("GEN_INPUT " class " sv=%p\n", sv); \
40     if(sv_derived_from(sv, class)) \
41     return (type *) SvIV(SvRV(sv)); \
42     croak("Not a reference to a " class " object"); \
43     return (type *) 0; }
44    
45    
46     #define GEN_OUTPUT(type,class) \
47     static inline SV* output_##type(type *foobar, SV *sv) { \
48     XD("GEN_OUTPUT " class " sv=%p\n", sv); \
49     return sv_setref_pv(sv, class, (void *) foobar); \
50     }
51    
52    
53     #define GEN_IO(type,class) \
54     GEN_INPUT(type,class) \
55     GEN_OUTPUT(type,class)
56    
57    
58     GEN_IO(X509,"OpenSSL::X509")
59     GEN_IO(X509_CRL,"OpenSSL::CRL")
60     GEN_IO(X509_NAME, "OpenSSL::Name")
61     GEN_IO(PKCS12, "OpenSSL::PKCS12")
62     GEN_IO(PKCS7, "OpenSSL::PKCS7")
63     GEN_IO(RSA, "OpenSSL::RSA")
64     GEN_IO(EVP_MD_CTX, "OpenSSL::Digest")
65     GEN_IO(EVP_CIPHER_CTX, "OpenSSL::Cipher")
66    
67 root 1.2 typedef X509 *OpenSSL__X509;
68 stefan 1.1
69     static inline SV* output_ASN1_INTEGER(ASN1_INTEGER *ai, SV *sv)
70     {
71     if(!ai)
72     croak("got 0-ptr");
73     if(ai->type != V_ASN1_INTEGER)
74     croak("not asn1 integer type (%d)", ai->type);
75     //return newSViv(ASN1_INTEGER_get(ai));
76     sv_setiv(sv, ASN1_INTEGER_get(ai));
77     return sv;
78     }
79    
80     static inline SV* output_ASN1_UTCTIME(ASN1_UTCTIME *s, SV *sv)
81     {
82     struct tm tm;
83     int offs;
84     char buf[64];
85    
86     if(!s)
87     croak("got 0-ptr");
88     if(s->type != V_ASN1_UTCTIME)
89     croak("not asn1 utctime type (%d)", s->type);
90     if(!ASN1_UTCTIME_check(s))
91     croak("invalid UTC time.");
92     // fuck openssl crap.
93     memset(&tm, 0, sizeof tm);
94     #define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
95     tm.tm_year=g2(s->data);
96     if(tm.tm_year < 50)
97     tm.tm_year+=100;
98     tm.tm_mon=g2(s->data+2)-1;
99     tm.tm_mday=g2(s->data+4);
100     tm.tm_hour=g2(s->data+6);
101     tm.tm_min=g2(s->data+8);
102     tm.tm_sec=g2(s->data+10);
103     if(s->data[12] == 'Z')
104     offs=0;
105     else
106     {
107     offs=g2(s->data+13)*60+g2(s->data+15);
108     if(s->data[12] == '-')
109     offs= -offs;
110     }
111     #undef g2
112     if(!strftime(buf, 63, "%a, %d %b %Y %H:%M:%S %z", &tm)) {
113     croak("can't convert time.");
114     }
115     sv_setpv(sv, buf);
116     return sv;
117     }
118    
119     long fuck_cb(struct bio_st *bm, int m, const char *ptr, int l, long x, long y)
120     {
121     if(m == BIO_CB_WRITE) {
122     SV *sv = (SV *) BIO_get_callback_arg(bm);
123     sv_catpvn(sv, ptr, l);
124     }
125     if(m == BIO_CB_PUTS) {
126     SV *sv = (SV *) BIO_get_callback_arg(bm);
127     l = strlen(ptr);
128     sv_catpvn(sv, ptr, l);
129     }
130     return l;
131     }
132    
133     static inline BIO* sv_bio_create(void)
134     {
135     SV *sv;
136     BIO *bio;
137     sv = newSVpvn("",0);
138     // mem is completely broken for write, so we use /dev/null
139     // and use callbacks-hooks
140     bio = BIO_new_file("/dev/null", "wb");
141     BIO_set_callback(bio, fuck_cb);
142     BIO_set_callback_arg(bio, (void *)sv);
143     return bio;
144     }
145    
146     static inline BIO *sv_bio_create_file(SV *filename)
147     {
148     char *fn;
149     STRLEN l;
150    
151     return BIO_new_file(SvPV(filename, l), "wb");
152     }
153    
154     static inline SV * sv_bio_final(BIO *bio)
155     {
156     SV* sv;
157    
158     BIO_flush(bio);
159     sv = (SV *) BIO_get_callback_arg(bio);
160     BIO_free_all (bio);
161     // check for file:
162     if(!sv)
163     sv = &PL_sv_undef;
164     return sv;
165     }
166    
167     static inline void sv_bio_error(BIO *bio)
168     {
169     SV *sv;
170     sv = (SV *) BIO_get_callback_arg(bio);
171     if(sv)
172     sv_free(sv);
173     BIO_free_all (bio);
174     }
175    
176     static const char *ssl_error(void) // function leaks. :(
177     {
178     BIO *bio;
179     SV *sv;
180     STRLEN l;
181    
182     bio = sv_bio_create();
183     ERR_print_errors(bio);
184     sv = sv_bio_final(bio);
185     ERR_clear_error();
186     return SvPV(sv, l);
187     }
188    
189     static inline SV* output_BN(BIGNUM *n, SV *sv)
190     {
191     if (!n)
192     croak("parse error :)");
193    
194     sv_setpvn(sv, BN_bn2dec(n), 0);
195     return sv;
196     }
197    
198     static const char * digcvt(char *ret, const char *from, int len)
199     {
200     static const char *htab = "0123456789abcdef";
201     char *to = ret;
202     int i;
203     for(i = 0; i < len; i++) {
204     *to++ = htab[(*from >> 4) & 0xf];
205     *to++ = htab[*from++ & 0xf];
206     }
207     *to = 0;
208     return ret;
209     }
210    
211     /* mutt, anything else is broken ! */
212     static const char B64Chars[64] = {
213     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
214     'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
215     'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
216     't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
217     '8', '9', '+', '/'
218     };
219    
220     static unsigned char *mutt_to_base64 (unsigned char *out, const unsigned char *in, size_t len,
221     size_t olen)
222     {
223     char *o = out;
224     while (len >= 3 && olen > 10)
225     {
226     *out++ = B64Chars[in[0] >> 2];
227     *out++ = B64Chars[((in[0] << 4) & 0x30) | (in[1] >> 4)];
228     *out++ = B64Chars[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
229     *out++ = B64Chars[in[2] & 0x3f];
230     olen -= 4;
231     len -= 3;
232     in += 3;
233     }
234    
235     /* clean up remainder */
236     if (len > 0 && olen > 4)
237     {
238     unsigned char fragment;
239    
240     *out++ = B64Chars[in[0] >> 2];
241     fragment = (in[0] << 4) & 0x30;
242     if (len > 1)
243     fragment |= in[1] >> 4;
244     *out++ = B64Chars[fragment];
245     *out++ = (len < 2) ? '=' : B64Chars[(in[1] << 2) & 0x3c];
246     *out++ = '=';
247     }
248     *out = '\0';
249     return o;
250     }
251    
252     static inline SV* hexsv(unsigned char *s, unsigned len)
253     {
254     char *ret;
255     SV *sv;
256     ret = malloc((len<<1)+1);
257     if(!ret)
258     croak("malloc");
259     sv = newSVpv(digcvt(ret, s,len), len <<1);
260     free(ret);
261     return sv;
262     }
263    
264     static inline SV* base64sv(unsigned char *s, unsigned len)
265     {
266     char *ret;
267     SV *sv;
268     int enc_cnt = ((len+ 2) / 3) << 2;
269     ret = malloc(enc_cnt+1);
270     if(!ret)
271     croak("malloc");
272     sv = newSVpv(mutt_to_base64(ret, s,len, enc_cnt+1), enc_cnt);
273     free(ret);
274     return sv;
275    
276     }
277    
278     #define FLAG_HEX 0x10
279     #define FLAG_BASE64 0x20
280     #define NO_FLAGS(x) ((x) &0xf)
281    
282     static EVP_MD *_mds[9];
283    
284     static int mds_booted = 0;
285    
286     static void mds_boot (void)
287     {
288     if(mds_booted)
289     return;
290     mds_booted = 1;
291     OpenSSL_add_all_digests();
292     _mds[0] = EVP_md2();
293     _mds[1] = EVP_md4();
294     _mds[2] = EVP_md5();
295     _mds[3] = EVP_sha();
296     _mds[4] = EVP_sha1();
297     _mds[5] = EVP_dss();
298     _mds[6] = EVP_dss1();
299     _mds[7] = EVP_mdc2();
300     _mds[8] = EVP_ripemd160();
301     }
302    
303    
304    
305     static char *
306     dofp(X509 *x509, EVP_MD *digest)
307     {
308     unsigned char md[EVP_MAX_MD_SIZE];
309     unsigned static char s[EVP_MAX_MD_SIZE*3];
310     int n, i;
311    
312     if(!X509_digest(x509, digest, md, &n))
313     croak("Digest error: %s", ssl_error());
314     for(i = 0; i < n; i++) {
315     sprintf(&s[i*3], "%02X%c", md[i], (i + 1 == (int) n) ? '\0' : ':');
316     }
317     return s;
318     }
319    
320     static inline char *ol(X509_NAME *x)
321     {
322     static char buf[256];
323     X509_NAME_oneline(x, buf, 256);
324     return buf;
325     }
326    
327     static void run_sha1(char *digest, const char *msg, int msglen)
328     {
329     SHA_CTX ctx;
330    
331     if(!digest || !msg || msglen < 0)
332     croak("run_sha1: null pointer or illegal message len");
333     SHA1_Init(&ctx);
334     SHA1_Update(&ctx, msg, msglen);
335     SHA1_Final(digest, &ctx);
336     }
337    
338     static bool is_privkey(RSA *key)
339     {
340     return (key->n && key->e && key->d && key->p && key->q
341     && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0;
342     }
343    
344     typedef struct {
345     EVP_CIPHER *func;
346     char name[20];
347     } cip_list_st;
348    
349     static cip_list_st cip_list[50];
350     static int cip_cnt = 0;
351    
352     static inline char *wappla_fixname(const char *s)
353     {
354     static char x[50];
355     char *p;
356     strcpy(x, s);
357     while((p = strchr(x, '_'))) {
358     *p = '-';
359     }
360     return x;
361     }
362    
363     static inline EVP_CIPHER *lookup_cipher(const char *name)
364     {
365     int i;
366     for(i = 0; i < cip_cnt;i++)
367     if(!strcmp(name, cip_list[i].name))
368     return cip_list[i].func;
369     return 0;
370     }
371    
372     #define ADD_C_(x) cip_list[cip_cnt].func = (EVP_##x()); \
373     strcpy(cip_list[cip_cnt++].name, wappla_fixname(#x))
374    
375     static int cipher_booted = 0;
376    
377     static void cipher_boot(void)
378     {
379     if(cipher_booted)
380     return;
381     cipher_booted++;
382     OpenSSL_add_all_ciphers();
383     #ifndef NO_DES
384     ADD_C_(des_ecb); ADD_C_(des_ede); ADD_C_(des_ede3);
385     ADD_C_(des_cfb); ADD_C_(des_ede_cfb); ADD_C_(des_ede3_cfb);
386     ADD_C_(des_ofb); ADD_C_(des_ede_ofb); ADD_C_(des_ede3_ofb);
387     ADD_C_(des_cbc); ADD_C_(des_ede_cbc); ADD_C_(des_ede3_cbc);
388     ADD_C_(desx_cbc);
389     #endif
390     #ifndef NO_RC4
391     ADD_C_(rc4); ADD_C_(rc4_40);
392     #endif
393     #ifndef NO_IDEA
394     ADD_C_(idea_ecb); ADD_C_(idea_cfb);
395     ADD_C_(idea_ofb); ADD_C_(idea_cbc);
396     #endif
397     #ifndef NI_RC2
398     ADD_C_(rc2_ecb); ADD_C_(rc2_cbc); ADD_C_(rc2_40_cbc);
399     ADD_C_(rc2_64_cbc); ADD_C_(rc2_cfb); ADD_C_(rc2_ofb);
400     #endif
401     #ifndef NO_BF
402     ADD_C_(bf_ecb); ADD_C_(bf_cbc);
403     ADD_C_(bf_cfb); ADD_C_(bf_ofb);
404     #endif
405     #ifndef NO_CAST
406     ADD_C_(cast5_ecb); ADD_C_(cast5_cbc);
407     ADD_C_(cast5_cfb); ADD_C_(cast5_ofb);
408     #endif
409     #ifndef NO_RC5
410     ADD_C_(rc5_32_12_16_cbc); ADD_C_(rc5_32_12_16_ecb);
411     ADD_C_(rc5_32_12_16_cfb); ADD_C_(rc5_32_12_16_ofb);
412     #endif
413     }
414    
415    
416     MODULE = OpenSSL PACKAGE = OpenSSL::RSA
417    
418     void
419     new_keygen(bits = 128, e = 35)
420     IV bits
421     IV e
422     PREINIT:
423     RSA *key;
424     PPCODE:
425     if(!(key = RSA_generate_key(bits, e, NULL, NULL)))
426     croak("RSA_generate_key");
427     EXTEND(sp, 1);
428     PUSHs(sv_newmortal());
429     sv_setref_pv(ST(0), "OpenSSL::RSA", (void *) key);
430    
431     void
432     new_pubkey(n, e)
433     char *n
434     char *e
435     PREINIT:
436     RSA *key;
437     PPCODE:
438     EXTEND(sp, 1);
439     PUSHs(sv_newmortal());
440     key = RSA_new();
441     if (!key)
442     croak("can't allocate key");
443     if(!(key->n = BN_new()) || !BN_dec2bn(&key->n, n)) {
444     RSA_free(key); croak("can't initialize n");
445     }
446     if(!(key->e = BN_new()) || !BN_dec2bn(&key->e, e)) {
447     RSA_free(key); croak("can't initialize e");
448     }
449     //key->p = 0, key->q = 0, key->dmp1 = 0, key->dmq1 = 0, key->iqmp = 0;
450     sv_setref_pv(ST(0), "OpenSSL::RSA", (void *) key);
451    
452    
453     void
454     new_privkey(n, e, p, q, dmp1, dmq1, iqmp, d)
455     char *n
456     char *e
457     char *p
458     char *q
459     char *dmp1
460     char *dmq1
461     char *iqmp
462     char *d
463     PREINIT:
464     RSA *key;
465     int rc;
466     PPCODE:
467     EXTEND(sp, 1);
468     PUSHs(sv_newmortal());
469     key = RSA_new();
470     if (!key)
471     croak("can't allocate key");
472     if(!(key->n = BN_new()) || !BN_dec2bn(&key->n, n)) {
473     RSA_free(key); croak("can't initialize n");
474     }
475     if(!(key->e = BN_new()) || !BN_dec2bn(&key->e, e)) {
476     RSA_free(key); croak("can't initialize e");
477     }
478     if(!(key->p = BN_new()) || !BN_dec2bn(&key->p, p)) {
479     RSA_free(key); croak("can't initialize p");
480     }
481     if(!(key->q = BN_new()) || !BN_dec2bn(&key->q, q)) {
482     RSA_free(key); croak("can't initialize q");
483     }
484     if(!(key->dmp1 = BN_new()) || !BN_dec2bn(&key->dmp1, dmp1)) {
485     RSA_free(key); croak("can't initialize dmp1");
486     }
487     if(!(key->dmq1 = BN_new()) || !BN_dec2bn(&key->dmq1, dmq1)) {
488     RSA_free(key); croak("can't initialize dmq1");
489     }
490     if(!(key->iqmp = BN_new()) || !BN_dec2bn(&key->iqmp, iqmp)) {
491     RSA_free(key); croak("can't initialize iqmp");
492     }
493     if(!(key->d = BN_new()) || !BN_dec2bn(&key->d, d)) {
494     RSA_free(key); croak("can't initialize d");
495     }
496     if((rc = RSA_check_key(key)) != 1) {
497     RSA_free(key); croak("RSA_check_key failed (%d).", rc);
498     }
499     sv_setref_pv(ST(0), "OpenSSL::RSA", (void *) key);
500    
501    
502     void
503     DESTROY(key)
504     RSA* key
505     CODE:
506     if (key) {
507     XD("RSA_free(%p)\n", key);
508     RSA_free(key);
509     }
510    
511     IV
512     keysize(key)
513     RSA *key;
514     CODE:
515     if (!key || !key->n)
516     croak("invalid key");
517     RETVAL = BN_num_bits(key->n);
518     OUTPUT:
519     RETVAL
520    
521     bool
522     check_key(key)
523     RSA *key;
524     PPCODE:
525     if(!key)
526     XSRETURN_NO;
527     if(RSA_check_key(key) == 1)
528     XSRETURN_YES;
529     XSRETURN_NO;
530    
531    
532     BIGNUM *
533     n(key)
534     RSA *key;
535     ALIAS:
536     e = 1
537     d = 2
538     p = 3
539     q = 4
540     dmp1 = 5
541     dmq1 = 6
542     iqmp = 7
543     PREINIT:
544     BIGNUM *bn = 0;
545     CODE:
546     if(!key)
547     croak("invalid key");
548     switch(ix) {
549     case 0: bn = key->n; break;
550     case 1: bn = key->e; break;
551     case 2: bn = key->d; break;
552     case 3: bn = key->p; break;
553     case 4: bn = key->q; break;
554     case 5: bn = key->dmp1; break;
555     case 6: bn = key->dmq1; break;
556     case 7: bn = key->iqmp; break;
557     default:
558     croak("huch");
559     }
560     if(!bn)
561     croak("bignum not defined (maybe pubkey ?)");
562     RETVAL = bn;
563     OUTPUT:
564     RETVAL
565    
566    
567     bool
568     is_privkey(key)
569     RSA *key;
570     CODE:
571     RETVAL = is_privkey(key);
572     OUTPUT:
573     RETVAL
574    
575     void
576     STORABLE_thaw(osv, cloning, sv)
577     SV *osv
578     bool cloning
579     SV *sv
580     PREINIT:
581     STRLEN len;
582     char *p;
583     unsigned int *i;
584     RSA *key = NULL;
585     PPCODE:
586     if(cloning)
587     return;
588     i = (unsigned int *) SvPV(sv, len);
589     if(i[2] == 0xffffffff) {
590     // public key
591     key = RSA_new();
592     p = (char *) &i[3];
593     key->n = BN_bin2bn(p, i[0], NULL);
594     key->e = BN_bin2bn(&p[i[0]], i[1], NULL);
595     } else if (i[8] == 0xffffffff) {
596     // private key
597     key = RSA_new();
598     p = (char *) &i[9];
599     key->n = BN_bin2bn(p, i[0], NULL);
600     p += i[0];
601     key->e = BN_bin2bn(p, i[1], NULL);
602     p += i[1];
603     key->d = BN_bin2bn(p, i[2], NULL);
604     p += i[2];
605     key->p = BN_bin2bn(p, i[3], NULL);
606     p += i[3];
607     key->q = BN_bin2bn(p, i[4], NULL);
608     p += i[4];
609     key->dmp1 = BN_bin2bn(p, i[5], NULL);
610     p += i[5];
611     key->dmq1 = BN_bin2bn(p, i[6], NULL);
612     p += i[6];
613     key->iqmp = BN_bin2bn(p, i[7], NULL);
614     }
615     if(!key)
616     croak("Illegal Storable format.");
617     sv_setiv(SvRV(osv), (IV) key);
618     //sv_setref_pv(SvRV(osv), "OpenSSL::RSA", newRV_noinc((void *) key);
619     //sv_setiv(osv, (IV) key);
620    
621    
622    
623     void
624     STORABLE_freeze(key, cloning)
625     RSA *key
626     bool cloning
627     PREINIT:
628     SV *sv;
629     STRLEN totlen;
630     PPCODE:
631     if(cloning)
632     return;
633     totlen = BN_num_bytes(key->n) + BN_num_bytes(key->e) + 3*sizeof(int);
634     if(!is_privkey(key)) {
635     int *y = malloc(totlen);
636     int *x = y;
637     char *p;
638     *x++ = BN_num_bytes(key->n);
639     *x++ = BN_num_bytes(key->e);
640     *x++ = 0xffffffff;
641     p = (char *) x;
642     p += BN_bn2bin(key->n, p);
643     p += BN_bn2bin(key->e, p);
644     XPUSHs(sv_2mortal(newSVpvn((char *)y, p - (char *) y)));
645     free(y);
646     } else {
647     int *y, *x;
648     char *p;
649     totlen += BN_num_bytes(key->d)
650     + BN_num_bytes(key->p)
651     + BN_num_bytes(key->q)
652     + BN_num_bytes(key->dmp1)
653     + BN_num_bytes(key->dmq1)
654     + BN_num_bytes(key->iqmp) + 6*sizeof(int);
655     y = malloc(totlen);
656     x = y;
657     *x++ = BN_num_bytes(key->n);
658     *x++ = BN_num_bytes(key->e);
659     *x++ = BN_num_bytes(key->d);
660     *x++ = BN_num_bytes(key->p);
661     *x++ = BN_num_bytes(key->q);
662     *x++ = BN_num_bytes(key->dmp1);
663     *x++ = BN_num_bytes(key->dmq1);
664     *x++ = BN_num_bytes(key->iqmp);
665     *x++ = 0xffffffff;
666     p = (char *) x;
667     p += BN_bn2bin(key->n, p);
668     p += BN_bn2bin(key->e, p);
669     p += BN_bn2bin(key->d, p);
670     p += BN_bn2bin(key->p, p);
671     p += BN_bn2bin(key->q, p);
672     p += BN_bn2bin(key->dmp1, p);
673     p += BN_bn2bin(key->dmq1, p);
674     p += BN_bn2bin(key->iqmp, p);
675     XPUSHs(sv_2mortal(newSVpvn((char *)y, p - (char *) y)));
676     free(y);
677     }
678    
679    
680     SV *
681     public_encrypt(key, sv)
682     RSA *key;
683     SV *sv;
684     ALIAS:
685     encrypt = 4
686     public_decrypt = 1
687     verify = 5
688     private_encrypt = 2
689     sign = 6
690     private_decrypt = 3
691     decrypt = 7
692     PREINIT:
693     static int (*func[4])(int, unsigned char *, unsigned char *, RSA *, int) = { RSA_public_encrypt, RSA_public_decrypt, RSA_private_encrypt, RSA_private_decrypt };
694     STRLEN len;
695     int keylen;
696     char *p;
697     char *out;
698     STRLEN rc;
699     CODE:
700     if(!SvPOK(sv))
701     croak ("need a string.");
702     p = SvPV(sv, len);
703     keylen = BN_num_bits(key->n);
704     if(!p || len < 1 || (len*8 > (keylen+7)&~0x7))
705     croak("illegal value");
706     RETVAL = NEWSV(0, len + keylen);
707     SvPOK_only(RETVAL);
708     SvCUR_set(RETVAL, len + keylen);
709     out = SvPV_nolen(RETVAL);
710     if((ix&0x3) > 1 && !is_privkey(key))
711     croak("need a private key.");
712     rc = func[ix&0x3](len, p, out, key, RSA_PKCS1_PADDING);
713     if(rc < 0) {
714     sv_free(RETVAL);
715     RETVAL = &PL_sv_undef;
716     croak("crypto error... rc=%d inlen=%d", rc, len);
717     }
718     SvCUR_set(RETVAL, rc);
719     OUTPUT:
720     RETVAL
721    
722    
723     void
724     fingerprint(key)
725     RSA *key
726     PREINIT:
727     char *x;
728     char dig[SHA_DIGEST_LENGTH];
729     int nlen, elen;
730     PPCODE:
731     nlen = BN_num_bytes(key->n);
732     elen = BN_num_bytes(key->e);
733     x = malloc(nlen + elen);
734     if(!x)
735     croak("malloc error");
736     BN_bn2bin(key->n, x);
737     BN_bn2bin(key->e, &x[nlen]);
738     //un_sha1(dig, x, nlen+elen);
739     free(x);
740     XPUSHs(sv_2mortal(newSVpvn(dig, SHA_DIGEST_LENGTH)));
741    
742     MODULE = OpenSSL PACKAGE = OpenSSL::Name
743    
744     PROTOTYPES: ENABLE
745    
746     void
747     new_name()
748     PREINIT:
749     X509_NAME *name;
750     PPCODE:
751     if(!(name = X509_NAME_new())) {
752     croak("X509_NAME_new");
753     }
754     EXTEND(sp, 1);
755     PUSHs(sv_newmortal());
756     sv_setref_pv(ST(0), "OpenSSL::Name", (void *) name);
757    
758    
759     void
760     add(name, key, string)
761     X509_NAME *name
762     SV *key
763     SV *string
764     PREINIT:
765     STRLEN l, kl;
766     char *p, *k;
767     int ok;
768     PPCODE:
769     p = SvPV(string, l);
770     if(SvIOK(key)) {
771     ok = X509_NAME_add_entry_by_NID(name, SvIV(key), MBSTRING_ASC, p, -1, -1, 0);
772     } else {
773     k = SvPV(key, kl);
774     ok = X509_NAME_add_entry_by_txt(name, k, MBSTRING_ASC, p, -1, -1, 0);
775     }
776     if(!ok)
777     croak("X509_NAME_add_entry_by_*: %s", ssl_error());
778    
779     IV
780     count(name)
781     X509_NAME *name
782     CODE:
783     RETVAL = X509_NAME_entry_count(name);
784     OUTPUT:
785     RETVAL
786    
787     void
788     getall(name)
789     X509_NAME *name
790     PREINIT:
791     int cnt, i;
792     X509_NAME_ENTRY *e;
793     int nid;
794     ASN1_STRING *s;
795     PPCODE:
796     cnt = X509_NAME_entry_count(name);
797     EXTEND(SP, cnt<<1);
798     for(i = 0; i < cnt; i++) {
799     e = X509_NAME_get_entry(name, i);
800     if(!e)
801     croak("X509_NAME_get_entry");
802     nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e));
803     s = X509_NAME_ENTRY_get_data(e);
804     PUSHs(sv_2mortal(newSVpv(OBJ_nid2ln(nid),0)));
805     PUSHs(sv_2mortal(newSVpvn(s->data, s->length)));
806     }
807    
808    
809    
810    
811    
812     void
813     DESTROY(name)
814     X509_NAME *name
815     CODE:
816     if(name) {
817     XD("X509_NAME_free(%p)\n", name);
818     X509_NAME_free(name);
819     }
820    
821    
822     MODULE = OpenSSL PACKAGE = OpenSSL::Rand
823    
824     PROTOTYPES: ENABLE
825    
826     BOOT:
827     {
828     int fd;
829     int rc;
830     ERR_load_RAND_strings();
831     fd = open("/dev/urandom", O_RDONLY);
832     if(fd != -1) {
833     char buf[64];
834     rc = read(fd, buf, 64);
835     if(rc < 1) {
836     warn ("read /dev/urandom");
837     } else {
838     RAND_seed(buf, rc);
839     }
840     close(fd);
841     } else {
842     warn ("can't open /dev/urandom");
843     }
844     }
845    
846    
847    
848     SV *
849     randbytes(nr)
850     IV nr
851     ALIAS:
852     randbytes_hex = 1
853     randbytes_base64 = 2
854     PREINIT:
855     char *p;
856     int rc;
857     CODE:
858     p = malloc(nr+1);
859     if(!p)
860     croak("malloc failed");
861     rc = RAND_bytes(p, nr);
862     if(rc != 1) {
863     free(p);
864     croak("RAND_bytes returned %d", rc);
865     }
866     switch(ix) {
867     case 0:
868     RETVAL = newSVpvn(p, nr);
869     break;
870     case 1:
871     RETVAL = hexsv(p, nr);
872     break;
873     default:
874     RETVAL = base64sv(p, nr);
875     break;
876     }
877     free(p);
878     OUTPUT:
879     RETVAL
880    
881    
882     MODULE = OpenSSL PACKAGE = OpenSSL::X509
883    
884     PROTOTYPES: ENABLE
885    
886     BOOT:
887     {
888     // We have joy we have fun we have seasons in the sun...
889     OpenSSL_add_all_algorithms();
890     OpenSSL_add_all_ciphers();
891     OpenSSL_add_all_digests();
892     SSL_load_error_strings();
893     ERR_load_PEM_strings();
894     ERR_load_PKCS7_strings();
895     ERR_load_PKCS12_strings();
896     ERR_load_ASN1_strings();
897     ERR_load_crypto_strings();
898     ERR_load_RAND_strings();
899     ERR_load_X509_strings();
900     ERR_load_X509V3_strings();
901     ERR_load_DH_strings();
902     ERR_load_DSA_strings();
903     ERR_load_RSA_strings();
904     }
905    
906    
907     void
908     new_X509()
909     PREINIT:
910     X509 *x509;
911     PPCODE:
912     if((x509=X509_new()) == NULL)
913     croak("X509_new");
914     if(!X509_set_version(x509, 2)) {
915     X509_free(x509);
916     croak("X509_set_version");
917     }
918     ASN1_INTEGER_set(X509_get_serialNumber(x509),0L);
919     EXTEND(sp, 1);
920     PUSHs(sv_newmortal());
921     sv_setref_pv(ST(0), "OpenSSL::X509", (void *) x509);
922    
923    
924     void
925     new_from_string(thing)
926     SV *thing
927     ALIAS:
928     new_from_file = 1
929     PREINIT:
930     BIO *bio;
931     X509 *x509;
932     STRLEN l;
933     char *p, *q = 0;
934     PPCODE:
935     p = SvPV(thing, l);
936     if(ix == 1) {
937     bio = BIO_new_file(p, "r");
938     } else {
939     bio = BIO_new_mem_buf (p, l);
940     }
941     if(!bio)
942     croak(ssl_error());
943    
944     x509 = PEM_read_bio_X509 (bio, 0, 0, 0);
945     BIO_free (bio);
946     if(!x509)
947     croak("PEM_read_bio_X509: %s", ssl_error());
948    
949     EXTEND(sp, 1);
950     PUSHs(sv_newmortal());
951     sv_setref_pv(ST(0), "OpenSSL::X509", (void *) x509);
952    
953     void
954     DESTROY(x509)
955 root 1.2 OpenSSL::X509 x509
956 stefan 1.1 CODE:
957     if (x509) {
958     XD("X509_free(%p)\n", x509);
959     X509_free(x509);
960     x509 = 0;
961     }
962    
963    
964     char *
965     fingerprint_md5(x509)
966 root 1.2 OpenSSL::X509 x509
967 stefan 1.1 ALIAS:
968     fingerprint_md2 = 1
969     fingerprint_mdc2 = 2
970     fingerprint_sha1 = 3
971     PREINIT:
972     EVP_MD *mds[] = { EVP_md5(), EVP_md2(), EVP_mdc2(), EVP_sha1() };
973     CODE:
974     RETVAL = dofp(x509, mds[ix]);
975     OUTPUT:
976     RETVAL
977    
978    
979     X509_NAME *
980     subject(x509)
981 root 1.2 OpenSSL::X509 x509
982 stefan 1.1 CODE:
983     RETVAL = X509_get_subject_name(x509);
984     OUTPUT:
985     RETVAL
986    
987     X509_NAME *
988     issuer(x509)
989 root 1.2 OpenSSL::X509 x509
990 stefan 1.1 CODE:
991     RETVAL = X509_get_issuer_name(x509);
992     OUTPUT:
993     RETVAL
994    
995    
996     char *
997     subject_txt(x509)
998 root 1.2 OpenSSL::X509 x509
999 stefan 1.1 CODE:
1000     RETVAL = ol(X509_get_subject_name(x509));
1001     OUTPUT:
1002     RETVAL
1003    
1004    
1005     char *
1006     issuer_txt(x509)
1007 root 1.2 OpenSSL::X509 x509
1008 stefan 1.1 CODE:
1009     RETVAL = ol(X509_get_issuer_name(x509));
1010     OUTPUT:
1011     RETVAL
1012    
1013     ASN1_INTEGER *
1014     serial(x509)
1015 root 1.2 OpenSSL::X509 x509
1016 stefan 1.1 CODE:
1017     RETVAL = X509_get_serialNumber(x509);
1018     OUTPUT:
1019     RETVAL
1020    
1021    
1022     int
1023     version(x509)
1024 root 1.2 OpenSSL::X509 x509
1025 stefan 1.1 CODE:
1026     RETVAL = X509_get_version(x509);
1027     OUTPUT:
1028     RETVAL
1029    
1030     ASN1_UTCTIME *
1031     notBefore(x509)
1032 root 1.2 OpenSSL::X509 x509
1033 stefan 1.1 CODE:
1034     RETVAL = X509_get_notBefore(x509);
1035     OUTPUT:
1036     RETVAL
1037    
1038     ASN1_UTCTIME *
1039     notAfter(x509)
1040 root 1.2 OpenSSL::X509 x509
1041 stefan 1.1 CODE:
1042     RETVAL = X509_get_notAfter(x509);
1043     OUTPUT:
1044     RETVAL
1045    
1046     int
1047     cert_type(x509)
1048 root 1.2 OpenSSL::X509 x509
1049 stefan 1.1 CODE:
1050     RETVAL = X509_certificate_type(x509, 0);
1051     OUTPUT:
1052     RETVAL
1053    
1054     SV*
1055     as_string(x509,...)
1056 root 1.2 OpenSSL::X509 x509
1057 stefan 1.1 ALIAS:
1058     as_file = 1
1059     PROTOTYPE: $;$
1060     PREINIT:
1061     BIO *bio;
1062     CODE:
1063     if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1064     croak("OpenSSL::X509::%s: illegal/missing args", (ix == 1) ? "as_file" : " as_string");
1065     if(items > 1) {
1066     bio = sv_bio_create_file(ST(1));
1067     } else {
1068     bio = sv_bio_create();
1069     }
1070     if(!bio)
1071     croak("sv_bio_create");
1072     if(!PEM_write_bio_X509(bio, x509)) {
1073     sv_bio_error(bio);
1074     croak("PEM_write_bio_X509: %s", ssl_error());
1075     }
1076     RETVAL = sv_bio_final(bio);
1077     OUTPUT:
1078     RETVAL
1079    
1080     SV*
1081     info(x509)
1082 root 1.2 OpenSSL::X509 x509
1083 stefan 1.1 PREINIT:
1084     BIO *bio;
1085     CODE:
1086     bio = sv_bio_create();
1087     if(!X509_print(bio,x509)) {
1088     sv_bio_error(bio);
1089     croak("X509_print: %s", ssl_error());
1090     }
1091     RETVAL = sv_bio_final(bio);
1092     OUTPUT:
1093     RETVAL
1094    
1095     void
1096     set_issuer(x509,name)
1097     X509 *x509
1098     X509_NAME *name
1099     CODE:
1100     X509_set_issuer_name(x509, X509_NAME_dup(name));
1101    
1102     void
1103     set_subject(x509,name)
1104     X509 *x509
1105     X509_NAME *name
1106     CODE:
1107     X509_set_subject_name(x509, X509_NAME_dup(name));
1108    
1109     SV *
1110     errstring(x509)
1111 root 1.2 OpenSSL::X509 x509
1112 stefan 1.1 PREINIT:
1113     BIO *bio;
1114     CODE:
1115     bio = sv_bio_create();
1116     ERR_print_errors(bio);
1117     RETVAL = sv_bio_final(bio);
1118     ERR_clear_error();
1119     OUTPUT:
1120     RETVAL
1121    
1122    
1123     MODULE = OpenSSL PACKAGE = OpenSSL::Cipher
1124    
1125     PROTOTYPES: ENABLE
1126    
1127     BOOT:
1128     {
1129     cipher_boot();
1130     }
1131    
1132     void
1133     DESTROY(ctx)
1134     EVP_CIPHER_CTX *ctx
1135     CODE:
1136     if(ctx) {
1137     EVP_CIPHER_CTX_cleanup(ctx);
1138     free(ctx);
1139     }
1140    
1141     void
1142     new_decrypt(...)
1143     ALIAS:
1144     new_encrypt = 1
1145     PREINIT:
1146     char *name;
1147     SV *svkey;
1148     EVP_CIPHER *ci;
1149     EVP_CIPHER_CTX *ctx;
1150     char *key;
1151     char iv[EVP_MAX_IV_LENGTH];
1152     char k[EVP_MAX_KEY_LENGTH];
1153     int rc;
1154     STRLEN keylen;
1155     PPCODE:
1156     if(items < 2 || items > 3) {
1157     croak("usage: new_[en|de]crypt(ciphname,key)");
1158     }
1159     name = SvPV_nolen(ST(items -2));
1160     svkey = ST(items - 1);
1161     memset(iv, 0, EVP_MAX_IV_LENGTH);
1162     memset(k, 0, EVP_MAX_KEY_LENGTH);
1163    
1164     if(!(ci = lookup_cipher(name)))
1165     croak("OpenSSL::Cipher::new: no such cipher \"%s\"", name);
1166     ctx = (EVP_CIPHER_CTX *) malloc(sizeof(EVP_CIPHER_CTX));
1167     if(!ctx)
1168     croak("malloc error");
1169     key = SvPV(svkey, keylen);
1170     memcpy(k, key, (keylen <= ci->key_len) ? keylen : ci->key_len);
1171     rc = EVP_CipherInit(ctx, ci, k, iv, ix);
1172     memset(iv, 0, EVP_MAX_IV_LENGTH);
1173     memset(iv, 0, EVP_MAX_KEY_LENGTH);
1174     if(!rc) {
1175     free(ctx);
1176     croak("EVP_CipherInit");
1177     }
1178     EXTEND(sp, 1);
1179     PUSHs(sv_newmortal());
1180     sv_setref_pv(ST(0), "OpenSSL::Cipher", (void *) ctx);
1181    
1182    
1183     SV *
1184     update(ctx,svin)
1185     EVP_CIPHER_CTX *ctx
1186     SV *svin
1187     PREINIT:
1188     unsigned char *in, *out;
1189     STRLEN il, ol;
1190     CODE:
1191     in = SvPV(svin, il);
1192     ol = (il + 63) & ~63;
1193     RETVAL = NEWSV(0, ol);
1194     SvPOK_only(RETVAL);
1195     SvCUR_set(RETVAL, ol);
1196     out = SvPV_nolen(RETVAL);
1197     if(!out)
1198     croak("memory");
1199     if(!EVP_CipherUpdate(ctx, out, &ol, in, il)) {
1200     sv_free(RETVAL);
1201     croak("EVP_CipherUpdate");
1202     }
1203     SvCUR_set(RETVAL, ol);
1204     OUTPUT:
1205     RETVAL
1206    
1207     SV *
1208     final(ctx)
1209     EVP_CIPHER_CTX *ctx
1210     PREINIT:
1211     STRLEN ol;
1212     unsigned char *out;
1213     CODE:
1214     ol = 256;
1215     RETVAL = NEWSV(0, ol);
1216     SvPOK_only(RETVAL);
1217     SvCUR_set(RETVAL, ol);
1218     out = SvPV_nolen(RETVAL);
1219     if(!out)
1220     croak("memory");
1221     if(!EVP_CipherFinal(ctx, out, &ol)) {
1222     sv_free(RETVAL);
1223     croak("EVP_CipherFinal %s", ssl_error());
1224     }
1225     SvCUR_set(RETVAL, ol);
1226     OUTPUT:
1227     RETVAL
1228    
1229     void
1230     enum_ciphers()
1231     PREINIT:
1232     int i;
1233     PPCODE:
1234     EXTEND(SP, cip_cnt<<1);
1235     for(i = 0; i < cip_cnt; i++) {
1236     PUSHs(sv_2mortal(newSVpv(cip_list[i].name, 0)));
1237     PUSHs(sv_2mortal(newSViv(cip_list[i].func->key_len)));
1238     }
1239    
1240    
1241    
1242    
1243     MODULE = OpenSSL PACKAGE = OpenSSL::Digest
1244    
1245     PROTOTYPES: ENABLE
1246    
1247     BOOT:
1248     {
1249     mds_boot();
1250     }
1251    
1252     SV *
1253     md2(sv)
1254     SV *sv
1255     ALIAS:
1256     md4 = 0x1
1257     md5 = 0x2
1258     sha = 0x3
1259     sha1 = 0x4
1260     dss = 0x5
1261     dss1 = 0x6
1262     mdc2 = 0x7
1263     ripemd160 = 0x8
1264     md2_hex = 0x10
1265     md4_hex = 0x11
1266     md5_hex = 0x12
1267     sha_hex = 0x13
1268     sha1_hex = 0x14
1269     dss_hex = 0x15
1270     dss1_hex = 0x16
1271     mdc2_hex = 0x17
1272     ripemd160_hex = 0x18
1273     md2_base64 = 0x20
1274     md4_base64 = 0x21
1275     md5_base64 = 0x22
1276     sha_base64 = 0x23
1277     sha1_base64 = 0x24
1278     dss_base64 = 0x25
1279     dss1_base64 = 0x26
1280     mdc2_base64 = 0x27
1281     ripemd160_base64 = 0x28
1282     PREINIT:
1283     EVP_MD_CTX ctx;
1284     STRLEN l;
1285     char *p;
1286     unsigned char md[EVP_MAX_MD_SIZE];
1287     unsigned int md_len;
1288     CODE:
1289     EVP_DigestInit(&ctx, _mds[NO_FLAGS(ix)]);
1290     p = SvPV(sv, l);
1291     EVP_DigestUpdate(&ctx, p, l);
1292     EVP_DigestFinal(&ctx, md, &md_len);
1293     switch(ix & ~15) {
1294     case 0:
1295     RETVAL = newSVpvn(md, md_len);
1296     break;
1297     case FLAG_HEX:
1298     RETVAL = hexsv(md, md_len);
1299     break;
1300     default:
1301     RETVAL = base64sv(md, md_len);
1302     break;
1303     }
1304     OUTPUT:
1305     RETVAL
1306    
1307    
1308     void
1309     new_md2()
1310     ALIAS:
1311     new_md4 = 0x1
1312     new_md5 = 0x2
1313     mew_sha = 0x3
1314     new_sha1 = 0x4
1315     new_dss = 0x5
1316     new_dss1 = 0x6
1317     new_mdc2 = 0x7
1318     new_ripemd160 = 0x8
1319     PREINIT:
1320     EVP_MD_CTX *ctx;
1321     PPCODE:
1322     ctx = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1323     if(!ctx)
1324     croak("out of memory.");
1325     EVP_DigestInit(ctx, _mds[NO_FLAGS(ix)]);
1326     EXTEND(sp, 1);
1327     PUSHs(sv_newmortal());
1328     sv_setref_pv(ST(0), "OpenSSL::Digest", (void *) ctx);
1329    
1330    
1331     void
1332     DESTROY(ctx)
1333     EVP_MD_CTX *ctx
1334     CODE:
1335     if(ctx)
1336     free(ctx);
1337    
1338     void
1339     update(ctx, sv)
1340     EVP_MD_CTX *ctx
1341     SV *sv
1342     PREINIT:
1343     STRLEN l;
1344     char *p;
1345     CODE:
1346     p = SvPV(sv, l);
1347     EVP_DigestUpdate(ctx, p, l);
1348    
1349    
1350     SV *
1351     final(ctx)
1352     EVP_MD_CTX *ctx
1353     ALIAS:
1354     final_hex = 1
1355     final_base64 = 2
1356     PREINIT:
1357     unsigned char md[EVP_MAX_MD_SIZE];
1358     unsigned int md_len;
1359     CODE:
1360     EVP_DigestFinal(ctx, md, &md_len);
1361     switch(ix) {
1362     case 0:
1363     RETVAL = newSVpvn(md, md_len);
1364     break;
1365     case 1:
1366     RETVAL = hexsv(md, md_len);
1367     break;
1368     default:
1369     RETVAL = base64sv(md, md_len);
1370     break;
1371     }
1372     OUTPUT:
1373     RETVAL
1374    
1375     MODULE = OpenSSL::Digest PACKAGE = OpenSSL::HMAC
1376    
1377     PROTOTYPES: ENABLE
1378    
1379     BOOT:
1380     {
1381     mds_boot();
1382     }
1383    
1384     SV *
1385     md2(svkey, sv)
1386     SV *svkey
1387     SV *sv
1388     ALIAS:
1389     md4 = 0x1
1390     md5 = 0x2
1391     sha = 0x3
1392     sha1 = 0x4
1393     dss = 0x5
1394     dss1 = 0x6
1395     mdc2 = 0x7
1396     ripemd160 = 0x8
1397     md2_hex = 0x10
1398     md4_hex = 0x11
1399     md5_hex = 0x12
1400     sha_hex = 0x13
1401     sha1_hex = 0x14
1402     dss_hex = 0x15
1403     dss1_hex = 0x16
1404     mdc2_hex = 0x17
1405     ripemd160_hex = 0x18
1406     md2_base64 = 0x20
1407     md4_base64 = 0x21
1408     md5_base64 = 0x22
1409     sha_base64 = 0x23
1410     sha1_base64 = 0x24
1411     dss_base64 = 0x25
1412     dss1_base64 = 0x26
1413     mdc2_base64 = 0x27
1414     ripemd160_base64 = 0x28
1415     PREINIT:
1416     HMAC_CTX ctx;
1417     STRLEN l, keylen;
1418     char *p;
1419     char *key;
1420     unsigned char md[EVP_MAX_MD_SIZE];
1421     unsigned int md_len;
1422     CODE:
1423     p = SvPV(sv, l);
1424     key = SvPV(svkey, keylen);
1425     if(!HMAC(_mds[NO_FLAGS(ix)], key, keylen, p, l, md, &md_len))
1426     croak("HMAC");
1427     switch(ix & ~15) {
1428     case 0:
1429     RETVAL = newSVpvn(md, md_len);
1430     break;
1431     case FLAG_HEX:
1432     RETVAL = hexsv(md, md_len);
1433     break;
1434     default:
1435     RETVAL = base64sv(md, md_len);
1436     break;
1437     }
1438     OUTPUT:
1439     RETVAL
1440    
1441    
1442     void
1443     new_md2(void)
1444     ALIAS:
1445     new_md4 = 0x1
1446     new_md5 = 0x2
1447     mew_sha = 0x3
1448     new_sha1 = 0x4
1449     new_dss = 0x5
1450     new_dss1 = 0x6
1451     new_mdc2 = 0x7
1452     new_ripemd160 = 0x8
1453     PREINIT:
1454     EVP_MD_CTX *ctx;
1455     PPCODE:
1456     ctx = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1457     if(!ctx)
1458     croak("out of memory.");
1459     EVP_DigestInit(ctx, _mds[NO_FLAGS(ix)]);
1460     EXTEND(sp, 1);
1461     PUSHs(sv_newmortal());
1462     sv_setref_pv(ST(0), "OpenSSL::Digest", (void *) ctx);
1463    
1464    
1465     void
1466     DESTROY(ctx)
1467     EVP_MD_CTX *ctx
1468     CODE:
1469     if(ctx)
1470     free(ctx);
1471    
1472     void
1473     update(ctx, sv)
1474     EVP_MD_CTX *ctx
1475     SV *sv
1476     PREINIT:
1477     STRLEN l;
1478     char *p;
1479     CODE:
1480     p = SvPV(sv, l);
1481     EVP_DigestUpdate(ctx, p, l);
1482    
1483    
1484     SV *
1485     final(ctx)
1486     EVP_MD_CTX *ctx
1487     ALIAS:
1488     final_hex = 1
1489     final_base64 = 2
1490     PREINIT:
1491     unsigned char md[EVP_MAX_MD_SIZE];
1492     unsigned int md_len;
1493     CODE:
1494     EVP_DigestFinal(ctx, md, &md_len);
1495     switch(ix) {
1496     case 0:
1497     RETVAL = newSVpvn(md, md_len);
1498     break;
1499     case 1:
1500     RETVAL = hexsv(md, md_len);
1501     break;
1502     default:
1503     RETVAL = base64sv(md, md_len);
1504     break;
1505     }
1506     OUTPUT:
1507     RETVAL
1508    
1509    
1510     MODULE = OpenSSL PACKAGE = OpenSSL::PKCS7
1511    
1512     void
1513     new()
1514     PREINIT:
1515     PKCS7 *p7;
1516     PPCODE:
1517     if(!(p7 = PKCS7_new())) {
1518     croak("PKCS7_new");
1519     }
1520     EXTEND(sp, 1);
1521     PUSHs(sv_newmortal());
1522     sv_setref_pv(ST(0), "OpenSSL::PKCS7", (void *) p7);
1523    
1524    
1525     void
1526     DESTROY(p7)
1527     PKCS7 *p7;
1528     CODE:
1529     if(p7) {
1530     XD("PKCS7_free(%p)\n", p7);
1531     PKCS7_free(p7);
1532     }
1533    
1534    
1535     MODULE = OpenSSL PACKAGE = OpenSSL::PKCS12
1536    
1537     void
1538     new()
1539     PREINIT:
1540     PKCS12 *p12;
1541     PPCODE:
1542     if(!(p12 = PKCS12_new())) {
1543     croak("PKCS12_new");
1544     }
1545     EXTEND(sp, 1);
1546     PUSHs(sv_newmortal());
1547     sv_setref_pv(ST(0), "OpenSSL::PKCS12", (void *) p12);
1548    
1549     void
1550     new_from_string(sv)
1551     SV *sv
1552     ALIAS:
1553     new_from_file = 1
1554     PREINIT:
1555     PKCS12 *p12;
1556     BIO *bio;
1557     char *s;
1558     STRLEN len;
1559     PPCODE:
1560     s = SvPV(sv, len);
1561     if(ix == 1) {
1562     bio = BIO_new_file(s, "r");
1563     } else {
1564     bio = BIO_new_mem_buf (s, len);
1565     }
1566     if(!bio)
1567     croak("BIO_new_mem_buf");
1568     if(!(p12 = d2i_PKCS12_bio(bio, 0))) {
1569     BIO_free(bio);
1570     croak("d2i_PKCS12_BIO: %s", ssl_error());
1571     }
1572     BIO_free(bio);
1573     EXTEND(sp, 1);
1574     PUSHs(sv_newmortal());
1575     sv_setref_pv(ST(0), "OpenSSL::PKCS12", (void *) p12);
1576    
1577    
1578     SV*
1579     mac_ok(p12, pwd)
1580     PKCS12 *p12
1581     char *pwd
1582     CODE:
1583    
1584     RETVAL = (PKCS12_verify_mac(p12, pwd, strlen(pwd))) ? &PL_sv_yes : &PL_sv_no;
1585     OUTPUT:
1586     RETVAL
1587    
1588     void
1589     changepass(p12, oldpwd, newpwd)
1590     PKCS12 *p12
1591     SV *oldpwd
1592     SV *newpwd
1593     PREINIT:
1594     char *op = 0;
1595     char *np = 0;
1596     CODE:
1597     if(oldpwd != &PL_sv_undef)
1598     op = SvPV_nolen(oldpwd);
1599     if(newpwd != &PL_sv_undef)
1600     np = SvPV_nolen(newpwd);
1601     if(!PKCS12_newpass(p12, op, np)) {
1602     croak("PKCS12_newpass: %s", ssl_error());
1603     }
1604    
1605     SV*
1606     as_string(p12,...)
1607     PKCS12 *p12
1608     ALIAS:
1609     as_file = 1
1610     PROTOTYPE: $;$
1611     PREINIT:
1612     SV *sv;
1613     BIO *bio;
1614     CODE:
1615     if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1616     croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string");
1617     if(items > 1) {
1618     bio = sv_bio_create_file(ST(1));
1619     } else {
1620     bio = sv_bio_create();
1621     }
1622     if(!bio)
1623     croak("sv_bio_create");
1624     if(!i2d_PKCS12_bio(bio, p12)) {
1625     sv_bio_error(bio);
1626     croak("i2d_PKCS12_bio: %s", ssl_error());
1627     }
1628     RETVAL = sv_bio_final(bio);
1629     OUTPUT:
1630     RETVAL
1631    
1632     void
1633     DESTROY(p12)
1634     PKCS12 *p12;
1635     CODE:
1636     if(p12) {
1637     XD("PKCS12_free(%p)\n", p12);
1638     PKCS12_free(p12);
1639     }
1640    
1641    
1642     MODULE = OpenSSL PACKAGE = OpenSSL::CRL
1643    
1644     void
1645     new_from_string(thing)
1646     SV *thing
1647     ALIAS:
1648     new_from_file = 1
1649     PREINIT:
1650     BIO *bio;
1651     X509_CRL *crl;
1652     STRLEN l;
1653     char *p, *q = 0;
1654     PPCODE:
1655     p = SvPV(thing, l);
1656     if(ix == 1) {
1657     bio = BIO_new_file(p, "r");
1658     } else {
1659     bio = BIO_new_mem_buf (p, l);
1660     }
1661     if(!bio)
1662     croak(ssl_error());
1663    
1664     crl = PEM_read_bio_X509_CRL (bio, 0, 0, 0);
1665     BIO_free (bio);
1666     if(!crl)
1667     croak("PEM_read_bio_X509_CRL: %s", ssl_error());
1668    
1669     EXTEND(sp, 1);
1670     PUSHs(sv_newmortal());
1671     sv_setref_pv(ST(0), "OpenSSL::CRL", (void *) crl);
1672    
1673     void
1674     DESTROY(crl)
1675     X509_CRL *crl
1676     CODE:
1677     if (crl) {
1678     XD("X509_CRL_free (%p)\n", crl);
1679     X509_CRL_free(crl);
1680     crl = 0;
1681     }
1682    
1683     SV*
1684     info(crl)
1685     X509_CRL *crl
1686     PREINIT:
1687     BIO *bio;
1688     CODE:
1689     bio = sv_bio_create();
1690     if(!X509_CRL_print(bio,crl)) {
1691     sv_bio_error(bio);
1692     croak("X509_CRL_print: %s", ssl_error());
1693     }
1694     RETVAL = sv_bio_final(bio);
1695     OUTPUT:
1696     RETVAL
1697