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