diff options
author | Richard Levitte <levitte@openssl.org> | 2019-11-18 01:32:22 +0100 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2019-11-29 20:55:16 +0100 |
commit | 742496f1309d04f4921ca64e4b6315a45a47b4af (patch) | |
tree | e3c21274c6f1ae8e545e458edc986d96663085cc /crypto | |
parent | 0d003c52d3dcf4b076bb01a6767cdd5ace2d79f6 (diff) |
SERIALIZER: add functions for serialization to file
These functions are added:
- OSSL_SERIALIZER_to_bio()
- OSSL_SERIALIZER_to_fp() (unless 'no-stdio')
OSSL_SERIALIZER_to_bio() and OSSL_SERIALIZER_to_fp() work as wrapper
functions, and call an internal "do_output" function with the given
serializer context and a BIO to output the serialized result to.
The internal "do_output" function must have intimate knowledge of the
object being output. This will defined independently with context
creators for specific OpenSSL types.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10394)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/serializer/build.info | 2 | ||||
-rw-r--r-- | crypto/serializer/serializer_lib.c | 43 | ||||
-rw-r--r-- | crypto/serializer/serializer_local.h | 7 |
3 files changed, 51 insertions, 1 deletions
diff --git a/crypto/serializer/build.info b/crypto/serializer/build.info index 7d69df931c..1a35152586 100644 --- a/crypto/serializer/build.info +++ b/crypto/serializer/build.info @@ -1 +1 @@ -SOURCE[../../libcrypto]=serializer_meth.c +SOURCE[../../libcrypto]=serializer_meth.c serializer_lib.c diff --git a/crypto/serializer/serializer_lib.c b/crypto/serializer/serializer_lib.c new file mode 100644 index 0000000000..932ef1e3ae --- /dev/null +++ b/crypto/serializer/serializer_lib.c @@ -0,0 +1,43 @@ +/* + * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include <openssl/bio.h> +#include <openssl/serializer.h> +#include "serializer_local.h" + +int OSSL_SERIALIZER_to_bio(OSSL_SERIALIZER_CTX *ctx, BIO *out) +{ + return ctx->do_output(ctx, out); +} + +#ifndef OPENSSL_NO_STDIO +static BIO *bio_from_file(FILE *fp) +{ + BIO *b; + + if ((b = BIO_new(BIO_s_file())) == NULL) { + ERR_raise(ERR_LIB_OSSL_SERIALIZER, ERR_R_BUF_LIB); + return NULL; + } + BIO_set_fp(b, fp, BIO_NOCLOSE); + return b; +} + +int OSSL_SERIALIZER_to_fp(OSSL_SERIALIZER_CTX *ctx, FILE *fp) +{ + BIO *b = bio_from_file(fp); + int ret = 0; + + if (b != NULL) + ret = OSSL_SERIALIZER_to_bio(ctx, b); + + BIO_free(b); + return ret; +} +#endif diff --git a/crypto/serializer/serializer_local.h b/crypto/serializer/serializer_local.h index 979ba83e78..dd0eb85414 100644 --- a/crypto/serializer/serializer_local.h +++ b/crypto/serializer/serializer_local.h @@ -31,4 +31,11 @@ struct ossl_serializer_st { struct ossl_serializer_ctx_st { OSSL_SERIALIZER *ser; void *serctx; + + /* + * |object| is the libcrypto object to handle. + * |do_output| must have intimate knowledge of this object. + */ + const void *object; + int (*do_output)(OSSL_SERIALIZER_CTX *ctx, BIO *out); }; |