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

# 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 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 // 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 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 OpenSSL::RSA
397 new_keygen(bits = 128, e = 35)
398 IV bits
399 IV e
400 CODE:
401 if(!(RETVAL = RSA_generate_key(bits, e, NULL, NULL)))
402 croak("RSA_generate_key");
403 OUTPUT:
404 RETVAL
405
406 OpenSSL::RSA
407 new_pubkey(n, e)
408 char *n
409 char *e
410 CODE:
411 RETVAL = RSA_new();
412 if (!RETVAL)
413 croak("can't allocate key");
414 if(!(RETVAL->n = BN_new()) || !BN_dec2bn(&RETVAL->n, n)) {
415 RSA_free(RETVAL); croak("can't initialize n");
416 }
417 if(!(RETVAL->e = BN_new()) || !BN_dec2bn(&RETVAL->e, e)) {
418 RSA_free(RETVAL); croak("can't initialize e");
419 }
420 //key->p = 0, key->q = 0, key->dmp1 = 0, key->dmq1 = 0, key->iqmp = 0;
421 OUTPUT:
422 RETVAL
423
424
425 OpenSSL::RSA
426 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 CODE:
436 int rc;
437
438 RETVAL = RSA_new();
439 if (!RETVAL)
440 croak("can't allocate key");
441 if(!(RETVAL->n = BN_new()) || !BN_dec2bn(&RETVAL->n, n)) {
442 RSA_free(RETVAL); croak("can't initialize n");
443 }
444 if(!(RETVAL->e = BN_new()) || !BN_dec2bn(&RETVAL->e, e)) {
445 RSA_free(RETVAL); croak("can't initialize e");
446 }
447 if(!(RETVAL->p = BN_new()) || !BN_dec2bn(&RETVAL->p, p)) {
448 RSA_free(RETVAL); croak("can't initialize p");
449 }
450 if(!(RETVAL->q = BN_new()) || !BN_dec2bn(&RETVAL->q, q)) {
451 RSA_free(RETVAL); croak("can't initialize q");
452 }
453 if(!(RETVAL->dmp1 = BN_new()) || !BN_dec2bn(&RETVAL->dmp1, dmp1)) {
454 RSA_free(RETVAL); croak("can't initialize dmp1");
455 }
456 if(!(RETVAL->dmq1 = BN_new()) || !BN_dec2bn(&RETVAL->dmq1, dmq1)) {
457 RSA_free(RETVAL); croak("can't initialize dmq1");
458 }
459 if(!(RETVAL->iqmp = BN_new()) || !BN_dec2bn(&RETVAL->iqmp, iqmp)) {
460 RSA_free(RETVAL); croak("can't initialize iqmp");
461 }
462 if(!(RETVAL->d = BN_new()) || !BN_dec2bn(&RETVAL->d, d)) {
463 RSA_free(RETVAL); croak("can't initialize d");
464 }
465 if((rc = RSA_check_key(RETVAL)) != 1) {
466 RSA_free(RETVAL); croak("RSA_check_key failed (%d).", rc);
467 }
468 OUTPUT:
469 RETVAL
470
471
472 void
473 DESTROY(key)
474 OpenSSL::RSA key
475 CODE:
476 if (key) {
477 XD("RSA_free(%p)\n", key);
478 RSA_free(key);
479 }
480
481 IV
482 keysize(key)
483 OpenSSL::RSA key;
484 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 OpenSSL::RSA key;
494 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 OpenSSL::RSA key;
505 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 OpenSSL::RSA key;
540 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 OpenSSL::RSA key
596 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 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, *q = 0;
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 char *
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 char *
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 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 OpenSSL::Digest
1400 new_md2()
1401 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 CODE:
1411 RETVAL = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1412 if(!RETVAL)
1413 croak("out of memory.");
1414 EVP_DigestInit(RETVAL, _mds[NO_FLAGS(ix)]);
1415 OUTPUT:
1416 RETVAL
1417
1418 void
1419 DESTROY(ctx)
1420 OpenSSL::Digest ctx
1421 CODE:
1422 if(ctx)
1423 free(ctx);
1424
1425 void
1426 update(ctx, sv)
1427 OpenSSL::Digest ctx
1428 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 OpenSSL::Digest ctx
1440 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 OpenSSL::PKCS7
1466 new()
1467 CODE:
1468 if(!(RETVAL = PKCS7_new())) {
1469 croak("PKCS7_new");
1470 }
1471 OUTPUT:
1472 RETVAL
1473
1474
1475 void
1476 DESTROY(p7)
1477 OpenSSL::PKCS7 p7;
1478 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 OpenSSL::PKCS12
1488 new(class)
1489 SV *class
1490 CODE:
1491 if(!(RETVAL = PKCS12_new())) {
1492 croak("PKCS12_new");
1493 }
1494 OUTPUT:
1495 RETVAL
1496
1497 OpenSSL::PKCS12
1498 new_from_string(class,sv)
1499 SV *class
1500 SV *sv
1501 ALIAS:
1502 new_from_file = 1
1503 PREINIT:
1504 BIO *bio;
1505 char *s;
1506 STRLEN len;
1507 CODE:
1508 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 if(!(RETVAL = d2i_PKCS12_bio(bio, 0))) {
1517 BIO_free(bio);
1518 croak("d2i_PKCS12_BIO: %s", ssl_error());
1519 }
1520 BIO_free(bio);
1521 OUTPUT:
1522 RETVAL
1523
1524
1525 SV*
1526 mac_ok(p12, pwd)
1527 OpenSSL::PKCS12 p12
1528 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 OpenSSL::PKCS12 p12
1538 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 OpenSSL::PKCS12 p12
1555 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 OpenSSL::PKCS12 p12;
1582 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 OpenSSL::CRL
1592 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 CODE:
1601 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 RETVAL = PEM_read_bio_X509_CRL (bio, 0, 0, 0);
1611 BIO_free (bio);
1612 if(!RETVAL)
1613 croak("PEM_read_bio_X509_CRL: %s", ssl_error());
1614
1615 OUTPUT:
1616 RETVAL
1617
1618 void
1619 DESTROY(crl)
1620 OpenSSL::CRL crl
1621 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 OpenSSL::CRL crl
1631 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