File Coverage

inc/CryptX_ASN1.xs.inc
Criterion Covered Total %
statement 28 29 96.5
branch 26 38 68.4
condition n/a
subroutine n/a
pod n/a
total 54 67 80.6


line stmt bran cond sub pod time code
1             MODULE = CryptX PACKAGE = Crypt::ASN1
2              
3             PROTOTYPES: DISABLE
4              
5             SV *
6             asn1_decode_der(SV *der, SV *opts = &PL_sv_undef)
7             CODE:
8             {
9 41           STRLEN der_len = 0;
10 41           unsigned char *der_ptr = (unsigned char *)SvPVbyte(der, der_len);
11 41           unsigned long inlen = (unsigned long)der_len;
12 41           ltc_asn1_list *list = NULL;
13             int rv;
14 41           asn1_opts_t o = { 0, 0, 0, NULL };
15              
16 41 100         if (SvROK(opts) && SvTYPE(SvRV(opts)) == SVt_PVHV) {
    50          
17 12           HV *h = (HV *)SvRV(opts);
18             SV **sv;
19 12 100         if ((sv = hv_fetchs(h, "int", 0)) && SvOK(*sv)) {
    50          
20 7           const char *v = SvPV_nolen(*sv);
21 7 100         if (strEQ(v, "hex")) o.int_fmt = 1;
22 4 50         else if (strEQ(v, "bytes")) o.int_fmt = 2;
23             }
24 12 100         if ((sv = hv_fetchs(h, "bin", 0)) && SvOK(*sv)) {
    50          
25 5           const char *v = SvPV_nolen(*sv);
26 5 100         if (strEQ(v, "hex")) o.bin_fmt = 1;
27 3 50         else if (strEQ(v, "base64")) o.bin_fmt = 2;
28             }
29 12 100         if ((sv = hv_fetchs(h, "dt", 0)) && SvOK(*sv)) {
    50          
30 4           const char *v = SvPV_nolen(*sv);
31 4 50         if (strEQ(v, "epoch")) o.dt_fmt = 1;
32             }
33 12 100         if ((sv = hv_fetchs(h, "oidmap", 0)) && SvROK(*sv) && SvTYPE(SvRV(*sv)) == SVt_PVHV) {
    50          
    50          
34 1           o.oidmap = (HV *)SvRV(*sv);
35             }
36             }
37              
38 41           rv = der_decode_sequence_flexi(der_ptr, &inlen, &list);
39 41 50         if (rv != CRYPT_OK) croak("FATAL: asn1_decode_der failed: %s", error_to_string(rv));
40              
41 41           RETVAL = newRV_noinc(s_ltc_asn1_to_perl(aTHX_ list, o));
42 40           der_sequence_free(list);
43             }
44             OUTPUT:
45             RETVAL
46              
47             SV *
48             _asn1_encode_der(SV *tree)
49             CODE:
50             {
51             AV *nodes;
52              
53 42 50         if (!SvROK(tree) || SvTYPE(SvRV(tree)) != SVt_PVAV)
    50          
54 0           croak("FATAL: _asn1_encode_der: argument must be an arrayref");
55              
56 42           nodes = (AV *)SvRV(tree);
57 42           RETVAL = newSVpvn("", 0);
58 42           s_asn1_encode_nodes(aTHX_ RETVAL, nodes);
59             }
60             OUTPUT:
61             RETVAL