Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

swh:1:snp:dc2a5002442a00b1c0eda7c65d04ea7455e166cd
  • Code
  • Branches (204)
  • Releases (207)
    • Branches
    • Releases
    • HEAD
    • refs/heads/OpenSSL-engine-0_9_6-stable
    • refs/heads/OpenSSL-fips-0_9_7-stable
    • refs/heads/OpenSSL-fips-0_9_8-stable
    • refs/heads/OpenSSL-fips-1_2-stable
    • refs/heads/OpenSSL-fips-2_0-dev
    • refs/heads/OpenSSL-fips-2_0-stable
    • refs/heads/OpenSSL-fips2-0_9_7-stable
    • refs/heads/OpenSSL_0_9_6-stable
    • refs/heads/OpenSSL_0_9_7-stable
    • refs/heads/OpenSSL_0_9_8-stable
    • refs/heads/OpenSSL_0_9_8fg-stable
    • refs/heads/OpenSSL_1_0_0-stable
    • refs/heads/OpenSSL_1_0_1-stable
    • refs/heads/OpenSSL_1_0_2-stable
    • refs/heads/OpenSSL_1_1_0-stable
    • refs/heads/OpenSSL_1_1_1-stable
    • refs/heads/SSLeay
    • refs/heads/feature/dtls-1.3
    • refs/heads/feature/ech
    • refs/heads/feature/quic-server
    • refs/heads/master
    • refs/heads/openssl-3.0
    • refs/heads/openssl-3.1
    • refs/heads/openssl-3.2
    • refs/heads/openssl-3.3
    • refs/heads/openssl-3.4
    • refs/heads/tls1.3-draft-18
    • refs/heads/tls1.3-draft-19
    • refs/tags/AFTER_COMPAQ_PATCH
    • refs/tags/BEFORE_COMPAQ_PATCH
    • refs/tags/BEFORE_engine
    • refs/tags/BEN_FIPS_TEST_1
    • refs/tags/BEN_FIPS_TEST_2
    • refs/tags/BEN_FIPS_TEST_3
    • refs/tags/BEN_FIPS_TEST_4
    • refs/tags/BEN_FIPS_TEST_5
    • refs/tags/BEN_FIPS_TEST_6
    • refs/tags/BEN_FIPS_TEST_7
    • refs/tags/BEN_FIPS_TEST_8
    • refs/tags/FIPS_098_TEST_1
    • refs/tags/FIPS_098_TEST_2
    • refs/tags/FIPS_098_TEST_3
    • refs/tags/FIPS_098_TEST_4
    • refs/tags/FIPS_098_TEST_5
    • refs/tags/FIPS_098_TEST_6
    • refs/tags/FIPS_098_TEST_7
    • refs/tags/FIPS_098_TEST_8
    • refs/tags/FIPS_TEST_10
    • refs/tags/FIPS_TEST_9
    • refs/tags/LEVITTE_after_const
    • refs/tags/LEVITTE_before_const
    • refs/tags/OpenSSL-engine-0_9_6
    • refs/tags/OpenSSL-engine-0_9_6-beta1
    • refs/tags/OpenSSL-engine-0_9_6-beta2
    • refs/tags/OpenSSL-engine-0_9_6-beta3
    • refs/tags/OpenSSL-engine-0_9_6a
    • refs/tags/OpenSSL-engine-0_9_6a-beta1
    • refs/tags/OpenSSL-engine-0_9_6a-beta2
    • refs/tags/OpenSSL-engine-0_9_6a-beta3
    • refs/tags/OpenSSL-engine-0_9_6b
    • refs/tags/OpenSSL-engine-0_9_6c
    • refs/tags/OpenSSL-engine-0_9_6d
    • refs/tags/OpenSSL-engine-0_9_6d-beta1
    • refs/tags/OpenSSL-engine-0_9_6e
    • refs/tags/OpenSSL-engine-0_9_6f
    • refs/tags/OpenSSL-engine-0_9_6g
    • refs/tags/OpenSSL-engine-0_9_6h
    • refs/tags/OpenSSL-engine-0_9_6i
    • refs/tags/OpenSSL-engine-0_9_6j
    • refs/tags/OpenSSL-engine-0_9_6k
    • refs/tags/OpenSSL-engine-0_9_6l
    • refs/tags/OpenSSL-engine-0_9_6m
    • refs/tags/OpenSSL-fips-1_2_0
    • refs/tags/OpenSSL-fips-1_2_1
    • refs/tags/OpenSSL-fips-1_2_2
    • refs/tags/OpenSSL-fips-1_2_3
    • refs/tags/OpenSSL-fips-2_0
    • refs/tags/OpenSSL-fips-2_0-pl1
    • refs/tags/OpenSSL-fips-2_0-rc1
    • refs/tags/OpenSSL-fips-2_0-rc2
    • refs/tags/OpenSSL-fips-2_0-rc3
    • refs/tags/OpenSSL-fips-2_0-rc4
    • refs/tags/OpenSSL-fips-2_0-rc5
    • refs/tags/OpenSSL-fips-2_0-rc6
    • refs/tags/OpenSSL-fips-2_0-rc7
    • refs/tags/OpenSSL-fips-2_0-rc8
    • refs/tags/OpenSSL-fips-2_0-rc9
    • refs/tags/OpenSSL-fips-2_0_1
    • refs/tags/OpenSSL_0_9_1c
    • refs/tags/OpenSSL_0_9_2b
    • refs/tags/OpenSSL_0_9_3
    • refs/tags/OpenSSL_0_9_3a
    • refs/tags/OpenSSL_0_9_3beta1
    • refs/tags/OpenSSL_0_9_3beta2
    • refs/tags/OpenSSL_0_9_4
    • refs/tags/OpenSSL_0_9_5
    • refs/tags/OpenSSL_0_9_5a
    • refs/tags/OpenSSL_0_9_5a-beta1
    • refs/tags/OpenSSL_0_9_5a-beta2
    • refs/tags/OpenSSL_0_9_5beta1
    • refs/tags/OpenSSL_0_9_5beta2
    • refs/tags/OpenSSL_0_9_6
    • refs/tags/OpenSSL_0_9_6-beta1
    • refs/tags/OpenSSL_0_9_6-beta2
    • refs/tags/OpenSSL_0_9_6-beta3
    • refs/tags/OpenSSL_0_9_6a
    • refs/tags/OpenSSL_0_9_6a-beta1
    • refs/tags/OpenSSL_0_9_6a-beta2
    • refs/tags/OpenSSL_0_9_6a-beta3
    • refs/tags/OpenSSL_0_9_6b
    • refs/tags/OpenSSL_0_9_6c
    • refs/tags/OpenSSL_0_9_6d
    • refs/tags/OpenSSL_0_9_6d-beta1
    • refs/tags/OpenSSL_0_9_6e
    • refs/tags/OpenSSL_0_9_6f
    • refs/tags/OpenSSL_0_9_6g
    • refs/tags/OpenSSL_0_9_6h
    • refs/tags/OpenSSL_0_9_6i
    • refs/tags/OpenSSL_0_9_6j
    • refs/tags/OpenSSL_0_9_6k
    • refs/tags/OpenSSL_0_9_6l
    • refs/tags/OpenSSL_0_9_6m
    • refs/tags/OpenSSL_0_9_7
    • refs/tags/OpenSSL_0_9_7-beta1
    • refs/tags/OpenSSL_0_9_7-beta2
    • refs/tags/OpenSSL_0_9_7-beta3
    • refs/tags/OpenSSL_0_9_7-beta4
    • refs/tags/OpenSSL_0_9_7-beta5
    • refs/tags/OpenSSL_0_9_7-beta6
    • refs/tags/OpenSSL_0_9_7a
    • refs/tags/OpenSSL_0_9_7b
    • refs/tags/OpenSSL_0_9_7c
    • refs/tags/OpenSSL_0_9_7d
    • refs/tags/OpenSSL_0_9_7e
    • refs/tags/OpenSSL_0_9_7f
    • refs/tags/OpenSSL_0_9_7g
    • refs/tags/OpenSSL_0_9_7h
    • refs/tags/OpenSSL_0_9_7i
    • refs/tags/OpenSSL_0_9_7j
    • refs/tags/OpenSSL_0_9_7k
    • refs/tags/OpenSSL_0_9_7l
    • refs/tags/OpenSSL_0_9_7m
    • refs/tags/OpenSSL_0_9_8
    • refs/tags/OpenSSL_0_9_8-beta1
    • refs/tags/OpenSSL_0_9_8-beta2
    • refs/tags/OpenSSL_0_9_8-beta3
    • refs/tags/OpenSSL_0_9_8-beta4
    • refs/tags/OpenSSL_0_9_8-beta5
    • refs/tags/OpenSSL_0_9_8-beta6
    • refs/tags/OpenSSL_0_9_8a
    • refs/tags/OpenSSL_0_9_8b
    • refs/tags/OpenSSL_0_9_8c
    • refs/tags/OpenSSL_0_9_8d
    • refs/tags/OpenSSL_0_9_8e
    • refs/tags/OpenSSL_0_9_8f
    • refs/tags/OpenSSL_0_9_8g
    • refs/tags/OpenSSL_0_9_8h
    • refs/tags/OpenSSL_0_9_8i
    • refs/tags/OpenSSL_0_9_8j
    • refs/tags/OpenSSL_0_9_8k
    • refs/tags/OpenSSL_0_9_8l
    • refs/tags/OpenSSL_0_9_8m
    • refs/tags/OpenSSL_0_9_8m-beta1
    • refs/tags/OpenSSL_0_9_8n
    • refs/tags/OpenSSL_0_9_8o
    • refs/tags/OpenSSL_0_9_8p
    • refs/tags/OpenSSL_0_9_8q
    • refs/tags/OpenSSL_0_9_8r
    • refs/tags/OpenSSL_0_9_8s
    • refs/tags/OpenSSL_0_9_8t
    • refs/tags/OpenSSL_0_9_8u
    • refs/tags/OpenSSL_0_9_8v
    • refs/tags/OpenSSL_0_9_8w
    • refs/tags/OpenSSL_0_9_8x
    • refs/tags/OpenSSL_1_0_0
    • refs/tags/OpenSSL_1_0_0-beta1
    • refs/tags/OpenSSL_1_0_0-beta2
    • refs/tags/OpenSSL_1_0_0-beta3
    • refs/tags/OpenSSL_1_0_0-beta4
    • refs/tags/OpenSSL_1_0_0-beta5
    • refs/tags/OpenSSL_1_0_0a
    • refs/tags/OpenSSL_1_0_0b
    • refs/tags/OpenSSL_1_0_0c
    • refs/tags/OpenSSL_1_0_0d
    • refs/tags/OpenSSL_1_0_0e
    • refs/tags/OpenSSL_1_0_0f
    • refs/tags/OpenSSL_1_0_0g
    • refs/tags/OpenSSL_1_0_0h
    • refs/tags/OpenSSL_1_0_0i
    • refs/tags/OpenSSL_1_0_0j
    • refs/tags/OpenSSL_1_0_1
    • refs/tags/OpenSSL_1_0_1-beta1
    • refs/tags/OpenSSL_1_0_1-beta2
    • refs/tags/OpenSSL_1_0_1-beta3
    • refs/tags/OpenSSL_1_0_1a
    • refs/tags/OpenSSL_1_0_1b
    • refs/tags/OpenSSL_1_0_1c
    • refs/tags/OpenSSL_FIPS_1_0
    • refs/tags/SSLeay_0_8_1b
    • refs/tags/SSLeay_0_9_0b
    • refs/tags/SSLeay_0_9_1b
    • refs/tags/STATE_after_zlib
    • refs/tags/STATE_before_zlib
    • refs/tags/rsaref
    • openssl-3.4.0-alpha1
    • openssl-3.3.2
    • openssl-3.3.1
    • openssl-3.3.0-beta1
    • openssl-3.3.0-alpha1
    • openssl-3.3.0
    • openssl-3.2.3
    • openssl-3.2.2
    • openssl-3.2.1
    • openssl-3.2.0-beta1
    • openssl-3.2.0-alpha2
    • openssl-3.2.0-alpha1
    • openssl-3.2.0
    • openssl-3.1.7
    • openssl-3.1.6
    • openssl-3.1.5
    • openssl-3.1.4
    • openssl-3.1.3
    • openssl-3.1.2
    • openssl-3.1.1
    • openssl-3.1.0-beta1
    • openssl-3.1.0-alpha1
    • openssl-3.1.0
    • openssl-3.0.9
    • openssl-3.0.8
    • openssl-3.0.7
    • openssl-3.0.6
    • openssl-3.0.5
    • openssl-3.0.4
    • openssl-3.0.3
    • openssl-3.0.2
    • openssl-3.0.15
    • openssl-3.0.14
    • openssl-3.0.13
    • openssl-3.0.12
    • openssl-3.0.11
    • openssl-3.0.10
    • openssl-3.0.1
    • openssl-3.0.0-beta2
    • openssl-3.0.0-beta1
    • openssl-3.0.0-alpha9
    • openssl-3.0.0-alpha8
    • openssl-3.0.0-alpha7
    • openssl-3.0.0-alpha6
    • openssl-3.0.0-alpha5
    • openssl-3.0.0-alpha4
    • openssl-3.0.0-alpha3
    • openssl-3.0.0-alpha2
    • openssl-3.0.0-alpha17
    • openssl-3.0.0-alpha16
    • openssl-3.0.0-alpha15
    • openssl-3.0.0-alpha14
    • openssl-3.0.0-alpha13
    • openssl-3.0.0-alpha12
    • openssl-3.0.0-alpha11
    • openssl-3.0.0-alpha10
    • openssl-3.0.0-alpha1
    • openssl-3.0.0
    • master-pre-reformat
    • master-pre-auto-reformat
    • master-post-reformat
    • master-post-auto-reformat
    • OpenSSL_1_1_1w
    • OpenSSL_1_1_1v
    • OpenSSL_1_1_1u
    • OpenSSL_1_1_1t
    • OpenSSL_1_1_1s
    • OpenSSL_1_1_1r
    • OpenSSL_1_1_1q
    • OpenSSL_1_1_1p
    • OpenSSL_1_1_1o
    • OpenSSL_1_1_1n
    • OpenSSL_1_1_1m
    • OpenSSL_1_1_1l
    • OpenSSL_1_1_1k
    • OpenSSL_1_1_1j
    • OpenSSL_1_1_1i
    • OpenSSL_1_1_1h
    • OpenSSL_1_1_1g
    • OpenSSL_1_1_1f
    • OpenSSL_1_1_1e
    • OpenSSL_1_1_1d
    • OpenSSL_1_1_1c
    • OpenSSL_1_1_1b
    • OpenSSL_1_1_1a
    • OpenSSL_1_1_1-pre9
    • OpenSSL_1_1_1-pre8
    • OpenSSL_1_1_1-pre7
    • OpenSSL_1_1_1-pre6
    • OpenSSL_1_1_1-pre5
    • OpenSSL_1_1_1-pre4
    • OpenSSL_1_1_1-pre3
    • OpenSSL_1_1_1-pre2
    • OpenSSL_1_1_1-pre1
    • OpenSSL_1_1_1
    • OpenSSL_1_1_0l
    • OpenSSL_1_1_0k
    • OpenSSL_1_1_0j
    • OpenSSL_1_1_0i
    • OpenSSL_1_1_0h
    • OpenSSL_1_1_0g
    • OpenSSL_1_1_0f
    • OpenSSL_1_1_0e
    • OpenSSL_1_1_0d
    • OpenSSL_1_1_0c
    • OpenSSL_1_1_0b
    • OpenSSL_1_1_0a
    • OpenSSL_1_1_0-pre6
    • OpenSSL_1_1_0-pre5
    • OpenSSL_1_1_0-pre4
    • OpenSSL_1_1_0-pre3
    • OpenSSL_1_1_0-pre2
    • OpenSSL_1_1_0-pre1
    • OpenSSL_1_1_0
    • OpenSSL_1_0_2u
    • OpenSSL_1_0_2t
    • OpenSSL_1_0_2s
    • OpenSSL_1_0_2r
    • OpenSSL_1_0_2q
    • OpenSSL_1_0_2p
    • OpenSSL_1_0_2o
    • OpenSSL_1_0_2n
    • OpenSSL_1_0_2m
    • OpenSSL_1_0_2l
    • OpenSSL_1_0_2k
    • OpenSSL_1_0_2j
    • OpenSSL_1_0_2i
    • OpenSSL_1_0_2h
    • OpenSSL_1_0_2g
    • OpenSSL_1_0_2f
    • OpenSSL_1_0_2e
    • OpenSSL_1_0_2d
    • OpenSSL_1_0_2c
    • OpenSSL_1_0_2b
    • OpenSSL_1_0_2a
    • OpenSSL_1_0_2-pre-reformat
    • OpenSSL_1_0_2-pre-auto-reformat
    • OpenSSL_1_0_2-post-reformat
    • OpenSSL_1_0_2-post-auto-reformat
    • OpenSSL_1_0_2-beta3
    • OpenSSL_1_0_2-beta2
    • OpenSSL_1_0_2-beta1
    • OpenSSL_1_0_2
    • OpenSSL_1_0_1u
    • OpenSSL_1_0_1t
    • OpenSSL_1_0_1s
    • OpenSSL_1_0_1r
    • OpenSSL_1_0_1q
    • OpenSSL_1_0_1p
    • OpenSSL_1_0_1o
    • OpenSSL_1_0_1n
    • OpenSSL_1_0_1m
    • OpenSSL_1_0_1l
    • OpenSSL_1_0_1k
    • OpenSSL_1_0_1j
    • OpenSSL_1_0_1i
    • OpenSSL_1_0_1h
    • OpenSSL_1_0_1g
    • OpenSSL_1_0_1f
    • OpenSSL_1_0_1e
    • OpenSSL_1_0_1d
    • OpenSSL_1_0_1-pre-reformat
    • OpenSSL_1_0_1-pre-auto-reformat
    • OpenSSL_1_0_1-post-reformat
    • OpenSSL_1_0_1-post-auto-reformat
    • OpenSSL_1_0_0t
    • OpenSSL_1_0_0s
    • OpenSSL_1_0_0r
    • OpenSSL_1_0_0q
    • OpenSSL_1_0_0p
    • OpenSSL_1_0_0o
    • OpenSSL_1_0_0n
    • OpenSSL_1_0_0m
    • OpenSSL_1_0_0l
    • OpenSSL_1_0_0k
    • OpenSSL_1_0_0-pre-reformat
    • OpenSSL_1_0_0-pre-auto-reformat
    • OpenSSL_1_0_0-post-reformat
    • OpenSSL_1_0_0-post-auto-reformat
    • OpenSSL_0_9_8zh
    • OpenSSL_0_9_8zg
    • OpenSSL_0_9_8zf
    • OpenSSL_0_9_8ze
    • OpenSSL_0_9_8zd
    • OpenSSL_0_9_8zc
    • OpenSSL_0_9_8zb
    • OpenSSL_0_9_8za
    • OpenSSL_0_9_8y
    • OpenSSL_0_9_8-pre-reformat
    • OpenSSL_0_9_8-pre-auto-reformat
    • OpenSSL_0_9_8-post-reformat
    • OpenSSL_0_9_8-post-auto-reformat
    • OpenSSL-fips-2_0_9
    • OpenSSL-fips-2_0_8
    • OpenSSL-fips-2_0_7
    • OpenSSL-fips-2_0_6
    • OpenSSL-fips-2_0_5
    • OpenSSL-fips-2_0_4
    • OpenSSL-fips-2_0_3
    • OpenSSL-fips-2_0_2
    • OpenSSL-fips-2_0_16
    • OpenSSL-fips-2_0_15
    • OpenSSL-fips-2_0_14
    • OpenSSL-fips-2_0_13
    • OpenSSL-fips-2_0_12
    • OpenSSL-fips-2_0_11
    • OpenSSL-fips-2_0_10
  • 237708f
  • /
  • test
  • /
  • endecoder_legacy_test.c
