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