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 )