Crypt-NSS

 view release on metacpan or  search on metacpan

NSS.xs  view on Meta::CPAN

        new_socket->fd = remote_fd;
        new_socket->ssl_fd = SSL_ImportFD(NULL, new_socket->fd);
        new_socket->is_connected = TRUE;
        new_socket->does_ssl = TRUE;
        RETVAL = new_socket;
    OUTPUT:
        RETVAL

void
listen(self, queue_length=10)
    Net::NSS::SSL self;
    I32 queue_length;
    CODE:
        EVALUATE_PR_CALL(PR_Listen(self->fd, queue_length), "Listen failed")

void
import_into_ssl_layer(self, proto=NULL)
    Net::NSS::SSL self;
    Net::NSS::SSL proto;
    PREINIT:
        PRFileDesc * proto_sock = NULL;
    CODE:
        if (proto != NULL) {
            proto_sock = proto->ssl_fd;
        }
        self->ssl_fd = (PRFileDesc *) SSL_ImportFD(proto_sock, self->fd);
        self->does_ssl = TRUE;

void
reset_handshake(self, as_server)
    Net::NSS::SSL self;
    bool as_server;
    CODE:
        EVALUATE_SEC_CALL(SSL_ResetHandshake(self->ssl_fd, as_server ? PR_TRUE : PR_FALSE), "Failed to reset handshake");
    
void
configure_as_server(self, cert, key)
    Net::NSS::SSL self;
    Crypt::NSS::Certificate cert;
    Crypt::NSS::PrivateKey key;
    PREINIT:
        SSLKEAType certKEA;
    CODE:
        certKEA = NSS_FindCertKEAType(cert);
        EVALUATE_SEC_CALL(SSL_ConfigSecureServer(self->ssl_fd, cert, key, certKEA), "Failed to configure server socket");
    
I32
available(self)
    Net::NSS::SSL self;
    CODE:
        RETVAL = PR_Available(self->ssl_fd);
    OUTPUT:
        RETVAL

void
_peeraddr(self)
    Net::NSS::SSL self;
    PREINIT:
        char * hostname;
        PRNetAddr addr;
    PPCODE:
        if (self->ssl_fd == NULL || !self->is_connected) {
            croak("Can't get peeraddr because we're not connected");
        }
        EVALUATE_PR_CALL(PR_GetPeerName(self->ssl_fd, &addr), "Failed to get peer addr")
        Newz(1, hostname, 16, char);
        if (PR_NetAddrToString(&addr, hostname, 16) != PR_SUCCESS) {
            Safefree(hostname);
            throw_exception_from_nspr_error("Failed to convert PRNetAddr to string");
        }
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSVpv(hostname, 0)));
        PUSHs(sv_2mortal(newSViv(PR_ntohs(addr.inet.port))));
        Safefree(hostname);

void
_sockaddr(self)
    Net::NSS::SSL self;
    PREINIT:
        char * hostname;
        PRNetAddr addr;
    PPCODE:
        EVALUATE_PR_CALL(PR_GetSockName(self->ssl_fd, &addr), "Failed to get peer addr")
        Newz(1, hostname, 16, char);
        if (PR_NetAddrToString(&addr, hostname, 16) != PR_SUCCESS) {
            Safefree(hostname);
            throw_exception_from_nspr_error("Failed to convert PRNetAddr to string");
        }
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSVpv(hostname, 0)));
        PUSHs(sv_2mortal(newSViv(PR_ntohs(addr.inet.port))));
        Safefree(hostname);
                
I32
keysize(self)
    Net::NSS::SSL self;
    PREINIT:
        int keysize;
    CODE:
        EVALUATE_SEC_CALL(SSL_SecurityStatus(self->ssl_fd, NULL, NULL, &keysize, NULL, NULL, NULL), 
                          "Failed to get session key length")
        RETVAL = keysize;
    OUTPUT:
        RETVAL

I32
secret_keysize(self)
    Net::NSS::SSL self;
    PREINIT:
        int secret_keysize;
    CODE:
        EVALUATE_SEC_CALL(SSL_SecurityStatus(self->ssl_fd, NULL, NULL, NULL, &secret_keysize, NULL, NULL), 
                         "Failed to get session secret key length")
        RETVAL = secret_keysize;
    OUTPUT:
        RETVAL

const char *
cipher(self)
    Net::NSS::SSL self;
    PREINIT:
        char *cipher;
    CODE:
        EVALUATE_SEC_CALL(SSL_SecurityStatus(self->ssl_fd, NULL, &cipher, NULL, NULL, NULL, NULL),
                                             "Failed to get session cipher")
        RETVAL = savepv(cipher);
        PR_Free(cipher);
    OUTPUT:
        RETVAL

const char *
issuer(self)
    Net::NSS::SSL self;
    PREINIT:
        char *issuer;
    CODE:
        EVALUATE_SEC_CALL(SSL_SecurityStatus(self->ssl_fd, NULL, NULL, NULL, NULL, &issuer, NULL),
                                             "Failed to get session issuer")
        RETVAL = savepv(issuer);
        PR_Free(issuer);
    OUTPUT:
        RETVAL



( run in 1.384 second using v1.01-cache-2.11-cpan-71847e10f99 )