Raw File
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
  • revision
  • snapshot
content badge Iframe embedding
swh:1:cnt:943cba56e59f5b2a79eb75582a62b791a9fc858f
directory badge Iframe embedding
swh:1:dir:4c95b39b8f15e05632f0b4a669285bddfe82abef
revision badge
swh:1:rev:e88dfd5ee50f9d934edd966369339ee5573c67d4
snapshot badge
swh:1:snp:dc2a5002442a00b1c0eda7c65d04ea7455e166cd
Tip revision: e88dfd5ee50f9d934edd966369339ee5573c67d4 authored by erbsland-dev on 10 September 2024, 19:24:59 UTC
Add Missing Error Messages for AES-OCB Tag Length Validation
Tip revision: e88dfd5
endecoder_legacy_test.c
/*
 * Copyright 2020-2021 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
 */

/*
 * This program tests the following known key type specific function against
 * the corresponding OSSL_ENCODER implementation:
 *
 * - i2d_{TYPE}PrivateKey()
 * - i2d_{TYPE}PublicKey(),
 * - i2d_{TYPE}params(),
 * - i2d_{TYPE}_PUBKEY(),
 * - PEM_write_bio_{TYPE}PrivateKey()
 * - PEM_write_bio_{TYPE}PublicKey()
 * - PEM_write_bio_{TYPE}params()
 * - PEM_write_bio_{TYPE}_PUBKEY()
 *
 * as well as the following functions against the corresponding OSSL_DECODER
 * implementation.
 *
 * - d2i_{TYPE}PrivateKey()
 * - d2i_{TYPE}PublicKey(),
 * - d2i_{TYPE}params(),
 * - d2i_{TYPE}_PUBKEY(),
 * - PEM_read_bio_{TYPE}PrivateKey()
 * - PEM_read_bio_{TYPE}PublicKey()
 * - PEM_read_bio_{TYPE}params()
 * - PEM_read_bio_{TYPE}_PUBKEY()
 */

