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