ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenSSL/OpenSSL.xs
Revision: 1.9
Committed: Sat Oct 27 03:17:42 2001 UTC (22 years, 6 months ago) by root
Branch: MAIN
Changes since 1.8: +59 -76 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 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 OpenSSL::RSA
396 new_keygen(bits = 128, e = 35)
397 IV bits
398 IV e
399 CODE:
400 if(!(RETVAL = RSA_generate_key(bits, e, NULL, NULL)))
401 croak("RSA_generate_key");
402 OUTPUT:
403 RETVAL
404
405 OpenSSL::RSA
406 new_pubkey(n, e)
407 char *n
408 char *e
409 CODE:
410 RETVAL = RSA_new();
411 if (!RETVAL)
412 croak("can't allocate key");
413 if(!(RETVAL->n = BN_new()) || !BN_dec2bn(&RETVAL->n, n)) {
414 RSA_free(RETVAL); croak("can't initialize n");
415 }
416 if(!(RETVAL->e = BN_new()) || !BN_dec2bn(&RETVAL->e, e)) {
417 RSA_free(RETVAL); croak("can't initialize e");
418 }
419 //key->p = 0, key->q = 0, key->dmp1 = 0, key->dmq1 = 0, key->iqmp = 0;
420 OUTPUT:
421 RETVAL
422
423
424 OpenSSL::RSA
425 new_privkey(n, e, p, q, dmp1, dmq1, iqmp, d)
426 char *n
427 char *e
428 char *p
429 char *q
430 char *dmp1
431 char *dmq1
432 char *iqmp
433 char *d
434 CODE:
435 int rc;
436
437 RETVAL = RSA_new();
438 if (!RETVAL)
439 croak("can't allocate key");
440 if(!(RETVAL->n = BN_new()) || !BN_dec2bn(&RETVAL->n, n)) {
441 RSA_free(RETVAL); croak("can't initialize n");
442 }
443 if(!(RETVAL->e = BN_new()) || !BN_dec2bn(&RETVAL->e, e)) {
444 RSA_free(RETVAL); croak("can't initialize e");
445 }
446 if(!(RETVAL->p = BN_new()) || !BN_dec2bn(&RETVAL->p, p)) {
447 RSA_free(RETVAL); croak("can't initialize p");
448 }
449 if(!(RETVAL->q = BN_new()) || !BN_dec2bn(&RETVAL->q, q)) {
450 RSA_free(RETVAL); croak("can't initialize q");
451 }
452 if(!(RETVAL->dmp1 = BN_new()) || !BN_dec2bn(&RETVAL->dmp1, dmp1)) {
453 RSA_free(RETVAL); croak("can't initialize dmp1");
454 }
455 if(!(RETVAL->dmq1 = BN_new()) || !BN_dec2bn(&RETVAL->dmq1, dmq1)) {
456 RSA_free(RETVAL); croak("can't initialize dmq1");
457 }
458 if(!(RETVAL->iqmp = BN_new()) || !BN_dec2bn(&RETVAL->iqmp, iqmp)) {
459 RSA_free(RETVAL); croak("can't initialize iqmp");
460 }
461 if(!(RETVAL->d = BN_new()) || !BN_dec2bn(&RETVAL->d, d)) {
462 RSA_free(RETVAL); croak("can't initialize d");
463 }
464 if((rc = RSA_check_key(RETVAL)) != 1) {
465 RSA_free(RETVAL); croak("RSA_check_key failed (%d).", rc);
466 }
467 OUTPUT:
468 RETVAL
469
470
471 void
472 DESTROY(key)
473 OpenSSL::RSA key
474 CODE:
475 if (key) {
476 XD("RSA_free(%p)\n", key);
477 RSA_free(key);
478 }
479
480 IV
481 keysize(key)
482 OpenSSL::RSA key;
483 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 OpenSSL::RSA key;
493 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 OpenSSL::RSA key;
504 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 OpenSSL::RSA key;
539 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 OpenSSL::RSA key
595 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 OpenSSL::RSA key;
652 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 OpenSSL::RSA key
695 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 OpenSSL::Name
716 new(class)
717 SV *class
718 CODE:
719 if(!(RETVAL = X509_NAME_new())) {
720 croak("X509_NAME_new");
721 }
722 OUTPUT:
723 RETVAL
724
725
726 void
727 add(name, key, string)
728 OpenSSL::Name name
729 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 OpenSSL::Name name
749 CODE:
750 RETVAL = X509_NAME_entry_count(name);
751 OUTPUT:
752 RETVAL
753
754 void
755 getall(name)
756 OpenSSL::Name name
757 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 OpenSSL::Name name
778 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 OpenSSL::X509
871 new(class)
872 SV *class
873 CODE:
874 if ((RETVAL = X509_new ()) == NULL)
875 croak("X509_new");
876
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
887
888 OpenSSL::X509
889 new_from_string(class,thing)
890 SV *class
891 SV *thing
892 ALIAS:
893 new_from_file = 1
894 PREINIT:
895 BIO *bio;
896 STRLEN l;
897 char *p, *q = 0;
898 CODE:
899 p = SvPV (thing, l);
900 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 RETVAL = PEM_read_bio_X509 (bio, 0, 0, 0);
909 BIO_free (bio);
910 if(!RETVAL)
911 croak("PEM_read_bio_X509: %s", ssl_error());
912
913 OUTPUT:
914 RETVAL
915
916 void
917 DESTROY(x509)
918 OpenSSL::X509 x509
919 CODE:
920 if (x509) {
921 XD("X509_free(%p)\n", x509);
922 X509_free (x509);
923 x509 = 0;
924 }
925
926
927 char *
928 fingerprint_md5(x509)
929 OpenSSL::X509 x509
930 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 OpenSSL::Name
943 subject(x509)
944 OpenSSL::X509 x509
945 CODE:
946 RETVAL = X509_get_subject_name(x509);
947 OUTPUT:
948 RETVAL
949
950 OpenSSL::Name
951 issuer(x509)
952 OpenSSL::X509 x509
953 CODE:
954 RETVAL = X509_get_issuer_name(x509);
955 OUTPUT:
956 RETVAL
957
958
959 char *
960 subject_txt(x509)
961 OpenSSL::X509 x509
962 CODE:
963 RETVAL = ol(X509_get_subject_name(x509));
964 OUTPUT:
965 RETVAL
966
967
968 char *
969 issuer_txt(x509)
970 OpenSSL::X509 x509
971 CODE:
972 RETVAL = ol(X509_get_issuer_name(x509));
973 OUTPUT:
974 RETVAL
975
976 ASN1_INTEGER *
977 serial(x509)
978 OpenSSL::X509 x509
979 CODE:
980 RETVAL = X509_get_serialNumber(x509);
981 OUTPUT:
982 RETVAL
983
984
985 int
986 version(x509)
987 OpenSSL::X509 x509
988 CODE:
989 RETVAL = X509_get_version(x509);
990 OUTPUT:
991 RETVAL
992
993 ASN1_UTCTIME *
994 notBefore(x509)
995 OpenSSL::X509 x509
996 CODE:
997 RETVAL = X509_get_notBefore(x509);
998 OUTPUT:
999 RETVAL
1000
1001 ASN1_UTCTIME *
1002 notAfter(x509)
1003 OpenSSL::X509 x509
1004 CODE:
1005 RETVAL = X509_get_notAfter(x509);
1006 OUTPUT:
1007 RETVAL
1008
1009 int
1010 cert_type(x509)
1011 OpenSSL::X509 x509
1012 CODE:
1013 RETVAL = X509_certificate_type(x509, 0);
1014 OUTPUT:
1015 RETVAL
1016
1017 SV*
1018 as_string(x509,...)
1019 OpenSSL::X509 x509
1020 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 OpenSSL::X509 x509
1046 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 OpenSSL::X509 x509
1061 OpenSSL::Name name
1062 CODE:
1063 X509_set_issuer_name(x509, X509_NAME_dup(name));
1064
1065 void
1066 set_subject(x509,name)
1067 OpenSSL::X509 x509
1068 OpenSSL::Name name
1069 CODE:
1070 X509_set_subject_name(x509, X509_NAME_dup(name));
1071
1072 SV *
1073 errstring(x509)
1074 OpenSSL::X509 x509
1075 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 OpenSSL::Cipher ctx
1098 CODE:
1099 if(ctx) {
1100 EVP_CIPHER_CTX_cleanup(ctx);
1101 free(ctx);
1102 }
1103
1104 OpenSSL::Cipher
1105 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 CODE:
1118 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 RETVAL = (EVP_CIPHER_CTX *) malloc(sizeof(EVP_CIPHER_CTX));
1129 if(!RETVAL)
1130 croak("malloc error");
1131 key = SvPV(svkey, keylen);
1132 memcpy(k, key, (keylen <= ci->key_len) ? keylen : ci->key_len);
1133 rc = EVP_CipherInit(RETVAL, ci, k, iv, ix);
1134 memset(iv, 0, EVP_MAX_IV_LENGTH);
1135 memset(iv, 0, EVP_MAX_KEY_LENGTH);
1136 if(!rc) {
1137 free(RETVAL);
1138 croak("EVP_CipherInit");
1139 }
1140 OUTPUT:
1141 RETVAL
1142
1143
1144 SV *
1145 update(ctx,svin)
1146 OpenSSL::Cipher ctx
1147 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 OpenSSL::Cipher ctx
1171 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 OpenSSL::Digest
1270 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 CODE:
1281 RETVAL = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1282 if(!RETVAL)
1283 croak("out of memory.");
1284 EVP_DigestInit(RETVAL, _mds[NO_FLAGS(ix)]);
1285 OUTPUT:
1286 RETVAL
1287
1288 void
1289 DESTROY(ctx)
1290 OpenSSL::Digest ctx
1291 CODE:
1292 if(ctx)
1293 free(ctx);
1294
1295 void
1296 update(ctx, sv)
1297 OpenSSL::Digest ctx
1298 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 OpenSSL::Digest ctx
1309 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 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 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 OpenSSL::PKCS12 p12;
1581 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 OpenSSL::CRL
1591 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 CODE:
1600 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 RETVAL = PEM_read_bio_X509_CRL (bio, 0, 0, 0);
1610 BIO_free (bio);
1611 if(!RETVAL)
1612 croak("PEM_read_bio_X509_CRL: %s", ssl_error());
1613
1614 OUTPUT:
1615 RETVAL
1616
1617 void
1618 DESTROY(crl)
1619 OpenSSL::CRL crl
1620 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 OpenSSL::CRL crl
1630 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