#include <stdlib.h>
#include <string.h>

/*
 * We test deprecated functions, so we need to suppress deprecation warnings.
 */
#define OPENSSL_SUPPRESS_DEPRECATED

#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/asn1.h>
#include <openssl/pem.h>
#include <openssl/params.h>
#include <openssl/encoder.h>
#include <openssl/decoder.h>
#include <openssl/dh.h>
#include <openssl/dsa.h>
#ifndef OPENSSL_NO_DEPRECATED_3_0
# include <openssl/rsa.h>
#endif
#include "internal/nelem.h"
#include "crypto/evp.h"

#include "testutil.h"

typedef int PEM_write_bio_of_void_protected(BIO *out, const void *obj,
                                            const EVP_CIPHER *enc,
                                            unsigned char *kstr, int klen,
                                            pem_password_cb *cb, void *u);
typedef int PEM_write_bio_of_void_unprotected(BIO *out, const void *obj);
typedef void *PEM_read_bio_of_void(BIO *out, void **obj,
                                   pem_password_cb *cb, void *u);
typedef int EVP_PKEY_print_fn(BIO *out, const EVP_PKEY *pkey,
                              int indent, ASN1_PCTX *pctx);
typedef int EVP_PKEY_eq_fn(const EVP_PKEY *a, const EVP_PKEY *b);

