Crypt-NSS
view release on metacpan or search on metacpan
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 )