mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-10-28 17:15:09 +03:00
Introduce missing functionality that was found in compatibility layer of wolfssl
This commit is contained in:
committed by
Juliusz Sosinowicz
parent
21bb7a10f1
commit
5c8ac7998f
58
src/pk_ec.c
58
src/pk_ec.c
@@ -4765,6 +4765,64 @@ int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode an octet-encoded EC public point into @key.
|
||||
*
|
||||
* Return code compliant with OpenSSL.
|
||||
*
|
||||
* @param [in, out] key EC key (must already have a group set).
|
||||
* @param [in] buf Octet-encoded public point.
|
||||
* @param [in] len Length of @buf in bytes.
|
||||
* @param [in] ctx BN context. May be NULL.
|
||||
* @return 1 on success.
|
||||
* @return 0 on failure.
|
||||
*/
|
||||
int wolfSSL_EC_KEY_oct2key(WOLFSSL_EC_KEY *key, const unsigned char *buf,
|
||||
size_t len, WOLFSSL_BN_CTX *ctx)
|
||||
{
|
||||
int ret = 1;
|
||||
const WOLFSSL_EC_GROUP *group = NULL;
|
||||
WOLFSSL_EC_POINT *point = NULL;
|
||||
|
||||
WOLFSSL_ENTER("wolfSSL_EC_KEY_oct2key");
|
||||
|
||||
if ((key == NULL) || (buf == NULL) || (len == 0)) {
|
||||
WOLFSSL_MSG("wolfSSL_EC_KEY_oct2key Bad arguments");
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (ret == 1) {
|
||||
group = wolfSSL_EC_KEY_get0_group(key);
|
||||
if (group == NULL) {
|
||||
WOLFSSL_MSG("EC_KEY has no group set");
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == 1) {
|
||||
point = wolfSSL_EC_POINT_new((WOLFSSL_EC_GROUP*)group);
|
||||
if (point == NULL) {
|
||||
WOLFSSL_MSG("wolfSSL_EC_POINT_new failed");
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret == 1) &&
|
||||
(wolfSSL_EC_POINT_oct2point(group, point, buf, len, ctx) != 1)) {
|
||||
WOLFSSL_MSG("wolfSSL_EC_POINT_oct2point failed");
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if ((ret == 1) && (wolfSSL_EC_KEY_set_public_key(key, point) != 1)) {
|
||||
WOLFSSL_MSG("wolfSSL_EC_KEY_set_public_key failed");
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
wolfSSL_EC_POINT_free(point);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifndef NO_WOLFSSL_STUB
|
||||
/* Set the ASN.1 encoding flag against the EC key.
|
||||
*
|
||||
|
||||
37
src/x509.c
37
src/x509.c
@@ -3584,6 +3584,43 @@ err_cleanup:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode @value as an extension of type @nid and append it to @x.
|
||||
*
|
||||
* The @flags argument (X509V3_ADD_DEFAULT / APPEND / REPLACE / KEEP_EXISTING
|
||||
* in OpenSSL) is not supported here; non-zero values are treated as the
|
||||
* default append behavior.
|
||||
*
|
||||
* @return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise.
|
||||
*/
|
||||
int wolfSSL_X509_add1_ext_i2d(WOLFSSL_X509 *x, int nid, void *value,
|
||||
int crit, unsigned long flags)
|
||||
{
|
||||
WOLFSSL_X509_EXTENSION *ext = NULL;
|
||||
int ret;
|
||||
|
||||
WOLFSSL_ENTER("wolfSSL_X509_add1_ext_i2d");
|
||||
|
||||
if (x == NULL || value == NULL) {
|
||||
WOLFSSL_MSG("Bad parameter");
|
||||
return WOLFSSL_FAILURE;
|
||||
}
|
||||
|
||||
if (flags != 0) {
|
||||
WOLFSSL_MSG("X509V3_ADD_* flags not supported; using default behavior");
|
||||
}
|
||||
|
||||
ext = wolfSSL_X509V3_EXT_i2d(nid, crit, value);
|
||||
if (ext == NULL) {
|
||||
return WOLFSSL_FAILURE;
|
||||
}
|
||||
|
||||
ret = wolfSSL_X509_add_ext(x, ext, -1);
|
||||
wolfSSL_X509_EXTENSION_free(ext);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
|
||||
WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object(
|
||||
WOLFSSL_X509_EXTENSION* ext)
|
||||
|
||||
145
tests/api.c
145
tests/api.c
@@ -3056,6 +3056,27 @@ static int test_tls13_null_cipher_explicit_keep(void)
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
/* Test SSL_set_ciphersuites OpenSSL-compat macro. */
|
||||
static int test_wolfSSL_SSL_set_ciphersuites(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13) && \
|
||||
!defined(NO_WOLFSSL_CLIENT) && defined(HAVE_AESGCM)
|
||||
WOLFSSL_CTX* ctx = NULL;
|
||||
WOLFSSL* ssl = NULL;
|
||||
|
||||
ExpectNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method()));
|
||||
ExpectNotNull(ssl = SSL_new(ctx));
|
||||
|
||||
ExpectIntEQ(SSL_set_ciphersuites(ssl, "TLS_AES_128_GCM_SHA256"), 1);
|
||||
ExpectIntEQ(SSL_set_ciphersuites(ssl, "BOGUS-SUITE"), 0);
|
||||
|
||||
SSL_free(ssl);
|
||||
SSL_CTX_free(ctx);
|
||||
#endif
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
static int test_wolfSSL_set_alpn_protos_default_fails(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
@@ -23694,6 +23715,25 @@ static int test_wolfSSL_sk_GENERAL_NAME(void)
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
static int test_wolfSSL_sk_GENERAL_NAME_new_null(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
|
||||
STACK_OF(GENERAL_NAME)* sk = NULL;
|
||||
GENERAL_NAME* gn = NULL;
|
||||
|
||||
ExpectNotNull(sk = sk_GENERAL_NAME_new_null());
|
||||
ExpectIntEQ(sk_GENERAL_NAME_num(sk), 0);
|
||||
|
||||
ExpectNotNull(gn = GENERAL_NAME_new());
|
||||
ExpectIntEQ(sk_GENERAL_NAME_push(sk, gn), 1);
|
||||
ExpectIntEQ(sk_GENERAL_NAME_num(sk), 1);
|
||||
|
||||
sk_GENERAL_NAME_pop_free(sk, GENERAL_NAME_free);
|
||||
#endif
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
static int test_wolfSSL_GENERAL_NAME_print(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
@@ -24400,6 +24440,68 @@ static int test_wolfSSL_X509_set_extensions(void)
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
/* Test wolfSSL_X509_add1_ext_i2d using a SAN DNS entry. */
|
||||
static int test_wolfSSL_X509_add1_ext_i2d(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
#if defined(OPENSSL_EXTRA) && defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
|
||||
!defined(NO_ASN)
|
||||
WOLFSSL_X509* x509 = NULL;
|
||||
WOLFSSL_GENERAL_NAMES* gns = NULL;
|
||||
WOLFSSL_GENERAL_NAME* gn = NULL;
|
||||
WOLFSSL_ASN1_STRING* dnsStr = NULL;
|
||||
const char dns[] = "example.com";
|
||||
|
||||
ExpectNotNull(x509 = wolfSSL_X509_new());
|
||||
ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new());
|
||||
ExpectNotNull(dnsStr = wolfSSL_ASN1_STRING_new());
|
||||
ExpectIntEQ(wolfSSL_ASN1_STRING_set(dnsStr, dns, (int)XSTRLEN(dns)), 1);
|
||||
if (gn != NULL) {
|
||||
wolfSSL_GENERAL_NAME_set0_value(gn, GEN_DNS, dnsStr);
|
||||
dnsStr = NULL;
|
||||
}
|
||||
ExpectNotNull(gns = wolfSSL_sk_GENERAL_NAME_new(NULL));
|
||||
ExpectIntEQ(wolfSSL_sk_GENERAL_NAME_push(gns, gn), 1);
|
||||
if (EXPECT_FAIL() && gn != NULL) {
|
||||
wolfSSL_GENERAL_NAME_free(gn);
|
||||
}
|
||||
|
||||
ExpectIntEQ(wolfSSL_X509_add1_ext_i2d(NULL, NID_subject_alt_name, gns, 0,
|
||||
0), WOLFSSL_FAILURE);
|
||||
ExpectIntEQ(wolfSSL_X509_add1_ext_i2d(x509, NID_subject_alt_name, NULL, 0,
|
||||
0), WOLFSSL_FAILURE);
|
||||
|
||||
ExpectIntEQ(wolfSSL_X509_add1_ext_i2d(x509, NID_subject_alt_name, gns, 0,
|
||||
0), WOLFSSL_SUCCESS);
|
||||
|
||||
{
|
||||
WOLFSSL_GENERAL_NAMES* readBack = NULL;
|
||||
WOLFSSL_GENERAL_NAME* rbGn = NULL;
|
||||
|
||||
ExpectNotNull(readBack = (WOLFSSL_GENERAL_NAMES*)
|
||||
wolfSSL_X509_get_ext_d2i(x509, NID_subject_alt_name, NULL,
|
||||
NULL));
|
||||
ExpectIntEQ(wolfSSL_sk_GENERAL_NAME_num(readBack), 1);
|
||||
ExpectNotNull(rbGn = wolfSSL_sk_GENERAL_NAME_value(readBack, 0));
|
||||
if (rbGn != NULL) {
|
||||
ExpectIntEQ(rbGn->type, GEN_DNS);
|
||||
ExpectNotNull(rbGn->d.dNSName);
|
||||
if (rbGn->d.dNSName != NULL) {
|
||||
ExpectIntEQ(rbGn->d.dNSName->length, (int)XSTRLEN(dns));
|
||||
ExpectIntEQ(XMEMCMP(rbGn->d.dNSName->data, dns,
|
||||
XSTRLEN(dns)), 0);
|
||||
}
|
||||
}
|
||||
wolfSSL_sk_GENERAL_NAME_pop_free(readBack, wolfSSL_GENERAL_NAME_free);
|
||||
}
|
||||
|
||||
wolfSSL_sk_GENERAL_NAME_pop_free(gns, wolfSSL_GENERAL_NAME_free);
|
||||
wolfSSL_ASN1_STRING_free(dnsStr);
|
||||
wolfSSL_X509_free(x509);
|
||||
#endif
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
/* Round trip test for wolfSSL_X509_set_authority_key_id() with a raw key ID.
|
||||
*
|
||||
* Builds a cert, calls the setter with a 20-byte raw keyId, signs the cert,
|
||||
@@ -25629,6 +25731,45 @@ static int test_wolfSSL_d2i_and_i2d_PUBKEY_mldsa(void)
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
/* Round-trip test for EC_KEY_oct2key with a P-256 public point. */
|
||||
static int test_wolfSSL_EC_KEY_oct2key(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && !defined(NO_ASN)
|
||||
EC_KEY* src = NULL;
|
||||
EC_KEY* dst = NULL;
|
||||
const EC_GROUP* group = NULL;
|
||||
const EC_POINT* src_pub = NULL;
|
||||
const EC_POINT* dst_pub = NULL;
|
||||
unsigned char buf[1 + 2 * 32];
|
||||
size_t enc_len = 0;
|
||||
|
||||
ExpectNotNull(src = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
|
||||
ExpectIntEQ(EC_KEY_generate_key(src), 1);
|
||||
ExpectNotNull(group = EC_KEY_get0_group(src));
|
||||
ExpectNotNull(src_pub = EC_KEY_get0_public_key(src));
|
||||
|
||||
enc_len = EC_POINT_point2oct(group, src_pub,
|
||||
POINT_CONVERSION_UNCOMPRESSED, buf, sizeof(buf), NULL);
|
||||
ExpectIntEQ((int)enc_len, (int)sizeof(buf));
|
||||
|
||||
ExpectNotNull(dst = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
|
||||
|
||||
ExpectIntEQ(EC_KEY_oct2key(NULL, buf, enc_len, NULL), 0);
|
||||
ExpectIntEQ(EC_KEY_oct2key(dst, NULL, enc_len, NULL), 0);
|
||||
ExpectIntEQ(EC_KEY_oct2key(dst, buf, 0, NULL), 0);
|
||||
|
||||
ExpectIntEQ(EC_KEY_oct2key(dst, buf, enc_len, NULL), 1);
|
||||
|
||||
ExpectNotNull(dst_pub = EC_KEY_get0_public_key(dst));
|
||||
ExpectIntEQ(EC_POINT_cmp(group, src_pub, dst_pub, NULL), 0);
|
||||
|
||||
EC_KEY_free(dst);
|
||||
EC_KEY_free(src);
|
||||
#endif
|
||||
return EXPECT_RESULT();
|
||||
}
|
||||
|
||||
static int test_wolfSSL_d2i_and_i2d_DSAparams(void)
|
||||
{
|
||||
EXPECT_DECLS;
|
||||
@@ -43694,6 +43835,7 @@ TEST_CASE testCases[] = {
|
||||
TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey),
|
||||
TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey_ecc),
|
||||
TEST_DECL(test_wolfSSL_d2i_and_i2d_PUBKEY_mldsa),
|
||||
TEST_DECL(test_wolfSSL_EC_KEY_oct2key),
|
||||
#ifndef NO_BIO
|
||||
TEST_DECL(test_wolfSSL_d2i_PUBKEY),
|
||||
TEST_DECL(test_wolfSSL_i2d_PUBKEY_bio),
|
||||
@@ -43761,6 +43903,7 @@ TEST_CASE testCases[] = {
|
||||
TEST_DECL(test_wolfSSL_X509_ALGOR_get0),
|
||||
TEST_DECL(test_wolfSSL_X509_SEP),
|
||||
TEST_DECL(test_wolfSSL_X509_set_extensions),
|
||||
TEST_DECL(test_wolfSSL_X509_add1_ext_i2d),
|
||||
TEST_DECL(test_wolfSSL_X509_set_authority_key_id_roundtrip),
|
||||
TEST_DECL(test_wolfSSL_X509_set_authority_key_id_ex_roundtrip),
|
||||
TEST_DECL(test_wolfSSL_X509_set_authority_key_id_overwrite),
|
||||
@@ -43854,6 +43997,7 @@ TEST_CASE testCases[] = {
|
||||
/* Can't memory test as tcp_connect aborts. */
|
||||
TEST_DECL(test_wolfSSL_d2i_SSL_SESSION_bounds_check),
|
||||
TEST_DECL(test_wolfSSL_sk_GENERAL_NAME),
|
||||
TEST_DECL(test_wolfSSL_sk_GENERAL_NAME_new_null),
|
||||
TEST_DECL(test_wolfSSL_GENERAL_NAME_print),
|
||||
TEST_DECL(test_wolfSSL_sk_DIST_POINT),
|
||||
TEST_DECL(test_wolfSSL_verify_mode),
|
||||
@@ -44031,6 +44175,7 @@ TEST_CASE testCases[] = {
|
||||
TEST_DECL(test_wolfSSL_set_cipher_list_exclusions),
|
||||
TEST_DECL(test_tls13_null_cipher_default_list),
|
||||
TEST_DECL(test_tls13_null_cipher_explicit_keep),
|
||||
TEST_DECL(test_wolfSSL_SSL_set_ciphersuites),
|
||||
TEST_DECL(test_wolfSSL_set_alpn_protos_default_fails),
|
||||
TEST_DECL(test_wolfSSL_set_alpn_protos_binary_safe),
|
||||
TEST_DECL(test_wolfSSL_CTX_use_certificate),
|
||||
|
||||
@@ -295,6 +295,9 @@ void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag);
|
||||
WOLFSSL_API
|
||||
int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
|
||||
const WOLFSSL_EC_POINT *pub);
|
||||
WOLFSSL_API
|
||||
int wolfSSL_EC_KEY_oct2key(WOLFSSL_EC_KEY *key, const unsigned char *buf,
|
||||
size_t len, WOLFSSL_BN_CTX *ctx);
|
||||
WOLFSSL_API int wolfSSL_EC_KEY_check_key(const WOLFSSL_EC_KEY *key);
|
||||
#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
|
||||
WOLFSSL_API int wolfSSL_EC_KEY_print_fp(XFILE fp, WOLFSSL_EC_KEY* key,
|
||||
@@ -491,6 +494,7 @@ typedef WOLFSSL_EC_KEY_METHOD EC_KEY_METHOD;
|
||||
#define ECPoint_d2i wolfSSL_ECPoint_d2i
|
||||
#define EC_POINT_point2oct wolfSSL_EC_POINT_point2oct
|
||||
#define EC_POINT_oct2point wolfSSL_EC_POINT_oct2point
|
||||
#define EC_KEY_oct2key wolfSSL_EC_KEY_oct2key
|
||||
#define EC_POINT_point2bn wolfSSL_EC_POINT_point2bn
|
||||
#define EC_POINT_is_on_curve wolfSSL_EC_POINT_is_on_curve
|
||||
#define o2i_ECPublicKey wolfSSL_o2i_ECPublicKey
|
||||
|
||||
@@ -410,6 +410,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
|
||||
#define SSL_CTX_set_cipher_list wolfSSL_CTX_set_cipher_list
|
||||
#define SSL_CTX_set_ciphersuites wolfSSL_CTX_set_cipher_list
|
||||
#define SSL_set_cipher_list wolfSSL_set_cipher_list
|
||||
#define SSL_set_ciphersuites wolfSSL_set_cipher_list
|
||||
/* wolfSSL does not support security levels */
|
||||
#define SSL_CTX_set_security_level wolfSSL_CTX_set_security_level
|
||||
#define SSL_CTX_get_security_level wolfSSL_CTX_get_security_level
|
||||
@@ -651,6 +652,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
|
||||
#define X509_check_issued wolfSSL_X509_check_issued
|
||||
#define X509_dup wolfSSL_X509_dup
|
||||
#define X509_add_ext wolfSSL_X509_add_ext
|
||||
#define X509_add1_ext_i2d wolfSSL_X509_add1_ext_i2d
|
||||
#define X509_delete_ext wolfSSL_X509_delete_ext
|
||||
#define X509_get0_subject_key_id wolfSSL_X509_get0_subject_key_id
|
||||
|
||||
@@ -1667,6 +1669,7 @@ typedef WOLFSSL_SRTP_PROTECTION_PROFILE SRTP_PROTECTION_PROFILE;
|
||||
#define SSL_SESSION_print wolfSSL_SESSION_print
|
||||
#define sk_GENERAL_NAME_pop_free wolfSSL_sk_GENERAL_NAME_pop_free
|
||||
#define sk_GENERAL_NAME_new wolfSSL_sk_GENERAL_NAME_new
|
||||
#define sk_GENERAL_NAME_new_null() wolfSSL_sk_GENERAL_NAME_new(NULL)
|
||||
#define sk_GENERAL_NAME_free wolfSSL_sk_GENERAL_NAME_free
|
||||
#define sk_ASN1_OBJECT_pop_free wolfSSL_sk_ASN1_OBJECT_pop_free
|
||||
#define GENERAL_NAME_free wolfSSL_GENERAL_NAME_free
|
||||
|
||||
@@ -5493,6 +5493,9 @@ WOLFSSL_API int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509 *x, int nid, int
|
||||
WOLFSSL_API int wolfSSL_X509_add_ext(WOLFSSL_X509 *x, WOLFSSL_X509_EXTENSION *ex, int loc);
|
||||
WOLFSSL_API WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
|
||||
void *data);
|
||||
WOLFSSL_API int wolfSSL_X509_add1_ext_i2d(WOLFSSL_X509 *x, int nid,
|
||||
void *value, int crit,
|
||||
unsigned long flags);
|
||||
WOLFSSL_API WOLFSSL_X509_EXTENSION *wolfSSL_X509_delete_ext(WOLFSSL_X509 *x509, int loc);
|
||||
WOLFSSL_API WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
|
||||
WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
|
||||
|
||||
Reference in New Issue
Block a user