static struct test_stanza_st {
    const char *keytype;
    const char *structure[2];
    int evp_type;

    i2d_of_void *i2d_PrivateKey;
    i2d_of_void *i2d_PublicKey;
    i2d_of_void *i2d_params;
    i2d_of_void *i2d_PUBKEY;
    PEM_write_bio_of_void_protected *pem_write_bio_PrivateKey;
    PEM_write_bio_of_void_unprotected *pem_write_bio_PublicKey;
    PEM_write_bio_of_void_unprotected *pem_write_bio_params;
    PEM_write_bio_of_void_unprotected *pem_write_bio_PUBKEY;

    d2i_of_void *d2i_PrivateKey;
    d2i_of_void *d2i_PublicKey;
    d2i_of_void *d2i_params;
    d2i_of_void *d2i_PUBKEY;
    PEM_read_bio_of_void *pem_read_bio_PrivateKey;
    PEM_read_bio_of_void *pem_read_bio_PublicKey;
    PEM_read_bio_of_void *pem_read_bio_params;
    PEM_read_bio_of_void *pem_read_bio_PUBKEY;
} test_stanzas[] = {
#ifndef OPENSSL_NO_DH
    { "DH", { "DH", "type-specific" }, EVP_PKEY_DH,
      NULL,                      /* No i2d_DHPrivateKey */
      NULL,                      /* No i2d_DHPublicKey */
      (i2d_of_void *)i2d_DHparams,
      NULL,                      /* No i2d_DH_PUBKEY */
      NULL,                      /* No PEM_write_bio_DHPrivateKey */
      NULL,                      /* No PEM_write_bio_DHPublicKey */
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_DHparams,
      NULL,                      /* No PEM_write_bio_DH_PUBKEY */
      NULL,                      /* No d2i_DHPrivateKey */
      NULL,                      /* No d2i_DHPublicKey */
      (d2i_of_void *)d2i_DHparams,
      NULL,                      /* No d2i_DH_PUBKEY */
      NULL,                      /* No PEM_read_bio_DHPrivateKey */
      NULL,                      /* No PEM_read_bio_DHPublicKey */
      (PEM_read_bio_of_void *)PEM_read_bio_DHparams,
      NULL },                    /* No PEM_read_bio_DH_PUBKEY */
    { "DHX", { "DHX", "type-specific" }, EVP_PKEY_DHX,
      NULL,                      /* No i2d_DHxPrivateKey */
      NULL,                      /* No i2d_DHxPublicKey */
      (i2d_of_void *)i2d_DHxparams,
      NULL,                      /* No i2d_DHx_PUBKEY */
      NULL,                      /* No PEM_write_bio_DHxPrivateKey */
      NULL,                      /* No PEM_write_bio_DHxPublicKey */
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_DHxparams,
      NULL,                      /* No PEM_write_bio_DHx_PUBKEY */
      NULL,                      /* No d2i_DHxPrivateKey */
      NULL,                      /* No d2i_DHxPublicKey */
      (d2i_of_void *)d2i_DHxparams,
      NULL,                      /* No d2i_DHx_PUBKEY */
      NULL,                      /* No PEM_read_bio_DHxPrivateKey */
      NULL,                      /* No PEM_read_bio_DHxPublicKey */
      NULL,                      /* No PEM_read_bio_DHxparams */
      NULL },                    /* No PEM_read_bio_DHx_PUBKEY */
#endif
#ifndef OPENSSL_NO_DSA
    { "DSA", { "DSA", "type-specific" }, EVP_PKEY_DSA,
      (i2d_of_void *)i2d_DSAPrivateKey,
      (i2d_of_void *)i2d_DSAPublicKey,
      (i2d_of_void *)i2d_DSAparams,
      (i2d_of_void *)i2d_DSA_PUBKEY,
      (PEM_write_bio_of_void_protected *)PEM_write_bio_DSAPrivateKey,
      NULL,                      /* No PEM_write_bio_DSAPublicKey */
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_DSAparams,
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_DSA_PUBKEY,
      (d2i_of_void *)d2i_DSAPrivateKey,
      (d2i_of_void *)d2i_DSAPublicKey,
      (d2i_of_void *)d2i_DSAparams,
      (d2i_of_void *)d2i_DSA_PUBKEY,
      (PEM_read_bio_of_void *)PEM_read_bio_DSAPrivateKey,
      NULL,                      /* No PEM_write_bio_DSAPublicKey */
      (PEM_read_bio_of_void *)PEM_read_bio_DSAparams,
      (PEM_read_bio_of_void *)PEM_read_bio_DSA_PUBKEY },
#endif
#ifndef OPENSSL_NO_EC
    { "EC", { "EC", "type-specific" }, EVP_PKEY_EC,
      (i2d_of_void *)i2d_ECPrivateKey,
      NULL,                      /* No i2d_ECPublicKey */
      (i2d_of_void *)i2d_ECParameters,
      (i2d_of_void *)i2d_EC_PUBKEY,
      (PEM_write_bio_of_void_protected *)PEM_write_bio_ECPrivateKey,
      NULL,                      /* No PEM_write_bio_ECPublicKey */
      NULL,                      /* No PEM_write_bio_ECParameters */
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_EC_PUBKEY,
      (d2i_of_void *)d2i_ECPrivateKey,
      NULL,                      /* No d2i_ECPublicKey */
      (d2i_of_void *)d2i_ECParameters,
      (d2i_of_void *)d2i_EC_PUBKEY,
      (PEM_read_bio_of_void *)PEM_read_bio_ECPrivateKey,
      NULL,                      /* No PEM_read_bio_ECPublicKey */
      NULL,                      /* No PEM_read_bio_ECParameters */
      (PEM_read_bio_of_void *)PEM_read_bio_EC_PUBKEY, },
#endif
    { "RSA", { "RSA", "type-specific" }, EVP_PKEY_RSA,
      (i2d_of_void *)i2d_RSAPrivateKey,
      (i2d_of_void *)i2d_RSAPublicKey,
      NULL,                      /* No i2d_RSAparams */
      (i2d_of_void *)i2d_RSA_PUBKEY,
      (PEM_write_bio_of_void_protected *)PEM_write_bio_RSAPrivateKey,
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_RSAPublicKey,
      NULL,                      /* No PEM_write_bio_RSAparams */
      (PEM_write_bio_of_void_unprotected *)PEM_write_bio_RSA_PUBKEY,
      (d2i_of_void *)d2i_RSAPrivateKey,
      (d2i_of_void *)d2i_RSAPublicKey,
      NULL,                      /* No d2i_RSAparams */
      (d2i_of_void *)d2i_RSA_PUBKEY,
      (PEM_read_bio_of_void *)PEM_read_bio_RSAPrivateKey,
      (PEM_read_bio_of_void *)PEM_read_bio_RSAPublicKey,
      NULL,                      /* No PEM_read_bio_RSAparams */
      (PEM_read_bio_of_void *)PEM_read_bio_RSA_PUBKEY }
};

