The branch master has been updated via 92eb592b3b70a1f8e08b7160e54e367ba0d0aca2 (commit) from 56ba2b78eb68239166dc7e2373b34f3f10be7fc3 (commit)
- Log ----------------------------------------------------------------- commit 92eb592b3b70a1f8e08b7160e54e367ba0d0aca2 Author: Richard Levitte <levi...@openssl.org> Date: Thu Jun 24 18:44:26 2021 +0200 ENCODER & DECODER: Allow en/decoders to have multiple names We had prepared for this a little bit, but apparently not completed it. Reviewed-by: Paul Dale <pa...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/15904) ----------------------------------------------------------------------- Summary of changes: crypto/encode_decode/decoder_meth.c | 32 +++++++++++++++++++++++++++++--- crypto/encode_decode/encoder_meth.c | 32 +++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/crypto/encode_decode/decoder_meth.c b/crypto/encode_decode/decoder_meth.c index 097605cfdc..8f0786c941 100644 --- a/crypto/encode_decode/decoder_meth.c +++ b/crypto/encode_decode/decoder_meth.c @@ -131,12 +131,25 @@ static void *get_decoder_from_store(void *store, void *data) void *method = NULL; int id; - if ((id = methdata->id) == 0) { + /* + * get_decoder_from_store() is only called to try and get the method + * that OSSL_DECODER_fetch() is asking for, and the name or name id are + * passed via methdata. + */ + if ((id = methdata->id) == 0 && methdata->names != NULL) { OSSL_NAMEMAP *namemap = ossl_namemap_stored(methdata->libctx); + const char *names = methdata->names; + const char *q = strchr(names, NAME_SEPARATOR); + size_t l = (q == NULL ? strlen(names) : (size_t)(q - names)); - id = ossl_namemap_name2num(namemap, methdata->names); + if (namemap == 0) + return NULL; + id = ossl_namemap_name2num_n(namemap, names, l); } + if (id == 0) + return NULL; + if (store == NULL && (store = get_decoder_store(methdata->libctx)) == NULL) return NULL; @@ -154,9 +167,22 @@ static int put_decoder_in_store(void *store, void *method, struct decoder_data_st *methdata = data; OSSL_NAMEMAP *namemap; int id; + size_t l = 0; + + /* + * put_decoder_in_store() is only called with an OSSL_DECODER method that + * was successfully created by construct_decoder() below, which means that + * all the names should already be stored in the namemap with the same + * numeric identity, so just use the first to get that identity. + */ + if (names != NULL) { + const char *q = strchr(names, NAME_SEPARATOR); + + l = (q == NULL ? strlen(names) : (size_t)(q - names)); + } if ((namemap = ossl_namemap_stored(methdata->libctx)) == NULL - || (id = ossl_namemap_name2num(namemap, names)) == 0) + || (id = ossl_namemap_name2num_n(namemap, names, l)) == 0) return 0; if (store == NULL && (store = get_decoder_store(methdata->libctx)) == NULL) diff --git a/crypto/encode_decode/encoder_meth.c b/crypto/encode_decode/encoder_meth.c index 823def8843..9f7ecc82cb 100644 --- a/crypto/encode_decode/encoder_meth.c +++ b/crypto/encode_decode/encoder_meth.c @@ -131,12 +131,25 @@ static void *get_encoder_from_store(void *store, void *data) void *method = NULL; int id; - if ((id = methdata->id) == 0) { + /* + * get_encoder_from_store() is only called to try and get the method + * that OSSL_ENCODER_fetch() is asking for, and the name or name id are + * passed via methdata. + */ + if ((id = methdata->id) == 0 && methdata->names != NULL) { OSSL_NAMEMAP *namemap = ossl_namemap_stored(methdata->libctx); + const char *names = methdata->names; + const char *q = strchr(names, NAME_SEPARATOR); + size_t l = (q == NULL ? strlen(names) : (size_t)(q - names)); - id = ossl_namemap_name2num(namemap, methdata->names); + if (namemap == 0) + return NULL; + id = ossl_namemap_name2num_n(namemap, methdata->names, l); } + if (id == 0) + return NULL; + if (store == NULL && (store = get_encoder_store(methdata->libctx)) == NULL) return NULL; @@ -154,9 +167,22 @@ static int put_encoder_in_store(void *store, void *method, struct encoder_data_st *methdata = data; OSSL_NAMEMAP *namemap; int id; + size_t l = 0; + + /* + * put_encoder_in_store() is only called with an OSSL_ENCODER method that + * was successfully created by construct_encoder() below, which means that + * all the names should already be stored in the namemap with the same + * numeric identity, so just use the first to get that identity. + */ + if (names != NULL) { + const char *q = strchr(names, NAME_SEPARATOR); + + l = (q == NULL ? strlen(names) : (size_t)(q - names)); + } if ((namemap = ossl_namemap_stored(methdata->libctx)) == NULL - || (id = ossl_namemap_name2num(namemap, names)) == 0) + || (id = ossl_namemap_name2num_n(namemap, names, l)) == 0) return 0; if (store == NULL && (store = get_encoder_store(methdata->libctx)) == NULL)