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