/*
 * Keys that we're going to test with.  We initialize this with the intended
 * key types, and generate the keys themselves on program setup.
 * They must all be downgradable with EVP_PKEY_get0()
 */

#ifndef OPENSSL_NO_DH
static const OSSL_PARAM DH_params[] = { OSSL_PARAM_END };
static const OSSL_PARAM DHX_params[] = { OSSL_PARAM_END };
#endif
#ifndef OPENSSL_NO_DSA
static size_t qbits = 160;  /* PVK only tolerates 160 Q bits */
static size_t pbits = 1024; /* With 160 Q bits, we MUST use 1024 P bits */
static const OSSL_PARAM DSA_params[] = {
    OSSL_PARAM_size_t("pbits", &pbits),
    OSSL_PARAM_size_t("qbits", &qbits),
    OSSL_PARAM_END
};
#endif
#ifndef OPENSSL_NO_EC
static char groupname[] = "prime256v1";
static const OSSL_PARAM EC_params[] = {
    OSSL_PARAM_utf8_string("group", groupname, sizeof(groupname) - 1),
    OSSL_PARAM_END
};
#endif

static struct key_st {
    const char *keytype;
    int evp_type;
    /* non-NULL if a template EVP_PKEY must be generated first */
    const OSSL_PARAM *template_params;

    EVP_PKEY *key;
} keys[] = {
#ifndef OPENSSL_NO_DH
    { "DH", EVP_PKEY_DH, DH_params, NULL },
    { "DHX", EVP_PKEY_DHX, DHX_params, NULL },
#endif
#ifndef OPENSSL_NO_DSA
    { "DSA", EVP_PKEY_DSA, DSA_params, NULL },
#endif
#ifndef OPENSSL_NO_EC
    { "EC", EVP_PKEY_EC, EC_params, NULL },
#endif
#ifndef OPENSSL_NO_DEPRECATED_3_0
    { "RSA", EVP_PKEY_RSA, NULL, NULL },
#endif
};

