ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenSSL/OpenSSL.xs
Revision: 1.6
Committed: Sat Oct 27 02:55:31 2001 UTC (22 years, 6 months ago) by root
Branch: MAIN
Changes since 1.5: +16 -19 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 stefan 1.1 new_name()
747 root 1.6 CODE:
748     if(!(RETVAL = X509_NAME_new())) {
749 stefan 1.1 croak("X509_NAME_new");
750     }
751 root 1.6 OUTPUT:
752     RETVAL
753 stefan 1.1
754    
755     void
756     add(name, key, string)
757 root 1.6 OpenSSL::Name name
758 stefan 1.1 SV *key
759     SV *string
760     PREINIT:
761     STRLEN l, kl;
762     char *p, *k;
763     int ok;
764     PPCODE:
765     p = SvPV(string, l);
766     if(SvIOK(key)) {
767     ok = X509_NAME_add_entry_by_NID(name, SvIV(key), MBSTRING_ASC, p, -1, -1, 0);
768     } else {
769     k = SvPV(key, kl);
770     ok = X509_NAME_add_entry_by_txt(name, k, MBSTRING_ASC, p, -1, -1, 0);
771     }
772     if(!ok)
773     croak("X509_NAME_add_entry_by_*: %s", ssl_error());
774    
775     IV
776     count(name)
777 root 1.6 OpenSSL::Name name
778 stefan 1.1 CODE:
779     RETVAL = X509_NAME_entry_count(name);
780     OUTPUT:
781     RETVAL
782    
783     void
784     getall(name)
785 root 1.6 OpenSSL::Name name
786 stefan 1.1 PREINIT:
787     int cnt, i;
788     X509_NAME_ENTRY *e;
789     int nid;
790     ASN1_STRING *s;
791     PPCODE:
792     cnt = X509_NAME_entry_count(name);
793     EXTEND(SP, cnt<<1);
794     for(i = 0; i < cnt; i++) {
795     e = X509_NAME_get_entry(name, i);
796     if(!e)
797     croak("X509_NAME_get_entry");
798     nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e));
799     s = X509_NAME_ENTRY_get_data(e);
800     PUSHs(sv_2mortal(newSVpv(OBJ_nid2ln(nid),0)));
801     PUSHs(sv_2mortal(newSVpvn(s->data, s->length)));
802     }
803    
804    
805    
806    
807    
808     void
809     DESTROY(name)
810 root 1.6 OpenSSL::Name name
811 stefan 1.1 CODE:
812     if(name) {
813     XD("X509_NAME_free(%p)\n", name);
814     X509_NAME_free(name);
815     }
816    
817    
818     MODULE = OpenSSL PACKAGE = OpenSSL::Rand
819    
820     PROTOTYPES: ENABLE
821    
822     BOOT:
823     {
824     int fd;
825     int rc;
826     ERR_load_RAND_strings();
827     fd = open("/dev/urandom", O_RDONLY);
828     if(fd != -1) {
829     char buf[64];
830     rc = read(fd, buf, 64);
831     if(rc < 1) {
832     warn ("read /dev/urandom");
833     } else {
834     RAND_seed(buf, rc);
835     }
836     close(fd);
837     } else {
838     warn ("can't open /dev/urandom");
839     }
840     }
841    
842    
843    
844     SV *
845     randbytes(nr)
846     IV nr
847     ALIAS:
848     randbytes_hex = 1
849     randbytes_base64 = 2
850     PREINIT:
851     char *p;
852     int rc;
853     CODE:
854     p = malloc(nr+1);
855     if(!p)
856     croak("malloc failed");
857     rc = RAND_bytes(p, nr);
858     if(rc != 1) {
859     free(p);
860     croak("RAND_bytes returned %d", rc);
861     }
862     switch(ix) {
863     case 0:
864     RETVAL = newSVpvn(p, nr);
865     break;
866     case 1:
867     RETVAL = hexsv(p, nr);
868     break;
869     default:
870     RETVAL = base64sv(p, nr);
871     break;
872     }
873     free(p);
874     OUTPUT:
875     RETVAL
876    
877    
878     MODULE = OpenSSL PACKAGE = OpenSSL::X509
879    
880     PROTOTYPES: ENABLE
881    
882     BOOT:
883     {
884     // We have joy we have fun we have seasons in the sun...
885     OpenSSL_add_all_algorithms();
886     OpenSSL_add_all_ciphers();
887     OpenSSL_add_all_digests();
888     SSL_load_error_strings();
889     ERR_load_PEM_strings();
890     ERR_load_PKCS7_strings();
891     ERR_load_PKCS12_strings();
892     ERR_load_ASN1_strings();
893     ERR_load_crypto_strings();
894     ERR_load_RAND_strings();
895     ERR_load_X509_strings();
896     ERR_load_X509V3_strings();
897     ERR_load_DH_strings();
898     ERR_load_DSA_strings();
899     ERR_load_RSA_strings();
900     }
901    
902    
903 root 1.4 OpenSSL::X509
904 stefan 1.1 new_X509()
905 root 1.4 CODE:
906     if ((RETVAL = X509_new ()) == NULL)
907 stefan 1.1 croak("X509_new");
908 root 1.4
909     if (!X509_set_version (RETVAL, 2))
910     {
911     X509_free (RETVAL);
912     croak ("X509_set_version");
913     }
914    
915     ASN1_INTEGER_set (X509_get_serialNumber (RETVAL), 0L);
916     OUTPUT:
917     RETVAL
918 stefan 1.1
919    
920     void
921     new_from_string(thing)
922 root 1.5 SV *thing
923 stefan 1.1 ALIAS:
924     new_from_file = 1
925     PREINIT:
926     BIO *bio;
927     X509 *x509;
928     STRLEN l;
929     char *p, *q = 0;
930     PPCODE:
931 root 1.5 p = SvPV (thing, l);
932 stefan 1.1 if(ix == 1) {
933     bio = BIO_new_file(p, "r");
934     } else {
935     bio = BIO_new_mem_buf (p, l);
936     }
937     if(!bio)
938     croak(ssl_error());
939    
940     x509 = PEM_read_bio_X509 (bio, 0, 0, 0);
941     BIO_free (bio);
942     if(!x509)
943     croak("PEM_read_bio_X509: %s", ssl_error());
944    
945     EXTEND(sp, 1);
946     PUSHs(sv_newmortal());
947     sv_setref_pv(ST(0), "OpenSSL::X509", (void *) x509);
948    
949     void
950     DESTROY(x509)
951 root 1.2 OpenSSL::X509 x509
952 stefan 1.1 CODE:
953     if (x509) {
954     XD("X509_free(%p)\n", x509);
955 root 1.5 X509_free (x509);
956 stefan 1.1 x509 = 0;
957     }
958    
959    
960     char *
961     fingerprint_md5(x509)
962 root 1.2 OpenSSL::X509 x509
963 stefan 1.1 ALIAS:
964     fingerprint_md2 = 1
965     fingerprint_mdc2 = 2
966     fingerprint_sha1 = 3
967     PREINIT:
968     EVP_MD *mds[] = { EVP_md5(), EVP_md2(), EVP_mdc2(), EVP_sha1() };
969     CODE:
970     RETVAL = dofp(x509, mds[ix]);
971     OUTPUT:
972     RETVAL
973    
974    
975 root 1.6 OpenSSL::Name
976 stefan 1.1 subject(x509)
977 root 1.2 OpenSSL::X509 x509
978 stefan 1.1 CODE:
979     RETVAL = X509_get_subject_name(x509);
980     OUTPUT:
981     RETVAL
982    
983 root 1.6 OpenSSL::Name
984 stefan 1.1 issuer(x509)
985 root 1.2 OpenSSL::X509 x509
986 stefan 1.1 CODE:
987     RETVAL = X509_get_issuer_name(x509);
988     OUTPUT:
989     RETVAL
990    
991    
992     char *
993     subject_txt(x509)
994 root 1.2 OpenSSL::X509 x509
995 stefan 1.1 CODE:
996     RETVAL = ol(X509_get_subject_name(x509));
997     OUTPUT:
998     RETVAL
999    
1000    
1001     char *
1002     issuer_txt(x509)
1003 root 1.2 OpenSSL::X509 x509
1004 stefan 1.1 CODE:
1005     RETVAL = ol(X509_get_issuer_name(x509));
1006     OUTPUT:
1007     RETVAL
1008    
1009     ASN1_INTEGER *
1010     serial(x509)
1011 root 1.2 OpenSSL::X509 x509
1012 stefan 1.1 CODE:
1013     RETVAL = X509_get_serialNumber(x509);
1014     OUTPUT:
1015     RETVAL
1016    
1017    
1018     int
1019     version(x509)
1020 root 1.2 OpenSSL::X509 x509
1021 stefan 1.1 CODE:
1022     RETVAL = X509_get_version(x509);
1023     OUTPUT:
1024     RETVAL
1025    
1026     ASN1_UTCTIME *
1027     notBefore(x509)
1028 root 1.2 OpenSSL::X509 x509
1029 stefan 1.1 CODE:
1030     RETVAL = X509_get_notBefore(x509);
1031     OUTPUT:
1032     RETVAL
1033    
1034     ASN1_UTCTIME *
1035     notAfter(x509)
1036 root 1.2 OpenSSL::X509 x509
1037 stefan 1.1 CODE:
1038     RETVAL = X509_get_notAfter(x509);
1039     OUTPUT:
1040     RETVAL
1041    
1042     int
1043     cert_type(x509)
1044 root 1.2 OpenSSL::X509 x509
1045 stefan 1.1 CODE:
1046     RETVAL = X509_certificate_type(x509, 0);
1047     OUTPUT:
1048     RETVAL
1049    
1050     SV*
1051     as_string(x509,...)
1052 root 1.2 OpenSSL::X509 x509
1053 stefan 1.1 ALIAS:
1054     as_file = 1
1055     PROTOTYPE: $;$
1056     PREINIT:
1057     BIO *bio;
1058     CODE:
1059     if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1060     croak("OpenSSL::X509::%s: illegal/missing args", (ix == 1) ? "as_file" : " as_string");
1061     if(items > 1) {
1062     bio = sv_bio_create_file(ST(1));
1063     } else {
1064     bio = sv_bio_create();
1065     }
1066     if(!bio)
1067     croak("sv_bio_create");
1068     if(!PEM_write_bio_X509(bio, x509)) {
1069     sv_bio_error(bio);
1070     croak("PEM_write_bio_X509: %s", ssl_error());
1071     }
1072     RETVAL = sv_bio_final(bio);
1073     OUTPUT:
1074     RETVAL
1075    
1076     SV*
1077     info(x509)
1078 root 1.2 OpenSSL::X509 x509
1079 stefan 1.1 PREINIT:
1080     BIO *bio;
1081     CODE:
1082     bio = sv_bio_create();
1083     if(!X509_print(bio,x509)) {
1084     sv_bio_error(bio);
1085     croak("X509_print: %s", ssl_error());
1086     }
1087     RETVAL = sv_bio_final(bio);
1088     OUTPUT:
1089     RETVAL
1090    
1091     void
1092     set_issuer(x509,name)
1093 root 1.3 OpenSSL::X509 x509
1094 root 1.6 OpenSSL::Name name
1095 stefan 1.1 CODE:
1096     X509_set_issuer_name(x509, X509_NAME_dup(name));
1097    
1098     void
1099     set_subject(x509,name)
1100 root 1.3 OpenSSL::X509 x509
1101 root 1.6 OpenSSL::Name name
1102 stefan 1.1 CODE:
1103     X509_set_subject_name(x509, X509_NAME_dup(name));
1104    
1105     SV *
1106     errstring(x509)
1107 root 1.2 OpenSSL::X509 x509
1108 stefan 1.1 PREINIT:
1109     BIO *bio;
1110     CODE:
1111     bio = sv_bio_create();
1112     ERR_print_errors(bio);
1113     RETVAL = sv_bio_final(bio);
1114     ERR_clear_error();
1115     OUTPUT:
1116     RETVAL
1117    
1118    
1119     MODULE = OpenSSL PACKAGE = OpenSSL::Cipher
1120    
1121     PROTOTYPES: ENABLE
1122    
1123     BOOT:
1124     {
1125     cipher_boot();
1126     }
1127    
1128     void
1129     DESTROY(ctx)
1130     EVP_CIPHER_CTX *ctx
1131     CODE:
1132     if(ctx) {
1133     EVP_CIPHER_CTX_cleanup(ctx);
1134     free(ctx);
1135     }
1136    
1137     void
1138     new_decrypt(...)
1139     ALIAS:
1140     new_encrypt = 1
1141     PREINIT:
1142     char *name;
1143     SV *svkey;
1144     EVP_CIPHER *ci;
1145     EVP_CIPHER_CTX *ctx;
1146     char *key;
1147     char iv[EVP_MAX_IV_LENGTH];
1148     char k[EVP_MAX_KEY_LENGTH];
1149     int rc;
1150     STRLEN keylen;
1151     PPCODE:
1152     if(items < 2 || items > 3) {
1153     croak("usage: new_[en|de]crypt(ciphname,key)");
1154     }
1155     name = SvPV_nolen(ST(items -2));
1156     svkey = ST(items - 1);
1157     memset(iv, 0, EVP_MAX_IV_LENGTH);
1158     memset(k, 0, EVP_MAX_KEY_LENGTH);
1159    
1160     if(!(ci = lookup_cipher(name)))
1161     croak("OpenSSL::Cipher::new: no such cipher \"%s\"", name);
1162     ctx = (EVP_CIPHER_CTX *) malloc(sizeof(EVP_CIPHER_CTX));
1163     if(!ctx)
1164     croak("malloc error");
1165     key = SvPV(svkey, keylen);
1166     memcpy(k, key, (keylen <= ci->key_len) ? keylen : ci->key_len);
1167     rc = EVP_CipherInit(ctx, ci, k, iv, ix);
1168     memset(iv, 0, EVP_MAX_IV_LENGTH);
1169     memset(iv, 0, EVP_MAX_KEY_LENGTH);
1170     if(!rc) {
1171     free(ctx);
1172     croak("EVP_CipherInit");
1173     }
1174     EXTEND(sp, 1);
1175     PUSHs(sv_newmortal());
1176     sv_setref_pv(ST(0), "OpenSSL::Cipher", (void *) ctx);
1177    
1178    
1179     SV *
1180     update(ctx,svin)
1181     EVP_CIPHER_CTX *ctx
1182     SV *svin
1183     PREINIT:
1184     unsigned char *in, *out;
1185     STRLEN il, ol;
1186     CODE:
1187     in = SvPV(svin, il);
1188     ol = (il + 63) & ~63;
1189     RETVAL = NEWSV(0, ol);
1190     SvPOK_only(RETVAL);
1191     SvCUR_set(RETVAL, ol);
1192     out = SvPV_nolen(RETVAL);
1193     if(!out)
1194     croak("memory");
1195     if(!EVP_CipherUpdate(ctx, out, &ol, in, il)) {
1196     sv_free(RETVAL);
1197     croak("EVP_CipherUpdate");
1198     }
1199     SvCUR_set(RETVAL, ol);
1200     OUTPUT:
1201     RETVAL
1202    
1203     SV *
1204     final(ctx)
1205     EVP_CIPHER_CTX *ctx
1206     PREINIT:
1207     STRLEN ol;
1208     unsigned char *out;
1209     CODE:
1210     ol = 256;
1211     RETVAL = NEWSV(0, ol);
1212     SvPOK_only(RETVAL);
1213     SvCUR_set(RETVAL, ol);
1214     out = SvPV_nolen(RETVAL);
1215     if(!out)
1216     croak("memory");
1217     if(!EVP_CipherFinal(ctx, out, &ol)) {
1218     sv_free(RETVAL);
1219     croak("EVP_CipherFinal %s", ssl_error());
1220     }
1221     SvCUR_set(RETVAL, ol);
1222     OUTPUT:
1223     RETVAL
1224    
1225     void
1226     enum_ciphers()
1227     PREINIT:
1228     int i;
1229     PPCODE:
1230     EXTEND(SP, cip_cnt<<1);
1231     for(i = 0; i < cip_cnt; i++) {
1232     PUSHs(sv_2mortal(newSVpv(cip_list[i].name, 0)));
1233     PUSHs(sv_2mortal(newSViv(cip_list[i].func->key_len)));
1234     }
1235    
1236    
1237    
1238    
1239     MODULE = OpenSSL PACKAGE = OpenSSL::Digest
1240    
1241     PROTOTYPES: ENABLE
1242    
1243     BOOT:
1244     {
1245     mds_boot();
1246     }
1247    
1248     SV *
1249     md2(sv)
1250     SV *sv
1251     ALIAS:
1252     md4 = 0x1
1253     md5 = 0x2
1254     sha = 0x3
1255     sha1 = 0x4
1256     dss = 0x5
1257     dss1 = 0x6
1258     mdc2 = 0x7
1259     ripemd160 = 0x8
1260     md2_hex = 0x10
1261     md4_hex = 0x11
1262     md5_hex = 0x12
1263     sha_hex = 0x13
1264     sha1_hex = 0x14
1265     dss_hex = 0x15
1266     dss1_hex = 0x16
1267     mdc2_hex = 0x17
1268     ripemd160_hex = 0x18
1269     md2_base64 = 0x20
1270     md4_base64 = 0x21
1271     md5_base64 = 0x22
1272     sha_base64 = 0x23
1273     sha1_base64 = 0x24
1274     dss_base64 = 0x25
1275     dss1_base64 = 0x26
1276     mdc2_base64 = 0x27
1277     ripemd160_base64 = 0x28
1278     PREINIT:
1279     EVP_MD_CTX ctx;
1280     STRLEN l;
1281     char *p;
1282     unsigned char md[EVP_MAX_MD_SIZE];
1283     unsigned int md_len;
1284     CODE:
1285     EVP_DigestInit(&ctx, _mds[NO_FLAGS(ix)]);
1286     p = SvPV(sv, l);
1287     EVP_DigestUpdate(&ctx, p, l);
1288     EVP_DigestFinal(&ctx, md, &md_len);
1289     switch(ix & ~15) {
1290     case 0:
1291     RETVAL = newSVpvn(md, md_len);
1292     break;
1293     case FLAG_HEX:
1294     RETVAL = hexsv(md, md_len);
1295     break;
1296     default:
1297     RETVAL = base64sv(md, md_len);
1298     break;
1299     }
1300     OUTPUT:
1301     RETVAL
1302    
1303    
1304     void
1305     new_md2()
1306     ALIAS:
1307     new_md4 = 0x1
1308     new_md5 = 0x2
1309     mew_sha = 0x3
1310     new_sha1 = 0x4
1311     new_dss = 0x5
1312     new_dss1 = 0x6
1313     new_mdc2 = 0x7
1314     new_ripemd160 = 0x8
1315     PREINIT:
1316     EVP_MD_CTX *ctx;
1317     PPCODE:
1318     ctx = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1319     if(!ctx)
1320     croak("out of memory.");
1321     EVP_DigestInit(ctx, _mds[NO_FLAGS(ix)]);
1322     EXTEND(sp, 1);
1323     PUSHs(sv_newmortal());
1324     sv_setref_pv(ST(0), "OpenSSL::Digest", (void *) ctx);
1325    
1326    
1327     void
1328     DESTROY(ctx)
1329     EVP_MD_CTX *ctx
1330     CODE:
1331     if(ctx)
1332     free(ctx);
1333    
1334     void
1335     update(ctx, sv)
1336     EVP_MD_CTX *ctx
1337     SV *sv
1338     PREINIT:
1339     STRLEN l;
1340     char *p;
1341     CODE:
1342     p = SvPV(sv, l);
1343     EVP_DigestUpdate(ctx, p, l);
1344    
1345    
1346     SV *
1347     final(ctx)
1348     EVP_MD_CTX *ctx
1349     ALIAS:
1350     final_hex = 1
1351     final_base64 = 2
1352     PREINIT:
1353     unsigned char md[EVP_MAX_MD_SIZE];
1354     unsigned int md_len;
1355     CODE:
1356     EVP_DigestFinal(ctx, md, &md_len);
1357     switch(ix) {
1358     case 0:
1359     RETVAL = newSVpvn(md, md_len);
1360     break;
1361     case 1:
1362     RETVAL = hexsv(md, md_len);
1363     break;
1364     default:
1365     RETVAL = base64sv(md, md_len);
1366     break;
1367     }
1368     OUTPUT:
1369     RETVAL
1370    
1371     MODULE = OpenSSL::Digest PACKAGE = OpenSSL::HMAC
1372    
1373     PROTOTYPES: ENABLE
1374    
1375     BOOT:
1376     {
1377     mds_boot();
1378     }
1379    
1380     SV *
1381     md2(svkey, sv)
1382     SV *svkey
1383     SV *sv
1384     ALIAS:
1385     md4 = 0x1
1386     md5 = 0x2
1387     sha = 0x3
1388     sha1 = 0x4
1389     dss = 0x5
1390     dss1 = 0x6
1391     mdc2 = 0x7
1392     ripemd160 = 0x8
1393     md2_hex = 0x10
1394     md4_hex = 0x11
1395     md5_hex = 0x12
1396     sha_hex = 0x13
1397     sha1_hex = 0x14
1398     dss_hex = 0x15
1399     dss1_hex = 0x16
1400     mdc2_hex = 0x17
1401     ripemd160_hex = 0x18
1402     md2_base64 = 0x20
1403     md4_base64 = 0x21
1404     md5_base64 = 0x22
1405     sha_base64 = 0x23
1406     sha1_base64 = 0x24
1407     dss_base64 = 0x25
1408     dss1_base64 = 0x26
1409     mdc2_base64 = 0x27
1410     ripemd160_base64 = 0x28
1411     PREINIT:
1412     HMAC_CTX ctx;
1413     STRLEN l, keylen;
1414     char *p;
1415     char *key;
1416     unsigned char md[EVP_MAX_MD_SIZE];
1417     unsigned int md_len;
1418     CODE:
1419     p = SvPV(sv, l);
1420     key = SvPV(svkey, keylen);
1421     if(!HMAC(_mds[NO_FLAGS(ix)], key, keylen, p, l, md, &md_len))
1422     croak("HMAC");
1423     switch(ix & ~15) {
1424     case 0:
1425     RETVAL = newSVpvn(md, md_len);
1426     break;
1427     case FLAG_HEX:
1428     RETVAL = hexsv(md, md_len);
1429     break;
1430     default:
1431     RETVAL = base64sv(md, md_len);
1432     break;
1433     }
1434     OUTPUT:
1435     RETVAL
1436    
1437    
1438     void
1439     new_md2(void)
1440     ALIAS:
1441     new_md4 = 0x1
1442     new_md5 = 0x2
1443     mew_sha = 0x3
1444     new_sha1 = 0x4
1445     new_dss = 0x5
1446     new_dss1 = 0x6
1447     new_mdc2 = 0x7
1448     new_ripemd160 = 0x8
1449     PREINIT:
1450     EVP_MD_CTX *ctx;
1451     PPCODE:
1452     ctx = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1453     if(!ctx)
1454     croak("out of memory.");
1455     EVP_DigestInit(ctx, _mds[NO_FLAGS(ix)]);
1456     EXTEND(sp, 1);
1457     PUSHs(sv_newmortal());
1458     sv_setref_pv(ST(0), "OpenSSL::Digest", (void *) ctx);
1459    
1460    
1461     void
1462     DESTROY(ctx)
1463     EVP_MD_CTX *ctx
1464     CODE:
1465     if(ctx)
1466     free(ctx);
1467    
1468     void
1469     update(ctx, sv)
1470     EVP_MD_CTX *ctx
1471     SV *sv
1472     PREINIT:
1473     STRLEN l;
1474     char *p;
1475     CODE:
1476     p = SvPV(sv, l);
1477     EVP_DigestUpdate(ctx, p, l);
1478    
1479    
1480     SV *
1481     final(ctx)
1482     EVP_MD_CTX *ctx
1483     ALIAS:
1484     final_hex = 1
1485     final_base64 = 2
1486     PREINIT:
1487     unsigned char md[EVP_MAX_MD_SIZE];
1488     unsigned int md_len;
1489     CODE:
1490     EVP_DigestFinal(ctx, md, &md_len);
1491     switch(ix) {
1492     case 0:
1493     RETVAL = newSVpvn(md, md_len);
1494     break;
1495     case 1:
1496     RETVAL = hexsv(md, md_len);
1497     break;
1498     default:
1499     RETVAL = base64sv(md, md_len);
1500     break;
1501     }
1502     OUTPUT:
1503     RETVAL
1504    
1505    
1506     MODULE = OpenSSL PACKAGE = OpenSSL::PKCS7
1507    
1508     void
1509     new()
1510     PREINIT:
1511     PKCS7 *p7;
1512     PPCODE:
1513     if(!(p7 = PKCS7_new())) {
1514     croak("PKCS7_new");
1515     }
1516     EXTEND(sp, 1);
1517     PUSHs(sv_newmortal());
1518     sv_setref_pv(ST(0), "OpenSSL::PKCS7", (void *) p7);
1519    
1520    
1521     void
1522     DESTROY(p7)
1523     PKCS7 *p7;
1524     CODE:
1525     if(p7) {
1526     XD("PKCS7_free(%p)\n", p7);
1527     PKCS7_free(p7);
1528     }
1529    
1530    
1531     MODULE = OpenSSL PACKAGE = OpenSSL::PKCS12
1532    
1533     void
1534     new()
1535     PREINIT:
1536     PKCS12 *p12;
1537     PPCODE:
1538     if(!(p12 = PKCS12_new())) {
1539     croak("PKCS12_new");
1540     }
1541     EXTEND(sp, 1);
1542     PUSHs(sv_newmortal());
1543     sv_setref_pv(ST(0), "OpenSSL::PKCS12", (void *) p12);
1544    
1545     void
1546     new_from_string(sv)
1547     SV *sv
1548     ALIAS:
1549     new_from_file = 1
1550     PREINIT:
1551     PKCS12 *p12;
1552     BIO *bio;
1553     char *s;
1554     STRLEN len;
1555     PPCODE:
1556     s = SvPV(sv, len);
1557     if(ix == 1) {
1558     bio = BIO_new_file(s, "r");
1559     } else {
1560     bio = BIO_new_mem_buf (s, len);
1561     }
1562     if(!bio)
1563     croak("BIO_new_mem_buf");
1564     if(!(p12 = d2i_PKCS12_bio(bio, 0))) {
1565     BIO_free(bio);
1566     croak("d2i_PKCS12_BIO: %s", ssl_error());
1567     }
1568     BIO_free(bio);
1569     EXTEND(sp, 1);
1570     PUSHs(sv_newmortal());
1571     sv_setref_pv(ST(0), "OpenSSL::PKCS12", (void *) p12);
1572    
1573    
1574     SV*
1575     mac_ok(p12, pwd)
1576     PKCS12 *p12
1577     char *pwd
1578     CODE:
1579    
1580     RETVAL = (PKCS12_verify_mac(p12, pwd, strlen(pwd))) ? &PL_sv_yes : &PL_sv_no;
1581     OUTPUT:
1582     RETVAL
1583    
1584     void
1585     changepass(p12, oldpwd, newpwd)
1586     PKCS12 *p12
1587     SV *oldpwd
1588     SV *newpwd
1589     PREINIT:
1590     char *op = 0;
1591     char *np = 0;
1592     CODE:
1593     if(oldpwd != &PL_sv_undef)
1594     op = SvPV_nolen(oldpwd);
1595     if(newpwd != &PL_sv_undef)
1596     np = SvPV_nolen(newpwd);
1597     if(!PKCS12_newpass(p12, op, np)) {
1598     croak("PKCS12_newpass: %s", ssl_error());
1599     }
1600    
1601     SV*
1602     as_string(p12,...)
1603     PKCS12 *p12
1604     ALIAS:
1605     as_file = 1
1606     PROTOTYPE: $;$
1607     PREINIT:
1608     SV *sv;
1609     BIO *bio;
1610     CODE:
1611     if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1612     croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string");
1613     if(items > 1) {
1614     bio = sv_bio_create_file(ST(1));
1615     } else {
1616     bio = sv_bio_create();
1617     }
1618     if(!bio)
1619     croak("sv_bio_create");
1620     if(!i2d_PKCS12_bio(bio, p12)) {
1621     sv_bio_error(bio);
1622     croak("i2d_PKCS12_bio: %s", ssl_error());
1623     }
1624     RETVAL = sv_bio_final(bio);
1625     OUTPUT:
1626     RETVAL
1627    
1628     void
1629     DESTROY(p12)
1630     PKCS12 *p12;
1631     CODE:
1632     if(p12) {
1633     XD("PKCS12_free(%p)\n", p12);
1634     PKCS12_free(p12);
1635     }
1636    
1637    
1638     MODULE = OpenSSL PACKAGE = OpenSSL::CRL
1639    
1640 root 1.5 OpenSSL::CRL
1641 stefan 1.1 new_from_string(thing)
1642     SV *thing
1643     ALIAS:
1644     new_from_file = 1
1645     PREINIT:
1646     BIO *bio;
1647     STRLEN l;
1648     char *p, *q = 0;
1649 root 1.5 CODE:
1650 stefan 1.1 p = SvPV(thing, l);
1651     if(ix == 1) {
1652     bio = BIO_new_file(p, "r");
1653     } else {
1654     bio = BIO_new_mem_buf (p, l);
1655     }
1656     if(!bio)
1657     croak(ssl_error());
1658    
1659 root 1.5 RETVAL = PEM_read_bio_X509_CRL (bio, 0, 0, 0);
1660 stefan 1.1 BIO_free (bio);
1661 root 1.5 if(!RETVAL)
1662 stefan 1.1 croak("PEM_read_bio_X509_CRL: %s", ssl_error());
1663    
1664 root 1.5 OUTPUT:
1665     RETVAL
1666 stefan 1.1
1667     void
1668     DESTROY(crl)
1669 root 1.5 OpenSSL::CRL crl
1670 stefan 1.1 CODE:
1671     if (crl) {
1672     XD("X509_CRL_free (%p)\n", crl);
1673     X509_CRL_free(crl);
1674     crl = 0;
1675     }
1676    
1677     SV*
1678     info(crl)
1679 root 1.5 OpenSSL::CRL crl
1680 stefan 1.1 PREINIT:
1681     BIO *bio;
1682     CODE:
1683     bio = sv_bio_create();
1684     if(!X509_CRL_print(bio,crl)) {
1685     sv_bio_error(bio);
1686     croak("X509_CRL_print: %s", ssl_error());
1687     }
1688     RETVAL = sv_bio_final(bio);
1689     OUTPUT:
1690     RETVAL
1691