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