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