static EVP_PKEY *make_key(const char *type,
                          const OSSL_PARAM *gen_template_params)
{
    EVP_PKEY *template = NULL;
    EVP_PKEY *pkey = NULL;
    EVP_PKEY_CTX *ctx = NULL;
    OSSL_PARAM *gen_template_params_noconst =
        (OSSL_PARAM *)gen_template_params;

    if (gen_template_params != NULL
        && ((ctx = EVP_PKEY_CTX_new_from_name(NULL, type, NULL)) == NULL
            || EVP_PKEY_paramgen_init(ctx) <= 0
            || (gen_template_params[0].key != NULL
                && EVP_PKEY_CTX_set_params(ctx, gen_template_params_noconst) <= 0)
            || EVP_PKEY_generate(ctx, &template) <= 0))
        goto end;
    EVP_PKEY_CTX_free(ctx);

    /*
     * No real need to check the errors other than for the cascade
     * effect.  |pkey| will simply remain NULL if something goes wrong.
     */
    ctx =
        template != NULL
        ? EVP_PKEY_CTX_new(template, NULL)
        : EVP_PKEY_CTX_new_from_name(NULL, type, NULL);

    (void)(ctx != NULL
           && EVP_PKEY_keygen_init(ctx) > 0
           && EVP_PKEY_keygen(ctx, &pkey) > 0);

 end:
    EVP_PKEY_free(template);
    EVP_PKEY_CTX_free(ctx);
    return pkey;
}

static struct key_st *lookup_key(const char *type)
{
    size_t i;

    for (i = 0; i < OSSL_NELEM(keys); i++) {
        if (strcmp(keys[i].keytype, type) == 0)
            return &keys[i];
    }
    return NULL;
}

static int test_membio_str_eq(BIO *bio_provided, BIO *bio_legacy)
{
    char *str_provided = NULL, *str_legacy = NULL;
    long len_provided = BIO_get_mem_data(bio_provided, &str_provided);
    long len_legacy = BIO_get_mem_data(bio_legacy, &str_legacy);

    return TEST_long_ge(len_legacy, 0)
           && TEST_long_ge(len_provided, 0)
           && TEST_strn2_eq(str_provided, len_provided,
                            str_legacy, len_legacy);
}

static int test_protected_PEM(const char *keytype, int evp_type,
                              const void *legacy_key,
                              PEM_write_bio_of_void_protected *pem_write_bio,
                              PEM_read_bio_of_void *pem_read_bio,
                              EVP_PKEY_eq_fn *evp_pkey_eq,
                              EVP_PKEY_print_fn *evp_pkey_print,
                              EVP_PKEY *provided_pkey, int selection,
                              const char *structure)
{
    int ok = 0;
    BIO *membio_legacy = NULL;
    BIO *membio_provided = NULL;
    OSSL_ENCODER_CTX *ectx = NULL;
    OSSL_DECODER_CTX *dctx = NULL;
    void *decoded_legacy_key = NULL;
    EVP_PKEY *decoded_legacy_pkey = NULL;
    EVP_PKEY *decoded_provided_pkey = NULL;

    /* Set up the BIOs, so we have them */
    if (!TEST_ptr(membio_legacy = BIO_new(BIO_s_mem()))
        || !TEST_ptr(membio_provided = BIO_new(BIO_s_mem())))
        goto end;

    if (!TEST_ptr(ectx =
                  OSSL_ENCODER_CTX_new_for_pkey(provided_pkey, selection,
                                                "PEM", structure,
                                                NULL))
        || !TEST_true(OSSL_ENCODER_to_bio(ectx, membio_provided))
        || !TEST_true(pem_write_bio(membio_legacy, legacy_key,
                                   NULL, NULL, 0, NULL, NULL))
        || !test_membio_str_eq(membio_provided, membio_legacy))
        goto end;

    if (pem_read_bio != NULL) {
        /* Now try decoding the results and compare the resulting keys */

        if (!TEST_ptr(decoded_legacy_pkey = EVP_PKEY_new())
            || !TEST_ptr(dctx =
                         OSSL_DECODER_CTX_new_for_pkey(&decoded_provided_pkey,
                                                       "PEM", structure,
                                                       keytype, selection,
                                                       NULL, NULL))
            || !TEST_true(OSSL_DECODER_from_bio(dctx, membio_provided))
            || !TEST_ptr(decoded_legacy_key =
                         pem_read_bio(membio_legacy, NULL, NULL, NULL))
            || !TEST_true(EVP_PKEY_assign(decoded_legacy_pkey, evp_type,
                                          decoded_legacy_key)))
            goto end;

        if (!TEST_int_gt(evp_pkey_eq(decoded_provided_pkey,
                                     decoded_legacy_pkey), 0)) {
            TEST_info("decoded_provided_pkey:");
            evp_pkey_print(bio_out, decoded_provided_pkey, 0, NULL);
            TEST_info("decoded_legacy_pkey:");
            evp_pkey_print(bio_out, decoded_legacy_pkey, 0, NULL);
        }
    }
    ok = 1;
 end:
    EVP_PKEY_free(decoded_legacy_pkey);
    EVP_PKEY_free(decoded_provided_pkey);
    OSSL_ENCODER_CTX_free(ectx);
    OSSL_DECODER_CTX_free(dctx);
    BIO_free(membio_provided);
    BIO_free(membio_legacy);
    return ok;
}

static int test_unprotected_PEM(const char *keytype, int evp_type,
                                const void *legacy_key,
                                PEM_write_bio_of_void_unprotected *pem_write_bio,
                                PEM_read_bio_of_void *pem_read_bio,
                                EVP_PKEY_eq_fn *evp_pkey_eq,
                                EVP_PKEY_print_fn *evp_pkey_print,
                                EVP_PKEY *provided_pkey, int selection,
                                const char *structure)
{
    int ok = 0;
    BIO *membio_legacy = NULL;
    BIO *membio_provided = NULL;
    OSSL_ENCODER_CTX *ectx = NULL;
    OSSL_DECODER_CTX *dctx = NULL;
    void *decoded_legacy_key = NULL;
    EVP_PKEY *decoded_legacy_pkey = NULL;
    EVP_PKEY *decoded_provided_pkey = NULL;

    /* Set up the BIOs, so we have them */
    if (!TEST_ptr(membio_legacy = BIO_new(BIO_s_mem()))
        || !TEST_ptr(membio_provided = BIO_new(BIO_s_mem())))
        goto end;

    if (!TEST_ptr(ectx =
                  OSSL_ENCODER_CTX_new_for_pkey(provided_pkey, selection,
                                                "PEM", structure,
                                                NULL))
        || !TEST_true(OSSL_ENCODER_to_bio(ectx, membio_provided))
        || !TEST_true(pem_write_bio(membio_legacy, legacy_key))
        || !test_membio_str_eq(membio_provided, membio_legacy))
        goto end;

    if (pem_read_bio != NULL) {
        /* Now try decoding the results and compare the resulting keys */

        if (!TEST_ptr(decoded_legacy_pkey = EVP_PKEY_new())
            || !TEST_ptr(dctx =
                         OSSL_DECODER_CTX_new_for_pkey(&decoded_provided_pkey,
                                                       "PEM", structure,
                                                       keytype, selection,
                                                       NULL, NULL))
            || !TEST_true(OSSL_DECODER_from_bio(dctx, membio_provided))
            || !TEST_ptr(decoded_legacy_key =
                         pem_read_bio(membio_legacy, NULL, NULL, NULL))
            || !TEST_true(EVP_PKEY_assign(decoded_legacy_pkey, evp_type,
                                          decoded_legacy_key)))
            goto end;

        if (!TEST_int_gt(evp_pkey_eq(decoded_provided_pkey,
                                     decoded_legacy_pkey), 0)) {
            TEST_info("decoded_provided_pkey:");
            evp_pkey_print(bio_out, decoded_provided_pkey, 0, NULL);
            TEST_info("decoded_legacy_pkey:");
            evp_pkey_print(bio_out, decoded_legacy_pkey, 0, NULL);
        }
    }
    ok = 1;
 end:
    EVP_PKEY_free(decoded_legacy_pkey);
    EVP_PKEY_free(decoded_provided_pkey);
    OSSL_ENCODER_CTX_free(ectx);
    OSSL_DECODER_CTX_free(dctx);
    BIO_free(membio_provided);
    BIO_free(membio_legacy);
    return ok;
}

