PDF-Make

 view release on metacpan or  search on metacpan

xs/signature.xs  view on Meta::CPAN

        RETVAL = newSVpvn((const char *)digest, digest_len);
    OUTPUT:
        RETVAL

##############################################################################
# SigningIdentity - PKCS#12 and PEM parsing
##############################################################################

MODULE = PDF::Make  PACKAGE = PDF::Make::SigningIdentity
PROTOTYPES: ENABLE

pdfmake_signing_identity_t *
_from_pkcs12(class, data_sv, password)
    const char *class
    SV *data_sv
    const char *password
    PREINIT:
        STRLEN len;
        const uint8_t *data;
        pdfmake_arena_t *arena;
    CODE:
        PERL_UNUSED_VAR(class);
        data = (const uint8_t *)SvPVbyte(data_sv, len);
        
        arena = pdfmake_arena_new();
        if (!arena)
            croak("PDF::Make::SigningIdentity: out of memory");
        
        RETVAL = pdfmake_pkcs12_parse(arena, data, len, password);
        if (!RETVAL) {
            pdfmake_arena_free(arena);
            croak("PDF::Make::SigningIdentity: failed to parse PKCS#12 data");
        }
        /* Note: arena is now owned by the identity */
    OUTPUT:
        RETVAL

void
DESTROY(self_sv)
    SV *self_sv
    PREINIT:
        SV *inner;
        pdfmake_signing_identity_t *self;
    CODE:
        /* The PDF::Make::SigningIdentity package has two constructors:
         *   - XS: _from_pkcs12() blesses a scalar holding a native pointer
         *   - pure-Perl: ::new() in lib/PDF/Make/Signature.pm blesses a HASH
         * Only the XS-created variant owns a pdfmake_signing_identity_t
         * that must be freed here. Without this guard, calling SvIV on a
         * blessed HASH at global destruction emits a spurious
         * "Use of uninitialized value in subroutine entry" warning. */
        if (sv_isobject(self_sv) && SvROK(self_sv)) {
            inner = SvRV(self_sv);
            if (inner && SvTYPE(inner) < SVt_PVAV) {
                self = INT2PTR(pdfmake_signing_identity_t *, SvIV(inner));
                if (self) pdfmake_signing_identity_free(self);
            }
        }

int
has_private_key(self)
    pdfmake_signing_identity_t *self
    CODE:
        RETVAL = (self && self->privkey != NULL);
    OUTPUT:
        RETVAL

int
has_certificate(self)
    pdfmake_signing_identity_t *self
    CODE:
        RETVAL = (self && self->cert != NULL);
    OUTPUT:
        RETVAL

int
chain_length(self)
    pdfmake_signing_identity_t *self
    CODE:
        if (!self || !self->chain)
            RETVAL = 0;
        else
            RETVAL = self->chain->count;
    OUTPUT:
        RETVAL

SV *
subject(self)
    pdfmake_signing_identity_t *self
    CODE:
        if (!self || !self->cert || !self->cert->subject.dn)
            XSRETURN_UNDEF;
        RETVAL = newSVpv(self->cert->subject.dn, 0);
    OUTPUT:
        RETVAL

SV *
issuer(self)
    pdfmake_signing_identity_t *self
    CODE:
        if (!self || !self->cert || !self->cert->issuer.dn)
            XSRETURN_UNDEF;
        RETVAL = newSVpv(self->cert->issuer.dn, 0);
    OUTPUT:
        RETVAL

SV *
serial(self)
    pdfmake_signing_identity_t *self
    CODE:
        if (!self || !self->cert || !self->cert->serial_hex)
            XSRETURN_UNDEF;
        RETVAL = newSVpv(self->cert->serial_hex, 0);
    OUTPUT:
        RETVAL

IV
not_before(self)
    pdfmake_signing_identity_t *self
    CODE:
        if (!self || !self->cert)



( run in 0.999 second using v1.01-cache-2.11-cpan-8dfa8b56332 )