From 8c30fb7d85e73088455141bfbd758b3a43c931df Mon Sep 17 00:00:00 2001 From: tb <> Date: Wed, 30 Oct 2024 18:14:49 +0000 Subject: Move public point <-> octets API to a new ec_convert.c discussed with jsing --- src/lib/libcrypto/Makefile | 3 +- src/lib/libcrypto/ec/ec_convert.c | 199 ++++++++++++++++++++++++++++++++++++++ src/lib/libcrypto/ec/ec_oct.c | 131 +------------------------ 3 files changed, 202 insertions(+), 131 deletions(-) create mode 100644 src/lib/libcrypto/ec/ec_convert.c (limited to 'src/lib') diff --git a/src/lib/libcrypto/Makefile b/src/lib/libcrypto/Makefile index 6a1d125950..652d74ee92 100644 --- a/src/lib/libcrypto/Makefile +++ b/src/lib/libcrypto/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.214 2024/10/19 08:26:03 tb Exp $ +# $OpenBSD: Makefile,v 1.215 2024/10/30 18:14:49 tb Exp $ LIB= crypto LIBREBUILD=y @@ -282,6 +282,7 @@ SRCS+= dsa_prn.c SRCS+= ec_ameth.c SRCS+= ec_asn1.c SRCS+= ec_curve.c +SRCS+= ec_convert.c SRCS+= ec_err.c SRCS+= ec_key.c SRCS+= ec_kmeth.c diff --git a/src/lib/libcrypto/ec/ec_convert.c b/src/lib/libcrypto/ec/ec_convert.c new file mode 100644 index 0000000000..fd0182f420 --- /dev/null +++ b/src/lib/libcrypto/ec/ec_convert.c @@ -0,0 +1,199 @@ +/* $OpenBSD: ec_convert.c,v 1.1 2024/10/30 18:14:49 tb Exp $ */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * Binary polynomial ECC support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#include + +#include +#include + +#include "asn1_local.h" +#include "ec_local.h" + +int +ec_point_to_octets(const EC_GROUP *group, const EC_POINT *point, int form, + unsigned char **out_buf, size_t *out_len, BN_CTX *ctx) +{ + unsigned char *buf = NULL; + size_t len = 0; + int ret = 0; + + if (out_buf != NULL && *out_buf != NULL) + goto err; + + *out_len = 0; + + if ((len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx)) == 0) + goto err; + + if (out_buf == NULL) + goto done; + + if ((buf = calloc(1, len)) == NULL) + goto err; + if (EC_POINT_point2oct(group, point, form, buf, len, ctx) != len) + goto err; + + *out_buf = buf; + buf = NULL; + + done: + *out_len = len; + + ret = 1; + + err: + freezero(buf, len); + + return ret; +} + +int +ec_point_from_octets(const EC_GROUP *group, const unsigned char *buf, size_t buf_len, + EC_POINT **out_point, uint8_t *out_form, BN_CTX *ctx) +{ + EC_POINT *point; + int ret = 0; + + if ((point = *out_point) == NULL) + point = EC_POINT_new(group); + if (point == NULL) + goto err; + + if (!EC_POINT_oct2point(group, point, buf, buf_len, ctx)) + goto err; + + if (out_form != NULL) + *out_form = buf[0] & ~1U; /* XXX - EC_OCT_YBIT */ + + *out_point = point; + point = NULL; + + ret = 1; + + err: + if (*out_point != point) + EC_POINT_free(point); + + return ret; +} + +size_t +EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t form, unsigned char *buf, size_t len, + BN_CTX *ctx_in) +{ + BN_CTX *ctx; + size_t ret = 0; + + if ((ctx = ctx_in) == NULL) + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; + + if (group->meth->point2oct == NULL) { + ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + goto err; + } + if (group->meth != point->meth) { + ECerror(EC_R_INCOMPATIBLE_OBJECTS); + goto err; + } + ret = group->meth->point2oct(group, point, form, buf, len, ctx); + + err: + if (ctx != ctx_in) + BN_CTX_free(ctx); + + return ret; +} +LCRYPTO_ALIAS(EC_POINT_point2oct); + +int +EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, + const unsigned char *buf, size_t len, BN_CTX *ctx_in) +{ + BN_CTX *ctx; + int ret = 0; + + if ((ctx = ctx_in) == NULL) + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; + + if (group->meth->oct2point == NULL) { + ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + goto err; + } + if (group->meth != point->meth) { + ECerror(EC_R_INCOMPATIBLE_OBJECTS); + goto err; + } + ret = group->meth->oct2point(group, point, buf, len, ctx); + + err: + if (ctx != ctx_in) + BN_CTX_free(ctx); + + return ret; +} +LCRYPTO_ALIAS(EC_POINT_oct2point); diff --git a/src/lib/libcrypto/ec/ec_oct.c b/src/lib/libcrypto/ec/ec_oct.c index 3277bf4dd5..7eb7d51910 100644 --- a/src/lib/libcrypto/ec/ec_oct.c +++ b/src/lib/libcrypto/ec/ec_oct.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_oct.c,v 1.19 2024/10/30 17:52:34 tb Exp $ */ +/* $OpenBSD: ec_oct.c,v 1.20 2024/10/30 18:14:49 tb Exp $ */ /* * Originally written by Bodo Moeller for the OpenSSL project. */ @@ -110,132 +110,3 @@ EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx); } LCRYPTO_ALIAS(EC_POINT_set_compressed_coordinates_GFp); - -int -ec_point_to_octets(const EC_GROUP *group, const EC_POINT *point, int form, - unsigned char **out_buf, size_t *out_len, BN_CTX *ctx) -{ - unsigned char *buf = NULL; - size_t len = 0; - int ret = 0; - - if (out_buf != NULL && *out_buf != NULL) - goto err; - - *out_len = 0; - - if ((len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx)) == 0) - goto err; - - if (out_buf == NULL) - goto done; - - if ((buf = calloc(1, len)) == NULL) - goto err; - if (EC_POINT_point2oct(group, point, form, buf, len, ctx) != len) - goto err; - - *out_buf = buf; - buf = NULL; - - done: - *out_len = len; - - ret = 1; - - err: - freezero(buf, len); - - return ret; -} - -int -ec_point_from_octets(const EC_GROUP *group, const unsigned char *buf, size_t buf_len, - EC_POINT **out_point, uint8_t *out_form, BN_CTX *ctx) -{ - EC_POINT *point; - int ret = 0; - - if ((point = *out_point) == NULL) - point = EC_POINT_new(group); - if (point == NULL) - goto err; - - if (!EC_POINT_oct2point(group, point, buf, buf_len, ctx)) - goto err; - - if (out_form != NULL) - *out_form = buf[0] & ~1U; /* XXX - EC_OCT_YBIT */ - - *out_point = point; - point = NULL; - - ret = 1; - - err: - if (*out_point != point) - EC_POINT_free(point); - - return ret; -} - -size_t -EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, - point_conversion_form_t form, unsigned char *buf, size_t len, - BN_CTX *ctx_in) -{ - BN_CTX *ctx; - size_t ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->point2oct == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - ret = group->meth->point2oct(group, point, form, buf, len, ctx); - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_point2oct); - -int -EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, - const unsigned char *buf, size_t len, BN_CTX *ctx_in) -{ - BN_CTX *ctx; - int ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->oct2point == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - ret = group->meth->oct2point(group, point, buf, len, ctx); - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_oct2point); -- cgit v1.2.3-55-g6feb