static int test_DER(const char *keytype, int evp_type,
                    const void *legacy_key, i2d_of_void *i2d, d2i_of_void *d2i,
                    EVP_PKEY_eq_fn *evp_pkey_eq,
                    EVP_PKEY_print_fn *evp_pkey_print,
                    EVP_PKEY *provided_pkey, int selection,
                    const char *structure)
{
    int ok = 0;
    unsigned char *der_legacy = NULL;
    const unsigned char *pder_legacy = NULL;
    size_t der_legacy_len = 0;
    unsigned char *der_provided = NULL;
    const unsigned char *pder_provided = NULL;
    size_t der_provided_len = 0;
    size_t tmp_size;
    OSSL_ENCODER_CTX *ectx = NULL;
    OSSL_DECODER_CTX *dctx = NULL;
    void *decoded_legacy_key = NULL;
    EVP_PKEY *decoded_legacy_pkey = NULL;
    EVP_PKEY *decoded_provided_pkey = NULL;

    if (!TEST_ptr(ectx =
                 OSSL_ENCODER_CTX_new_for_pkey(provided_pkey, selection,
                                               "DER", structure,
                                               NULL))
        || !TEST_true(OSSL_ENCODER_to_data(ectx,
                                          &der_provided, &der_provided_len))
        || !TEST_size_t_gt(der_legacy_len = i2d(legacy_key, &der_legacy), 0)
        || !TEST_mem_eq(der_provided, der_provided_len,
                        der_legacy, der_legacy_len))
        goto end;

    if (d2i != NULL) {
        /* Now try decoding the results and compare the resulting keys */

        if (!TEST_ptr(decoded_legacy_pkey = EVP_PKEY_new())
            || !TEST_ptr(dctx =
                         OSSL_DECODER_CTX_new_for_pkey(&decoded_provided_pkey,
                                                       "DER", structure,
                                                       keytype, selection,
                                                       NULL, NULL))
            || !TEST_true((pder_provided = der_provided,
                           tmp_size = der_provided_len,
                           OSSL_DECODER_from_data(dctx, &pder_provided,
                                                  &tmp_size)))
            || !TEST_ptr((pder_legacy = der_legacy,
                          decoded_legacy_key = d2i(NULL, &pder_legacy,
                                                   (long)der_legacy_len)))
            || !TEST_true(EVP_PKEY_assign(decoded_legacy_pkey, evp_type,
                                          decoded_legacy_key)))
            goto end;

        if (!TEST_int_gt(evp_pkey_eq(decoded_provided_pkey,
                                     decoded_legacy_pkey), 0)) {
            TEST_info("decoded_provided_pkey:");
            evp_pkey_print(bio_out, decoded_provided_pkey, 0, NULL);
            TEST_info("decoded_legacy_pkey:");
            evp_pkey_print(bio_out, decoded_legacy_pkey, 0, NULL);
        }
    }
    ok = 1;
 end:
    EVP_PKEY_free(decoded_legacy_pkey);
    EVP_PKEY_free(decoded_provided_pkey);
    OSSL_ENCODER_CTX_free(ectx);
    OSSL_DECODER_CTX_free(dctx);
    OPENSSL_free(der_provided);
    OPENSSL_free(der_legacy);
    return ok;
}

