ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenSSL/OpenSSL.xs
Revision: 1.6
Committed: Sat Oct 27 02:55:31 2001 UTC (22 years, 6 months ago) by root
Branch: MAIN
Changes since 1.5: +16 -19 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 #define GEN_INPUT(type,class) \
38 static inline type * input_##type(SV *sv) { \
39 XD("GEN_INPUT " class " sv=%p\n", sv); \
40 if(sv_derived_from(sv, class)) \
41 return (type *) SvIV(SvRV(sv)); \
42 croak("Not a reference to a " class " object"); \
43 return (type *) 0; }
44
45
46 #define GEN_OUTPUT(type,class) \
47 static inline SV* output_##type(type *foobar, SV *sv) { \
48 XD("GEN_OUTPUT " class " sv=%p\n", sv); \
49 return sv_setref_pv(sv, class, (void *) foobar); \
50 }
51
52
53 #define GEN_IO(type,class) \
54 GEN_INPUT(type,class) \
55 GEN_OUTPUT(type,class)
56
57
58 GEN_IO(PKCS12, "OpenSSL::PKCS12")
59 GEN_IO(PKCS7, "OpenSSL::PKCS7")
60 GEN_IO(RSA, "OpenSSL::RSA")
61 GEN_IO(EVP_MD_CTX, "OpenSSL::Digest")
62 GEN_IO(EVP_CIPHER_CTX, "OpenSSL::Cipher")
63
64 typedef X509 *OpenSSL__X509;
65 typedef X509_CRL *OpenSSL__CRL;
66 typedef X509_NAME *OpenSSL__Name;
67
68 static inline SV* output_ASN1_INTEGER(ASN1_INTEGER *ai, SV *sv)
69 {
70 if(!ai)
71 croak("got 0-ptr");
72 if(ai->type != V_ASN1_INTEGER)
73 croak("not asn1 integer type (%d)", ai->type);
74 //return newSViv(ASN1_INTEGER_get(ai));
75 sv_setiv(sv, ASN1_INTEGER_get(ai));
76 return sv;
77 }
78
79 static inline SV* output_ASN1_UTCTIME(ASN1_UTCTIME *s, SV *sv)
80 {
81 struct tm tm;
82 int offs;
83 char buf[64];
84
85 if(!s)
86 croak("got 0-ptr");
87 if(s->type != V_ASN1_UTCTIME)
88 croak("not asn1 utctime type (%d)", s->type);
89 if(!ASN1_UTCTIME_check(s))
90 croak("invalid UTC time.");
91 // fuck openssl crap.
92 memset(&tm, 0, sizeof tm);
93 #define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
94 tm.tm_year=g2(s->data);
95 if(tm.tm_year < 50)
96 tm.tm_year+=100;
97 tm.tm_mon=g2(s->data+2)-1;
98 tm.tm_mday=g2(s->data+4);
99 tm.tm_hour=g2(s->data+6);
100 tm.tm_min=g2(s->data+8);
101 tm.tm_sec=g2(s->data+10);
102 if(s->data[12] == 'Z')
103 offs=0;
104 else
105 {
106 offs=g2(s->data+13)*60+g2(s->data+15);
107 if(s->data[12] == '-')
108 offs= -offs;
109 }
110 #undef g2
111 if(!strftime(buf, 63, "%a, %d %b %Y %H:%M:%S %z", &tm)) {
112 croak("can't convert time.");
113 }
114 sv_setpv(sv, buf);
115 return sv;
116 }
117
118 long fuck_cb(struct bio_st *bm, int m, const char *ptr, int l, long x, long y)
119 {
120 if(m == BIO_CB_WRITE) {
121 SV *sv = (SV *) BIO_get_callback_arg(bm);
122 sv_catpvn(sv, ptr, l);
123 }
124 if(m == BIO_CB_PUTS) {
125 SV *sv = (SV *) BIO_get_callback_arg(bm);
126 l = strlen(ptr);
127 sv_catpvn(sv, ptr, l);
128 }
129 return l;
130 }
131
132 static inline BIO* sv_bio_create(void)
133 {
134 SV *sv;
135 BIO *bio;
136 sv = newSVpvn("",0);
137 // mem is completely broken for write, so we use /dev/null
138 // and use callbacks-hooks
139 bio = BIO_new_file("/dev/null", "wb");
140 BIO_set_callback(bio, fuck_cb);
141 BIO_set_callback_arg(bio, (void *)sv);
142 return bio;
143 }
144
145 static inline BIO *sv_bio_create_file(SV *filename)
146 {
147 char *fn;
148 STRLEN l;
149
150 return BIO_new_file(SvPV(filename, l), "wb");
151 }
152
153 static inline SV * sv_bio_final(BIO *bio)
154 {
155 SV* sv;
156
157 BIO_flush(bio);
158 sv = (SV *) BIO_get_callback_arg(bio);
159 BIO_free_all (bio);
160 // check for file:
161 if(!sv)
162 sv = &PL_sv_undef;
163 return sv;
164 }
165
166 static inline void sv_bio_error(BIO *bio)
167 {
168 SV *sv;
169 sv = (SV *) BIO_get_callback_arg(bio);
170 if(sv)
171 sv_free(sv);
172 BIO_free_all (bio);
173 }
174
175 static const char *ssl_error(void) // function leaks. :(
176 {
177 BIO *bio;
178 SV *sv;
179 STRLEN l;
180
181 bio = sv_bio_create();
182 ERR_print_errors(bio);
183 sv = sv_bio_final(bio);
184 ERR_clear_error();
185 return SvPV(sv, l);
186 }
187
188 static inline SV* output_BN(BIGNUM *n, SV *sv)
189 {
190 if (!n)
191 croak("parse error :)");
192
193 sv_setpvn(sv, BN_bn2dec(n), 0);
194 return sv;
195 }
196
197 static const char * digcvt(char *ret, const char *from, int len)
198 {
199 static const char *htab = "0123456789abcdef";
200 char *to = ret;
201 int i;
202 for(i = 0; i < len; i++) {
203 *to++ = htab[(*from >> 4) & 0xf];
204 *to++ = htab[*from++ & 0xf];
205 }
206 *to = 0;
207 return ret;
208 }
209
210 /* mutt, anything else is broken ! */
211 static const char B64Chars[64] = {
212 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
213 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
214 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
215 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
216 '8', '9', '+', '/'
217 };
218
219 static unsigned char *mutt_to_base64 (unsigned char *out, const unsigned char *in, size_t len,
220 size_t olen)
221 {
222 char *o = out;
223 while (len >= 3 && olen > 10)
224 {
225 *out++ = B64Chars[in[0] >> 2];
226 *out++ = B64Chars[((in[0] << 4) & 0x30) | (in[1] >> 4)];
227 *out++ = B64Chars[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
228 *out++ = B64Chars[in[2] & 0x3f];
229 olen -= 4;
230 len -= 3;
231 in += 3;
232 }
233
234 /* clean up remainder */
235 if (len > 0 && olen > 4)
236 {
237 unsigned char fragment;
238
239 *out++ = B64Chars[in[0] >> 2];
240 fragment = (in[0] << 4) & 0x30;
241 if (len > 1)
242 fragment |= in[1] >> 4;
243 *out++ = B64Chars[fragment];
244 *out++ = (len < 2) ? '=' : B64Chars[(in[1] << 2) & 0x3c];
245 *out++ = '=';
246 }
247 *out = '\0';
248 return o;
249 }
250
251 static inline SV* hexsv(unsigned char *s, unsigned len)
252 {
253 char *ret;
254 SV *sv;
255 ret = malloc((len<<1)+1);
256 if(!ret)
257 croak("malloc");
258 sv = newSVpv(digcvt(ret, s,len), len <<1);
259 free(ret);
260 return sv;
261 }
262
263 static inline SV* base64sv(unsigned char *s, unsigned len)
264 {
265 char *ret;
266 SV *sv;
267 int enc_cnt = ((len+ 2) / 3) << 2;
268 ret = malloc(enc_cnt+1);
269 if(!ret)
270 croak("malloc");
271 sv = newSVpv(mutt_to_base64(ret, s,len, enc_cnt+1), enc_cnt);
272 free(ret);
273 return sv;
274
275 }
276
277 #define FLAG_HEX 0x10
278 #define FLAG_BASE64 0x20
279 #define NO_FLAGS(x) ((x) &0xf)
280
281 static EVP_MD *_mds[9];
282
283 static int mds_booted = 0;
284
285 static void mds_boot (void)
286 {
287 if(mds_booted)
288 return;
289 mds_booted = 1;
290 OpenSSL_add_all_digests();
291 _mds[0] = EVP_md2();
292 _mds[1] = EVP_md4();
293 _mds[2] = EVP_md5();
294 _mds[3] = EVP_sha();
295 _mds[4] = EVP_sha1();
296 _mds[5] = EVP_dss();
297 _mds[6] = EVP_dss1();
298 _mds[7] = EVP_mdc2();
299 _mds[8] = EVP_ripemd160();
300 }
301
302
303
304 static char *
305 dofp(X509 *x509, EVP_MD *digest)
306 {
307 unsigned char md[EVP_MAX_MD_SIZE];
308 unsigned static char s[EVP_MAX_MD_SIZE*3];
309 int n, i;
310
311 if(!X509_digest(x509, digest, md, &n))
312 croak("Digest error: %s", ssl_error());
313 for(i = 0; i < n; i++) {
314 sprintf(&s[i*3], "%02X%c", md[i], (i + 1 == (int) n) ? '\0' : ':');
315 }
316 return s;
317 }
318
319 static inline char *ol(X509_NAME *x)
320 {
321 static char buf[256];
322 X509_NAME_oneline(x, buf, 256);
323 return buf;
324 }
325
326 static void run_sha1(char *digest, const char *msg, int msglen)
327 {
328 SHA_CTX ctx;
329
330 if(!digest || !msg || msglen < 0)
331 croak("run_sha1: null pointer or illegal message len");
332 SHA1_Init(&ctx);
333 SHA1_Update(&ctx, msg, msglen);
334 SHA1_Final(digest, &ctx);
335 }
336
337 static bool is_privkey(RSA *key)
338 {
339 return (key->n && key->e && key->d && key->p && key->q
340 && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0;
341 }
342
343 typedef struct {
344 EVP_CIPHER *func;
345 char name[20];
346 } cip_list_st;
347
348 static cip_list_st cip_list[50];
349 static int cip_cnt = 0;
350
351 static inline char *wappla_fixname(const char *s)
352 {
353 static char x[50];
354 char *p;
355 strcpy(x, s);
356 while((p = strchr(x, '_'))) {
357 *p = '-';
358 }
359 return x;
360 }
361
362 static inline EVP_CIPHER *lookup_cipher(const char *name)
363 {
364 int i;
365 for(i = 0; i < cip_cnt;i++)
366 if(!strcmp(name, cip_list[i].name))
367 return cip_list[i].func;
368 return 0;
369 }
370
371 #define ADD_C_(x) cip_list[cip_cnt].func = (EVP_##x()); \
372 strcpy(cip_list[cip_cnt++].name, wappla_fixname(#x))
373
374 static int cipher_booted = 0;
375
376 static void cipher_boot(void)
377 {
378 if(cipher_booted)
379 return;
380 cipher_booted++;
381 OpenSSL_add_all_ciphers();
382 #ifndef NO_DES
383 ADD_C_(des_ecb); ADD_C_(des_ede); ADD_C_(des_ede3);
384 ADD_C_(des_cfb); ADD_C_(des_ede_cfb); ADD_C_(des_ede3_cfb);
385 ADD_C_(des_ofb); ADD_C_(des_ede_ofb); ADD_C_(des_ede3_ofb);
386 ADD_C_(des_cbc); ADD_C_(des_ede_cbc); ADD_C_(des_ede3_cbc);
387 ADD_C_(desx_cbc);
388 #endif
389 #ifndef NO_RC4
390 ADD_C_(rc4); ADD_C_(rc4_40);
391 #endif
392 #ifndef NO_IDEA
393 ADD_C_(idea_ecb); ADD_C_(idea_cfb);
394 ADD_C_(idea_ofb); ADD_C_(idea_cbc);
395 #endif
396 #ifndef NI_RC2
397 ADD_C_(rc2_ecb); ADD_C_(rc2_cbc); ADD_C_(rc2_40_cbc);
398 ADD_C_(rc2_64_cbc); ADD_C_(rc2_cfb); ADD_C_(rc2_ofb);
399 #endif
400 #ifndef NO_BF
401 ADD_C_(bf_ecb); ADD_C_(bf_cbc);
402 ADD_C_(bf_cfb); ADD_C_(bf_ofb);
403 #endif
404 #ifndef NO_CAST
405 ADD_C_(cast5_ecb); ADD_C_(cast5_cbc);
406 ADD_C_(cast5_cfb); ADD_C_(cast5_ofb);
407 #endif
408 #ifndef NO_RC5
409 ADD_C_(rc5_32_12_16_cbc); ADD_C_(rc5_32_12_16_ecb);
410 ADD_C_(rc5_32_12_16_cfb); ADD_C_(rc5_32_12_16_ofb);
411 #endif
412 }
413
414
415 MODULE = OpenSSL PACKAGE = OpenSSL::RSA
416
417 void
418 new_keygen(bits = 128, e = 35)
419 IV bits
420 IV e
421 PREINIT:
422 RSA *key;
423 PPCODE:
424 if(!(key = RSA_generate_key(bits, e, NULL, NULL)))
425 croak("RSA_generate_key");
426 EXTEND(sp, 1);
427 PUSHs(sv_newmortal());
428 sv_setref_pv(ST(0), "OpenSSL::RSA", (void *) key);
429
430 void
431 new_pubkey(n, e)
432 char *n
433 char *e
434 PREINIT:
435 RSA *key;
436 PPCODE:
437 EXTEND(sp, 1);
438 PUSHs(sv_newmortal());
439 key = RSA_new();
440 if (!key)
441 croak("can't allocate key");
442 if(!(key->n = BN_new()) || !BN_dec2bn(&key->n, n)) {
443 RSA_free(key); croak("can't initialize n");
444 }
445 if(!(key->e = BN_new()) || !BN_dec2bn(&key->e, e)) {
446 RSA_free(key); croak("can't initialize e");
447 }
448 //key->p = 0, key->q = 0, key->dmp1 = 0, key->dmq1 = 0, key->iqmp = 0;
449 sv_setref_pv(ST(0), "OpenSSL::RSA", (void *) key);
450
451
452 void
453 new_privkey(n, e, p, q, dmp1, dmq1, iqmp, d)
454 char *n
455 char *e
456 char *p
457 char *q
458 char *dmp1
459 char *dmq1
460 char *iqmp
461 char *d
462 PREINIT:
463 RSA *key;
464 int rc;
465 PPCODE:
466 EXTEND(sp, 1);
467 PUSHs(sv_newmortal());
468 key = RSA_new();
469 if (!key)
470 croak("can't allocate key");
471 if(!(key->n = BN_new()) || !BN_dec2bn(&key->n, n)) {
472 RSA_free(key); croak("can't initialize n");
473 }
474 if(!(key->e = BN_new()) || !BN_dec2bn(&key->e, e)) {
475 RSA_free(key); croak("can't initialize e");
476 }
477 if(!(key->p = BN_new()) || !BN_dec2bn(&key->p, p)) {
478 RSA_free(key); croak("can't initialize p");
479 }
480 if(!(key->q = BN_new()) || !BN_dec2bn(&key->q, q)) {
481 RSA_free(key); croak("can't initialize q");
482 }
483 if(!(key->dmp1 = BN_new()) || !BN_dec2bn(&key->dmp1, dmp1)) {
484 RSA_free(key); croak("can't initialize dmp1");
485 }
486 if(!(key->dmq1 = BN_new()) || !BN_dec2bn(&key->dmq1, dmq1)) {
487 RSA_free(key); croak("can't initialize dmq1");
488 }
489 if(!(key->iqmp = BN_new()) || !BN_dec2bn(&key->iqmp, iqmp)) {
490 RSA_free(key); croak("can't initialize iqmp");
491 }
492 if(!(key->d = BN_new()) || !BN_dec2bn(&key->d, d)) {
493 RSA_free(key); croak("can't initialize d");
494 }
495 if((rc = RSA_check_key(key)) != 1) {
496 RSA_free(key); croak("RSA_check_key failed (%d).", rc);
497 }
498 sv_setref_pv(ST(0), "OpenSSL::RSA", (void *) key);
499
500
501 void
502 DESTROY(key)
503 RSA* key
504 CODE:
505 if (key) {
506 XD("RSA_free(%p)\n", key);
507 RSA_free(key);
508 }
509
510 IV
511 keysize(key)
512 RSA *key;
513 CODE:
514 if (!key || !key->n)
515 croak("invalid key");
516 RETVAL = BN_num_bits(key->n);
517 OUTPUT:
518 RETVAL
519
520 bool
521 check_key(key)
522 RSA *key;
523 PPCODE:
524 if(!key)
525 XSRETURN_NO;
526 if(RSA_check_key(key) == 1)
527 XSRETURN_YES;
528 XSRETURN_NO;
529
530
531 BIGNUM *
532 n(key)
533 RSA *key;
534 ALIAS:
535 e = 1
536 d = 2
537 p = 3
538 q = 4
539 dmp1 = 5
540 dmq1 = 6
541 iqmp = 7
542 PREINIT:
543 BIGNUM *bn = 0;
544 CODE:
545 if(!key)
546 croak("invalid key");
547 switch(ix) {
548 case 0: bn = key->n; break;
549 case 1: bn = key->e; break;
550 case 2: bn = key->d; break;
551 case 3: bn = key->p; break;
552 case 4: bn = key->q; break;
553 case 5: bn = key->dmp1; break;
554 case 6: bn = key->dmq1; break;
555 case 7: bn = key->iqmp; break;
556 default:
557 croak("huch");
558 }
559 if(!bn)
560 croak("bignum not defined (maybe pubkey ?)");
561 RETVAL = bn;
562 OUTPUT:
563 RETVAL
564
565
566 bool
567 is_privkey(key)
568 RSA *key;
569 CODE:
570 RETVAL = is_privkey(key);
571 OUTPUT:
572 RETVAL
573
574 void
575 STORABLE_thaw(osv, cloning, sv)
576 SV *osv
577 bool cloning
578 SV *sv
579 PREINIT:
580 STRLEN len;
581 char *p;
582 unsigned int *i;
583 RSA *key = NULL;
584 PPCODE:
585 if(cloning)
586 return;
587 i = (unsigned int *) SvPV(sv, len);
588 if(i[2] == 0xffffffff) {
589 // public key
590 key = RSA_new();
591 p = (char *) &i[3];
592 key->n = BN_bin2bn(p, i[0], NULL);
593 key->e = BN_bin2bn(&p[i[0]], i[1], NULL);
594 } else if (i[8] == 0xffffffff) {
595 // private key
596 key = RSA_new();
597 p = (char *) &i[9];
598 key->n = BN_bin2bn(p, i[0], NULL);
599 p += i[0];
600 key->e = BN_bin2bn(p, i[1], NULL);
601 p += i[1];
602 key->d = BN_bin2bn(p, i[2], NULL);
603 p += i[2];
604 key->p = BN_bin2bn(p, i[3], NULL);
605 p += i[3];
606 key->q = BN_bin2bn(p, i[4], NULL);
607 p += i[4];
608 key->dmp1 = BN_bin2bn(p, i[5], NULL);
609 p += i[5];
610 key->dmq1 = BN_bin2bn(p, i[6], NULL);
611 p += i[6];
612 key->iqmp = BN_bin2bn(p, i[7], NULL);
613 }
614 if(!key)
615 croak("Illegal Storable format.");
616 sv_setiv(SvRV(osv), (IV) key);
617 //sv_setref_pv(SvRV(osv), "OpenSSL::RSA", newRV_noinc((void *) key);
618 //sv_setiv(osv, (IV) key);
619
620
621
622 void
623 STORABLE_freeze(key, cloning)
624 RSA *key
625 bool cloning
626 PREINIT:
627 SV *sv;
628 STRLEN totlen;
629 PPCODE:
630 if(cloning)
631 return;
632 totlen = BN_num_bytes(key->n) + BN_num_bytes(key->e) + 3*sizeof(int);
633 if(!is_privkey(key)) {
634 int *y = malloc(totlen);
635 int *x = y;
636 char *p;
637 *x++ = BN_num_bytes(key->n);
638 *x++ = BN_num_bytes(key->e);
639 *x++ = 0xffffffff;
640 p = (char *) x;
641 p += BN_bn2bin(key->n, p);
642 p += BN_bn2bin(key->e, p);
643 XPUSHs(sv_2mortal(newSVpvn((char *)y, p - (char *) y)));
644 free(y);
645 } else {
646 int *y, *x;
647 char *p;
648 totlen += BN_num_bytes(key->d)
649 + BN_num_bytes(key->p)
650 + BN_num_bytes(key->q)
651 + BN_num_bytes(key->dmp1)
652 + BN_num_bytes(key->dmq1)
653 + BN_num_bytes(key->iqmp) + 6*sizeof(int);
654 y = malloc(totlen);
655 x = y;
656 *x++ = BN_num_bytes(key->n);
657 *x++ = BN_num_bytes(key->e);
658 *x++ = BN_num_bytes(key->d);
659 *x++ = BN_num_bytes(key->p);
660 *x++ = BN_num_bytes(key->q);
661 *x++ = BN_num_bytes(key->dmp1);
662 *x++ = BN_num_bytes(key->dmq1);
663 *x++ = BN_num_bytes(key->iqmp);
664 *x++ = 0xffffffff;
665 p = (char *) x;
666 p += BN_bn2bin(key->n, p);
667 p += BN_bn2bin(key->e, p);
668 p += BN_bn2bin(key->d, p);
669 p += BN_bn2bin(key->p, p);
670 p += BN_bn2bin(key->q, p);
671 p += BN_bn2bin(key->dmp1, p);
672 p += BN_bn2bin(key->dmq1, p);
673 p += BN_bn2bin(key->iqmp, p);
674 XPUSHs(sv_2mortal(newSVpvn((char *)y, p - (char *) y)));
675 free(y);
676 }
677
678
679 SV *
680 public_encrypt(key, sv)
681 RSA *key;
682 SV *sv;
683 ALIAS:
684 encrypt = 4
685 public_decrypt = 1
686 verify = 5
687 private_encrypt = 2
688 sign = 6
689 private_decrypt = 3
690 decrypt = 7
691 PREINIT:
692 static int (*func[4])(int, unsigned char *, unsigned char *, RSA *, int) = { RSA_public_encrypt, RSA_public_decrypt, RSA_private_encrypt, RSA_private_decrypt };
693 STRLEN len;
694 int keylen;
695 char *p;
696 char *out;
697 STRLEN rc;
698 CODE:
699 if(!SvPOK(sv))
700 croak ("need a string.");
701 p = SvPV(sv, len);
702 keylen = BN_num_bits(key->n);
703 if(!p || len < 1 || (len*8 > (keylen+7)&~0x7))
704 croak("illegal value");
705 RETVAL = NEWSV(0, len + keylen);
706 SvPOK_only(RETVAL);
707 SvCUR_set(RETVAL, len + keylen);
708 out = SvPV_nolen(RETVAL);
709 if((ix&0x3) > 1 && !is_privkey(key))
710 croak("need a private key.");
711 rc = func[ix&0x3](len, p, out, key, RSA_PKCS1_PADDING);
712 if(rc < 0) {
713 sv_free(RETVAL);
714 RETVAL = &PL_sv_undef;
715 croak("crypto error... rc=%d inlen=%d", rc, len);
716 }
717 SvCUR_set(RETVAL, rc);
718 OUTPUT:
719 RETVAL
720
721
722 void
723 fingerprint(key)
724 RSA *key
725 PREINIT:
726 char *x;
727 char dig[SHA_DIGEST_LENGTH];
728 int nlen, elen;
729 PPCODE:
730 nlen = BN_num_bytes(key->n);
731 elen = BN_num_bytes(key->e);
732 x = malloc(nlen + elen);
733 if(!x)
734 croak("malloc error");
735 BN_bn2bin(key->n, x);
736 BN_bn2bin(key->e, &x[nlen]);
737 //un_sha1(dig, x, nlen+elen);
738 free(x);
739 XPUSHs(sv_2mortal(newSVpvn(dig, SHA_DIGEST_LENGTH)));
740
741 MODULE = OpenSSL PACKAGE = OpenSSL::Name
742
743 PROTOTYPES: ENABLE
744
745 OpenSSL::Name
746 new_name()
747 CODE:
748 if(!(RETVAL = X509_NAME_new())) {
749 croak("X509_NAME_new");
750 }
751 OUTPUT:
752 RETVAL
753
754
755 void
756 add(name, key, string)
757 OpenSSL::Name name
758 SV *key
759 SV *string
760 PREINIT:
761 STRLEN l, kl;
762 char *p, *k;
763 int ok;
764 PPCODE:
765 p = SvPV(string, l);
766 if(SvIOK(key)) {
767 ok = X509_NAME_add_entry_by_NID(name, SvIV(key), MBSTRING_ASC, p, -1, -1, 0);
768 } else {
769 k = SvPV(key, kl);
770 ok = X509_NAME_add_entry_by_txt(name, k, MBSTRING_ASC, p, -1, -1, 0);
771 }
772 if(!ok)
773 croak("X509_NAME_add_entry_by_*: %s", ssl_error());
774
775 IV
776 count(name)
777 OpenSSL::Name name
778 CODE:
779 RETVAL = X509_NAME_entry_count(name);
780 OUTPUT:
781 RETVAL
782
783 void
784 getall(name)
785 OpenSSL::Name name
786 PREINIT:
787 int cnt, i;
788 X509_NAME_ENTRY *e;
789 int nid;
790 ASN1_STRING *s;
791 PPCODE:
792 cnt = X509_NAME_entry_count(name);
793 EXTEND(SP, cnt<<1);
794 for(i = 0; i < cnt; i++) {
795 e = X509_NAME_get_entry(name, i);
796 if(!e)
797 croak("X509_NAME_get_entry");
798 nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e));
799 s = X509_NAME_ENTRY_get_data(e);
800 PUSHs(sv_2mortal(newSVpv(OBJ_nid2ln(nid),0)));
801 PUSHs(sv_2mortal(newSVpvn(s->data, s->length)));
802 }
803
804
805
806
807
808 void
809 DESTROY(name)
810 OpenSSL::Name name
811 CODE:
812 if(name) {
813 XD("X509_NAME_free(%p)\n", name);
814 X509_NAME_free(name);
815 }
816
817
818 MODULE = OpenSSL PACKAGE = OpenSSL::Rand
819
820 PROTOTYPES: ENABLE
821
822 BOOT:
823 {
824 int fd;
825 int rc;
826 ERR_load_RAND_strings();
827 fd = open("/dev/urandom", O_RDONLY);
828 if(fd != -1) {
829 char buf[64];
830 rc = read(fd, buf, 64);
831 if(rc < 1) {
832 warn ("read /dev/urandom");
833 } else {
834 RAND_seed(buf, rc);
835 }
836 close(fd);
837 } else {
838 warn ("can't open /dev/urandom");
839 }
840 }
841
842
843
844 SV *
845 randbytes(nr)
846 IV nr
847 ALIAS:
848 randbytes_hex = 1
849 randbytes_base64 = 2
850 PREINIT:
851 char *p;
852 int rc;
853 CODE:
854 p = malloc(nr+1);
855 if(!p)
856 croak("malloc failed");
857 rc = RAND_bytes(p, nr);
858 if(rc != 1) {
859 free(p);
860 croak("RAND_bytes returned %d", rc);
861 }
862 switch(ix) {
863 case 0:
864 RETVAL = newSVpvn(p, nr);
865 break;
866 case 1:
867 RETVAL = hexsv(p, nr);
868 break;
869 default:
870 RETVAL = base64sv(p, nr);
871 break;
872 }
873 free(p);
874 OUTPUT:
875 RETVAL
876
877
878 MODULE = OpenSSL PACKAGE = OpenSSL::X509
879
880 PROTOTYPES: ENABLE
881
882 BOOT:
883 {
884 // We have joy we have fun we have seasons in the sun...
885 OpenSSL_add_all_algorithms();
886 OpenSSL_add_all_ciphers();
887 OpenSSL_add_all_digests();
888 SSL_load_error_strings();
889 ERR_load_PEM_strings();
890 ERR_load_PKCS7_strings();
891 ERR_load_PKCS12_strings();
892 ERR_load_ASN1_strings();
893 ERR_load_crypto_strings();
894 ERR_load_RAND_strings();
895 ERR_load_X509_strings();
896 ERR_load_X509V3_strings();
897 ERR_load_DH_strings();
898 ERR_load_DSA_strings();
899 ERR_load_RSA_strings();
900 }
901
902
903 OpenSSL::X509
904 new_X509()
905 CODE:
906 if ((RETVAL = X509_new ()) == NULL)
907 croak("X509_new");
908
909 if (!X509_set_version (RETVAL, 2))
910 {
911 X509_free (RETVAL);
912 croak ("X509_set_version");
913 }
914
915 ASN1_INTEGER_set (X509_get_serialNumber (RETVAL), 0L);
916 OUTPUT:
917 RETVAL
918
919
920 void
921 new_from_string(thing)
922 SV *thing
923 ALIAS:
924 new_from_file = 1
925 PREINIT:
926 BIO *bio;
927 X509 *x509;
928 STRLEN l;
929 char *p, *q = 0;
930 PPCODE:
931 p = SvPV (thing, l);
932 if(ix == 1) {
933 bio = BIO_new_file(p, "r");
934 } else {
935 bio = BIO_new_mem_buf (p, l);
936 }
937 if(!bio)
938 croak(ssl_error());
939
940 x509 = PEM_read_bio_X509 (bio, 0, 0, 0);
941 BIO_free (bio);
942 if(!x509)
943 croak("PEM_read_bio_X509: %s", ssl_error());
944
945 EXTEND(sp, 1);
946 PUSHs(sv_newmortal());
947 sv_setref_pv(ST(0), "OpenSSL::X509", (void *) x509);
948
949 void
950 DESTROY(x509)
951 OpenSSL::X509 x509
952 CODE:
953 if (x509) {
954 XD("X509_free(%p)\n", x509);
955 X509_free (x509);
956 x509 = 0;
957 }
958
959
960 char *
961 fingerprint_md5(x509)
962 OpenSSL::X509 x509
963 ALIAS:
964 fingerprint_md2 = 1
965 fingerprint_mdc2 = 2
966 fingerprint_sha1 = 3
967 PREINIT:
968 EVP_MD *mds[] = { EVP_md5(), EVP_md2(), EVP_mdc2(), EVP_sha1() };
969 CODE:
970 RETVAL = dofp(x509, mds[ix]);
971 OUTPUT:
972 RETVAL
973
974
975 OpenSSL::Name
976 subject(x509)
977 OpenSSL::X509 x509
978 CODE:
979 RETVAL = X509_get_subject_name(x509);
980 OUTPUT:
981 RETVAL
982
983 OpenSSL::Name
984 issuer(x509)
985 OpenSSL::X509 x509
986 CODE:
987 RETVAL = X509_get_issuer_name(x509);
988 OUTPUT:
989 RETVAL
990
991
992 char *
993 subject_txt(x509)
994 OpenSSL::X509 x509
995 CODE:
996 RETVAL = ol(X509_get_subject_name(x509));
997 OUTPUT:
998 RETVAL
999
1000
1001 char *
1002 issuer_txt(x509)
1003 OpenSSL::X509 x509
1004 CODE:
1005 RETVAL = ol(X509_get_issuer_name(x509));
1006 OUTPUT:
1007 RETVAL
1008
1009 ASN1_INTEGER *
1010 serial(x509)
1011 OpenSSL::X509 x509
1012 CODE:
1013 RETVAL = X509_get_serialNumber(x509);
1014 OUTPUT:
1015 RETVAL
1016
1017
1018 int
1019 version(x509)
1020 OpenSSL::X509 x509
1021 CODE:
1022 RETVAL = X509_get_version(x509);
1023 OUTPUT:
1024 RETVAL
1025
1026 ASN1_UTCTIME *
1027 notBefore(x509)
1028 OpenSSL::X509 x509
1029 CODE:
1030 RETVAL = X509_get_notBefore(x509);
1031 OUTPUT:
1032 RETVAL
1033
1034 ASN1_UTCTIME *
1035 notAfter(x509)
1036 OpenSSL::X509 x509
1037 CODE:
1038 RETVAL = X509_get_notAfter(x509);
1039 OUTPUT:
1040 RETVAL
1041
1042 int
1043 cert_type(x509)
1044 OpenSSL::X509 x509
1045 CODE:
1046 RETVAL = X509_certificate_type(x509, 0);
1047 OUTPUT:
1048 RETVAL
1049
1050 SV*
1051 as_string(x509,...)
1052 OpenSSL::X509 x509
1053 ALIAS:
1054 as_file = 1
1055 PROTOTYPE: $;$
1056 PREINIT:
1057 BIO *bio;
1058 CODE:
1059 if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1060 croak("OpenSSL::X509::%s: illegal/missing args", (ix == 1) ? "as_file" : " as_string");
1061 if(items > 1) {
1062 bio = sv_bio_create_file(ST(1));
1063 } else {
1064 bio = sv_bio_create();
1065 }
1066 if(!bio)
1067 croak("sv_bio_create");
1068 if(!PEM_write_bio_X509(bio, x509)) {
1069 sv_bio_error(bio);
1070 croak("PEM_write_bio_X509: %s", ssl_error());
1071 }
1072 RETVAL = sv_bio_final(bio);
1073 OUTPUT:
1074 RETVAL
1075
1076 SV*
1077 info(x509)
1078 OpenSSL::X509 x509
1079 PREINIT:
1080 BIO *bio;
1081 CODE:
1082 bio = sv_bio_create();
1083 if(!X509_print(bio,x509)) {
1084 sv_bio_error(bio);
1085 croak("X509_print: %s", ssl_error());
1086 }
1087 RETVAL = sv_bio_final(bio);
1088 OUTPUT:
1089 RETVAL
1090
1091 void
1092 set_issuer(x509,name)
1093 OpenSSL::X509 x509
1094 OpenSSL::Name name
1095 CODE:
1096 X509_set_issuer_name(x509, X509_NAME_dup(name));
1097
1098 void
1099 set_subject(x509,name)
1100 OpenSSL::X509 x509
1101 OpenSSL::Name name
1102 CODE:
1103 X509_set_subject_name(x509, X509_NAME_dup(name));
1104
1105 SV *
1106 errstring(x509)
1107 OpenSSL::X509 x509
1108 PREINIT:
1109 BIO *bio;
1110 CODE:
1111 bio = sv_bio_create();
1112 ERR_print_errors(bio);
1113 RETVAL = sv_bio_final(bio);
1114 ERR_clear_error();
1115 OUTPUT:
1116 RETVAL
1117
1118
1119 MODULE = OpenSSL PACKAGE = OpenSSL::Cipher
1120
1121 PROTOTYPES: ENABLE
1122
1123 BOOT:
1124 {
1125 cipher_boot();
1126 }
1127
1128 void
1129 DESTROY(ctx)
1130 EVP_CIPHER_CTX *ctx
1131 CODE:
1132 if(ctx) {
1133 EVP_CIPHER_CTX_cleanup(ctx);
1134 free(ctx);
1135 }
1136
1137 void
1138 new_decrypt(...)
1139 ALIAS:
1140 new_encrypt = 1
1141 PREINIT:
1142 char *name;
1143 SV *svkey;
1144 EVP_CIPHER *ci;
1145 EVP_CIPHER_CTX *ctx;
1146 char *key;
1147 char iv[EVP_MAX_IV_LENGTH];
1148 char k[EVP_MAX_KEY_LENGTH];
1149 int rc;
1150 STRLEN keylen;
1151 PPCODE:
1152 if(items < 2 || items > 3) {
1153 croak("usage: new_[en|de]crypt(ciphname,key)");
1154 }
1155 name = SvPV_nolen(ST(items -2));
1156 svkey = ST(items - 1);
1157 memset(iv, 0, EVP_MAX_IV_LENGTH);
1158 memset(k, 0, EVP_MAX_KEY_LENGTH);
1159
1160 if(!(ci = lookup_cipher(name)))
1161 croak("OpenSSL::Cipher::new: no such cipher \"%s\"", name);
1162 ctx = (EVP_CIPHER_CTX *) malloc(sizeof(EVP_CIPHER_CTX));
1163 if(!ctx)
1164 croak("malloc error");
1165 key = SvPV(svkey, keylen);
1166 memcpy(k, key, (keylen <= ci->key_len) ? keylen : ci->key_len);
1167 rc = EVP_CipherInit(ctx, ci, k, iv, ix);
1168 memset(iv, 0, EVP_MAX_IV_LENGTH);
1169 memset(iv, 0, EVP_MAX_KEY_LENGTH);
1170 if(!rc) {
1171 free(ctx);
1172 croak("EVP_CipherInit");
1173 }
1174 EXTEND(sp, 1);
1175 PUSHs(sv_newmortal());
1176 sv_setref_pv(ST(0), "OpenSSL::Cipher", (void *) ctx);
1177
1178
1179 SV *
1180 update(ctx,svin)
1181 EVP_CIPHER_CTX *ctx
1182 SV *svin
1183 PREINIT:
1184 unsigned char *in, *out;
1185 STRLEN il, ol;
1186 CODE:
1187 in = SvPV(svin, il);
1188 ol = (il + 63) & ~63;
1189 RETVAL = NEWSV(0, ol);
1190 SvPOK_only(RETVAL);
1191 SvCUR_set(RETVAL, ol);
1192 out = SvPV_nolen(RETVAL);
1193 if(!out)
1194 croak("memory");
1195 if(!EVP_CipherUpdate(ctx, out, &ol, in, il)) {
1196 sv_free(RETVAL);
1197 croak("EVP_CipherUpdate");
1198 }
1199 SvCUR_set(RETVAL, ol);
1200 OUTPUT:
1201 RETVAL
1202
1203 SV *
1204 final(ctx)
1205 EVP_CIPHER_CTX *ctx
1206 PREINIT:
1207 STRLEN ol;
1208 unsigned char *out;
1209 CODE:
1210 ol = 256;
1211 RETVAL = NEWSV(0, ol);
1212 SvPOK_only(RETVAL);
1213 SvCUR_set(RETVAL, ol);
1214 out = SvPV_nolen(RETVAL);
1215 if(!out)
1216 croak("memory");
1217 if(!EVP_CipherFinal(ctx, out, &ol)) {
1218 sv_free(RETVAL);
1219 croak("EVP_CipherFinal %s", ssl_error());
1220 }
1221 SvCUR_set(RETVAL, ol);
1222 OUTPUT:
1223 RETVAL
1224
1225 void
1226 enum_ciphers()
1227 PREINIT:
1228 int i;
1229 PPCODE:
1230 EXTEND(SP, cip_cnt<<1);
1231 for(i = 0; i < cip_cnt; i++) {
1232 PUSHs(sv_2mortal(newSVpv(cip_list[i].name, 0)));
1233 PUSHs(sv_2mortal(newSViv(cip_list[i].func->key_len)));
1234 }
1235
1236
1237
1238
1239 MODULE = OpenSSL PACKAGE = OpenSSL::Digest
1240
1241 PROTOTYPES: ENABLE
1242
1243 BOOT:
1244 {
1245 mds_boot();
1246 }
1247
1248 SV *
1249 md2(sv)
1250 SV *sv
1251 ALIAS:
1252 md4 = 0x1
1253 md5 = 0x2
1254 sha = 0x3
1255 sha1 = 0x4
1256 dss = 0x5
1257 dss1 = 0x6
1258 mdc2 = 0x7
1259 ripemd160 = 0x8
1260 md2_hex = 0x10
1261 md4_hex = 0x11
1262 md5_hex = 0x12
1263 sha_hex = 0x13
1264 sha1_hex = 0x14
1265 dss_hex = 0x15
1266 dss1_hex = 0x16
1267 mdc2_hex = 0x17
1268 ripemd160_hex = 0x18
1269 md2_base64 = 0x20
1270 md4_base64 = 0x21
1271 md5_base64 = 0x22
1272 sha_base64 = 0x23
1273 sha1_base64 = 0x24
1274 dss_base64 = 0x25
1275 dss1_base64 = 0x26
1276 mdc2_base64 = 0x27
1277 ripemd160_base64 = 0x28
1278 PREINIT:
1279 EVP_MD_CTX ctx;
1280 STRLEN l;
1281 char *p;
1282 unsigned char md[EVP_MAX_MD_SIZE];
1283 unsigned int md_len;
1284 CODE:
1285 EVP_DigestInit(&ctx, _mds[NO_FLAGS(ix)]);
1286 p = SvPV(sv, l);
1287 EVP_DigestUpdate(&ctx, p, l);
1288 EVP_DigestFinal(&ctx, md, &md_len);
1289 switch(ix & ~15) {
1290 case 0:
1291 RETVAL = newSVpvn(md, md_len);
1292 break;
1293 case FLAG_HEX:
1294 RETVAL = hexsv(md, md_len);
1295 break;
1296 default:
1297 RETVAL = base64sv(md, md_len);
1298 break;
1299 }
1300 OUTPUT:
1301 RETVAL
1302
1303
1304 void
1305 new_md2()
1306 ALIAS:
1307 new_md4 = 0x1
1308 new_md5 = 0x2
1309 mew_sha = 0x3
1310 new_sha1 = 0x4
1311 new_dss = 0x5
1312 new_dss1 = 0x6
1313 new_mdc2 = 0x7
1314 new_ripemd160 = 0x8
1315 PREINIT:
1316 EVP_MD_CTX *ctx;
1317 PPCODE:
1318 ctx = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1319 if(!ctx)
1320 croak("out of memory.");
1321 EVP_DigestInit(ctx, _mds[NO_FLAGS(ix)]);
1322 EXTEND(sp, 1);
1323 PUSHs(sv_newmortal());
1324 sv_setref_pv(ST(0), "OpenSSL::Digest", (void *) ctx);
1325
1326
1327 void
1328 DESTROY(ctx)
1329 EVP_MD_CTX *ctx
1330 CODE:
1331 if(ctx)
1332 free(ctx);
1333
1334 void
1335 update(ctx, sv)
1336 EVP_MD_CTX *ctx
1337 SV *sv
1338 PREINIT:
1339 STRLEN l;
1340 char *p;
1341 CODE:
1342 p = SvPV(sv, l);
1343 EVP_DigestUpdate(ctx, p, l);
1344
1345
1346 SV *
1347 final(ctx)
1348 EVP_MD_CTX *ctx
1349 ALIAS:
1350 final_hex = 1
1351 final_base64 = 2
1352 PREINIT:
1353 unsigned char md[EVP_MAX_MD_SIZE];
1354 unsigned int md_len;
1355 CODE:
1356 EVP_DigestFinal(ctx, md, &md_len);
1357 switch(ix) {
1358 case 0:
1359 RETVAL = newSVpvn(md, md_len);
1360 break;
1361 case 1:
1362 RETVAL = hexsv(md, md_len);
1363 break;
1364 default:
1365 RETVAL = base64sv(md, md_len);
1366 break;
1367 }
1368 OUTPUT:
1369 RETVAL
1370
1371 MODULE = OpenSSL::Digest PACKAGE = OpenSSL::HMAC
1372
1373 PROTOTYPES: ENABLE
1374
1375 BOOT:
1376 {
1377 mds_boot();
1378 }
1379
1380 SV *
1381 md2(svkey, sv)
1382 SV *svkey
1383 SV *sv
1384 ALIAS:
1385 md4 = 0x1
1386 md5 = 0x2
1387 sha = 0x3
1388 sha1 = 0x4
1389 dss = 0x5
1390 dss1 = 0x6
1391 mdc2 = 0x7
1392 ripemd160 = 0x8
1393 md2_hex = 0x10
1394 md4_hex = 0x11
1395 md5_hex = 0x12
1396 sha_hex = 0x13
1397 sha1_hex = 0x14
1398 dss_hex = 0x15
1399 dss1_hex = 0x16
1400 mdc2_hex = 0x17
1401 ripemd160_hex = 0x18
1402 md2_base64 = 0x20
1403 md4_base64 = 0x21
1404 md5_base64 = 0x22
1405 sha_base64 = 0x23
1406 sha1_base64 = 0x24
1407 dss_base64 = 0x25
1408 dss1_base64 = 0x26
1409 mdc2_base64 = 0x27
1410 ripemd160_base64 = 0x28
1411 PREINIT:
1412 HMAC_CTX ctx;
1413 STRLEN l, keylen;
1414 char *p;
1415 char *key;
1416 unsigned char md[EVP_MAX_MD_SIZE];
1417 unsigned int md_len;
1418 CODE:
1419 p = SvPV(sv, l);
1420 key = SvPV(svkey, keylen);
1421 if(!HMAC(_mds[NO_FLAGS(ix)], key, keylen, p, l, md, &md_len))
1422 croak("HMAC");
1423 switch(ix & ~15) {
1424 case 0:
1425 RETVAL = newSVpvn(md, md_len);
1426 break;
1427 case FLAG_HEX:
1428 RETVAL = hexsv(md, md_len);
1429 break;
1430 default:
1431 RETVAL = base64sv(md, md_len);
1432 break;
1433 }
1434 OUTPUT:
1435 RETVAL
1436
1437
1438 void
1439 new_md2(void)
1440 ALIAS:
1441 new_md4 = 0x1
1442 new_md5 = 0x2
1443 mew_sha = 0x3
1444 new_sha1 = 0x4
1445 new_dss = 0x5
1446 new_dss1 = 0x6
1447 new_mdc2 = 0x7
1448 new_ripemd160 = 0x8
1449 PREINIT:
1450 EVP_MD_CTX *ctx;
1451 PPCODE:
1452 ctx = (EVP_MD_CTX *) malloc(sizeof(EVP_MD_CTX));
1453 if(!ctx)
1454 croak("out of memory.");
1455 EVP_DigestInit(ctx, _mds[NO_FLAGS(ix)]);
1456 EXTEND(sp, 1);
1457 PUSHs(sv_newmortal());
1458 sv_setref_pv(ST(0), "OpenSSL::Digest", (void *) ctx);
1459
1460
1461 void
1462 DESTROY(ctx)
1463 EVP_MD_CTX *ctx
1464 CODE:
1465 if(ctx)
1466 free(ctx);
1467
1468 void
1469 update(ctx, sv)
1470 EVP_MD_CTX *ctx
1471 SV *sv
1472 PREINIT:
1473 STRLEN l;
1474 char *p;
1475 CODE:
1476 p = SvPV(sv, l);
1477 EVP_DigestUpdate(ctx, p, l);
1478
1479
1480 SV *
1481 final(ctx)
1482 EVP_MD_CTX *ctx
1483 ALIAS:
1484 final_hex = 1
1485 final_base64 = 2
1486 PREINIT:
1487 unsigned char md[EVP_MAX_MD_SIZE];
1488 unsigned int md_len;
1489 CODE:
1490 EVP_DigestFinal(ctx, md, &md_len);
1491 switch(ix) {
1492 case 0:
1493 RETVAL = newSVpvn(md, md_len);
1494 break;
1495 case 1:
1496 RETVAL = hexsv(md, md_len);
1497 break;
1498 default:
1499 RETVAL = base64sv(md, md_len);
1500 break;
1501 }
1502 OUTPUT:
1503 RETVAL
1504
1505
1506 MODULE = OpenSSL PACKAGE = OpenSSL::PKCS7
1507
1508 void
1509 new()
1510 PREINIT:
1511 PKCS7 *p7;
1512 PPCODE:
1513 if(!(p7 = PKCS7_new())) {
1514 croak("PKCS7_new");
1515 }
1516 EXTEND(sp, 1);
1517 PUSHs(sv_newmortal());
1518 sv_setref_pv(ST(0), "OpenSSL::PKCS7", (void *) p7);
1519
1520
1521 void
1522 DESTROY(p7)
1523 PKCS7 *p7;
1524 CODE:
1525 if(p7) {
1526 XD("PKCS7_free(%p)\n", p7);
1527 PKCS7_free(p7);
1528 }
1529
1530
1531 MODULE = OpenSSL PACKAGE = OpenSSL::PKCS12
1532
1533 void
1534 new()
1535 PREINIT:
1536 PKCS12 *p12;
1537 PPCODE:
1538 if(!(p12 = PKCS12_new())) {
1539 croak("PKCS12_new");
1540 }
1541 EXTEND(sp, 1);
1542 PUSHs(sv_newmortal());
1543 sv_setref_pv(ST(0), "OpenSSL::PKCS12", (void *) p12);
1544
1545 void
1546 new_from_string(sv)
1547 SV *sv
1548 ALIAS:
1549 new_from_file = 1
1550 PREINIT:
1551 PKCS12 *p12;
1552 BIO *bio;
1553 char *s;
1554 STRLEN len;
1555 PPCODE:
1556 s = SvPV(sv, len);
1557 if(ix == 1) {
1558 bio = BIO_new_file(s, "r");
1559 } else {
1560 bio = BIO_new_mem_buf (s, len);
1561 }
1562 if(!bio)
1563 croak("BIO_new_mem_buf");
1564 if(!(p12 = d2i_PKCS12_bio(bio, 0))) {
1565 BIO_free(bio);
1566 croak("d2i_PKCS12_BIO: %s", ssl_error());
1567 }
1568 BIO_free(bio);
1569 EXTEND(sp, 1);
1570 PUSHs(sv_newmortal());
1571 sv_setref_pv(ST(0), "OpenSSL::PKCS12", (void *) p12);
1572
1573
1574 SV*
1575 mac_ok(p12, pwd)
1576 PKCS12 *p12
1577 char *pwd
1578 CODE:
1579
1580 RETVAL = (PKCS12_verify_mac(p12, pwd, strlen(pwd))) ? &PL_sv_yes : &PL_sv_no;
1581 OUTPUT:
1582 RETVAL
1583
1584 void
1585 changepass(p12, oldpwd, newpwd)
1586 PKCS12 *p12
1587 SV *oldpwd
1588 SV *newpwd
1589 PREINIT:
1590 char *op = 0;
1591 char *np = 0;
1592 CODE:
1593 if(oldpwd != &PL_sv_undef)
1594 op = SvPV_nolen(oldpwd);
1595 if(newpwd != &PL_sv_undef)
1596 np = SvPV_nolen(newpwd);
1597 if(!PKCS12_newpass(p12, op, np)) {
1598 croak("PKCS12_newpass: %s", ssl_error());
1599 }
1600
1601 SV*
1602 as_string(p12,...)
1603 PKCS12 *p12
1604 ALIAS:
1605 as_file = 1
1606 PROTOTYPE: $;$
1607 PREINIT:
1608 SV *sv;
1609 BIO *bio;
1610 CODE:
1611 if((ix != 1 && items > 1) || (ix == 1 && items != 2))
1612 croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string");
1613 if(items > 1) {
1614 bio = sv_bio_create_file(ST(1));
1615 } else {
1616 bio = sv_bio_create();
1617 }
1618 if(!bio)
1619 croak("sv_bio_create");
1620 if(!i2d_PKCS12_bio(bio, p12)) {
1621 sv_bio_error(bio);
1622 croak("i2d_PKCS12_bio: %s", ssl_error());
1623 }
1624 RETVAL = sv_bio_final(bio);
1625 OUTPUT:
1626 RETVAL
1627
1628 void
1629 DESTROY(p12)
1630 PKCS12 *p12;
1631 CODE:
1632 if(p12) {
1633 XD("PKCS12_free(%p)\n", p12);
1634 PKCS12_free(p12);
1635 }
1636
1637
1638 MODULE = OpenSSL PACKAGE = OpenSSL::CRL
1639
1640 OpenSSL::CRL
1641 new_from_string(thing)
1642 SV *thing
1643 ALIAS:
1644 new_from_file = 1
1645 PREINIT:
1646 BIO *bio;
1647 STRLEN l;
1648 char *p, *q = 0;
1649 CODE:
1650 p = SvPV(thing, l);
1651 if(ix == 1) {
1652 bio = BIO_new_file(p, "r");
1653 } else {
1654 bio = BIO_new_mem_buf (p, l);
1655 }
1656 if(!bio)
1657 croak(ssl_error());
1658
1659 RETVAL = PEM_read_bio_X509_CRL (bio, 0, 0, 0);
1660 BIO_free (bio);
1661 if(!RETVAL)
1662 croak("PEM_read_bio_X509_CRL: %s", ssl_error());
1663
1664 OUTPUT:
1665 RETVAL
1666
1667 void
1668 DESTROY(crl)
1669 OpenSSL::CRL crl
1670 CODE:
1671 if (crl) {
1672 XD("X509_CRL_free (%p)\n", crl);
1673 X509_CRL_free(crl);
1674 crl = 0;
1675 }
1676
1677 SV*
1678 info(crl)
1679 OpenSSL::CRL crl
1680 PREINIT:
1681 BIO *bio;
1682 CODE:
1683 bio = sv_bio_create();
1684 if(!X509_CRL_print(bio,crl)) {
1685 sv_bio_error(bio);
1686 croak("X509_CRL_print: %s", ssl_error());
1687 }
1688 RETVAL = sv_bio_final(bio);
1689 OUTPUT:
1690 RETVAL
1691