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