const OSSL_PARAM *options,
const OSSL_DISPATCH *fns,
void *cbarg,
+ void *rlarg,
OSSL_RECORD_LAYER **ret);
int (*free)(OSSL_RECORD_LAYER *rl);
const EVP_MD *md, COMP_METHOD *comp, BIO *prev,
BIO *transport, BIO *next, BIO_ADDR *local, BIO_ADDR *peer,
const OSSL_PARAM *settings, const OSSL_PARAM *options,
- const OSSL_DISPATCH *fns, void *cbarg,
+ const OSSL_DISPATCH *fns, void *cbarg, void *rlarg,
OSSL_RECORD_LAYER **retrl)
{
int ret;
const EVP_MD *md, COMP_METHOD *comp, BIO *prev,
BIO *transport, BIO *next, BIO_ADDR *local, BIO_ADDR *peer,
const OSSL_PARAM *settings, const OSSL_PARAM *options,
- const OSSL_DISPATCH *fns, void *cbarg,
+ const OSSL_DISPATCH *fns, void *cbarg, void *rlarg,
OSSL_RECORD_LAYER **retrl)
{
int ret;
const EVP_MD *md, COMP_METHOD *comp, BIO *prev,
BIO *transport, BIO *next, BIO_ADDR *local, BIO_ADDR *peer,
const OSSL_PARAM *settings, const OSSL_PARAM *options,
- const OSSL_DISPATCH *fns, void *cbarg,
+ const OSSL_DISPATCH *fns, void *cbarg, void *rlarg,
OSSL_RECORD_LAYER **retrl)
{
int ret;
{ 0, NULL }
};
+void ossl_ssl_set_custom_record_layer(SSL_CONNECTION *s,
+ const OSSL_RECORD_METHOD *meth,
+ void *rlarg)
+{
+ s->rlayer.custom_rlmethod = meth;
+ s->rlayer.rlarg = rlarg;
+}
+
static const OSSL_RECORD_METHOD *ssl_select_next_record_layer(SSL_CONNECTION *s,
int direction,
int level)
{
+ if (s->rlayer.custom_rlmethod != NULL)
+ return s->rlayer.custom_rlmethod;
if (level == OSSL_RECORD_PROTECTION_LEVEL_NONE) {
if (SSL_CONNECTION_IS_DTLS(s))
mackeylen, ciph, taglen, mactype, md,
compm, prev, thisbio, next, NULL, NULL,
settings, options, rlayer_dispatch_tmp,
- s, &newrl);
+ s, s->rlayer.rlarg, &newrl);
BIO_free(prev);
switch (rlret) {
case OSSL_RECORD_RETURN_FATAL:
/* The parent SSL_CONNECTION structure */
SSL_CONNECTION *s;
+ /* Custom record layer: always selected if set */
+ const OSSL_RECORD_METHOD *custom_rlmethod;
+ /* Record layer specific argument */
+ void *rlarg;
/* Method to use for the read record layer*/
const OSSL_RECORD_METHOD *rrlmethod;
/* Method to use for the write record layer*/
int ossl_comp_has_alg(int a);
size_t ossl_calculate_comp_expansion(int alg, size_t length);
+void ossl_ssl_set_custom_record_layer(SSL_CONNECTION *s,
+ const OSSL_RECORD_METHOD *meth,
+ void *rlarg);
+
#endif
OSSL_RECORD_PROTECTION_LEVEL_APPLICATION, 0, key, 16,
iv, ivlen, NULL, 0, EVP_aes_128_gcm(),
EVP_GCM_TLS_TAG_LEN, 0, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, &wrl)))
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, &wrl)))
goto err;
memcpy(wrl->sequence, seqbuf, sizeof(seqbuf));
OSSL_RECORD_PROTECTION_LEVEL_APPLICATION, 0, key, 16,
iv, ivlen, NULL, 0, EVP_aes_128_gcm(),
EVP_GCM_TLS_TAG_LEN, 0, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, &rrl)))
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, &rrl)))
goto err;
memcpy(rrl->sequence, seqbuf, sizeof(seqbuf));