summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2022-05-24 20:06:32 +0000
committertb <>2022-05-24 20:06:32 +0000
commite10e3f1508de3bcfc278adc5e63ee08c206e14e4 (patch)
tree0d1e82f3ac5c409e56ea3af7d79ae59008869f05 /src
parenta4b85d840951739dd62fc246ac18df2975d614c0 (diff)
downloadopenbsd-e10e3f1508de3bcfc278adc5e63ee08c206e14e4.tar.gz
openbsd-e10e3f1508de3bcfc278adc5e63ee08c206e14e4.tar.bz2
openbsd-e10e3f1508de3bcfc278adc5e63ee08c206e14e4.zip
Simplify ec_asn1_group2curve()
Don't try to reuse curve->seed to avoid an allocation. Free it unconditionally and copy over the group->seed if it's available. Use asn1_abs_set_unused_bits() instead of inlining it. ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/ec/ec_asn1.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c
index 4cf0bf5972..6bf7e47d7d 100644
--- a/src/lib/libcrypto/ec/ec_asn1.c
+++ b/src/lib/libcrypto/ec/ec_asn1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_asn1.c,v 1.36 2022/03/31 13:00:58 tb Exp $ */ 1/* $OpenBSD: ec_asn1.c,v 1.37 2022/05/24 20:06:32 tb Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -60,11 +60,13 @@
60 60
61#include <openssl/opensslconf.h> 61#include <openssl/opensslconf.h>
62 62
63#include "ec_lcl.h"
64#include <openssl/err.h> 63#include <openssl/err.h>
65#include <openssl/asn1t.h> 64#include <openssl/asn1t.h>
66#include <openssl/objects.h> 65#include <openssl/objects.h>
67 66
67#include "asn1_locl.h"
68#include "ec_lcl.h"
69
68int 70int
69EC_GROUP_get_basis_type(const EC_GROUP * group) 71EC_GROUP_get_basis_type(const EC_GROUP * group)
70{ 72{
@@ -860,24 +862,24 @@ ec_asn1_group2curve(const EC_GROUP * group, X9_62_CURVE * curve)
860 ECerror(ERR_R_ASN1_LIB); 862 ECerror(ERR_R_ASN1_LIB);
861 goto err; 863 goto err;
862 } 864 }
865
866 ASN1_BIT_STRING_free(curve->seed);
867 curve->seed = NULL;
868
863 /* set the seed (optional) */ 869 /* set the seed (optional) */
864 if (group->seed) { 870 if (group->seed != NULL) {
865 if (!curve->seed) 871 if ((curve->seed = ASN1_BIT_STRING_new()) == NULL) {
866 if ((curve->seed = ASN1_BIT_STRING_new()) == NULL) { 872 ECerror(ERR_R_MALLOC_FAILURE);
867 ECerror(ERR_R_MALLOC_FAILURE); 873 goto err;
868 goto err; 874 }
869 }
870 curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
871 curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT;
872 if (!ASN1_BIT_STRING_set(curve->seed, group->seed, 875 if (!ASN1_BIT_STRING_set(curve->seed, group->seed,
873 (int) group->seed_len)) { 876 (int) group->seed_len)) {
874 ECerror(ERR_R_ASN1_LIB); 877 ECerror(ERR_R_ASN1_LIB);
875 goto err; 878 goto err;
876 } 879 }
877 } else { 880 if (!asn1_abs_set_unused_bits(curve->seed, 0)) {
878 if (curve->seed) { 881 ECerror(ERR_R_ASN1_LIB);
879 ASN1_BIT_STRING_free(curve->seed); 882 goto err;
880 curve->seed = NULL;
881 } 883 }
882 } 884 }
883 885
@@ -1481,10 +1483,11 @@ i2d_ECPrivateKey(EC_KEY * a, unsigned char **out)
1481 ECerror(ERR_R_EC_LIB); 1483 ECerror(ERR_R_EC_LIB);
1482 goto err; 1484 goto err;
1483 } 1485 }
1484 priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); 1486 if (!ASN1_STRING_set(priv_key->publicKey, buffer, buf_len)) {
1485 priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT; 1487 ECerror(ERR_R_ASN1_LIB);
1486 if (!ASN1_STRING_set(priv_key->publicKey, buffer, 1488 goto err;
1487 buf_len)) { 1489 }
1490 if (!asn1_abs_set_unused_bits(priv_key->publicKey, 0)) {
1488 ECerror(ERR_R_ASN1_LIB); 1491 ECerror(ERR_R_ASN1_LIB);
1489 goto err; 1492 goto err;
1490 } 1493 }