ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenSSL/OpenSSL.xs
Revision: 1.12
Committed: Sat Oct 27 04:16:35 2001 UTC (22 years, 6 months ago) by stefan
Branch: MAIN
Changes since 1.11: +14 -16 lines
Log Message:
*** empty log message ***

File Contents

# Content
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 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
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 bio_write_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, bio_write_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 STRLEN l;
126
127 return BIO_new_file(SvPV(filename, l), "wb");
128 }
129
130 static inline SV * sv_bio_final(BIO *bio)
131 {
132 SV* sv;
133
134 BIO_flush(bio);
135 sv = (SV *) BIO_get_callback_arg(bio);
136 BIO_free_all (bio);
137 // check for file:
138 if(!sv)
139 sv = &PL_sv_undef;
140 return sv;
141 }
142
143 static inline void sv_bio_error(BIO *bio)
144 {
145 SV *sv;
146 sv = (SV *) BIO_get_callback_arg(bio);
147 if(sv)
148 sv_free(sv);
149 BIO_free_all (bio);
150 }
151
152 static const char *ssl_error(void) // function leaks. :(
153 {
154 BIO *bio;
155 SV *sv;
156 STRLEN l;
157
158 bio = sv_bio_create();
159 ERR_print_errors(bio);
160 sv = sv_bio_final(bio);
161 ERR_clear_error();
162 return SvPV(sv, l);
163 }
164
165 static inline SV* output_BN(BIGNUM *n, SV *sv)
166 {
167 if (!n)
168 croak("parse error :)");
169
170 sv_setpvn(sv, BN_bn2dec(n), 0);
171 return sv;
172 }
173
174 static const char * digcvt(char *ret, const char *from, int len)
175 {
176 static const char *htab = "0123456789abcdef";
177 char *to = ret;
178 int i;
179 for(i = 0; i < len; i++) {
180 *to++ = htab[(*from >> 4) & 0xf];
181 *to++ = htab[*from++ & 0xf];
182 }
183 *to = 0;
184 return ret;
185 }
186
187 /* mutt, anything else is broken ! */
188 static const char B64Chars[64] = {
189 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
190 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
191 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
192 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
193 '8', '9', '+', '/'
194 };
195
196 static unsigned char *mutt_to_base64 (unsigned char *out, const unsigned char *in, size_t len,
197 size_t olen)
198 {
199 char *o = out;
200 while (len >= 3 && olen > 10)
201 {
202 *out++ = B64Chars[in[0] >> 2];
203 *out++ = B64Chars[((in[0] << 4) & 0x30) | (in[1] >> 4)];
204 *out++ = B64Chars[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
205 *out++ = B64Chars[in[2] & 0x3f];
206 olen -= 4;
207 len -= 3;
208 in += 3;
209 }
210
211 /* clean up remainder */
212 if (len > 0 && olen > 4)
213 {
214 unsigned char fragment;
215
216 *out++ = B64Chars[in[0] >> 2];
217 fragment = (in[0] << 4) & 0x30;
218 if (len > 1)
219 fragment |= in[1] >> 4;
220 *out++ = B64Chars[fragment];
221 *out++ = (len < 2) ? '=' : B64Chars[(in[1] << 2) & 0x3c];
222 *out++ = '=';
223 }
224 *out = '\0';
225 return o;
226 }
227
228 static inline SV* hexsv(unsigned char *s, unsigned len)
229 {
230 char *ret;
231 SV *sv;
232 ret = malloc((len<<1)+1);
233 if(!ret)
234 croak("malloc");
235 sv = newSVpv(digcvt(ret, s,len), len <<1);
236 free(ret);
237 return sv;
238 }
239
240 static inline SV* base64sv(unsigned char *s, unsigned len)
241 {
242 char *ret;
243 SV *sv;
244 int enc_cnt = ((len+ 2) / 3) << 2;
245 ret = malloc(enc_cnt+1);
246 if(!ret)
247 croak("malloc");
248 sv = newSVpv(mutt_to_base64(ret, s,len, enc_cnt+1), enc_cnt);
249 free(ret);
250 return sv;
251
252 }
253
254 #define FLAG_HEX 0x10
255 #define FLAG_BASE64 0x20
256 #define NO_FLAGS(x) ((x) &0xf)
257
258 static EVP_MD *_mds[9];
259
260 static int mds_booted = 0;
261
262 static void mds_boot (void)
263 {
264 if(mds_booted)
265 return;
266 mds_booted = 1;
267 OpenSSL_add_all_digests();
268 _mds[0] = EVP_md2();
269 _mds[1] = EVP_md4();
270 _mds[2] = EVP_md5();
271 _mds[3] = EVP_sha();
272 _mds[4] = EVP_sha1();
273 _mds[5] = EVP_dss();
274 _mds[6] = EVP_dss1();
275 _mds[7] = EVP_mdc2();
276 _mds[8] = EVP_ripemd160();
277 }
278
279
280
281 static char *
282 dofp(X509 *x509, EVP_MD *digest)
283 {
284 unsigned char md[EVP_MAX_MD_SIZE];
285 unsigned static char s[EVP_MAX_MD_SIZE*3];
286 int n, i;
287
288 if(!X509_digest(x509, digest, md, &n))
289 croak("Digest error: %s", ssl_error());
290 for(i = 0; i < n; i++) {
291 sprintf(&s[i*3], "%02X%c", md[i], (i + 1 == (int) n) ? '\0' : ':');
292 }
293 return s;
294 }
295
296 static inline SV *ol(X509_NAME *x)
297 {
298 char *p;
299 SV *sv = newSVpvn("",0);
300 X509_NAME_oneline(x, (p=SvGROW(sv,8192)), 8192);
301 SvCUR_set(sv, strlen(p));
302 return sv;
303 }
304
305 #if 0
306 static void run_sha1(char *digest, const char *msg, int msglen)
307 {
308 SHA_CTX ctx;
309
310 if(!digest || !msg || msglen < 0)
311 croak("run_sha1: null pointer or illegal message len");
312 SHA1_Init(&ctx);
313 SHA1_Update(&ctx, msg, msglen);
314 SHA1_Final(digest, &ctx);
315 }
316 #endif
317 static bool is_privkey(RSA *key)
318 {
319 return (key->n && key->e && key->d && key->p && key->q
320 && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0;
321 }
322
323 typedef struct {
324 EVP_CIPHER *func;
325 char name[20];
326 } cip_list_st;
327
328 static cip_list_st cip_list[50];
329 static int cip_cnt = 0;
330
331 static inline char *wappla_fixname(const char *s)
332 {
333 static char x[50];
334 char *p;
335 strcpy(x, s);
336 while((p = strchr(x, '_'))) {
337 *p = '-';
338 }
339 return x;
340 }
341
342 static inline EVP_CIPHER *lookup_cipher(const char *name)
343 {
344 int i;
345 for(i = 0; i < cip_cnt;i++)
346 if(!strcmp(name, cip_list[i].name))
347 return cip_list[i].func;
348 return 0;
349 }
350
351 #define ADD_C_(x) cip_list[cip_cnt].func = (EVP_##x()); \
352 strcpy(cip_list[cip_cnt++].name, wappla_fixname(#x))
353
354 static int cipher_booted = 0;
355
356 static void cipher_boot(void)
357 {
358 if(cipher_booted)
359 return;
360 cipher_booted++;
361 OpenSSL_add_all_ciphers();
362 #ifndef NO_DES
363 ADD_C_(des_ecb); ADD_C_(des_ede); ADD_C_(des_ede3);
364 ADD_C_(des_cfb); ADD_C_(des_ede_cfb); ADD_C_(des_ede3_cfb);
365 ADD_C_(des_ofb); ADD_C_(des_ede_ofb); ADD_C_(des_ede3_ofb);
366 ADD_C_(des_cbc); ADD_C_(des_ede_cbc); ADD_C_(des_ede3_cbc);
367 ADD_C_(desx_cbc);
368 #endif
369 #ifndef NO_RC4
370 ADD_C_(rc4); ADD_C_(rc4_40);
371 #endif
372 #ifndef NO_IDEA
373 ADD_C_(idea_ecb); ADD_C_(idea_cfb);
374 ADD_C_(idea_ofb); ADD_C_(idea_cbc);
375 #endif
376 #ifndef NI_RC2
377 ADD_C_(rc2_ecb); ADD_C_(rc2_cbc); ADD_C_(rc2_40_cbc);
378 ADD_C_(rc2_64_cbc); ADD_C_(rc2_cfb); ADD_C_(rc2_ofb);
379 #endif
380 #ifndef NO_BF
381 ADD_C_(bf_ecb); ADD_C_(bf_cbc);
382 ADD_C_(bf_cfb); ADD_C_(bf_ofb);
383 #endif
384 #ifndef NO_CAST
385 ADD_C_(cast5_ecb); ADD_C_(cast5_cbc);
386 ADD_C_(cast5_cfb); ADD_C_(cast5_ofb);
387 #endif
388 #ifndef NO_RC5
389 ADD_C_(rc5_32_12_16_cbc); ADD_C_(rc5_32_12_16_ecb);
390 ADD_C_(rc5_32_12_16_cfb); ADD_C_(rc5_32_12_16_ofb);
391 #endif
392 }
393
394
395 MODULE = OpenSSL PACKAGE = OpenSSL::RSA
396
397 OpenSSL::RSA
398 new_keygen(bits = 128, e = 35)
399 IV bits
400 IV e
401 CODE:
402 if(!(RETVAL = RSA_generate_key(bits, e, NULL, NULL)))
403 croak("RSA_generate_key");
404 OUTPUT:
405 RETVAL
406
407 OpenSSL::RSA
408 new_pubkey(n, e)
409 char *n
410 char *e
411 CODE:
412 RETVAL = RSA_new();
413 if (!RETVAL)
414 croak("can't allocate key");
415 if(!(RETVAL->n = BN_new()) || !BN_dec2bn(&RETVAL->n, n)) {
416 RSA_free(RETVAL); croak("can't initialize n");
417 }
418 if(!(RETVAL->e = BN_new()) || !BN_dec2bn(&RETVAL->e, e)) {
419 RSA_free(RETVAL); croak("can't initialize e");
420 }
421 //key->p = 0, key->q = 0, key->dmp1 = 0, key->dmq1 = 0, key->iqmp = 0;
422 OUTPUT:
423 RETVAL
424
425
426 OpenSSL::RSA
427 new_privkey(n, e, p, q, dmp1, dmq1, iqmp, d)
428 char *n
429 char *e
430 char *p
431 char *q
432 char *dmp1
433 char *dmq1
434 char *iqmp
435 char *d
436 CODE:
437 int rc;
438
439 RETVAL = RSA_new();
440 if (!RETVAL)
441 croak("can't allocate key");
442 if(!(RETVAL->n = BN_new()) || !BN_dec2bn(&RETVAL->n, n)) {
443 RSA_free(RETVAL); croak("can't initialize n");
444 }
445 if(!(RETVAL->e = BN_new()) || !BN_dec2bn(&RETVAL->e, e)) {
446 RSA_free(RETVAL); croak("can't initialize e");
447 }
448 if(!(RETVAL->p = BN_new()) || !BN_dec2bn(&RETVAL->p, p)) {
449 RSA_free(RETVAL); croak("can't initialize p");
450 }
451 if(!(RETVAL->q = BN_new()) || !BN_dec2bn(&RETVAL->q, q)) {
452 RSA_free(RETVAL); croak("can't initialize q");
453 }
454 if(!(RETVAL->dmp1 = BN_new()) || !BN_dec2bn(&RETVAL->dmp1, dmp1)) {
455 RSA_free(RETVAL); croak("can't initialize dmp1");
456 }
457 if(!(RETVAL->dmq1 = BN_new()) || !BN_dec2bn(&RETVAL->dmq1, dmq1)) {
458 RSA_free(RETVAL); croak("can't initialize dmq1");
459 }
460 if(!(RETVAL->iqmp = BN_new()) || !BN_dec2bn(&RETVAL->iqmp, iqmp)) {
461 RSA_free(RETVAL); croak("can't initialize iqmp");
462 }
463 if(!(RETVAL->d = BN_new()) || !BN_dec2bn(&RETVAL->d, d)) {
464 RSA_free(RETVAL); croak("can't initialize d");
465 }
466 if((rc = RSA_check_key(RETVAL)) != 1) {
467 RSA_free(RETVAL); croak("RSA_check_key failed (%d).", rc);
468 }
469 OUTPUT:
470 RETVAL
471
472
473 void
474 DESTROY(key)
475 OpenSSL::RSA key
476 CODE:
477 if (key) {
478 XD("RSA_free(%p)\n", key);
479 RSA_free(key);
480 }
481
482 IV
483 keysize(key)
484 OpenSSL::RSA key;
485 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 OpenSSL::RSA key;
495 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 OpenSSL::RSA key;
506 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 OpenSSL::RSA key;
541 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 OpenSSL::RSA key
597 bool cloning
598 PREINIT:
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 OpenSSL::RSA key;
653 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 OpenSSL::RSA key
696 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 OpenSSL::Name
717 new(class)
718 SV *class
719 CODE:
720 if(!(RETVAL = X509_NAME_new())) {
721 croak("X509_NAME_new");
722 }
723 OUTPUT:
724 RETVAL
725
726
727 void
728 add(name, key, string)
729 OpenSSL::Name name
730 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 OpenSSL::Name name
750 CODE:
751 RETVAL = X509_NAME_entry_count(name);
752 OUTPUT:
753 RETVAL
754
755 void
756 getall(name)
757 OpenSSL::Name name
758 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 OpenSSL::Name name
779 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 OpenSSL::X509
872 new(class)
873 SV *class
874 CODE:
875 if ((RETVAL = X509_new ()) == NULL)
876 croak("X509_new");
877
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
888
889 OpenSSL::X509
890 new_from_string(class,thing)
891 SV *class
892 SV *thing
893 ALIAS:
894 new_from_file = 1
895 PREINIT:
896 BIO *bio;
897 STRLEN l;
898 char *p;
899 CODE:
900 p = SvPV (thing, l);
901 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 RETVAL = PEM_read_bio_X509 (bio, 0, 0, 0);
910 BIO_free (bio);
911 if(!RETVAL)
912 croak("PEM_read_bio_X509: %s", ssl_error());
913
914 OUTPUT:
915 RETVAL
916
917 void
918 DESTROY(x509)
919 OpenSSL::X509 x509
920 CODE:
921 if (x509) {
922 XD("X509_free(%p)\n", x509);
923 X509_free (x509);
924 x509 = 0;
925 }
926
927
928 char *
929 fingerprint_md5(x509)
930 OpenSSL::X509 x509
931 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 OpenSSL::Name
944 subject(x509)
945 OpenSSL::X509 x509
946 CODE:
947 RETVAL = X509_NAME_dup (X509_get_subject_name(x509));
948 OUTPUT:
949 RETVAL
950
951 OpenSSL::Name
952 issuer(x509)
953 OpenSSL::X509 x509
954 CODE:
955 RETVAL = X509_NAME_dup (X509_get_issuer_name(x509));
956 OUTPUT:
957 RETVAL
958
959
960 SV *
961 subject_txt(x509)
962 OpenSSL::X509 x509
963 CODE:
964 RETVAL = ol(X509_get_subject_name(x509));
965 OUTPUT:
966 RETVAL
967
968
969 SV *
970 issuer_txt(x509)
971 OpenSSL::X509 x509
972 CODE:
973 RETVAL = ol(X509_get_issuer_name(x509));
974 OUTPUT:
975 RETVAL
976
977 ASN1_INTEGER *
978 serial(x509)
979 OpenSSL::X509 x509
980 CODE:
981 RETVAL = X509_get_serialNumber(x509);
982 OUTPUT:
983 RETVAL
984
985
986 int
987 version(x509)
988 OpenSSL::X509 x509
989 CODE:
990 RETVAL = X509_get_version(x509);
991 OUTPUT:
992 RETVAL
993
994 ASN1_UTCTIME *
995 notBefore(x509)
996 OpenSSL::X509 x509
997 CODE:
998 RETVAL = X509_get_notBefore(x509);
999 OUTPUT:
1000 RETVAL
1001
1002 ASN1_UTCTIME *
1003 notAfter(x509)
1004 OpenSSL::X509 x509
1005 CODE:
1006 RETVAL = X509_get_notAfter(x509);
1007 OUTPUT:
1008 RETVAL
1009
1010 int
1011 cert_type(x509)
1012 OpenSSL::X509 x509
1013 CODE:
1014 RETVAL = X509_certificate_type(x509, 0);
1015 OUTPUT:
1016 RETVAL
1017
1018 SV*
1019 as_string(x509,...)
1020 OpenSSL::X509 x509
1021 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 OpenSSL::X509 x509
1047 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 OpenSSL::X509 x509
1062 OpenSSL::Name name
1063 CODE:
1064 X509_set_issuer_name(x509, X509_NAME_dup(name));
1065
1066 void
1067 set_subject(x509,name)
1068 OpenSSL::X509 x509
1069 OpenSSL::Name name
1070 CODE:
1071 X509_set_subject_name(x509, X509_NAME_dup(name));
1072
1073 SV *
1074 errstring(x509)
1075 OpenSSL::X509 x509
1076 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 OpenSSL::Cipher ctx
1099 CODE:
1100 if(ctx) {
1101 EVP_CIPHER_CTX_cleanup(ctx);
1102 free(ctx);
1103 }
1104
1105 OpenSSL::Cipher
1106 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 CODE:
1119 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 RETVAL = (EVP_CIPHER_CTX *) malloc(sizeof(EVP_CIPHER_CTX));
1130 if(!RETVAL)
1131 croak("malloc error");
1132 key = SvPV(svkey, keylen);
1133 memcpy(k, key, (keylen <= ci->key_len) ? keylen : ci->key_len);
1134 rc = EVP_CipherInit(RETVAL, ci, k, iv, ix);
1135 memset(iv, 0, EVP_MAX_IV_LENGTH);
1136 memset(iv, 0, EVP_MAX_KEY_LENGTH);
1137 if(!rc) {
1138 free(RETVAL);
1139 croak("EVP_CipherInit");
1140 }
1141 OUTPUT:
1142 RETVAL
1143
1144
1145 SV *
1146 update(ctx,svin)
1147 OpenSSL::Cipher ctx
1148 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 OpenSSL::Cipher ctx
1172 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 OpenSSL::Digest
1271 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 CODE:
1282 RETVAL = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1283 if(!RETVAL)
1284 croak("out of memory.");
1285 EVP_DigestInit(RETVAL, _mds[NO_FLAGS(ix)]);
1286 OUTPUT:
1287 RETVAL
1288
1289 void
1290 DESTROY(ctx)
1291 OpenSSL::Digest ctx
1292 CODE:
1293 if(ctx)
1294 free(ctx);
1295
1296 void
1297 update(ctx, sv)
1298 OpenSSL::Digest ctx
1299 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 OpenSSL::Digest ctx
1310 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 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 OpenSSL::Digest
1399 new_md2()
1400 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 CODE:
1410 RETVAL = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1411 if(!RETVAL)
1412 croak("out of memory.");
1413 EVP_DigestInit(RETVAL, _mds[NO_FLAGS(ix)]);
1414 OUTPUT:
1415 RETVAL
1416
1417 void
1418 DESTROY(ctx)
1419 OpenSSL::Digest ctx
1420 CODE:
1421 if(ctx)
1422 free(ctx);
1423
1424 void
1425 update(ctx, sv)
1426 OpenSSL::Digest ctx
1427 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 OpenSSL::Digest ctx
1439 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 OpenSSL::PKCS7
1465 new()
1466 CODE:
1467 if(!(RETVAL = PKCS7_new())) {
1468 croak("PKCS7_new");
1469 }
1470 OUTPUT:
1471 RETVAL
1472
1473
1474 void
1475 DESTROY(p7)
1476 OpenSSL::PKCS7 p7;
1477 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 OpenSSL::PKCS12
1487 new(class)
1488 SV *class
1489 CODE:
1490 if(!(RETVAL = PKCS12_new())) {
1491 croak("PKCS12_new");
1492 }
1493 OUTPUT:
1494 RETVAL
1495
1496 OpenSSL::PKCS12
1497 new_from_string(class,sv)
1498 SV *class
1499 SV *sv
1500 ALIAS:
1501 new_from_file = 1
1502 PREINIT:
1503 BIO *bio;
1504 char *s;
1505 STRLEN len;
1506 CODE:
1507 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 if(!(RETVAL = d2i_PKCS12_bio(bio, 0))) {
1516 BIO_free(bio);
1517 croak("d2i_PKCS12_BIO: %s", ssl_error());
1518 }
1519 BIO_free(bio);
1520 OUTPUT:
1521 RETVAL
1522
1523
1524 SV*
1525 mac_ok(p12, pwd)
1526 OpenSSL::PKCS12 p12
1527 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 OpenSSL::PKCS12 p12
1537 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 OpenSSL::PKCS12 p12
1554 ALIAS:
1555 as_file = 1
1556 PROTOTYPE: $;$
1557 PREINIT:
1558 BIO *bio;
1559 CODE:
1560 if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1561 croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string");
1562 if(items > 1) {
1563 bio = sv_bio_create_file(ST(1));
1564 } else {
1565 bio = sv_bio_create();
1566 }
1567 if(!bio)
1568 croak("sv_bio_create");
1569 if(!i2d_PKCS12_bio(bio, p12)) {
1570 sv_bio_error(bio);
1571 croak("i2d_PKCS12_bio: %s", ssl_error());
1572 }
1573 RETVAL = sv_bio_final(bio);
1574 OUTPUT:
1575 RETVAL
1576
1577 void
1578 DESTROY(p12)
1579 OpenSSL::PKCS12 p12;
1580 CODE:
1581 if(p12) {
1582 XD("PKCS12_free(%p)\n", p12);
1583 PKCS12_free(p12);
1584 }
1585
1586
1587 MODULE = OpenSSL PACKAGE = OpenSSL::CRL
1588
1589 OpenSSL::CRL
1590 new_from_string(thing)
1591 SV *thing
1592 ALIAS:
1593 new_from_file = 1
1594 PREINIT:
1595 BIO *bio;
1596 STRLEN l;
1597 char *p;
1598 CODE:
1599 p = SvPV(thing, l);
1600 if(ix == 1) {
1601 bio = BIO_new_file(p, "r");
1602 } else {
1603 bio = BIO_new_mem_buf (p, l);
1604 }
1605 if(!bio)
1606 croak(ssl_error());
1607
1608 RETVAL = PEM_read_bio_X509_CRL (bio, 0, 0, 0);
1609 BIO_free (bio);
1610 if(!RETVAL)
1611 croak("PEM_read_bio_X509_CRL: %s", ssl_error());
1612
1613 OUTPUT:
1614 RETVAL
1615
1616 void
1617 DESTROY(crl)
1618 OpenSSL::CRL crl
1619 CODE:
1620 if (crl) {
1621 XD("X509_CRL_free (%p)\n", crl);
1622 X509_CRL_free(crl);
1623 crl = 0;
1624 }
1625
1626 SV*
1627 info(crl)
1628 OpenSSL::CRL crl
1629 PREINIT:
1630 BIO *bio;
1631 CODE:
1632 bio = sv_bio_create();
1633 if(!X509_CRL_print(bio,crl)) {
1634 sv_bio_error(bio);
1635 croak("X509_CRL_print: %s", ssl_error());
1636 }
1637 RETVAL = sv_bio_final(bio);
1638 OUTPUT:
1639 RETVAL
1640