… | |
… | |
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 | static char buf[256]; |
298 | char *p; |
300 | X509_NAME_oneline(x, buf, 256); |
299 | SV *sv = newSVpvn("",0); |
|
|
300 | X509_NAME_oneline(x, (p=SvGROW(sv,8192)), 8192); |
|
|
301 | SvCUR_set(sv, strlen(p)); |
301 | return buf; |
302 | return sv; |
302 | } |
303 | } |
303 | |
304 | |
|
|
305 | #if 0 |
304 | static void run_sha1(char *digest, const char *msg, int msglen) |
306 | static void run_sha1(char *digest, const char *msg, int msglen) |
305 | { |
307 | { |
306 | SHA_CTX ctx; |
308 | SHA_CTX ctx; |
307 | |
309 | |
308 | if(!digest || !msg || msglen < 0) |
310 | if(!digest || !msg || msglen < 0) |
309 | croak("run_sha1: null pointer or illegal message len"); |
311 | croak("run_sha1: null pointer or illegal message len"); |
310 | SHA1_Init(&ctx); |
312 | SHA1_Init(&ctx); |
311 | SHA1_Update(&ctx, msg, msglen); |
313 | SHA1_Update(&ctx, msg, msglen); |
312 | SHA1_Final(digest, &ctx); |
314 | SHA1_Final(digest, &ctx); |
313 | } |
315 | } |
314 | |
316 | #endif |
315 | static bool is_privkey(RSA *key) |
317 | static bool is_privkey(RSA *key) |
316 | { |
318 | { |
317 | return (key->n && key->e && key->d && key->p && key->q |
319 | return (key->n && key->e && key->d && key->p && key->q |
318 | && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0; |
320 | && key->dmp1 && key->dmq1 && key->iqmp && key->d) ? 1 : 0; |
319 | } |
321 | } |
… | |
… | |
592 | void |
594 | void |
593 | STORABLE_freeze(key, cloning) |
595 | STORABLE_freeze(key, cloning) |
594 | OpenSSL::RSA key |
596 | OpenSSL::RSA key |
595 | bool cloning |
597 | bool cloning |
596 | PREINIT: |
598 | PREINIT: |
597 | SV *sv; |
|
|
598 | STRLEN totlen; |
599 | STRLEN totlen; |
599 | PPCODE: |
600 | PPCODE: |
600 | if(cloning) |
601 | if(cloning) |
601 | return; |
602 | return; |
602 | 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); |
… | |
… | |
892 | ALIAS: |
893 | ALIAS: |
893 | new_from_file = 1 |
894 | new_from_file = 1 |
894 | PREINIT: |
895 | PREINIT: |
895 | BIO *bio; |
896 | BIO *bio; |
896 | STRLEN l; |
897 | STRLEN l; |
897 | char *p, *q = 0; |
898 | char *p; |
898 | CODE: |
899 | CODE: |
899 | p = SvPV (thing, l); |
900 | p = SvPV (thing, l); |
900 | if(ix == 1) { |
901 | if(ix == 1) { |
901 | bio = BIO_new_file(p, "r"); |
902 | bio = BIO_new_file(p, "r"); |
902 | } else { |
903 | } else { |
… | |
… | |
954 | RETVAL = X509_NAME_dup (X509_get_issuer_name(x509)); |
955 | RETVAL = X509_NAME_dup (X509_get_issuer_name(x509)); |
955 | OUTPUT: |
956 | OUTPUT: |
956 | RETVAL |
957 | RETVAL |
957 | |
958 | |
958 | |
959 | |
959 | char * |
960 | SV * |
960 | subject_txt(x509) |
961 | subject_txt(x509) |
961 | OpenSSL::X509 x509 |
962 | OpenSSL::X509 x509 |
962 | CODE: |
963 | CODE: |
963 | RETVAL = ol(X509_get_subject_name(x509)); |
964 | RETVAL = ol(X509_get_subject_name(x509)); |
964 | OUTPUT: |
965 | OUTPUT: |
965 | RETVAL |
966 | RETVAL |
966 | |
967 | |
967 | |
968 | |
968 | char * |
969 | SV * |
969 | issuer_txt(x509) |
970 | issuer_txt(x509) |
970 | OpenSSL::X509 x509 |
971 | OpenSSL::X509 x509 |
971 | CODE: |
972 | CODE: |
972 | RETVAL = ol(X509_get_issuer_name(x509)); |
973 | RETVAL = ol(X509_get_issuer_name(x509)); |
973 | OUTPUT: |
974 | OUTPUT: |
… | |
… | |
1142 | |
1143 | |
1143 | |
1144 | |
1144 | SV * |
1145 | SV * |
1145 | update(ctx,svin) |
1146 | update(ctx,svin) |
1146 | OpenSSL::Cipher ctx |
1147 | OpenSSL::Cipher ctx |
1147 | SV *svin |
1148 | SV *svin |
1148 | PREINIT: |
1149 | PREINIT: |
1149 | unsigned char *in, *out; |
1150 | unsigned char *in, *out; |
1150 | STRLEN il, ol; |
1151 | STRLEN il, ol; |
1151 | CODE: |
1152 | CODE: |
1152 | in = SvPV(svin, il); |
1153 | in = SvPV(svin, il); |
1153 | ol = (il + 63) & ~63; |
1154 | ol = (il + 63) & ~63; |
1154 | RETVAL = NEWSV(0, ol); |
1155 | RETVAL = NEWSV(0, ol); |
1155 | SvPOK_only(RETVAL); |
1156 | SvPOK_only(RETVAL); |
1156 | SvCUR_set(RETVAL, ol); |
1157 | SvCUR_set(RETVAL, ol); |
1157 | out = SvPV_nolen(RETVAL); |
1158 | out = SvPV_nolen(RETVAL); |
1158 | if(!out) |
|
|
1159 | croak("memory"); |
|
|
1160 | if(!EVP_CipherUpdate(ctx, out, &ol, in, il)) { |
1159 | if(!EVP_CipherUpdate(ctx, out, &ol, in, il)) { |
1161 | sv_free(RETVAL); |
1160 | sv_free(RETVAL); |
1162 | croak("EVP_CipherUpdate"); |
1161 | croak("EVP_CipherUpdate"); |
1163 | } |
1162 | } |
1164 | SvCUR_set(RETVAL, ol); |
1163 | SvCUR_set(RETVAL, ol); |
… | |
… | |
1209 | { |
1208 | { |
1210 | mds_boot(); |
1209 | mds_boot(); |
1211 | } |
1210 | } |
1212 | |
1211 | |
1213 | SV * |
1212 | SV * |
1214 | md2(sv) |
1213 | md2(...) |
1215 | SV *sv |
|
|
1216 | ALIAS: |
1214 | ALIAS: |
1217 | md4 = 0x1 |
1215 | md4 = 0x1 |
1218 | md5 = 0x2 |
1216 | md5 = 0x2 |
1219 | sha = 0x3 |
1217 | sha = 0x3 |
1220 | sha1 = 0x4 |
1218 | sha1 = 0x4 |
… | |
… | |
1238 | sha1_base64 = 0x24 |
1236 | sha1_base64 = 0x24 |
1239 | dss_base64 = 0x25 |
1237 | dss_base64 = 0x25 |
1240 | dss1_base64 = 0x26 |
1238 | dss1_base64 = 0x26 |
1241 | mdc2_base64 = 0x27 |
1239 | mdc2_base64 = 0x27 |
1242 | ripemd160_base64 = 0x28 |
1240 | ripemd160_base64 = 0x28 |
1243 | PREINIT: |
1241 | CODE: |
1244 | EVP_MD_CTX ctx; |
1242 | EVP_MD_CTX ctx; |
1245 | STRLEN l; |
1243 | STRLEN l; |
1246 | char *p; |
1244 | char *p; |
1247 | unsigned char md[EVP_MAX_MD_SIZE]; |
1245 | unsigned char md[EVP_MAX_MD_SIZE]; |
1248 | unsigned int md_len; |
1246 | unsigned int md_len; |
1249 | CODE: |
1247 | int i; |
|
|
1248 | |
1250 | EVP_DigestInit(&ctx, _mds[NO_FLAGS(ix)]); |
1249 | EVP_DigestInit(&ctx, _mds[NO_FLAGS(ix)]); |
|
|
1250 | |
|
|
1251 | for (i = 0; i < items; i++) |
|
|
1252 | { |
1251 | p = SvPV(sv, l); |
1253 | p = SvPV(ST(i), l); |
1252 | EVP_DigestUpdate(&ctx, p, l); |
1254 | EVP_DigestUpdate(&ctx, p, l); |
|
|
1255 | } |
|
|
1256 | |
1253 | EVP_DigestFinal(&ctx, md, &md_len); |
1257 | EVP_DigestFinal(&ctx, md, &md_len); |
1254 | switch(ix & ~15) { |
1258 | switch(ix & ~15) { |
1255 | case 0: |
1259 | case 0: |
1256 | RETVAL = newSVpvn(md, md_len); |
1260 | RETVAL = newSVpvn(md, md_len); |
1257 | break; |
1261 | break; |
… | |
… | |
1291 | CODE: |
1295 | CODE: |
1292 | if(ctx) |
1296 | if(ctx) |
1293 | free(ctx); |
1297 | free(ctx); |
1294 | |
1298 | |
1295 | void |
1299 | void |
1296 | update(ctx, sv) |
1300 | update(ctx, ...) |
1297 | OpenSSL::Digest ctx |
1301 | OpenSSL::Digest ctx |
1298 | SV *sv |
|
|
1299 | PREINIT: |
1302 | PREINIT: |
1300 | STRLEN l; |
1303 | STRLEN l; |
1301 | char *p; |
1304 | char *p; |
|
|
1305 | int i; |
1302 | CODE: |
1306 | CODE: |
1303 | p = SvPV(sv, l); |
1307 | for (i = 1; i < items; i++) |
|
|
1308 | { |
|
|
1309 | p = SvPV(ST(i), l); |
1304 | EVP_DigestUpdate(ctx, p, l); |
1310 | EVP_DigestUpdate(ctx, p, l); |
|
|
1311 | } |
1305 | |
1312 | |
1306 | SV * |
1313 | SV * |
1307 | final(ctx) |
1314 | final(ctx) |
1308 | OpenSSL::Digest ctx |
1315 | OpenSSL::Digest ctx |
1309 | ALIAS: |
1316 | ALIAS: |
… | |
… | |
1367 | dss_base64 = 0x25 |
1374 | dss_base64 = 0x25 |
1368 | dss1_base64 = 0x26 |
1375 | dss1_base64 = 0x26 |
1369 | mdc2_base64 = 0x27 |
1376 | mdc2_base64 = 0x27 |
1370 | ripemd160_base64 = 0x28 |
1377 | ripemd160_base64 = 0x28 |
1371 | PREINIT: |
1378 | PREINIT: |
1372 | HMAC_CTX ctx; |
|
|
1373 | STRLEN l, keylen; |
1379 | STRLEN l, keylen; |
1374 | char *p; |
1380 | char *p; |
1375 | char *key; |
1381 | char *key; |
1376 | unsigned char md[EVP_MAX_MD_SIZE]; |
1382 | unsigned char md[EVP_MAX_MD_SIZE]; |
1377 | unsigned int md_len; |
1383 | unsigned int md_len; |
… | |
… | |
1420 | CODE: |
1426 | CODE: |
1421 | if(ctx) |
1427 | if(ctx) |
1422 | free(ctx); |
1428 | free(ctx); |
1423 | |
1429 | |
1424 | void |
1430 | void |
1425 | update(ctx, sv) |
1431 | update(ctx, ...) |
1426 | OpenSSL::Digest ctx |
1432 | OpenSSL::Digest ctx |
1427 | SV *sv |
|
|
1428 | PREINIT: |
1433 | PREINIT: |
1429 | STRLEN l; |
1434 | STRLEN l; |
1430 | char *p; |
1435 | char *p; |
|
|
1436 | int i; |
1431 | CODE: |
1437 | CODE: |
1432 | p = SvPV(sv, l); |
1438 | for (i = 1; i < items; i++) |
1433 | EVP_DigestUpdate(ctx, p, l); |
|
|
1434 | |
1439 | { |
|
|
1440 | p = SvPV(ST(i), l); |
|
|
1441 | EVP_DigestUpdate(ctx, p, l); |
|
|
1442 | } |
1435 | |
1443 | |
1436 | SV * |
1444 | SV * |
1437 | final(ctx) |
1445 | final(ctx) |
1438 | OpenSSL::Digest ctx |
1446 | OpenSSL::Digest ctx |
1439 | ALIAS: |
1447 | ALIAS: |
… | |
… | |
1553 | OpenSSL::PKCS12 p12 |
1561 | OpenSSL::PKCS12 p12 |
1554 | ALIAS: |
1562 | ALIAS: |
1555 | as_file = 1 |
1563 | as_file = 1 |
1556 | PROTOTYPE: $;$ |
1564 | PROTOTYPE: $;$ |
1557 | PREINIT: |
1565 | PREINIT: |
1558 | SV *sv; |
|
|
1559 | BIO *bio; |
1566 | BIO *bio; |
1560 | CODE: |
1567 | CODE: |
1561 | if((ix != 1 && items > 1) || (ix == 1 && items != 2)) |
1568 | if((ix != 1 && items > 1) || (ix == 1 && items != 2)) |
1562 | croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string"); |
1569 | croak("OpenSSL::PKCS12::%s: illegal/missing args", (ix == 1) ? "as_file" : "as_string"); |
1563 | if(items > 1) { |
1570 | if(items > 1) { |
… | |
… | |
1586 | |
1593 | |
1587 | |
1594 | |
1588 | MODULE = OpenSSL PACKAGE = OpenSSL::CRL |
1595 | MODULE = OpenSSL PACKAGE = OpenSSL::CRL |
1589 | |
1596 | |
1590 | OpenSSL::CRL |
1597 | OpenSSL::CRL |
1591 | new_from_string(thing) |
1598 | new_from_string(class,thing) |
|
|
1599 | SV *class |
1592 | SV *thing |
1600 | SV *thing |
1593 | ALIAS: |
1601 | ALIAS: |
1594 | new_from_file = 1 |
1602 | new_from_file = 1 |
1595 | PREINIT: |
1603 | PREINIT: |
1596 | BIO *bio; |
1604 | BIO *bio; |
1597 | STRLEN l; |
1605 | STRLEN l; |
1598 | char *p, *q = 0; |
1606 | char *p; |
1599 | CODE: |
1607 | CODE: |
1600 | p = SvPV(thing, l); |
1608 | p = SvPV(thing, l); |
1601 | if(ix == 1) { |
1609 | if(ix == 1) { |
1602 | bio = BIO_new_file(p, "r"); |
1610 | bio = BIO_new_file(p, "r"); |
1603 | } else { |
1611 | } else { |