Latest Update
This commit is contained in:
+2
-1
@@ -1050,7 +1050,8 @@ int set_name_ex(unsigned long *flags, const char *arg)
|
||||
};
|
||||
if (set_multi_opts(flags, arg, ex_tbl) == 0)
|
||||
return 0;
|
||||
if ((*flags & XN_FLAG_SEP_MASK) == 0)
|
||||
if (*flags != XN_FLAG_COMPAT
|
||||
&& (*flags & XN_FLAG_SEP_MASK) == 0)
|
||||
*flags |= XN_FLAG_SEP_CPLUS_SPC;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -234,6 +234,15 @@ static const char *get_sigtype(int nid)
|
||||
case NID_ED448:
|
||||
return "Ed448";
|
||||
|
||||
case NID_id_GostR3410_2001:
|
||||
return "gost2001";
|
||||
|
||||
case NID_id_GostR3410_2012_256:
|
||||
return "gost2012_256";
|
||||
|
||||
case NID_id_GostR3410_2012_512:
|
||||
return "gost2012_512";
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -201,6 +201,7 @@ static int psk_use_session_cb(SSL *s, const EVP_MD *md,
|
||||
cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);
|
||||
if (cipher == NULL) {
|
||||
BIO_printf(bio_err, "Error finding suitable ciphersuite\n");
|
||||
OPENSSL_free(key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -212,6 +212,7 @@ static int psk_find_session_cb(SSL *ssl, const unsigned char *identity,
|
||||
cipher = SSL_CIPHER_find(ssl, tls13_aes128gcmsha256_id);
|
||||
if (cipher == NULL) {
|
||||
BIO_printf(bio_err, "Error finding suitable ciphersuite\n");
|
||||
OPENSSL_free(key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ int init_client(int *sock, const char *host, const char *port,
|
||||
#endif
|
||||
|
||||
if (!BIO_connect(*sock, BIO_ADDRINFO_address(ai),
|
||||
type == SOCK_STREAM ? BIO_SOCK_NODELAY : 0)) {
|
||||
protocol == IPPROTO_TCP ? BIO_SOCK_NODELAY : 0)) {
|
||||
BIO_closesocket(*sock);
|
||||
*sock = INVALID_SOCKET;
|
||||
continue;
|
||||
|
||||
+5
-2
@@ -389,11 +389,14 @@ static SSL *doConnection(SSL *scon, const char *host, SSL_CTX *ctx)
|
||||
#if defined(SOL_SOCKET) && defined(SO_LINGER)
|
||||
{
|
||||
struct linger no_linger;
|
||||
int fd;
|
||||
|
||||
no_linger.l_onoff = 1;
|
||||
no_linger.l_linger = 0;
|
||||
(void) setsockopt(SSL_get_fd(serverCon), SOL_SOCKET, SO_LINGER,
|
||||
(char*)&no_linger, sizeof(no_linger));
|
||||
fd = SSL_get_fd(serverCon);
|
||||
if (fd >= 0)
|
||||
(void)setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&no_linger,
|
||||
sizeof(no_linger));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+134
-66
@@ -169,6 +169,7 @@ static int CRYPTO_gcm128_aad_loop(void *args);
|
||||
static int RAND_bytes_loop(void *args);
|
||||
static int EVP_Update_loop(void *args);
|
||||
static int EVP_Update_loop_ccm(void *args);
|
||||
static int EVP_Update_loop_aead(void *args);
|
||||
static int EVP_Digest_loop(void *args);
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
static int RSA_sign_loop(void *args);
|
||||
@@ -197,29 +198,33 @@ static const int lengths_list[] = {
|
||||
};
|
||||
static const int *lengths = lengths_list;
|
||||
|
||||
#ifdef SIGALRM
|
||||
# if defined(__STDC__) || defined(sgi) || defined(_AIX)
|
||||
# define SIGRETTYPE void
|
||||
# else
|
||||
# define SIGRETTYPE int
|
||||
# endif
|
||||
|
||||
static SIGRETTYPE sig_done(int sig);
|
||||
static SIGRETTYPE sig_done(int sig)
|
||||
{
|
||||
signal(SIGALRM, sig_done);
|
||||
run = 0;
|
||||
}
|
||||
#endif
|
||||
static const int aead_lengths_list[] = {
|
||||
2, 31, 136, 1024, 8 * 1024, 16 * 1024
|
||||
};
|
||||
|
||||
#define START 0
|
||||
#define STOP 1
|
||||
|
||||
#if defined(_WIN32)
|
||||
#ifdef SIGALRM
|
||||
|
||||
static void alarmed(int sig)
|
||||
{
|
||||
signal(SIGALRM, alarmed);
|
||||
run = 0;
|
||||
}
|
||||
|
||||
static double Time_F(int s)
|
||||
{
|
||||
double ret = app_tminterval(s, usertime);
|
||||
if (s == STOP)
|
||||
alarm(0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
||||
# define SIGALRM -1
|
||||
|
||||
# if !defined(SIGALRM)
|
||||
# define SIGALRM
|
||||
# endif
|
||||
static unsigned int lapse;
|
||||
static volatile unsigned int schlock;
|
||||
static void alarm_win32(unsigned int secs)
|
||||
@@ -263,13 +268,9 @@ static double Time_F(int s)
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
|
||||
static double Time_F(int s)
|
||||
{
|
||||
double ret = app_tminterval(s, usertime);
|
||||
if (s == STOP)
|
||||
alarm(0);
|
||||
return ret;
|
||||
return app_tminterval(s, usertime);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -295,38 +296,41 @@ typedef enum OPTION_choice {
|
||||
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
|
||||
OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI,
|
||||
OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM,
|
||||
OPT_PRIMES, OPT_SECONDS, OPT_BYTES
|
||||
OPT_PRIMES, OPT_SECONDS, OPT_BYTES, OPT_AEAD
|
||||
} OPTION_CHOICE;
|
||||
|
||||
const OPTIONS speed_options[] = {
|
||||
{OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"},
|
||||
{OPT_HELP_STR, 1, '-', "Valid options are:\n"},
|
||||
{"help", OPT_HELP, '-', "Display this summary"},
|
||||
{"evp", OPT_EVP, 's', "Use specified EVP cipher"},
|
||||
{"evp", OPT_EVP, 's', "Use EVP-named cipher or digest"},
|
||||
{"decrypt", OPT_DECRYPT, '-',
|
||||
"Time decryption instead of encryption (only EVP)"},
|
||||
{"mr", OPT_MR, '-', "Produce machine readable output"},
|
||||
{"aead", OPT_AEAD, '-',
|
||||
"Benchmark EVP-named AEAD cipher in TLS-like sequence"},
|
||||
{"mb", OPT_MB, '-',
|
||||
"Enable (tls1.1) multi-block mode on evp_cipher requested with -evp"},
|
||||
{"misalign", OPT_MISALIGN, 'n', "Amount to mis-align buffers"},
|
||||
{"elapsed", OPT_ELAPSED, '-',
|
||||
"Measure time in real time instead of CPU user time"},
|
||||
"Enable (tls1>=1) multi-block mode on EVP-named cipher"},
|
||||
{"mr", OPT_MR, '-', "Produce machine readable output"},
|
||||
#ifndef NO_FORK
|
||||
{"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_ASYNC
|
||||
{"async_jobs", OPT_ASYNCJOBS, 'p',
|
||||
"Enable async mode and start pnum jobs"},
|
||||
"Enable async mode and start specified number of jobs"},
|
||||
#endif
|
||||
OPT_R_OPTIONS,
|
||||
#ifndef OPENSSL_NO_ENGINE
|
||||
{"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
|
||||
#endif
|
||||
{"elapsed", OPT_ELAPSED, '-',
|
||||
"Use wall-clock time instead of CPU user time as divisor"},
|
||||
{"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"},
|
||||
{"seconds", OPT_SECONDS, 'p',
|
||||
"Run benchmarks for pnum seconds"},
|
||||
"Run benchmarks for specified amount of seconds"},
|
||||
{"bytes", OPT_BYTES, 'p',
|
||||
"Run cipher, digest and rand benchmarks on pnum bytes"},
|
||||
"Run [non-PKI] benchmarks on custom-sized buffer"},
|
||||
{"misalign", OPT_MISALIGN, 'p',
|
||||
"Use specified offset to mis-align buffers"},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
@@ -915,6 +919,7 @@ static int EVP_Update_loop(void *args)
|
||||
EVP_EncryptFinal_ex(ctx, buf, &outl);
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* CCM does not support streaming. For the purpose of performance measurement,
|
||||
* each message is encrypted using the same (key,iv)-pair. Do not use this
|
||||
@@ -949,6 +954,42 @@ static int EVP_Update_loop_ccm(void *args)
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* To make AEAD benchmarking more relevant perform TLS-like operations,
|
||||
* 13-byte AAD followed by payload. But don't use TLS-formatted AAD, as
|
||||
* payload length is not actually limited by 16KB...
|
||||
*/
|
||||
static int EVP_Update_loop_aead(void *args)
|
||||
{
|
||||
loopargs_t *tempargs = *(loopargs_t **) args;
|
||||
unsigned char *buf = tempargs->buf;
|
||||
EVP_CIPHER_CTX *ctx = tempargs->ctx;
|
||||
int outl, count;
|
||||
unsigned char aad[13] = { 0xcc };
|
||||
unsigned char faketag[16] = { 0xcc };
|
||||
#ifndef SIGALRM
|
||||
int nb_iter = save_count * 4 * lengths[0] / lengths[testnum];
|
||||
#endif
|
||||
if (decrypt) {
|
||||
for (count = 0; COND(nb_iter); count++) {
|
||||
EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv);
|
||||
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
|
||||
sizeof(faketag), faketag);
|
||||
EVP_DecryptUpdate(ctx, NULL, &outl, aad, sizeof(aad));
|
||||
EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
EVP_DecryptFinal_ex(ctx, buf + outl, &outl);
|
||||
}
|
||||
} else {
|
||||
for (count = 0; COND(nb_iter); count++) {
|
||||
EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv);
|
||||
EVP_EncryptUpdate(ctx, NULL, &outl, aad, sizeof(aad));
|
||||
EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]);
|
||||
EVP_EncryptFinal_ex(ctx, buf + outl, &outl);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static const EVP_MD *evp_md = NULL;
|
||||
static int EVP_Digest_loop(void *args)
|
||||
{
|
||||
@@ -1272,7 +1313,6 @@ static int run_benchmark(int async_jobs,
|
||||
int speed_main(int argc, char **argv)
|
||||
{
|
||||
ENGINE *e = NULL;
|
||||
int (*loopfunc)(void *args);
|
||||
loopargs_t *loopargs = NULL;
|
||||
const char *prog;
|
||||
const char *engine_id = NULL;
|
||||
@@ -1281,7 +1321,7 @@ int speed_main(int argc, char **argv)
|
||||
OPTION_CHOICE o;
|
||||
int async_init = 0, multiblock = 0, pr_header = 0;
|
||||
int doit[ALGOR_NUM] = { 0 };
|
||||
int ret = 1, misalign = 0, lengths_single = 0;
|
||||
int ret = 1, misalign = 0, lengths_single = 0, aead = 0;
|
||||
long count = 0;
|
||||
unsigned int size_num = OSSL_NELEM(lengths_list);
|
||||
unsigned int i, k, loop, loopargs_len = 0, async_jobs = 0;
|
||||
@@ -1517,6 +1557,9 @@ int speed_main(int argc, char **argv)
|
||||
lengths = &lengths_single;
|
||||
size_num = 1;
|
||||
break;
|
||||
case OPT_AEAD:
|
||||
aead = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
argc = opt_num_rest();
|
||||
@@ -1596,6 +1639,34 @@ int speed_main(int argc, char **argv)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Sanity checks */
|
||||
if (aead) {
|
||||
if (evp_cipher == NULL) {
|
||||
BIO_printf(bio_err, "-aead can be used only with an AEAD cipher\n");
|
||||
goto end;
|
||||
} else if (!(EVP_CIPHER_flags(evp_cipher) &
|
||||
EVP_CIPH_FLAG_AEAD_CIPHER)) {
|
||||
BIO_printf(bio_err, "%s is not an AEAD cipher\n",
|
||||
OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
if (multiblock) {
|
||||
if (evp_cipher == NULL) {
|
||||
BIO_printf(bio_err,"-mb can be used only with a multi-block"
|
||||
" capable cipher\n");
|
||||
goto end;
|
||||
} else if (!(EVP_CIPHER_flags(evp_cipher) &
|
||||
EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
|
||||
BIO_printf(bio_err, "%s is not a multi-block capable\n",
|
||||
OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
|
||||
goto end;
|
||||
} else if (async_jobs > 0) {
|
||||
BIO_printf(bio_err, "Async mode is not supported with -mb");
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the job pool if async mode is enabled */
|
||||
if (async_jobs > 0) {
|
||||
async_init = ASYNC_init_thread(async_jobs, async_jobs);
|
||||
@@ -1619,7 +1690,10 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
buflen = lengths[size_num - 1] + MAX_MISALIGNMENT + 1;
|
||||
buflen = lengths[size_num - 1];
|
||||
if (buflen < 36) /* size of random vector in RSA bencmark */
|
||||
buflen = 36;
|
||||
buflen += MAX_MISALIGNMENT + 1;
|
||||
loopargs[i].buf_malloc = app_malloc(buflen, "input buffer");
|
||||
loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer");
|
||||
memset(loopargs[i].buf_malloc, 0, buflen);
|
||||
@@ -1961,10 +2035,8 @@ int speed_main(int argc, char **argv)
|
||||
/* not worth fixing */
|
||||
# error "You cannot disable DES on systems without SIGALRM."
|
||||
# endif /* OPENSSL_NO_DES */
|
||||
#else
|
||||
# ifndef _WIN32
|
||||
signal(SIGALRM, sig_done);
|
||||
# endif
|
||||
#elif SIGALRM > 0
|
||||
signal(SIGALRM, alarmed);
|
||||
#endif /* SIGALRM */
|
||||
|
||||
#ifndef OPENSSL_NO_MD2
|
||||
@@ -2420,30 +2492,30 @@ int speed_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (doit[D_EVP]) {
|
||||
if (multiblock && evp_cipher) {
|
||||
if (!
|
||||
(EVP_CIPHER_flags(evp_cipher) &
|
||||
if (evp_cipher != NULL) {
|
||||
int (*loopfunc)(void *args) = EVP_Update_loop;
|
||||
|
||||
if (multiblock && (EVP_CIPHER_flags(evp_cipher) &
|
||||
EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) {
|
||||
BIO_printf(bio_err, "%s is not multi-block capable\n",
|
||||
OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)));
|
||||
goto end;
|
||||
}
|
||||
if (async_jobs > 0) {
|
||||
BIO_printf(bio_err, "Async mode is not supported, exiting...");
|
||||
exit(1);
|
||||
}
|
||||
multiblock_speed(evp_cipher, lengths_single, &seconds);
|
||||
ret = 0;
|
||||
goto end;
|
||||
}
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
if (evp_cipher) {
|
||||
|
||||
names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher));
|
||||
/*
|
||||
* -O3 -fschedule-insns messes up an optimization here!
|
||||
* names[D_EVP] somehow becomes NULL
|
||||
*/
|
||||
|
||||
if (EVP_CIPHER_mode(evp_cipher) == EVP_CIPH_CCM_MODE) {
|
||||
loopfunc = EVP_Update_loop_ccm;
|
||||
} else if (aead && (EVP_CIPHER_flags(evp_cipher) &
|
||||
EVP_CIPH_FLAG_AEAD_CIPHER)) {
|
||||
loopfunc = EVP_Update_loop_aead;
|
||||
if (lengths == lengths_list) {
|
||||
lengths = aead_lengths_list;
|
||||
size_num = OSSL_NELEM(aead_lengths_list);
|
||||
}
|
||||
}
|
||||
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_EVP], save_count, lengths[testnum],
|
||||
seconds.sym);
|
||||
|
||||
@@ -2461,13 +2533,6 @@ int speed_main(int argc, char **argv)
|
||||
loopargs[k].key, NULL, -1);
|
||||
OPENSSL_clear_free(loopargs[k].key, keylen);
|
||||
}
|
||||
switch (EVP_CIPHER_mode(evp_cipher)) {
|
||||
case EVP_CIPH_CCM_MODE:
|
||||
loopfunc = EVP_Update_loop_ccm;
|
||||
break;
|
||||
default:
|
||||
loopfunc = EVP_Update_loop;
|
||||
}
|
||||
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, loopfunc, loopargs);
|
||||
@@ -2475,18 +2540,21 @@ int speed_main(int argc, char **argv)
|
||||
for (k = 0; k < loopargs_len; k++) {
|
||||
EVP_CIPHER_CTX_free(loopargs[k].ctx);
|
||||
}
|
||||
print_result(D_EVP, testnum, count, d);
|
||||
}
|
||||
if (evp_md) {
|
||||
} else if (evp_md != NULL) {
|
||||
names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md));
|
||||
|
||||
for (testnum = 0; testnum < size_num; testnum++) {
|
||||
print_message(names[D_EVP], save_count, lengths[testnum],
|
||||
seconds.sym);
|
||||
Time_F(START);
|
||||
count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs);
|
||||
d = Time_F(STOP);
|
||||
}
|
||||
print_result(D_EVP, testnum, count, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < loopargs_len; i++)
|
||||
RAND_bytes(loopargs[i].buf, 36);
|
||||
|
||||
@@ -308,6 +308,7 @@ int storeutl_main(int argc, char *argv[])
|
||||
text, noout, recursive, 0, out, prog);
|
||||
|
||||
end:
|
||||
OPENSSL_free(fingerprint);
|
||||
OPENSSL_free(alias);
|
||||
ASN1_INTEGER_free(serial);
|
||||
X509_NAME_free(subject);
|
||||
|
||||
+27
-12
@@ -473,7 +473,6 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(SPARC_T4_MONT)
|
||||
static BN_ULONG bn_get_bits(const BIGNUM *a, int bitpos)
|
||||
{
|
||||
BN_ULONG ret = 0;
|
||||
@@ -492,7 +491,6 @@ static BN_ULONG bn_get_bits(const BIGNUM *a, int bitpos)
|
||||
|
||||
return ret & BN_MASK2;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* BN_mod_exp_mont_consttime() stores the precomputed powers in a specific
|
||||
@@ -599,7 +597,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
||||
const BIGNUM *m, BN_CTX *ctx,
|
||||
BN_MONT_CTX *in_mont)
|
||||
{
|
||||
int i, bits, ret = 0, window, wvalue;
|
||||
int i, bits, ret = 0, window, wvalue, wmask, window0;
|
||||
int top;
|
||||
BN_MONT_CTX *mont = NULL;
|
||||
|
||||
@@ -1040,27 +1038,44 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
|
||||
}
|
||||
}
|
||||
|
||||
bits--;
|
||||
for (wvalue = 0, i = bits % window; i >= 0; i--, bits--)
|
||||
wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
|
||||
/*
|
||||
* The exponent may not have a whole number of fixed-size windows.
|
||||
* To simplify the main loop, the initial window has between 1 and
|
||||
* full-window-size bits such that what remains is always a whole
|
||||
* number of windows
|
||||
*/
|
||||
window0 = (bits - 1) % window + 1;
|
||||
wmask = (1 << window0) - 1;
|
||||
bits -= window0;
|
||||
wvalue = bn_get_bits(p, bits) & wmask;
|
||||
if (!MOD_EXP_CTIME_COPY_FROM_PREBUF(&tmp, top, powerbuf, wvalue,
|
||||
window))
|
||||
goto err;
|
||||
|
||||
wmask = (1 << window) - 1;
|
||||
/*
|
||||
* Scan the exponent one window at a time starting from the most
|
||||
* significant bits.
|
||||
*/
|
||||
while (bits >= 0) {
|
||||
wvalue = 0; /* The 'value' of the window */
|
||||
while (bits > 0) {
|
||||
|
||||
/* Scan the window, squaring the result as we go */
|
||||
for (i = 0; i < window; i++, bits--) {
|
||||
/* Square the result window-size times */
|
||||
for (i = 0; i < window; i++)
|
||||
if (!BN_mod_mul_montgomery(&tmp, &tmp, &tmp, mont, ctx))
|
||||
goto err;
|
||||
wvalue = (wvalue << 1) + BN_is_bit_set(p, bits);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a window's worth of bits from the exponent
|
||||
* This avoids calling BN_is_bit_set for each bit, which
|
||||
* is not only slower but also makes each bit vulnerable to
|
||||
* EM (and likely other) side-channel attacks like One&Done
|
||||
* (for details see "One&Done: A Single-Decryption EM-Based
|
||||
* Attack on OpenSSL’s Constant-Time Blinded RSA" by M. Alam,
|
||||
* H. Khan, M. Dey, N. Sinha, R. Callan, A. Zajic, and
|
||||
* M. Prvulovic, in USENIX Security'18)
|
||||
*/
|
||||
bits -= window;
|
||||
wvalue = bn_get_bits(p, bits) & wmask;
|
||||
/*
|
||||
* Fetch the appropriate pre-computed value from the pre-buf
|
||||
*/
|
||||
|
||||
@@ -23,11 +23,14 @@
|
||||
# IALU/gcc-4.x 3xAltiVec+1xIALU
|
||||
#
|
||||
# Freescale e300 13.6/+115% -
|
||||
# PPC74x0/G4e 6.81/+310% 4.66
|
||||
# PPC970/G5 9.29/+160% 4.60
|
||||
# POWER7 8.62/+61% 4.27
|
||||
# POWER8 8.70/+51% 3.96
|
||||
# POWER9 6.61/+29% 3.67
|
||||
# PPC74x0/G4e 6.81/+310% 3.72
|
||||
# PPC970/G5 9.29/+160% ?
|
||||
# POWER7 8.62/+61% 3.38
|
||||
# POWER8 8.70/+51% 3.36
|
||||
# POWER9 6.61/+29% 3.30(*)
|
||||
#
|
||||
# (*) this is trade-off result, it's possible to improve it, but
|
||||
# then it would negatively affect all others;
|
||||
|
||||
$flavour = shift;
|
||||
|
||||
@@ -392,19 +395,19 @@ Loop_tail: # byte-by-byte loop
|
||||
___
|
||||
|
||||
{{{
|
||||
my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2,$T0,$T1,$T2) =
|
||||
map("v$_",(0..14));
|
||||
my (@K)=map("v$_",(15..20));
|
||||
my ($FOUR,$sixteen,$twenty4,$twenty,$twelve,$twenty5,$seven) =
|
||||
map("v$_",(21..27));
|
||||
my ($inpperm,$outperm,$outmask) = map("v$_",(28..30));
|
||||
my @D=("v31",$seven,$T0,$T1,$T2);
|
||||
my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2)
|
||||
= map("v$_",(0..11));
|
||||
my @K = map("v$_",(12..17));
|
||||
my ($FOUR,$sixteen,$twenty4) = map("v$_",(18..20));
|
||||
my ($inpperm,$outperm,$outmask) = map("v$_",(21..23));
|
||||
my @D = map("v$_",(24..28));
|
||||
my ($twelve,$seven,$T0,$T1) = @D;
|
||||
|
||||
my $FRAME=$LOCALS+64+13*16+18*$SIZE_T; # 13*16 is for v20-v31 offload
|
||||
my $FRAME=$LOCALS+64+10*16+18*$SIZE_T; # 10*16 is for v20-v28 offload
|
||||
|
||||
sub VMXROUND {
|
||||
my $odd = pop;
|
||||
my ($a,$b,$c,$d,$t)=@_;
|
||||
my ($a,$b,$c,$d)=@_;
|
||||
|
||||
(
|
||||
"&vadduwm ('$a','$a','$b')",
|
||||
@@ -412,20 +415,16 @@ my ($a,$b,$c,$d,$t)=@_;
|
||||
"&vperm ('$d','$d','$d','$sixteen')",
|
||||
|
||||
"&vadduwm ('$c','$c','$d')",
|
||||
"&vxor ('$t','$b','$c')",
|
||||
"&vsrw ('$b','$t','$twenty')",
|
||||
"&vslw ('$t','$t','$twelve')",
|
||||
"&vor ('$b','$b','$t')",
|
||||
"&vxor ('$b','$b','$c')",
|
||||
"&vrlw ('$b','$b','$twelve')",
|
||||
|
||||
"&vadduwm ('$a','$a','$b')",
|
||||
"&vxor ('$d','$d','$a')",
|
||||
"&vperm ('$d','$d','$d','$twenty4')",
|
||||
|
||||
"&vadduwm ('$c','$c','$d')",
|
||||
"&vxor ('$t','$b','$c')",
|
||||
"&vsrw ('$b','$t','$twenty5')",
|
||||
"&vslw ('$t','$t','$seven')",
|
||||
"&vor ('$b','$b','$t')",
|
||||
"&vxor ('$b','$b','$c')",
|
||||
"&vrlw ('$b','$b','$seven')",
|
||||
|
||||
"&vsldoi ('$c','$c','$c',8)",
|
||||
"&vsldoi ('$b','$b','$b',$odd?4:12)",
|
||||
@@ -461,13 +460,7 @@ $code.=<<___;
|
||||
stvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
stvx v27,r11,$sp
|
||||
addi r11,r11,32
|
||||
stvx v28,r10,$sp
|
||||
addi r10,r10,32
|
||||
stvx v29,r11,$sp
|
||||
addi r11,r11,32
|
||||
stvx v30,r10,$sp
|
||||
stvx v31,r11,$sp
|
||||
stw r12,`$FRAME-$SIZE_T*18-4`($sp) # save vrsave
|
||||
$PUSH r14,`$FRAME-$SIZE_T*18`($sp)
|
||||
$PUSH r15,`$FRAME-$SIZE_T*17`($sp)
|
||||
@@ -487,9 +480,9 @@ $code.=<<___;
|
||||
$PUSH r29,`$FRAME-$SIZE_T*3`($sp)
|
||||
$PUSH r30,`$FRAME-$SIZE_T*2`($sp)
|
||||
$PUSH r31,`$FRAME-$SIZE_T*1`($sp)
|
||||
li r12,-1
|
||||
li r12,-8
|
||||
$PUSH r0, `$FRAME+$LRSAVE`($sp)
|
||||
mtspr 256,r12 # preserve all AltiVec registers
|
||||
mtspr 256,r12 # preserve 29 AltiVec registers
|
||||
|
||||
bl Lconsts # returns pointer Lsigma in r12
|
||||
li @x[0],16
|
||||
@@ -526,11 +519,6 @@ $code.=<<___;
|
||||
lwz @d[3],12($ctr)
|
||||
vadduwm @K[5],@K[4],@K[5]
|
||||
|
||||
vspltisw $twenty,-12 # synthesize constants
|
||||
vspltisw $twelve,12
|
||||
vspltisw $twenty5,-7
|
||||
#vspltisw $seven,7 # synthesized in the loop
|
||||
|
||||
vxor $T0,$T0,$T0 # 0x00..00
|
||||
vspltisw $outmask,-1 # 0xff..ff
|
||||
?lvsr $inpperm,0,$inp # prepare for unaligned load
|
||||
@@ -543,6 +531,7 @@ $code.=<<___;
|
||||
be?vxor $outperm,$outperm,$T1
|
||||
be?vperm $inpperm,$inpperm,$inpperm,$T0
|
||||
|
||||
li r0,10 # inner loop counter
|
||||
b Loop_outer_vmx
|
||||
|
||||
.align 4
|
||||
@@ -560,7 +549,6 @@ Loop_outer_vmx:
|
||||
ori @x[3],@x[3],0x6574
|
||||
vmr $B0,@K[1]
|
||||
|
||||
li r0,10 # inner loop counter
|
||||
lwz @x[4],0($key) # load key to GPR
|
||||
vmr $B1,@K[1]
|
||||
lwz @x[5],4($key)
|
||||
@@ -586,15 +574,17 @@ Loop_outer_vmx:
|
||||
mr @t[1],@x[5]
|
||||
mr @t[2],@x[6]
|
||||
mr @t[3],@x[7]
|
||||
|
||||
vspltisw $twelve,12 # synthesize constants
|
||||
vspltisw $seven,7
|
||||
|
||||
mtctr r0
|
||||
nop
|
||||
Loop_vmx:
|
||||
___
|
||||
my @thread0=&VMXROUND($A0,$B0,$C0,$D0,$T0,0);
|
||||
my @thread1=&VMXROUND($A1,$B1,$C1,$D1,$T1,0);
|
||||
my @thread2=&VMXROUND($A2,$B2,$C2,$D2,$T2,0);
|
||||
my @thread0=&VMXROUND($A0,$B0,$C0,$D0,0);
|
||||
my @thread1=&VMXROUND($A1,$B1,$C1,$D1,0);
|
||||
my @thread2=&VMXROUND($A2,$B2,$C2,$D2,0);
|
||||
my @thread3=&ROUND(0,4,8,12);
|
||||
|
||||
foreach (@thread0) {
|
||||
@@ -602,10 +592,11 @@ ___
|
||||
eval(shift(@thread1)); eval(shift(@thread3));
|
||||
eval(shift(@thread2)); eval(shift(@thread3));
|
||||
}
|
||||
foreach (@thread3) { eval; }
|
||||
|
||||
@thread0=&VMXROUND($A0,$B0,$C0,$D0,$T0,1);
|
||||
@thread1=&VMXROUND($A1,$B1,$C1,$D1,$T1,1);
|
||||
@thread2=&VMXROUND($A2,$B2,$C2,$D2,$T2,1);
|
||||
@thread0=&VMXROUND($A0,$B0,$C0,$D0,1);
|
||||
@thread1=&VMXROUND($A1,$B1,$C1,$D1,1);
|
||||
@thread2=&VMXROUND($A2,$B2,$C2,$D2,1);
|
||||
@thread3=&ROUND(0,5,10,15);
|
||||
|
||||
foreach (@thread0) {
|
||||
@@ -613,6 +604,7 @@ ___
|
||||
eval(shift(@thread1)); eval(shift(@thread3));
|
||||
eval(shift(@thread2)); eval(shift(@thread3));
|
||||
}
|
||||
foreach (@thread3) { eval; }
|
||||
$code.=<<___;
|
||||
bdnz Loop_vmx
|
||||
|
||||
@@ -866,13 +858,7 @@ Ldone_vmx:
|
||||
lvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
lvx v27,r11,$sp
|
||||
addi r11,r11,32
|
||||
lvx v28,r10,$sp
|
||||
addi r10,r10,32
|
||||
lvx v29,r11,$sp
|
||||
addi r11,r11,32
|
||||
lvx v30,r10,$sp
|
||||
lvx v31,r11,$sp
|
||||
$POP r0, `$FRAME+$LRSAVE`($sp)
|
||||
$POP r14,`$FRAME-$SIZE_T*18`($sp)
|
||||
$POP r15,`$FRAME-$SIZE_T*17`($sp)
|
||||
@@ -904,7 +890,7 @@ Ldone_vmx:
|
||||
Lconsts:
|
||||
mflr r0
|
||||
bcl 20,31,\$+4
|
||||
mflr r12 #vvvvv "distance between . and _vpaes_consts
|
||||
mflr r12 #vvvvv "distance between . and Lsigma
|
||||
addi r12,r12,`64-8`
|
||||
mtlr r0
|
||||
blr
|
||||
|
||||
@@ -253,7 +253,6 @@ c448_error_t c448_ed448_verify(
|
||||
curve448_point_decode_like_eddsa_and_mul_by_ratio(pk_point, pubkey);
|
||||
curve448_scalar_t challenge_scalar;
|
||||
curve448_scalar_t response_scalar;
|
||||
unsigned int c;
|
||||
|
||||
if (C448_SUCCESS != error)
|
||||
return error;
|
||||
@@ -291,9 +290,6 @@ c448_error_t c448_ed448_verify(
|
||||
&signature[EDDSA_448_PUBLIC_BYTES],
|
||||
EDDSA_448_PRIVATE_BYTES);
|
||||
|
||||
for (c = 1; c < C448_EDDSA_DECODE_RATIO; c <<= 1)
|
||||
curve448_scalar_add(response_scalar, response_scalar, response_scalar);
|
||||
|
||||
/* pk_point = -c(x(P)) + (cx + k)G = kG */
|
||||
curve448_base_double_scalarmul_non_secret(pk_point,
|
||||
response_scalar,
|
||||
|
||||
@@ -219,10 +219,8 @@ static int pkey_ecies_encrypt(EVP_PKEY_CTX *ctx,
|
||||
|
||||
if (dctx->md)
|
||||
md_type = EVP_MD_type(dctx->md);
|
||||
else if (ec_nid == NID_sm2)
|
||||
md_type = NID_sm3;
|
||||
else
|
||||
md_type = NID_sha256;
|
||||
md_type = NID_sm3;
|
||||
|
||||
if (out == NULL) {
|
||||
*outlen = SM2_ciphertext_size(ec, EVP_get_digestbynid(md_type),
|
||||
@@ -259,13 +257,12 @@ static int pkey_ecies_decrypt(EVP_PKEY_CTX *ctx,
|
||||
|
||||
if (dctx->md)
|
||||
md_type = EVP_MD_type(dctx->md);
|
||||
else if (ec_nid == NID_sm2)
|
||||
md_type = NID_sm3;
|
||||
else
|
||||
md_type = NID_sha256;
|
||||
md_type = NID_sm3;
|
||||
|
||||
if (out == NULL) {
|
||||
*outlen = SM2_plaintext_size(ec, EVP_get_digestbynid(md_type), inlen);
|
||||
*outlen = SM2_plaintext_size(ec, EVP_get_digestbynid(md_type),
|
||||
inlen);
|
||||
ret = 1;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -171,7 +171,8 @@ static void look_str_cb(int nid, STACK_OF(ENGINE) *sk, ENGINE *def, void *arg)
|
||||
ENGINE *e = sk_ENGINE_value(sk, i);
|
||||
EVP_PKEY_ASN1_METHOD *ameth;
|
||||
e->pkey_asn1_meths(e, &ameth, NULL, nid);
|
||||
if (((int)strlen(ameth->pem_str) == lk->len)
|
||||
if (ameth != NULL
|
||||
&& ((int)strlen(ameth->pem_str) == lk->len)
|
||||
&& strncasecmp(ameth->pem_str, lk->str, lk->len) == 0) {
|
||||
lk->e = e;
|
||||
lk->ameth = ameth;
|
||||
|
||||
@@ -1685,6 +1685,7 @@ X509_F_X509_GET_PUBKEY_PARAMETERS:110:X509_get_pubkey_parameters
|
||||
X509_F_X509_LOAD_CERT_CRL_FILE:132:X509_load_cert_crl_file
|
||||
X509_F_X509_LOAD_CERT_FILE:111:X509_load_cert_file
|
||||
X509_F_X509_LOAD_CRL_FILE:112:X509_load_crl_file
|
||||
X509_F_X509_LOOKUP_METH_NEW:160:X509_LOOKUP_meth_new
|
||||
X509_F_X509_LOOKUP_NEW:155:X509_LOOKUP_new
|
||||
X509_F_X509_NAME_ADD_ENTRY:113:X509_NAME_add_entry
|
||||
X509_F_X509_NAME_CANON:156:x509_name_canon
|
||||
|
||||
@@ -237,7 +237,7 @@ size_t CRYPTO_128_wrap_pad(void *key, const unsigned char *icv,
|
||||
*
|
||||
* @param[in] key Key value.
|
||||
* @param[in] icv (Non-standard) IV, 4 bytes. NULL = use default_aiv.
|
||||
* @param[out] out Plaintext. Minimal buffer length = inlen bytes.
|
||||
* @param[out] out Plaintext. Minimal buffer length = (inlen - 8) bytes.
|
||||
* Input and output buffers can overlap if block function
|
||||
* supports that.
|
||||
* @param[in] in Ciphertext as n 64-bit blocks.
|
||||
@@ -267,7 +267,6 @@ size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv,
|
||||
if ((inlen & 0x7) != 0 || inlen < 16 || inlen >= CRYPTO128_WRAP_MAX)
|
||||
return 0;
|
||||
|
||||
memmove(out, in, inlen);
|
||||
if (inlen == 16) {
|
||||
/*
|
||||
* Section 4.2 - special case in step 1: When n=1, the ciphertext
|
||||
@@ -275,14 +274,17 @@ size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv,
|
||||
* single AES block using AES in ECB mode: AIV | P[1] = DEC(K, C[0] |
|
||||
* C[1])
|
||||
*/
|
||||
block(out, out, key);
|
||||
memcpy(aiv, out, 8);
|
||||
unsigned char buff[16];
|
||||
|
||||
block(in, buff, key);
|
||||
memcpy(aiv, buff, 8);
|
||||
/* Remove AIV */
|
||||
memmove(out, out + 8, 8);
|
||||
memcpy(out, buff + 8, 8);
|
||||
padded_len = 8;
|
||||
OPENSSL_cleanse(buff, inlen);
|
||||
} else {
|
||||
padded_len = inlen - 8;
|
||||
ret = crypto_128_unwrap_raw(key, aiv, out, out, inlen, block);
|
||||
ret = crypto_128_unwrap_raw(key, aiv, out, in, inlen, block);
|
||||
if (padded_len != ret) {
|
||||
OPENSSL_cleanse(out, inlen);
|
||||
return 0;
|
||||
|
||||
+31
-14
@@ -1,5 +1,5 @@
|
||||
#! /usr/bin/env perl
|
||||
# Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
# Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the OpenSSL license (the "License"). You may not use
|
||||
# this file except in compliance with the License. You can obtain a copy
|
||||
@@ -217,6 +217,7 @@ my $stvdx_u = sub { vsxmem_op(@_, 716); }; # stxsdx
|
||||
my $lvx_4w = sub { vsxmem_op(@_, 780); }; # lxvw4x
|
||||
my $stvx_4w = sub { vsxmem_op(@_, 908); }; # stxvw4x
|
||||
my $lvx_splt = sub { vsxmem_op(@_, 332); }; # lxvdsx
|
||||
# VSX instruction[s] masqueraded as made-up AltiVec/VMX
|
||||
my $vpermdi = sub { # xxpermdi
|
||||
my ($f, $vrt, $vra, $vrb, $dm) = @_;
|
||||
$dm = oct($dm) if ($dm =~ /^0/);
|
||||
@@ -228,6 +229,10 @@ sub vcrypto_op {
|
||||
my ($f, $vrt, $vra, $vrb, $op) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|$op;
|
||||
}
|
||||
sub vfour {
|
||||
my ($f, $vrt, $vra, $vrb, $vrc, $op) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|($vrc<<6)|$op;
|
||||
};
|
||||
my $vcipher = sub { vcrypto_op(@_, 1288); };
|
||||
my $vcipherlast = sub { vcrypto_op(@_, 1289); };
|
||||
my $vncipher = sub { vcrypto_op(@_, 1352); };
|
||||
@@ -239,7 +244,7 @@ my $vpmsumb = sub { vcrypto_op(@_, 1032); };
|
||||
my $vpmsumd = sub { vcrypto_op(@_, 1224); };
|
||||
my $vpmsubh = sub { vcrypto_op(@_, 1096); };
|
||||
my $vpmsumw = sub { vcrypto_op(@_, 1160); };
|
||||
# These are not really crypto, but one can use vcrypto_op
|
||||
# These are not really crypto, but vcrypto_op template works
|
||||
my $vaddudm = sub { vcrypto_op(@_, 192); };
|
||||
my $vadduqm = sub { vcrypto_op(@_, 256); };
|
||||
my $vmuleuw = sub { vcrypto_op(@_, 648); };
|
||||
@@ -247,21 +252,29 @@ my $vmulouw = sub { vcrypto_op(@_, 136); };
|
||||
my $vrld = sub { vcrypto_op(@_, 196); };
|
||||
my $vsld = sub { vcrypto_op(@_, 1476); };
|
||||
my $vsrd = sub { vcrypto_op(@_, 1732); };
|
||||
my $vsubudm = sub { vcrypto_op(@_, 1216); };
|
||||
my $vaddcuq = sub { vcrypto_op(@_, 320); };
|
||||
my $vaddeuqm = sub { vfour(@_,60); };
|
||||
my $vaddecuq = sub { vfour(@_,61); };
|
||||
|
||||
my $mtsle = sub {
|
||||
my ($f, $arg) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($arg<<21)|(147*2);
|
||||
};
|
||||
|
||||
# VSX instructions masqueraded as AltiVec/VMX
|
||||
my $mtvrd = sub {
|
||||
my ($f, $vrt, $ra) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($vrt<<21)|($ra<<16)|(179<<1)|1;
|
||||
};
|
||||
my $mtvrwz = sub {
|
||||
my ($f, $vrt, $ra) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($vrt<<21)|($ra<<16)|(243<<1)|1;
|
||||
};
|
||||
|
||||
# PowerISA 3.0 stuff
|
||||
my $maddhdu = sub {
|
||||
my ($f, $rt, $ra, $rb, $rc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|49;
|
||||
};
|
||||
my $maddld = sub {
|
||||
my ($f, $rt, $ra, $rb, $rc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|51;
|
||||
};
|
||||
my $maddhdu = sub { vfour(@_,49); };
|
||||
my $maddld = sub { vfour(@_,51); };
|
||||
my $darn = sub {
|
||||
my ($f, $rt, $l) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($l<<16)|(755<<1);
|
||||
@@ -270,16 +283,20 @@ my $iseleq = sub {
|
||||
my ($f, $rt, $ra, $rb) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($ra<<16)|($rb<<11)|(2<<6)|30;
|
||||
};
|
||||
# VSX instruction[s] masqueraded as made-up AltiVec/VMX
|
||||
my $vspltib = sub { # xxspltib
|
||||
my ($f, $vrt, $imm8) = @_;
|
||||
$imm8 = oct($imm8) if ($imm8 =~ /^0/);
|
||||
$imm8 &= 0xff;
|
||||
" .long ".sprintf "0x%X",(60<<26)|($vrt<<21)|($imm8<<11)|(360<<1)|1;
|
||||
};
|
||||
|
||||
# PowerISA 3.0B stuff
|
||||
my $addex = sub {
|
||||
my ($f, $rt, $ra, $rb, $cy) = @_; # only cy==0 is specified in 3.0B
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($cy<<9)|(170<<1);
|
||||
};
|
||||
my $vmsumudm = sub {
|
||||
my ($f, $vrt, $vra, $vrb, $vrc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|($vrc<<6)|35;
|
||||
};
|
||||
my $vmsumudm = sub { vfour(@_,35); };
|
||||
|
||||
while($line=<>) {
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ SOURCE[../../libcrypto]=\
|
||||
x509_obj.c x509_req.c x509spki.c x509_vfy.c \
|
||||
x509_set.c x509cset.c x509rset.c x509_err.c \
|
||||
x509name.c x509_v3.c x509_ext.c x509_att.c \
|
||||
x509type.c x509_lu.c x_all.c x509_txt.c \
|
||||
x509type.c x509_meth.c x509_lu.c x_all.c x509_txt.c \
|
||||
x509_trs.c by_file.c by_dir.c x509_vpm.c \
|
||||
x_crl.c t_crl.c x_req.c t_req.c x_x509.c t_x509.c \
|
||||
x_pubkey.c x_x509a.c x_attrib.c x_exten.c x_name.c
|
||||
@@ -110,7 +110,7 @@ static int new_dir(X509_LOOKUP *lu)
|
||||
X509err(X509_F_NEW_DIR, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
lu->method_data = (char *)a;
|
||||
lu->method_data = a;
|
||||
return 1;
|
||||
|
||||
err:
|
||||
|
||||
@@ -61,6 +61,8 @@ static const ERR_STRING_DATA X509_str_functs[] = {
|
||||
"X509_load_cert_file"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_LOAD_CRL_FILE, 0),
|
||||
"X509_load_crl_file"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_LOOKUP_METH_NEW, 0),
|
||||
"X509_LOOKUP_meth_new"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_LOOKUP_NEW, 0), "X509_LOOKUP_new"},
|
||||
{ERR_PACK(ERR_LIB_X509, X509_F_X509_NAME_ADD_ENTRY, 0),
|
||||
"X509_NAME_add_entry"},
|
||||
|
||||
@@ -69,7 +69,7 @@ struct x509_crl_method_st {
|
||||
};
|
||||
|
||||
struct x509_lookup_method_st {
|
||||
const char *name;
|
||||
char *name;
|
||||
int (*new_item) (X509_LOOKUP *ctx);
|
||||
void (*free) (X509_LOOKUP *ctx);
|
||||
int (*init) (X509_LOOKUP *ctx);
|
||||
@@ -93,7 +93,7 @@ struct x509_lookup_st {
|
||||
int init; /* have we been started */
|
||||
int skip; /* don't use us. */
|
||||
X509_LOOKUP_METHOD *method; /* the functions */
|
||||
char *method_data; /* method data */
|
||||
void *method_data; /* method data */
|
||||
X509_STORE *store_ctx; /* who owns us */
|
||||
};
|
||||
|
||||
|
||||
+45
-2
@@ -118,6 +118,23 @@ int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
return ctx->method->get_by_alias(ctx, type, str, len, ret);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data)
|
||||
{
|
||||
ctx->method_data = data;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx)
|
||||
{
|
||||
return ctx->method_data;
|
||||
}
|
||||
|
||||
X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx)
|
||||
{
|
||||
return ctx->store_ctx;
|
||||
}
|
||||
|
||||
|
||||
static int x509_object_cmp(const X509_OBJECT *const *a,
|
||||
const X509_OBJECT *const *b)
|
||||
{
|
||||
@@ -403,8 +420,7 @@ X509_OBJECT *X509_OBJECT_new(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void X509_OBJECT_free(X509_OBJECT *a)
|
||||
static void x509_object_free_internal(X509_OBJECT *a)
|
||||
{
|
||||
if (a == NULL)
|
||||
return;
|
||||
@@ -418,6 +434,33 @@ void X509_OBJECT_free(X509_OBJECT *a)
|
||||
X509_CRL_free(a->data.crl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj)
|
||||
{
|
||||
if (a == NULL || !X509_up_ref(obj))
|
||||
return 0;
|
||||
|
||||
x509_object_free_internal(a);
|
||||
a->type = X509_LU_X509;
|
||||
a->data.x509 = obj;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj)
|
||||
{
|
||||
if (a == NULL || !X509_CRL_up_ref(obj))
|
||||
return 0;
|
||||
|
||||
x509_object_free_internal(a);
|
||||
a->type = X509_LU_CRL;
|
||||
a->data.crl = obj;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void X509_OBJECT_free(X509_OBJECT *a)
|
||||
{
|
||||
x509_object_free_internal(a);
|
||||
OPENSSL_free(a);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (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 <stdio.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/ossl_typ.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name)
|
||||
{
|
||||
X509_LOOKUP_METHOD *method = OPENSSL_zalloc(sizeof(X509_LOOKUP_METHOD));
|
||||
|
||||
if (method != NULL) {
|
||||
method->name = OPENSSL_strdup(name);
|
||||
if (method->name == NULL) {
|
||||
X509err(X509_F_X509_LOOKUP_METH_NEW, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
return method;
|
||||
|
||||
err:
|
||||
OPENSSL_free(method);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
if (method != NULL)
|
||||
OPENSSL_free(method->name);
|
||||
OPENSSL_free(method);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method,
|
||||
int (*new_item) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->new_item = new_item;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->new_item;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_free(
|
||||
X509_LOOKUP_METHOD *method,
|
||||
void (*free) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->free = free;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->free;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method,
|
||||
int (*init) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->init = init;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->init;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_shutdown(
|
||||
X509_LOOKUP_METHOD *method,
|
||||
int (*shutdown) (X509_LOOKUP *ctx))
|
||||
{
|
||||
method->shutdown = shutdown;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx)
|
||||
{
|
||||
return method->shutdown;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_ctrl(
|
||||
X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_ctrl_fn ctrl)
|
||||
{
|
||||
method->ctrl = ctrl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->ctrl;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_subject_fn get_by_subject)
|
||||
{
|
||||
method->get_by_subject = get_by_subject;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject(
|
||||
const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_subject;
|
||||
}
|
||||
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_issuer_serial_fn get_by_issuer_serial)
|
||||
{
|
||||
method->get_by_issuer_serial = get_by_issuer_serial;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_issuer_serial_fn
|
||||
X509_LOOKUP_meth_get_get_by_issuer_serial(const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_issuer_serial;
|
||||
}
|
||||
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_fingerprint_fn get_by_fingerprint)
|
||||
{
|
||||
method->get_by_fingerprint = get_by_fingerprint;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint(
|
||||
const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_fingerprint;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_alias_fn get_by_alias)
|
||||
{
|
||||
method->get_by_alias = get_by_alias;
|
||||
return 1;
|
||||
}
|
||||
|
||||
X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias(
|
||||
const X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
return method->get_by_alias;
|
||||
}
|
||||
|
||||
+10
-4
@@ -16,6 +16,8 @@ B<openssl speed>
|
||||
[B<-rand file...>]
|
||||
[B<-writerand file>]
|
||||
[B<-primes num>]
|
||||
[B<-seconds num>]
|
||||
[B<-bytes num>]
|
||||
[B<algorithm...>]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -42,12 +44,16 @@ for all available algorithms.
|
||||
|
||||
=item B<-elapsed>
|
||||
|
||||
Measure time in real time instead of CPU time. It can be useful when testing
|
||||
speed of hardware engines.
|
||||
When calculating operations- or bytes-per-second, use wall-clock time
|
||||
instead of CPU user time as divisor. It can be useful when testing speed
|
||||
of hardware engines.
|
||||
|
||||
=item B<-evp algo>
|
||||
|
||||
Use the specified cipher or message digest algorithm via the EVP interface.
|
||||
If B<algo> is an AEAD cipher, then you can pass <-aead> to benchmark a
|
||||
TLS-like sequence. And if B<algo> is a multi-buffer capable cipher, e.g.
|
||||
aes-128-cbc-hmac-sha1, then B<-mb> will time multi-buffer operation.
|
||||
|
||||
=item B<-decrypt>
|
||||
|
||||
@@ -81,8 +87,8 @@ Run benchmarks on B<num>-byte buffers. Affects ciphers, digests and the CSPRNG.
|
||||
|
||||
=item B<[zero or more test algorithms]>
|
||||
|
||||
If any options are given, B<speed> tests those algorithms, otherwise all of
|
||||
the above are tested.
|
||||
If any options are given, B<speed> tests those algorithms, otherwise a
|
||||
pre-compiled grand selection is tested.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ L<PEM_read_PrivateKey(3)>,
|
||||
L<X509_STORE_load_locations(3)>,
|
||||
L<X509_store_add_lookup(3)>,
|
||||
L<SSL_CTX_load_verify_locations(3)>,
|
||||
L<X509_LOOKUP_meth_new(3)>,
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
X509_LOOKUP_meth_new, X509_LOOKUP_meth_free, X509_LOOKUP_meth_set_new_item,
|
||||
X509_LOOKUP_meth_get_new_item, X509_LOOKUP_meth_set_free,
|
||||
X509_LOOKUP_meth_get_free, X509_LOOKUP_meth_set_init,
|
||||
X509_LOOKUP_meth_get_init, X509_LOOKUP_meth_set_shutdown,
|
||||
X509_LOOKUP_meth_get_shutdown,
|
||||
X509_LOOKUP_ctrl_fn, X509_LOOKUP_meth_set_ctrl, X509_LOOKUP_meth_get_ctrl,
|
||||
X509_LOOKUP_get_by_subject_fn, X509_LOOKUP_meth_set_get_by_subject,
|
||||
X509_LOOKUP_meth_get_get_by_subject,
|
||||
X509_LOOKUP_get_by_issuer_serial_fn, X509_LOOKUP_meth_set_get_by_issuer_serial,
|
||||
X509_LOOKUP_meth_get_get_by_issuer_serial,
|
||||
X509_LOOKUP_get_by_fingerprint_fn, X509_LOOKUP_meth_set_get_by_fingerprint,
|
||||
X509_LOOKUP_meth_get_get_by_fingerprint,
|
||||
X509_LOOKUP_get_by_alias_fn, X509_LOOKUP_meth_set_get_by_alias,
|
||||
X509_LOOKUP_meth_get_get_by_alias,
|
||||
X509_LOOKUP_set_method_data, X509_LOOKUP_get_method_data,
|
||||
X509_LOOKUP_get_store, X509_OBJECT_set1_X509, X509_OBJECT_set1_X509_CRL
|
||||
- Routines to build up X509_LOOKUP methods
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/x509_vfy.h>
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name);
|
||||
void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method,
|
||||
int (*new_item) (X509_LOOKUP *ctx));
|
||||
int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method,
|
||||
void (*free) (X509_LOOKUP *ctx));
|
||||
void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method,
|
||||
int (*init) (X509_LOOKUP *ctx));
|
||||
int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method,
|
||||
int (*shutdown) (X509_LOOKUP *ctx));
|
||||
int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc,
|
||||
long argl, char **ret);
|
||||
int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_ctrl_fn ctrl_fn);
|
||||
X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method);
|
||||
|
||||
typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_subject_fn fn);
|
||||
X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name,
|
||||
ASN1_INTEGER *serial,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_meth_set_get_by_issuer_serial(
|
||||
X509_LOOKUP_METHOD *method, X509_LOOKUP_get_by_issuer_serial_fn fn);
|
||||
X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
const unsigned char* bytes,
|
||||
int len,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_fingerprint_fn fn);
|
||||
X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
const char *str,
|
||||
int len,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_alias_fn fn);
|
||||
X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data);
|
||||
void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx);
|
||||
|
||||
X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx);
|
||||
|
||||
int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj);
|
||||
int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The B<X509_LOOKUP_METHOD> type is a structure used for the implementation of new
|
||||
X509_LOOKUP types. It provides a set of functions used by OpenSSL for the
|
||||
implementation of various X509 and X509_CRL lookup capabilities. One instance
|
||||
of an X509_LOOKUP_METHOD can be associated to many instantiations of an
|
||||
B<X509_LOOKUP> structure.
|
||||
|
||||
X509_LOOKUP_meth_new() creates a new B<X509_LOOKUP_METHOD> structure. It should
|
||||
be given a human-readable string containing a brief description of the lookup
|
||||
method.
|
||||
|
||||
X509_LOOKUP_meth_free() destroys a B<X509_LOOKUP_METHOD> structure.
|
||||
|
||||
X509_LOOKUP_get_new_item() and X509_LOOKUP_set_new_item() get and set the
|
||||
function that is called when an B<X509_LOOKUP> object is created with
|
||||
X509_LOOKUP_new(). If an X509_LOOKUP_METHOD requires any per-X509_LOOKUP
|
||||
specific data, the supplied new_item function should allocate this data and
|
||||
invoke X509_LOOKUP_set_method_data().
|
||||
|
||||
X509_LOOKUP_get_free() and X509_LOOKUP_set_free() get and set the function
|
||||
that is used to free any method data that was allocated and set from within
|
||||
new_item function.
|
||||
|
||||
X509_LOOKUP_meth_get_init() and X509_LOOKUP_meth_set_init() get and set the
|
||||
function that is used to initialize the method data that was set with
|
||||
X509_LOOKUP_set_method_data() as part of the new_item routine.
|
||||
|
||||
X509_LOOKUP_meth_get_shutdown() and X509_LOOKUP_meth_set_shutdown() get and set
|
||||
the function that is used to shut down the method data whose state was
|
||||
previously initialized in the init function.
|
||||
|
||||
X509_LOOKUP_meth_get_ctrl() and X509_LOOKUP_meth_set_ctrl() get and set a
|
||||
function to be used to handle arbitrary control commands issued by
|
||||
X509_LOOKUP_ctrl(). The control function is given the X509_LOOKUP
|
||||
B<ctx>, along with the arguments passed by X509_LOOKUP_ctrl. B<cmd> is
|
||||
an arbitrary integer that defines some operation. B<argc> is a pointer
|
||||
to an array of characters. B<argl> is an integer. B<ret>, if set,
|
||||
points to a location where any return data should be written to. How
|
||||
B<argc> and B<argl> are used depends entirely on the control function.
|
||||
|
||||
|
||||
X509_LOOKUP_set_get_by_subject(), X509_LOOKUP_set_get_by_issuer_serial(),
|
||||
X509_LOOKUP_set_get_by_fingerprint(), X509_LOOKUP_set_get_by_alias() set
|
||||
the functions used to retrieve an X509 or X509_CRL object by the object's
|
||||
subject, issuer, fingerprint, and alias respectively. These functions are given
|
||||
the X509_LOOKUP context, the type of the X509_OBJECT being requested, parameters
|
||||
related to the lookup, and an X509_OBJECT that will receive the requested
|
||||
object.
|
||||
|
||||
Implementations should use either X509_OBJECT_set1_X509() or
|
||||
X509_OBJECT_set1_X509_CRL() to set the result. Any method data that was
|
||||
created as a result of the new_item function set by
|
||||
X509_LOOKUP_meth_set_new_item() can be accessed with
|
||||
X509_LOOKUP_get_method_data(). The B<X509_STORE> object that owns the
|
||||
X509_LOOKUP may be accessed with X509_LOOKUP_get_store(). Successful lookups
|
||||
should return 1, and unsuccessful lookups should return 0.
|
||||
|
||||
X509_LOOKUP_get_get_by_subject(), X509_LOOKUP_get_get_by_issuer_serial(),
|
||||
X509_LOOKUP_get_get_by_fingerprint(), X509_LOOKUP_get_get_by_alias() retrieve
|
||||
the function set by the corresponding setter.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The B<X509_LOOKUP_meth_set> functions return 1 on success or 0 on error.
|
||||
|
||||
The B<X509_LOOKUP_meth_get> functions return the corresponding function
|
||||
pointers.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<X509_STORE_new(3)>, L<SSL_CTX_set_cert_store(3)>
|
||||
|
||||
=head1 HISTORY
|
||||
|
||||
The functions described here were added in OpenSSL 1.1.0i.
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the OpenSSL license (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
|
||||
L<https://www.openssl.org/source/license.html>.
|
||||
|
||||
=cut
|
||||
@@ -0,0 +1,74 @@
|
||||
=pod
|
||||
|
||||
=begin comment
|
||||
|
||||
This is a recommended way to describe OSSL_STORE loaders,
|
||||
"ossl_store-{name}", where {name} is replaced with the name of the
|
||||
scheme it implements, in man section 7.
|
||||
|
||||
=end comment
|
||||
|
||||
=head1 NAME
|
||||
|
||||
ossl_store-file - The store 'file' scheme loader
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
=for comment generic
|
||||
|
||||
#include <openssl/store.h>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Support for the 'file' scheme is built into C<libcrypto>.
|
||||
Since files come in all kinds of formats and content types, the 'file'
|
||||
scheme has its own layer of functionality called "file handlers",
|
||||
which are used to try to decode diverse types of file contents.
|
||||
|
||||
In case a file is formatted as PEM, each called file handler receives
|
||||
the PEM name (everything following any 'C<-----BEGIN >') as well as
|
||||
possible PEM headers, together with the decoded PEM body. Since PEM
|
||||
formatted files can contain more than one object, the file handlers
|
||||
are called upon for each such object.
|
||||
|
||||
If the file isn't determined to be formatted as PEM, the content is
|
||||
loaded in raw form in its entirety and passed to the available file
|
||||
handlers as is, with no PEM name or headers.
|
||||
|
||||
Each file handler is expected to handle PEM and non-PEM content as
|
||||
appropriate. Some may refuse non-PEM content for the sake of
|
||||
determinism (for example, there are keys out in the wild that are
|
||||
represented as an ASN.1 OCTET STRING. In raw form, it's not easily
|
||||
possible to distinguish those from any other data coming as an ASN.1
|
||||
OCTET STRING, so such keys would naturally be accepted as PEM files
|
||||
only).
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
When needed, the 'file' scheme loader will require a pass phrase by
|
||||
using the C<UI_METHOD> that was passed via OSSL_STORE_open().
|
||||
This pass phrase is used as it is, which may present some challenge
|
||||
when the file that's loaded contains a PKCS#12 object.
|
||||
See L<passphrase-encoding(7)> for more information.
|
||||
|
||||
=begin comment
|
||||
|
||||
The treatment of pass phrases is currently being worked on and may
|
||||
change.
|
||||
|
||||
=end comment
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<ossl_store(7)>, L<passphrase-encoding(7)>
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the OpenSSL license (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
|
||||
L<https://www.openssl.org/source/license.html>.
|
||||
|
||||
=cut
|
||||
+2
-24
@@ -30,30 +30,8 @@ from which an OpenSSL type can be retrieved.
|
||||
Support for a URI scheme is called a STORE "loader", and can be added
|
||||
dynamically from the calling application or from a loadable engine.
|
||||
|
||||
=head2 The 'file' scheme
|
||||
|
||||
Support for the 'file' scheme is already built into C<libcrypto>.
|
||||
Since files come in all kinds of formats and content types, the 'file'
|
||||
scheme has its own layer of functionality called "file handlers",
|
||||
which are used to try to decode diverse types of file contents.
|
||||
|
||||
In case a file is formatted as PEM, each called file handler receives
|
||||
the PEM name (everything following any 'C<-----BEGIN >') as well as
|
||||
possible PEM headers, together with the decoded PEM body. Since PEM
|
||||
formatted files can contain more than one object, the file handlers
|
||||
are called upon for each such object.
|
||||
|
||||
If the file isn't determined to be formatted as PEM, the content is
|
||||
loaded in raw form in its entirety and passed to the available file
|
||||
handlers as is, with no PEM name or headers.
|
||||
|
||||
Each file handler is expected to handle PEM and non-PEM content as
|
||||
appropriate. Some may refuse non-PEM content for the sake of
|
||||
determinism (for example, there are keys out in the wild that are
|
||||
represented as an ASN.1 OCTET STRING. In raw form, it's not easily
|
||||
possible to distinguish those from any other data coming as an ASN.1
|
||||
OCTET STRING, so such keys would naturally be accepted as PEM files
|
||||
only).
|
||||
Support for the 'file' scheme is built into C<libcrypto>.
|
||||
See L<ossl_store-file(7)> for more information.
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
|
||||
@@ -261,7 +261,9 @@ X509_OBJECT *X509_OBJECT_new(void);
|
||||
void X509_OBJECT_free(X509_OBJECT *a);
|
||||
X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a);
|
||||
X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a);
|
||||
int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj);
|
||||
X509_CRL *X509_OBJECT_get0_X509_CRL(X509_OBJECT *a);
|
||||
int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj);
|
||||
X509_STORE *X509_STORE_new(void);
|
||||
void X509_STORE_free(X509_STORE *v);
|
||||
int X509_STORE_lock(X509_STORE *ctx);
|
||||
@@ -368,6 +370,76 @@ X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m);
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void);
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_file(void);
|
||||
|
||||
typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc,
|
||||
long argl, char **ret);
|
||||
typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name,
|
||||
ASN1_INTEGER *serial,
|
||||
X509_OBJECT *ret);
|
||||
typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
const unsigned char* bytes,
|
||||
int len,
|
||||
X509_OBJECT *ret);
|
||||
typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx,
|
||||
X509_LOOKUP_TYPE type,
|
||||
const char *str,
|
||||
int len,
|
||||
X509_OBJECT *ret);
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name);
|
||||
void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method,
|
||||
int (*new_item) (X509_LOOKUP *ctx));
|
||||
int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method,
|
||||
void (*free) (X509_LOOKUP *ctx));
|
||||
void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method,
|
||||
int (*init) (X509_LOOKUP *ctx));
|
||||
int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method,
|
||||
int (*shutdown) (X509_LOOKUP *ctx));
|
||||
int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method))
|
||||
(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_ctrl_fn ctrl_fn);
|
||||
X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_subject_fn fn);
|
||||
X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_issuer_serial_fn fn);
|
||||
X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_fingerprint_fn fn);
|
||||
X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method,
|
||||
X509_LOOKUP_get_by_alias_fn fn);
|
||||
X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias(
|
||||
const X509_LOOKUP_METHOD *method);
|
||||
|
||||
|
||||
int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
|
||||
int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
|
||||
|
||||
@@ -397,6 +469,9 @@ int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
const char *str, int len, X509_OBJECT *ret);
|
||||
int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data);
|
||||
void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx);
|
||||
X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx);
|
||||
int X509_LOOKUP_shutdown(X509_LOOKUP *ctx);
|
||||
|
||||
int X509_STORE_load_locations(X509_STORE *ctx,
|
||||
|
||||
@@ -49,6 +49,7 @@ int ERR_load_X509_strings(void);
|
||||
# define X509_F_X509_LOAD_CERT_CRL_FILE 132
|
||||
# define X509_F_X509_LOAD_CERT_FILE 111
|
||||
# define X509_F_X509_LOAD_CRL_FILE 112
|
||||
# define X509_F_X509_LOOKUP_METH_NEW 160
|
||||
# define X509_F_X509_LOOKUP_NEW 155
|
||||
# define X509_F_X509_NAME_ADD_ENTRY 113
|
||||
# define X509_F_X509_NAME_CANON 156
|
||||
|
||||
+4
-4
@@ -171,7 +171,7 @@ static SSL_CIPHER ssl3_ciphers[] = {
|
||||
SSL_aRSA,
|
||||
SSL_3DES,
|
||||
SSL_SHA1,
|
||||
SSL3_VERSION, TLS1_2_VERSION,
|
||||
SSL3_VERSION, TLS1_VERSION,
|
||||
DTLS1_BAD_VER, DTLS1_2_VERSION,
|
||||
SSL_NOT_DEFAULT | SSL_MEDIUM | SSL_FIPS,
|
||||
SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF,
|
||||
@@ -236,8 +236,8 @@ static SSL_CIPHER ssl3_ciphers[] = {
|
||||
SSL_aRSA,
|
||||
SSL_AES128,
|
||||
SSL_SHA1,
|
||||
SSL3_VERSION, TLS1_2_VERSION,
|
||||
DTLS1_BAD_VER, DTLS1_2_VERSION,
|
||||
SSL3_VERSION, TLS1_VERSION,
|
||||
DTLS1_BAD_VER, DTLS1_VERSION,
|
||||
SSL_HIGH | SSL_FIPS,
|
||||
SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF,
|
||||
128,
|
||||
@@ -300,7 +300,7 @@ static SSL_CIPHER ssl3_ciphers[] = {
|
||||
SSL_aRSA,
|
||||
SSL_AES256,
|
||||
SSL_SHA1,
|
||||
SSL3_VERSION, TLS1_2_VERSION,
|
||||
SSL3_VERSION, TLS1_VERSION,
|
||||
DTLS1_BAD_VER, DTLS1_2_VERSION,
|
||||
SSL_HIGH | SSL_FIPS,
|
||||
SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF,
|
||||
|
||||
@@ -383,11 +383,6 @@
|
||||
# define SSL_PKEY_ED25519 7
|
||||
# define SSL_PKEY_ED448 8
|
||||
# define SSL_PKEY_NUM 9
|
||||
/*
|
||||
* Pseudo-constant. GOST cipher suites can use different certs for 1
|
||||
* SSL_CIPHER. So let's see which one we have in fact.
|
||||
*/
|
||||
# define SSL_PKEY_GOST_EC SSL_PKEY_NUM+1
|
||||
|
||||
/*-
|
||||
* SSL_kRSA <- RSA_ENC
|
||||
|
||||
+10
-1
@@ -1427,10 +1427,19 @@ int tls_psk_do_binder(SSL *s, const EVP_MD *md, const unsigned char *msgstart,
|
||||
const char external_label[] = "ext binder";
|
||||
const char nonce_label[] = "resumption";
|
||||
const char *label;
|
||||
size_t bindersize, labelsize, psklen, hashsize = EVP_MD_size(md);
|
||||
size_t bindersize, labelsize, psklen, hashsize;
|
||||
int hashsizei = EVP_MD_size(md);
|
||||
int ret = -1;
|
||||
int usepskfored = 0;
|
||||
|
||||
/* Ensure cast to size_t is safe */
|
||||
if (!ossl_assert(hashsizei >= 0)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PSK_DO_BINDER,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
hashsize = (size_t)hashsizei;
|
||||
|
||||
if (external
|
||||
&& s->early_data_state == SSL_EARLY_DATA_CONNECTING
|
||||
&& s->session->ext.max_early_data == 0
|
||||
|
||||
+21
-1
@@ -661,7 +661,12 @@ static const uint16_t tls12_sigalgs[] = {
|
||||
|
||||
TLSEXT_SIGALG_dsa_sha256,
|
||||
TLSEXT_SIGALG_dsa_sha384,
|
||||
TLSEXT_SIGALG_dsa_sha512
|
||||
TLSEXT_SIGALG_dsa_sha512,
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_GOST
|
||||
TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256,
|
||||
TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512,
|
||||
TLSEXT_SIGALG_gostr34102001_gostr3411,
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -857,6 +862,21 @@ static const SIGALG_LOOKUP *tls1_get_legacy_sigalg(const SSL *s, int idx)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Some GOST ciphersuites allow more than one signature algorithms
|
||||
* */
|
||||
if (idx == SSL_PKEY_GOST01 && s->s3->tmp.new_cipher->algorithm_auth != SSL_aGOST01) {
|
||||
int real_idx;
|
||||
|
||||
for (real_idx = SSL_PKEY_GOST12_512; real_idx >= SSL_PKEY_GOST01;
|
||||
real_idx--) {
|
||||
if (s->cert->pkeys[real_idx].privatekey != NULL) {
|
||||
idx = real_idx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
idx = s->cert->key - s->cert->pkeys;
|
||||
}
|
||||
|
||||
+19
-2
@@ -129,6 +129,7 @@ int tls13_generate_secret(SSL *s, const EVP_MD *md,
|
||||
unsigned char *outsecret)
|
||||
{
|
||||
size_t mdlen, prevsecretlen;
|
||||
int mdleni;
|
||||
int ret;
|
||||
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);
|
||||
static const char derived_secret_label[] = "derived";
|
||||
@@ -140,7 +141,14 @@ int tls13_generate_secret(SSL *s, const EVP_MD *md,
|
||||
return 0;
|
||||
}
|
||||
|
||||
mdlen = EVP_MD_size(md);
|
||||
mdleni = EVP_MD_size(md);
|
||||
/* Ensure cast to size_t is safe */
|
||||
if (!ossl_assert(mdleni >= 0)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
mdlen = (size_t)mdleni;
|
||||
|
||||
if (insecret == NULL) {
|
||||
insecret = default_zeros;
|
||||
@@ -316,7 +324,16 @@ static int derive_secret_key_and_iv(SSL *s, int sending, const EVP_MD *md,
|
||||
{
|
||||
unsigned char key[EVP_MAX_KEY_LENGTH];
|
||||
size_t ivlen, keylen, taglen;
|
||||
size_t hashlen = EVP_MD_size(md);
|
||||
int hashleni = EVP_MD_size(md);
|
||||
size_t hashlen;
|
||||
|
||||
/* Ensure cast to size_t is safe */
|
||||
if (!ossl_assert(hashleni >= 0)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_DERIVE_SECRET_KEY_AND_IV,
|
||||
ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
}
|
||||
hashlen = (size_t)hashleni;
|
||||
|
||||
if (!tls13_hkdf_expand(s, md, insecret, label, labellen, hash, hashlen,
|
||||
secret, hashlen)) {
|
||||
|
||||
@@ -15,6 +15,8 @@ use OpenSSL::Test::Utils;
|
||||
my $test_name = "test_store";
|
||||
setup($test_name);
|
||||
|
||||
my $mingw = config('target') =~ m|^mingw|;
|
||||
|
||||
my @noexist_files =
|
||||
( "test/blahdiblah.pem",
|
||||
"test/blahdibleh.der" );
|
||||
@@ -104,8 +106,9 @@ indir "store_$$" => sub {
|
||||
|
||||
ok(run(app(["openssl", "storeutl", "-noout", $file])));
|
||||
ok(run(app(["openssl", "storeutl", "-noout", to_abs_file($file)])));
|
||||
SKIP:
|
||||
{
|
||||
local $ENV{MSYS2_ARG_CONV_EXCL} = "file:";
|
||||
skip "file: tests disabled on MingW", 4 if $mingw;
|
||||
|
||||
ok(run(app(["openssl", "storeutl", "-noout",
|
||||
to_abs_file_uri($file)])));
|
||||
@@ -123,8 +126,9 @@ indir "store_$$" => sub {
|
||||
ok(run(app(["openssl", "storeutl", "-noout", "-passin",
|
||||
"pass:password", to_abs_file($_)])));
|
||||
|
||||
SKIP:
|
||||
{
|
||||
local $ENV{MSYS2_ARG_CONV_EXCL} = "file:";
|
||||
skip "file: tests disabled on MingW", 2 if $mingw;
|
||||
|
||||
ok(run(app(["openssl", "storeutl", "-noout", "-passin",
|
||||
"pass:password", to_abs_file_uri($_)])));
|
||||
@@ -133,23 +137,30 @@ indir "store_$$" => sub {
|
||||
}
|
||||
}
|
||||
foreach (values %generated_file_files) {
|
||||
local $ENV{MSYS2_ARG_CONV_EXCL} = "file:";
|
||||
SKIP:
|
||||
{
|
||||
skip "file: tests disabled on MingW", 1 if $mingw;
|
||||
|
||||
ok(run(app(["openssl", "storeutl", "-noout", $_])));
|
||||
}
|
||||
}
|
||||
foreach (@noexist_file_files) {
|
||||
local $ENV{MSYS2_ARG_CONV_EXCL} = "file:";
|
||||
SKIP:
|
||||
{
|
||||
skip "file: tests disabled on MingW", 1 if $mingw;
|
||||
|
||||
ok(!run(app(["openssl", "storeutl", "-noout", $_])));
|
||||
}
|
||||
}
|
||||
{
|
||||
my $dir = srctop_dir("test", "certs");
|
||||
|
||||
ok(run(app(["openssl", "storeutl", "-noout", $dir])));
|
||||
ok(run(app(["openssl", "storeutl", "-noout",
|
||||
to_abs_file($dir, 1)])));
|
||||
SKIP:
|
||||
{
|
||||
local $ENV{MSYS2_ARG_CONV_EXCL} = "file:";
|
||||
skip "file: tests disabled on MingW", 1 if $mingw;
|
||||
|
||||
ok(run(app(["openssl", "storeutl", "-noout",
|
||||
to_abs_file_uri($dir, 1)])));
|
||||
|
||||
@@ -4548,3 +4548,28 @@ RSA_get0_p 4489 1_1_1 EXIST::FUNCTION:RSA
|
||||
RSA_get0_iqmp 4490 1_1_1 EXIST::FUNCTION:RSA
|
||||
ECDSA_SIG_get0_r 4491 1_1_1 EXIST::FUNCTION:EC
|
||||
ECDSA_SIG_get0_s 4492 1_1_1 EXIST::FUNCTION:EC
|
||||
X509_LOOKUP_meth_get_get_by_fingerprint 4493 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_new 4494 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_init 4495 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_get_by_alias 4496 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_new_item 4497 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_shutdown 4498 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_new_item 4499 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_ctrl 4500 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_get_by_issuer_serial 4501 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_get_store 4502 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_ctrl 4503 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_get_by_alias 4504 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_get_by_subject 4505 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_free 4506 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_get_by_subject 4507 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_free 4508 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_shutdown 4509 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_set_method_data 4510 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_get_method_data 4511 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_get_by_fingerprint 4512 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_free 4513 1_1_0i EXIST::FUNCTION:
|
||||
X509_OBJECT_set1_X509 4514 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_get_get_by_issuer_serial 4515 1_1_0i EXIST::FUNCTION:
|
||||
X509_LOOKUP_meth_set_init 4516 1_1_0i EXIST::FUNCTION:
|
||||
X509_OBJECT_set1_X509_CRL 4517 1_1_0i EXIST::FUNCTION:
|
||||
@@ -73,6 +73,11 @@ X509_STORE_CTX_lookup_crls_fn datatype
|
||||
X509_STORE_CTX_verify_cb datatype
|
||||
X509_STORE_CTX_verify_fn datatype
|
||||
X509_STORE_set_verify_cb_func datatype
|
||||
X509_LOOKUP_get_by_alias_fn datatype
|
||||
X509_LOOKUP_get_by_subject_fn datatype
|
||||
X509_LOOKUP_get_by_fingerprint_fn datatype
|
||||
X509_LOOKUP_ctrl_fn datatype
|
||||
X509_LOOKUP_get_by_issuer_serial_fn datatype
|
||||
bio_info_cb datatype
|
||||
BIO_info_cb datatype
|
||||
custom_ext_add_cb datatype
|
||||
|
||||
Reference in New Issue
Block a user