Crypt-MatrixSSL3
view release on metacpan or search on metacpan
MatrixSSL3.xs view on Meta::CPAN
#ifdef MATRIX_DEBUG
warn("set_server_params: index %d", server_index);
#endif
if (server_index < 0)
croak("Invalid SSL server index %d", server_index);
if (server_index >= SSL_server_index)
croak("Out of range SSL server index spcified: %d > %d", server_index, SSL_server_index - 1);
/* set SSL server pointer */
ss = SSL_servers[server_index];
/* initialize default server structure */
if (!(SvROK(params) && SvTYPE(SvRV(params)) == SVt_PVHV))
croak("Expected default server params to be a hash reference");
hparams = (HV *) SvRV(params);
if (hv_exists(hparams, "keys", strlen("keys"))) {
item_sv = *hv_fetch(hparams, "keys", strlen("keys"), 0);
tmp = SvIV((SV*)SvRV(item_sv));
ss->keys = INT2PTR(Crypt_MatrixSSL3_Keys *, tmp);
}
if (hv_exists(hparams, "ALPN", strlen("ALPN"))) {
item_sv = *hv_fetch(hparams, "ALPN", strlen("ALPN"), 0);
if (!(SvROK(item_sv) && SvTYPE(SvRV(item_sv)) == SVt_PVAV))
croak("Expected default server ALPN param to be an array reference");
ss->alpn = (p_ALPN_data) malloc(SZ_ALPN_DATA);
memset(ss->alpn, 0, SZ_ALPN_DATA);
aaux = (AV *) SvRV(item_sv);
ss->alpn->protoCount = (short) av_len(aaux) + 1;
if (ss->alpn->protoCount > MAX_PROTO_EXT) ss->alpn->protoCount = MAX_PROTO_EXT;
#ifdef MATRIX_DEBUG
warn("Loading %d protocols for SSL (default) server %d", ss->alpn->protoCount, server_index);
#endif
for (i = 0; i < ss->alpn->protoCount; i++) {
tmp_sv = *av_fetch(aaux, i, 0);
item = (unsigned char *) SvPV(tmp_sv, item_len);
#ifdef MATRIX_DEBUG
warn("Adding protocol for SSL (default) server %d: %s", server_index, item);
#endif
ss->alpn->proto[i] = (unsigned char *) malloc(item_len);
memcpy(ss->alpn->proto[i], item, item_len);
ss->alpn->protoLen[i] = item_len;
}
}
#ifdef MATRIX_DEBUG
warn("Returning SSL (default) server index: %d", server_index);
#endif
RETVAL = server_index;
OUTPUT:
RETVAL
int sess_set_callbacks(ssl, server_index, ssl_id)
Crypt_MatrixSSL3_Sess *ssl;
int server_index = SvOK(ST(1)) ? SvIV(ST(1)) : -1;
int ssl_id = SvOK(ST(2)) ? SvIV(ST(2)) : -1;
p_SSL_data ssl_data = NULL;
p_SSL_server ss = NULL;
CODE:
/* check if server_index points to a valid SSL server structure */
if (server_index < 0)
croak("Invalid SSL server index %d", server_index);
if (server_index >= SSL_server_index)
croak("Requested SSL server index out of range %d > %d", server_index, SSL_server_index - 1);
/* just set the callback and we're done */
#ifdef MATRIX_DEBUG
warn("Setting up SNI/ALPN callbacks for SSL server %d, ssl_id = %d, %p", server_index, ssl_id, SSL_servers[server_index]);
#endif
/* set out SSL session custom data */
ssl_data = (p_SSL_data) ssl->userPtr;
ssl_data->ssl_id = ssl_id;
ssl_data->server_index = server_index;
/* get the SSL server strcuture */
ss = SSL_servers[server_index];
/* test if any visrtual hosts are present */
if (ss->SNI_entries_number > 0) {
/* setup SNI callback */
matrixSslRegisterSNICallback(ssl, SNI_callback);
/* setup ALPN callback */
matrixSslRegisterALPNCallback(ssl, ALPNCallbackXS);
} else {
/* no virtual hosts, setup ALPN callback only if server has defined protocols */
if (ss->alpn != NULL) matrixSslRegisterALPNCallback(ssl, ALPNCallbackXS);
}
RETVAL = server_index;
OUTPUT:
RETVAL
void sess_DESTROY(ssl)
Crypt_MatrixSSL3_Sess *ssl;
SV *key = NULL;
CODE:
ENTER;
SAVETMPS;
/* delete callback from global hashes */
key = sv_2mortal(newSViv(PTR2IV(ssl)));
if(hv_exists_ent(certValidatorArg, key, 0))
hv_delete_ent(certValidatorArg, key, G_DISCARD, 0);
if(hv_exists_ent(extensionCbackArg, key, 0))
hv_delete_ent(extensionCbackArg, key, G_DISCARD, 0);
FREETMPS;
LEAVE;
if (((ssl_t *) ssl)->userPtr != NULL) free(((ssl_t *) ssl)->userPtr);
matrixSslDeleteSession((ssl_t *) ssl);
del_obj();
int sess_get_outdata(ssl, outBuf)
Crypt_MatrixSSL3_Sess *ssl;
SV *outBuf;
unsigned char *buf = NULL;
CODE:
RETVAL = matrixSslGetOutdata((ssl_t *)ssl, &buf);
if (RETVAL < 0)
croak("matrixSslGetOutdata returns %d", RETVAL);
( run in 0.733 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )