… | |
… | |
91 | } |
91 | } |
92 | sv_setpv(sv, buf); |
92 | sv_setpv(sv, buf); |
93 | return sv; |
93 | return sv; |
94 | } |
94 | } |
95 | |
95 | |
96 | long fuck_cb(struct bio_st *bm, int m, const char *ptr, int l, long x, long y) |
96 | long bio_write_cb(struct bio_st *bm, int m, const char *ptr, int l, long x, long y) |
97 | { |
97 | { |
98 | if(m == BIO_CB_WRITE) { |
98 | if(m == BIO_CB_WRITE) { |
99 | SV *sv = (SV *) BIO_get_callback_arg(bm); |
99 | SV *sv = (SV *) BIO_get_callback_arg(bm); |
100 | sv_catpvn(sv, ptr, l); |
100 | sv_catpvn(sv, ptr, l); |
101 | } |
101 | } |
… | |
… | |
113 | BIO *bio; |
113 | BIO *bio; |
114 | sv = newSVpvn("",0); |
114 | sv = newSVpvn("",0); |
115 | // mem is completely broken for write, so we use /dev/null |
115 | // mem is completely broken for write, so we use /dev/null |
116 | // and use callbacks-hooks |
116 | // and use callbacks-hooks |
117 | bio = BIO_new_file("/dev/null", "wb"); |
117 | bio = BIO_new_file("/dev/null", "wb"); |
118 | BIO_set_callback(bio, fuck_cb); |
118 | BIO_set_callback(bio, bio_write_cb); |
119 | BIO_set_callback_arg(bio, (void *)sv); |
119 | BIO_set_callback_arg(bio, (void *)sv); |
120 | return bio; |
120 | return bio; |
121 | } |
121 | } |
122 | |
122 | |
123 | static inline BIO *sv_bio_create_file(SV *filename) |
123 | static inline BIO *sv_bio_create_file(SV *filename) |
124 | { |
124 | { |
125 | char *fn; |
|
|
126 | STRLEN l; |
125 | STRLEN l; |
127 | |
126 | |
128 | return BIO_new_file(SvPV(filename, l), "wb"); |
127 | return BIO_new_file(SvPV(filename, l), "wb"); |
129 | } |
128 | } |
130 | |
129 | |
… | |
… | |
292 | sprintf(&s[i*3], "%02X%c", md[i], (i + 1 == (int) n) ? '\0' : ':'); |
291 | sprintf(&s[i*3], "%02X%c", md[i], (i + 1 == (int) n) ? '\0' : ':'); |
293 | } |
292 | } |
294 | return s; |
293 | return s; |
295 | } |
294 | } |
296 | |
295 | |
297 | static inline char *ol(X509_NAME *x) |
296 | static inline SV *ol(X509_NAME *x) |
298 | { |
297 | { |
299 | // if we can't fix it, pretend at least that it works |
298 | char *p; |
300 | static char buf[8192]; |
299 | SV *sv = newSVpvn("",0); |
301 | X509_NAME_oneline(x, buf, 8192); |
300 | X509_NAME_oneline(x, (p=SvGROW(sv,8192)), 8192); |
|
|
301 | SvCUR_set(sv, strlen(p)); |
302 | return buf; |
302 | return sv; |
303 | } |
303 | } |
304 | |
304 | |
|
|
305 | #if 0 |
305 | static void run_sha1(char *digest, const char *msg, int msglen) |
306 | static void run_sha1(char *digest, const char *msg, int msglen) |
306 | { |
307 | { |
307 | SHA_CTX ctx; |
308 | SHA_CTX ctx; |
308 | |
309 | |
309 | if(!digest || !msg || msglen < 0) |
310 | if(!digest || !msg || msglen < 0) |
310 | croak("run_sha1: null pointer or illegal message len"); |
311 | croak("run_sha1: null pointer or illegal message len"); |
311 | SHA1_Init(&ctx); |
312 | SHA1_Init(&ctx); |
312 | SHA1_Update(&ctx, msg, msglen); |
313 | SHA1_Update(&ctx, msg, msglen); |
313 | SHA1_Final(digest, &ctx); |
314 | SHA1_Final(digest, &ctx); |
314 | } |
315 | } |
315 | |
316 | #endif |
316 | static bool is_privkey(RSA *key) |
317 | static bool is_privkey(RSA *key) |
317 | { |
318 | { |
318 | return (key->n && key->e && key->d && key->p && key->q |
319 | return (key->n && key->e && key->d && key->p && key->q |
319 | && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0; |
320 | && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0; |
320 | } |
321 | } |
… | |
… | |
593 | void |
594 | void |
594 | STORABLE_freeze(key, cloning) |
595 | STORABLE_freeze(key, cloning) |
595 | OpenSSL::RSA key |
596 | OpenSSL::RSA key |
596 | bool cloning |
597 | bool cloning |
597 | PREINIT: |
598 | PREINIT: |
598 | SV *sv; |
|
|
599 | STRLEN totlen; |
599 | STRLEN totlen; |
600 | PPCODE: |
600 | PPCODE: |
601 | if(cloning) |
601 | if(cloning) |
602 | return; |
602 | return; |
603 | totlen = BN_num_bytes(key->n) + BN_num_bytes(key->e) + 3*sizeof(int); |
603 | totlen = BN_num_bytes(key->n) + BN_num_bytes(key->e) + 3*sizeof(int); |
… | |
… | |
893 | ALIAS: |
893 | ALIAS: |
894 | new_from_file = 1 |
894 | new_from_file = 1 |
895 | PREINIT: |
895 | PREINIT: |
896 | BIO *bio; |
896 | BIO *bio; |
897 | STRLEN l; |
897 | STRLEN l; |
898 | char *p, *q = 0; |
898 | char *p; |
899 | CODE: |
899 | CODE: |
900 | p = SvPV (thing, l); |
900 | p = SvPV (thing, l); |
901 | if(ix == 1) { |
901 | if(ix == 1) { |
902 | bio = BIO_new_file(p, "r"); |
902 | bio = BIO_new_file(p, "r"); |
903 | } else { |
903 | } else { |
… | |
… | |
955 | RETVAL = X509_NAME_dup (X509_get_issuer_name(x509)); |
955 | RETVAL = X509_NAME_dup (X509_get_issuer_name(x509)); |
956 | OUTPUT: |
956 | OUTPUT: |
957 | RETVAL |
957 | RETVAL |
958 | |
958 | |
959 | |
959 | |
960 | char * |
960 | SV * |
961 | subject_txt(x509) |
961 | subject_txt(x509) |
962 | OpenSSL::X509 x509 |
962 | OpenSSL::X509 x509 |
963 | CODE: |
963 | CODE: |
964 | RETVAL = ol(X509_get_subject_name(x509)); |
964 | RETVAL = ol(X509_get_subject_name(x509)); |
965 | OUTPUT: |
965 | OUTPUT: |
966 | RETVAL |
966 | RETVAL |
967 | |
967 | |
968 | |
968 | |
969 | char * |
969 | SV * |
970 | issuer_txt(x509) |
970 | issuer_txt(x509) |
971 | OpenSSL::X509 x509 |
971 | OpenSSL::X509 x509 |
972 | CODE: |
972 | CODE: |
973 | RETVAL = ol(X509_get_issuer_name(x509)); |
973 | RETVAL = ol(X509_get_issuer_name(x509)); |
974 | OUTPUT: |
974 | OUTPUT: |
… | |
… | |
1368 | dss_base64 = 0x25 |
1368 | dss_base64 = 0x25 |
1369 | dss1_base64 = 0x26 |
1369 | dss1_base64 = 0x26 |
1370 | mdc2_base64 = 0x27 |
1370 | mdc2_base64 = 0x27 |
1371 | ripemd160_base64 = 0x28 |
1371 | ripemd160_base64 = 0x28 |
1372 | PREINIT: |
1372 | PREINIT: |
1373 | HMAC_CTX ctx; |
|
|
1374 | STRLEN l, keylen; |
1373 | STRLEN l, keylen; |
1375 | char *p; |
1374 | char *p; |
1376 | char *key; |
1375 | char *key; |
1377 | unsigned char md[EVP_MAX_MD_SIZE]; |
1376 | unsigned char md[EVP_MAX_MD_SIZE]; |
1378 | unsigned int md_len; |
1377 | unsigned int md_len; |
… | |
… | |
1554 | OpenSSL::PKCS12 p12 |
1553 | OpenSSL::PKCS12 p12 |
1555 | ALIAS: |
1554 | ALIAS: |
1556 | as_file = 1 |
1555 | as_file = 1 |
1557 | PROTOTYPE: $;$ |
1556 | PROTOTYPE: $;$ |
1558 | PREINIT: |
1557 | PREINIT: |
1559 | SV *sv; |
|
|
1560 | BIO *bio; |
1558 | BIO *bio; |
1561 | CODE: |
1559 | CODE: |
1562 | if((ix != 1 && items > 1) || (ix == 1 && items != 2)) |
1560 | if((ix != 1 && items > 1) || (ix == 1 && items != 2)) |
1563 | croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string"); |
1561 | croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string"); |
1564 | if(items > 1) { |
1562 | if(items > 1) { |
… | |
… | |
1594 | ALIAS: |
1592 | ALIAS: |
1595 | new_from_file = 1 |
1593 | new_from_file = 1 |
1596 | PREINIT: |
1594 | PREINIT: |
1597 | BIO *bio; |
1595 | BIO *bio; |
1598 | STRLEN l; |
1596 | STRLEN l; |
1599 | char *p, *q = 0; |
1597 | char *p; |
1600 | CODE: |
1598 | CODE: |
1601 | p = SvPV(thing, l); |
1599 | p = SvPV(thing, l); |
1602 | if(ix == 1) { |
1600 | if(ix == 1) { |
1603 | bio = BIO_new_file(p, "r"); |
1601 | bio = BIO_new_file(p, "r"); |
1604 | } else { |
1602 | } else { |