static int test_key(int idx)
{
    struct test_stanza_st *test_stanza = NULL;
    struct key_st *key = NULL;
    int ok = 0;
    size_t i;
    EVP_PKEY *pkey = NULL, *downgraded_pkey = NULL;
    const void *legacy_obj = NULL;

    /* Get the test data */
    if (!TEST_ptr(test_stanza = &test_stanzas[idx])
        || !TEST_ptr(key = lookup_key(test_stanza->keytype)))
        goto end;

    /* Set up the keys */
    if (!TEST_ptr(pkey = key->key)
        || !TEST_true(evp_pkey_copy_downgraded(&downgraded_pkey, pkey))
        || !TEST_ptr(downgraded_pkey)
        || !TEST_int_eq(EVP_PKEY_get_id(downgraded_pkey), key->evp_type)
        || !TEST_ptr(legacy_obj = EVP_PKEY_get0(downgraded_pkey)))
        goto end;

    ok = 1;

    /* Test PrivateKey to PEM */
    if (test_stanza->pem_write_bio_PrivateKey != NULL) {
        int selection = OSSL_KEYMGMT_SELECT_ALL;

        for (i = 0; i < OSSL_NELEM(test_stanza->structure); i++) {
            const char *structure = test_stanza->structure[i];

            TEST_info("Test OSSL_ENCODER against PEM_write_bio_{TYPE}PrivateKey for %s, %s",
                      test_stanza->keytype, structure);
            if (!test_protected_PEM(key->keytype, key->evp_type, legacy_obj,
                                    test_stanza->pem_write_bio_PrivateKey,
                                    test_stanza->pem_read_bio_PrivateKey,
                                    EVP_PKEY_eq, EVP_PKEY_print_private,
                                    pkey, selection, structure))
                ok = 0;
        }
    }

    /* Test PublicKey to PEM */
    if (test_stanza->pem_write_bio_PublicKey != NULL) {
        int selection =
            OSSL_KEYMGMT_SELECT_PUBLIC_KEY
            | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS;

        for (i = 0; i < OSSL_NELEM(test_stanza->structure); i++) {
            const char *structure = test_stanza->structure[i];

            TEST_info("Test OSSL_ENCODER against PEM_write_bio_{TYPE}PublicKey for %s, %s",
                      test_stanza->keytype, structure);
            if (!test_unprotected_PEM(key->keytype, key->evp_type, legacy_obj,
                                      test_stanza->pem_write_bio_PublicKey,
                                      test_stanza->pem_read_bio_PublicKey,
                                      EVP_PKEY_eq, EVP_PKEY_print_public,
                                      pkey, selection, structure))
                ok = 0;
        }
    }

    /* Test params to PEM */
    if (test_stanza->pem_write_bio_params != NULL) {
        int selection = OSSL_KEYMGMT_SELECT_ALL_PARAMETERS;

        for (i = 0; i < OSSL_NELEM(test_stanza->structure); i++) {
            const char *structure = test_stanza->structure[i];

            TEST_info("Test OSSL_ENCODER against PEM_write_bio_{TYPE}params for %s, %s",
                      test_stanza->keytype, structure);
            if (!test_unprotected_PEM(key->keytype, key->evp_type, legacy_obj,
                                      test_stanza->pem_write_bio_params,
                                      test_stanza->pem_read_bio_params,
                                      EVP_PKEY_parameters_eq,
                                      EVP_PKEY_print_params,
                                      pkey, selection, structure))
                ok = 0;
        }
    }

    /* Test PUBKEY to PEM */
    if (test_stanza->pem_write_bio_PUBKEY != NULL) {
        int selection =
            OSSL_KEYMGMT_SELECT_PUBLIC_KEY
            | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS;
        const char *structure = "SubjectPublicKeyInfo";

        TEST_info("Test OSSL_ENCODER against PEM_write_bio_{TYPE}_PUBKEY for %s, %s",
                  test_stanza->keytype, structure);
        if (!test_unprotected_PEM(key->keytype, key->evp_type, legacy_obj,
                                  test_stanza->pem_write_bio_PUBKEY,
                                  test_stanza->pem_read_bio_PUBKEY,
                                  EVP_PKEY_eq, EVP_PKEY_print_public,
                                  pkey, selection, structure))
            ok = 0;
    }


    /* Test PrivateKey to DER */
    if (test_stanza->i2d_PrivateKey != NULL) {
        int selection = OSSL_KEYMGMT_SELECT_ALL;

        for (i = 0; i < OSSL_NELEM(test_stanza->structure); i++) {
            const char *structure = test_stanza->structure[i];

            TEST_info("Test OSSL_ENCODER against i2d_{TYPE}PrivateKey for %s, %s",
                      test_stanza->keytype, structure);
            if (!test_DER(key->keytype, key->evp_type, legacy_obj,
                          test_stanza->i2d_PrivateKey,
                          test_stanza->d2i_PrivateKey,
                          EVP_PKEY_eq, EVP_PKEY_print_private,
                          pkey, selection, structure))
                ok = 0;
        }
    }

    /* Test PublicKey to DER */
    if (test_stanza->i2d_PublicKey != NULL) {
        int selection =
            OSSL_KEYMGMT_SELECT_PUBLIC_KEY
            | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS;

        for (i = 0; i < OSSL_NELEM(test_stanza->structure); i++) {
            const char *structure = test_stanza->structure[i];

            TEST_info("Test OSSL_ENCODER against i2d_{TYPE}PublicKey for %s, %s",
                      test_stanza->keytype, structure);
            if (!test_DER(key->keytype, key->evp_type, legacy_obj,
                          test_stanza->i2d_PublicKey,
                          test_stanza->d2i_PublicKey,
                          EVP_PKEY_eq, EVP_PKEY_print_public,
                          pkey, selection, structure))
                ok = 0;
        }
    }

    /* Test params to DER */
    if (test_stanza->i2d_params != NULL) {
        int selection = OSSL_KEYMGMT_SELECT_ALL_PARAMETERS;

        for (i = 0; i < OSSL_NELEM(test_stanza->structure); i++) {
            const char *structure = test_stanza->structure[i];

            TEST_info("Test OSSL_ENCODER against i2d_{TYPE}params for %s, %s",
                      test_stanza->keytype, structure);
            if (!test_DER(key->keytype, key->evp_type, legacy_obj,
                          test_stanza->i2d_params, test_stanza->d2i_params,
                          EVP_PKEY_parameters_eq, EVP_PKEY_print_params,
                          pkey, selection, structure))
                ok = 0;
        }
    }

    /* Test PUBKEY to DER */
    if (test_stanza->i2d_PUBKEY != NULL) {
        int selection =
            OSSL_KEYMGMT_SELECT_PUBLIC_KEY
            | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS;
        const char *structure = "SubjectPublicKeyInfo";

        TEST_info("Test OSSL_ENCODER against i2d_{TYPE}_PUBKEY for %s, %s",
                  test_stanza->keytype, structure);
        if (!test_DER(key->keytype, key->evp_type, legacy_obj,
                      test_stanza->i2d_PUBKEY, test_stanza->d2i_PUBKEY,
                      EVP_PKEY_eq, EVP_PKEY_print_public,
                      pkey, selection, structure))
            ok = 0;
    }
 end:
    EVP_PKEY_free(downgraded_pkey);
    return ok;
}

#define USAGE "rsa-key.pem dh-key.pem\n"
OPT_TEST_DECLARE_USAGE(USAGE)

int setup_tests(void)
{
    size_t i;

    if (!test_skip_common_options()) {
        TEST_error("Error parsing test options\n");
        return 0;
    }
    if (test_get_argument_count() != 2) {
        TEST_error("usage: endecoder_legacy_test %s", USAGE);
        return 0;
    }

    TEST_info("Generating keys...");

    for (i = 0; i < OSSL_NELEM(keys); i++) {
#ifndef OPENSSL_NO_DH
        if (strcmp(keys[i].keytype, "DH") == 0) {
            if (!TEST_ptr(keys[i].key =
                          load_pkey_pem(test_get_argument(1), NULL)))
                return  0;
            continue;
        }
#endif
#ifndef OPENSSL_NO_DEPRECATED_3_0
        if (strcmp(keys[i].keytype, "RSA") == 0) {
            if (!TEST_ptr(keys[i].key =
                          load_pkey_pem(test_get_argument(0), NULL)))
                return  0;
            continue;
        }
#endif
        TEST_info("Generating %s key...", keys[i].keytype);
        if (!TEST_ptr(keys[i].key =
                      make_key(keys[i].keytype, keys[i].template_params)))
            return 0;
    }

    TEST_info("Generating keys done");

    ADD_ALL_TESTS(test_key, OSSL_NELEM(test_stanzas));
    return 1;
}

void cleanup_tests(void)
{
    size_t i;

    for (i = 0; i < OSSL_NELEM(keys); i++)
        EVP_PKEY_free(keys[i].key);
}

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top