sync with OpenBSD -current

This commit is contained in:
purplerain 2023-12-30 04:25:26 +00:00
parent 505632e9be
commit 72a51d0b15
Signed by: purplerain
GPG Key ID: F42C07F07E2E35B7
41 changed files with 3131 additions and 1347 deletions

View File

@ -354,6 +354,8 @@
./usr/include/dev/ic/qlavar.h ./usr/include/dev/ic/qlavar.h
./usr/include/dev/ic/qlwreg.h ./usr/include/dev/ic/qlwreg.h
./usr/include/dev/ic/qlwvar.h ./usr/include/dev/ic/qlwvar.h
./usr/include/dev/ic/qwxreg.h
./usr/include/dev/ic/qwxvar.h
./usr/include/dev/ic/r92creg.h ./usr/include/dev/ic/r92creg.h
./usr/include/dev/ic/ramdac.h ./usr/include/dev/ic/ramdac.h
./usr/include/dev/ic/revar.h ./usr/include/dev/ic/revar.h
@ -1875,7 +1877,7 @@
./usr/share/man/man3/DSA_do_sign.3 ./usr/share/man/man3/DSA_do_sign.3
./usr/share/man/man3/DSA_dup_DH.3 ./usr/share/man/man3/DSA_dup_DH.3
./usr/share/man/man3/DSA_generate_key.3 ./usr/share/man/man3/DSA_generate_key.3
./usr/share/man/man3/DSA_generate_parameters.3 ./usr/share/man/man3/DSA_generate_parameters_ex.3
./usr/share/man/man3/DSA_get0_pqg.3 ./usr/share/man/man3/DSA_get0_pqg.3
./usr/share/man/man3/DSA_get_ex_new_index.3 ./usr/share/man/man3/DSA_get_ex_new_index.3
./usr/share/man/man3/DSA_meth_new.3 ./usr/share/man/man3/DSA_meth_new.3

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.159 2023/12/20 13:52:17 tb Exp $ # $OpenBSD: Makefile,v 1.162 2023/12/29 06:56:38 tb Exp $
LIB= crypto LIB= crypto
LIBREBUILD=y LIBREBUILD=y
@ -349,8 +349,6 @@ SRCS+= bio_b64.c
SRCS+= bio_enc.c SRCS+= bio_enc.c
SRCS+= bio_md.c SRCS+= bio_md.c
SRCS+= c_all.c SRCS+= c_all.c
SRCS+= cipher_method_lib.c
SRCS+= digest.c
SRCS+= e_aes.c SRCS+= e_aes.c
SRCS+= e_aes_cbc_hmac_sha1.c SRCS+= e_aes_cbc_hmac_sha1.c
SRCS+= e_bf.c SRCS+= e_bf.c
@ -368,12 +366,12 @@ SRCS+= e_rc4.c
SRCS+= e_rc4_hmac_md5.c SRCS+= e_rc4_hmac_md5.c
SRCS+= e_sm4.c SRCS+= e_sm4.c
SRCS+= e_xcbc_d.c SRCS+= e_xcbc_d.c
SRCS+= encode.c
SRCS+= evp_aead.c SRCS+= evp_aead.c
SRCS+= evp_enc.c SRCS+= evp_cipher.c
SRCS+= evp_digest.c
SRCS+= evp_encode.c
SRCS+= evp_err.c SRCS+= evp_err.c
SRCS+= evp_key.c SRCS+= evp_key.c
SRCS+= evp_lib.c
SRCS+= evp_pbe.c SRCS+= evp_pbe.c
SRCS+= evp_pkey.c SRCS+= evp_pkey.c
SRCS+= m_gost2814789.c SRCS+= m_gost2814789.c

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ameth_lib.c,v 1.37 2023/12/15 21:55:47 tb Exp $ */ /* $OpenBSD: ameth_lib.c,v 1.41 2023/12/29 19:00:31 tb Exp $ */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project 2006. * project 2006.
*/ */
@ -62,159 +62,11 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/evp.h> #include <openssl/evp.h>
#include "asn1_local.h"
#include "evp_local.h" #include "evp_local.h"
extern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD dh_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[];
extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD gostimit_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD gostr01_asn1_meths[];
extern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[];
extern const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD x25519_asn1_meth;
static const EVP_PKEY_ASN1_METHOD *asn1_methods[] = {
&cmac_asn1_meth,
&dh_asn1_meth,
&dsa_asn1_meths[0],
&dsa_asn1_meths[1],
&dsa_asn1_meths[2],
&dsa_asn1_meths[3],
&dsa_asn1_meths[4],
&eckey_asn1_meth,
&ed25519_asn1_meth,
&gostimit_asn1_meth,
&gostr01_asn1_meths[0],
&gostr01_asn1_meths[1],
&gostr01_asn1_meths[2],
&hmac_asn1_meth,
&rsa_asn1_meths[0],
&rsa_asn1_meths[1],
&rsa_pss_asn1_meth,
&x25519_asn1_meth,
};
#define N_ASN1_METHODS (sizeof(asn1_methods) / sizeof(asn1_methods[0]))
int
EVP_PKEY_asn1_get_count(void)
{
return N_ASN1_METHODS;
}
const EVP_PKEY_ASN1_METHOD *
EVP_PKEY_asn1_get0(int idx)
{
if (idx < 0 || idx >= N_ASN1_METHODS)
return NULL;
return asn1_methods[idx];
}
static const EVP_PKEY_ASN1_METHOD *
pkey_asn1_find(int pkey_id)
{
const EVP_PKEY_ASN1_METHOD *ameth;
int i;
for (i = EVP_PKEY_asn1_get_count() - 1; i >= 0; i--) {
ameth = EVP_PKEY_asn1_get0(i);
if (ameth->pkey_id == pkey_id)
return ameth;
}
return NULL;
}
/* /*
* Find an implementation of an ASN1 algorithm. If 'pe' is not NULL * XXX - remove all the API below here in the next major bump.
* also search through engines and set *pe to a functional reference
* to the engine implementing 'type' or NULL if no engine implements
* it.
*/ */
const EVP_PKEY_ASN1_METHOD *
EVP_PKEY_asn1_find(ENGINE **pe, int type)
{
const EVP_PKEY_ASN1_METHOD *mp;
if (pe != NULL)
*pe = NULL;
for (;;) {
if ((mp = pkey_asn1_find(type)) == NULL)
break;
if ((mp->pkey_flags & ASN1_PKEY_ALIAS) == 0)
break;
type = mp->pkey_base_id;
}
return mp;
}
const EVP_PKEY_ASN1_METHOD *
EVP_PKEY_asn1_find_str(ENGINE **pe, const char *str, int len)
{
const EVP_PKEY_ASN1_METHOD *ameth;
int i;
if (len == -1)
len = strlen(str);
if (pe != NULL)
*pe = NULL;
for (i = EVP_PKEY_asn1_get_count() - 1; i >= 0; i--) {
ameth = EVP_PKEY_asn1_get0(i);
if (ameth->pkey_flags & ASN1_PKEY_ALIAS)
continue;
if (((int)strlen(ameth->pem_str) == len) &&
!strncasecmp(ameth->pem_str, str, len))
return ameth;
}
return NULL;
}
int
EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth)
{
EVPerror(ERR_R_DISABLED);
return 0;
}
int
EVP_PKEY_asn1_add_alias(int to, int from)
{
EVPerror(ERR_R_DISABLED);
return 0;
}
int
EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, int *ppkey_flags,
const char **pinfo, const char **ppem_str,
const EVP_PKEY_ASN1_METHOD *ameth)
{
if (!ameth)
return 0;
if (ppkey_id)
*ppkey_id = ameth->pkey_id;
if (ppkey_base_id)
*ppkey_base_id = ameth->pkey_base_id;
if (ppkey_flags)
*ppkey_flags = ameth->pkey_flags;
if (pinfo)
*pinfo = ameth->info;
if (ppem_str)
*ppem_str = ameth->pem_str;
return 1;
}
const EVP_PKEY_ASN1_METHOD*
EVP_PKEY_get0_asn1(const EVP_PKEY *pkey)
{
return pkey->ameth;
}
EVP_PKEY_ASN1_METHOD* EVP_PKEY_ASN1_METHOD*
EVP_PKEY_asn1_new(int id, int flags, const char *pem_str, const char *info) EVP_PKEY_asn1_new(int id, int flags, const char *pem_str, const char *info)
@ -364,3 +216,17 @@ EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth,
{ {
ameth->pkey_param_check = pkey_param_check; ameth->pkey_param_check = pkey_param_check;
} }
int
EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth)
{
EVPerror(ERR_R_DISABLED);
return 0;
}
int
EVP_PKEY_asn1_add_alias(int to, int from)
{
EVPerror(ERR_R_DISABLED);
return 0;
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: asn1_local.h,v 1.4 2023/07/28 10:00:10 tb Exp $ */ /* $OpenBSD: asn1_local.h,v 1.5 2023/12/29 10:59:00 tb Exp $ */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project 2006. * project 2006.
*/ */
@ -89,70 +89,6 @@ struct asn1_pctx_st {
unsigned long str_flags; unsigned long str_flags;
} /* ASN1_PCTX */; } /* ASN1_PCTX */;
/* ASN1 public key method structure */
struct evp_pkey_asn1_method_st {
int pkey_id;
int pkey_base_id;
unsigned long pkey_flags;
char *pem_str;
char *info;
int (*pub_decode)(EVP_PKEY *pk, X509_PUBKEY *pub);
int (*pub_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk);
int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent,
ASN1_PCTX *pctx);
int (*priv_decode)(EVP_PKEY *pk, const PKCS8_PRIV_KEY_INFO *p8inf);
int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk);
int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent,
ASN1_PCTX *pctx);
int (*pkey_size)(const EVP_PKEY *pk);
int (*pkey_bits)(const EVP_PKEY *pk);
int (*pkey_security_bits)(const EVP_PKEY *pk);
int (*param_decode)(EVP_PKEY *pkey, const unsigned char **pder,
int derlen);
int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder);
int (*param_missing)(const EVP_PKEY *pk);
int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from);
int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent,
ASN1_PCTX *pctx);
int (*sig_print)(BIO *out, const X509_ALGOR *sigalg,
const ASN1_STRING *sig, int indent, ASN1_PCTX *pctx);
void (*pkey_free)(EVP_PKEY *pkey);
int (*pkey_ctrl)(EVP_PKEY *pkey, int op, long arg1, void *arg2);
/* Legacy functions for old PEM */
int (*old_priv_decode)(EVP_PKEY *pkey, const unsigned char **pder,
int derlen);
int (*old_priv_encode)(const EVP_PKEY *pkey, unsigned char **pder);
/* Custom ASN1 signature verification */
int (*item_verify)(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
X509_ALGOR *a, ASN1_BIT_STRING *sig, EVP_PKEY *pkey);
int (*item_sign)(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig);
int (*pkey_check)(const EVP_PKEY *pk);
int (*pkey_public_check)(const EVP_PKEY *pk);
int (*pkey_param_check)(const EVP_PKEY *pk);
int (*set_priv_key)(EVP_PKEY *pk, const unsigned char *private_key,
size_t len);
int (*set_pub_key)(EVP_PKEY *pk, const unsigned char *public_key,
size_t len);
int (*get_priv_key)(const EVP_PKEY *pk, unsigned char *out_private_key,
size_t *out_len);
int (*get_pub_key)(const EVP_PKEY *pk, unsigned char *out_public_key,
size_t *out_len);
} /* EVP_PKEY_ASN1_METHOD */;
/* Method to handle CRL access. /* Method to handle CRL access.
* In general a CRL could be very large (several Mb) and can consume large * In general a CRL could be very large (several Mb) and can consume large
* amounts of resources if stored in memory by multiple processes. * amounts of resources if stored in memory by multiple processes.

View File

@ -1,4 +1,4 @@
/* $OpenBSD: t_x509.c,v 1.43 2023/07/07 19:37:52 beck Exp $ */ /* $OpenBSD: t_x509.c,v 1.44 2023/12/29 10:59:00 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -77,7 +77,7 @@
#include <openssl/rsa.h> #include <openssl/rsa.h>
#endif #endif
#include "asn1_local.h" #include "evp_local.h"
#include "x509_local.h" #include "x509_local.h"
int int

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ec_ameth.c,v 1.45 2023/09/24 08:08:54 tb Exp $ */ /* $OpenBSD: ec_ameth.c,v 1.50 2023/12/29 18:49:06 tb Exp $ */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project 2006. * project 2006.
*/ */
@ -264,8 +264,8 @@ eckey_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey)) if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
goto err; goto err;
X509_ALGOR_get0(NULL, &ptype, &pval, palg);
X509_ALGOR_get0(NULL, &ptype, &pval, palg);
if (!eckey_from_params(ptype, pval, &eckey)) if (!eckey_from_params(ptype, pval, &eckey))
goto err; goto err;
@ -302,68 +302,72 @@ eckey_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
} }
static int static int
eckey_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8) eckey_compute_pubkey(EC_KEY *eckey)
{ {
const unsigned char *p = NULL;
const void *pval;
int ptype, pklen;
EC_KEY *eckey = NULL;
const X509_ALGOR *palg;
if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
return 0;
X509_ALGOR_get0(NULL, &ptype, &pval, palg);
if (!eckey_from_params(ptype, pval, &eckey))
goto ecliberr;
/* We have parameters now set private key */
if (!d2i_ECPrivateKey(&eckey, &p, pklen)) {
ECerror(EC_R_DECODE_ERROR);
goto ecerr;
}
/* calculate public key (if necessary) */
if (EC_KEY_get0_public_key(eckey) == NULL) {
const BIGNUM *priv_key; const BIGNUM *priv_key;
const EC_GROUP *group; const EC_GROUP *group;
EC_POINT *pub_key; EC_POINT *pub_key = NULL;
/* int ret = 0;
* the public key was not included in the SEC1 private key =>
* calculate the public key
*/
group = EC_KEY_get0_group(eckey);
pub_key = EC_POINT_new(group);
if (pub_key == NULL) {
ECerror(ERR_R_EC_LIB);
goto ecliberr;
}
if (!EC_POINT_copy(pub_key, EC_GROUP_get0_generator(group))) {
EC_POINT_free(pub_key);
ECerror(ERR_R_EC_LIB);
goto ecliberr;
}
priv_key = EC_KEY_get0_private_key(eckey);
if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, NULL)) {
EC_POINT_free(pub_key);
ECerror(ERR_R_EC_LIB);
goto ecliberr;
}
if (EC_KEY_set_public_key(eckey, pub_key) == 0) {
EC_POINT_free(pub_key);
ECerror(ERR_R_EC_LIB);
goto ecliberr;
}
EC_POINT_free(pub_key);
}
EVP_PKEY_assign_EC_KEY(pkey, eckey);
return 1;
ecliberr: if ((priv_key = EC_KEY_get0_private_key(eckey)) == NULL)
ECerror(ERR_R_EC_LIB); goto err;
ecerr: if ((group = EC_KEY_get0_group(eckey)) == NULL)
if (eckey) goto err;
if ((pub_key = EC_POINT_new(group)) == NULL)
goto err;
if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, NULL))
goto err;
if (!EC_KEY_set_public_key(eckey, pub_key))
goto err;
pub_key = NULL;
ret = 1;
err:
EC_POINT_free(pub_key);
return ret;
}
static int
eckey_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)
{
const unsigned char *priv = NULL;
int priv_len;
const void *pval;
int ptype;
EC_KEY *eckey = NULL;
const X509_ALGOR *palg;
int ret = 0;
if (!PKCS8_pkey_get0(NULL, &priv, &priv_len, &palg, p8))
goto err;
X509_ALGOR_get0(NULL, &ptype, &pval, palg);
if (!eckey_from_params(ptype, pval, &eckey))
goto err;
/* Decode private key into eckey. */
if (d2i_ECPrivateKey(&eckey, &priv, priv_len) == NULL) {
ECerror(EC_R_DECODE_ERROR);
goto err;
}
/* If public key was missing from SEC1 key, compute it. */
if (EC_KEY_get0_public_key(eckey) == NULL) {
if (!eckey_compute_pubkey(eckey))
goto err;
}
if (!EVP_PKEY_assign_EC_KEY(pkey, eckey))
goto err;
eckey = NULL;
ret = 1;
err:
EC_KEY_free(eckey); EC_KEY_free(eckey);
return 0;
return ret;
} }
static int static int
@ -547,63 +551,74 @@ do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype)
} }
static int static int
eckey_param_decode(EVP_PKEY *pkey, eckey_param_decode(EVP_PKEY *pkey, const unsigned char **param, int param_len)
const unsigned char **pder, int derlen)
{ {
EC_KEY *eckey; EC_KEY *eckey;
if (!(eckey = d2i_ECParameters(NULL, pder, derlen))) { int ret = 0;
ECerror(ERR_R_EC_LIB);
return 0; if ((eckey = d2i_ECParameters(NULL, param, param_len)) == NULL)
} goto err;
EVP_PKEY_assign_EC_KEY(pkey, eckey); if (!EVP_PKEY_assign_EC_KEY(pkey, eckey))
return 1; goto err;
eckey = NULL;
ret = 1;
err:
EC_KEY_free(eckey);
return ret;
} }
static int static int
eckey_param_encode(const EVP_PKEY *pkey, unsigned char **pder) eckey_param_encode(const EVP_PKEY *pkey, unsigned char **param)
{ {
return i2d_ECParameters(pkey->pkey.ec, pder); return i2d_ECParameters(pkey->pkey.ec, param);
} }
static int static int
eckey_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, eckey_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx)
ASN1_PCTX *ctx)
{ {
return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 0); return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 0);
} }
static int static int
eckey_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, eckey_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx)
ASN1_PCTX *ctx)
{ {
return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 1); return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 1);
} }
static int static int
eckey_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent, eckey_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx)
ASN1_PCTX *ctx)
{ {
return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2); return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2);
} }
static int static int
old_ec_priv_decode(EVP_PKEY *pkey, old_ec_priv_decode(EVP_PKEY *pkey, const unsigned char **priv, int priv_len)
const unsigned char **pder, int derlen)
{ {
EC_KEY *ec; EC_KEY *eckey;
if (!(ec = d2i_ECPrivateKey(NULL, pder, derlen))) { int ret = 0;
ECerror(EC_R_DECODE_ERROR);
return 0; if ((eckey = d2i_ECPrivateKey(NULL, priv, priv_len)) == NULL)
} goto err;
EVP_PKEY_assign_EC_KEY(pkey, ec); if (!EVP_PKEY_assign_EC_KEY(pkey, eckey))
return 1; goto err;
eckey = NULL;
ret = 1;
err:
EC_KEY_free(eckey);
return ret;
} }
static int static int
old_ec_priv_encode(const EVP_PKEY *pkey, unsigned char **pder) old_ec_priv_encode(const EVP_PKEY *pkey, unsigned char **priv)
{ {
return i2d_ECPrivateKey(pkey->pkey.ec, pder); return i2d_ECPrivateKey(pkey->pkey.ec, priv);
} }
static int static int

View File

@ -1,185 +0,0 @@
/* $OpenBSD: cipher_method_lib.c,v 1.11 2023/12/20 14:05:58 tb Exp $ */
/*
* Written by Richard Levitte (levitte@openssl.org) for the OpenSSL project
* 2015.
*/
/* ====================================================================
* Copyright (c) 2015 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include <stdlib.h>
#include <openssl/evp.h>
#include "evp_local.h"
EVP_CIPHER *
EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len)
{
EVP_CIPHER *cipher;
if (cipher_type < 0 || key_len < 0)
return NULL;
/* EVP_CipherInit() will fail for any other value. */
if (block_size != 1 && block_size != 8 && block_size != 16)
return NULL;
if ((cipher = calloc(1, sizeof(*cipher))) == NULL)
return NULL;
cipher->nid = cipher_type;
cipher->block_size = block_size;
cipher->key_len = key_len;
return cipher;
}
EVP_CIPHER *
EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher)
{
EVP_CIPHER *copy;
if ((copy = calloc(1, sizeof(*copy))) == NULL)
return NULL;
*copy = *cipher;
return copy;
}
void
EVP_CIPHER_meth_free(EVP_CIPHER *cipher)
{
free(cipher);
}
int
EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len)
{
cipher->iv_len = iv_len;
return 1;
}
int
EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags)
{
cipher->flags = flags;
return 1;
}
int
EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size)
{
cipher->ctx_size = ctx_size;
return 1;
}
int
EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher,
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc))
{
cipher->init = init;
return 1;
}
int
EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher,
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t inl))
{
cipher->do_cipher = do_cipher;
return 1;
}
int
EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher,
int (*cleanup)(EVP_CIPHER_CTX *))
{
cipher->cleanup = cleanup;
return 1;
}
int
EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher,
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *))
{
cipher->set_asn1_parameters = set_asn1_parameters;
return 1;
}
int
EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher,
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *))
{
cipher->get_asn1_parameters = get_asn1_parameters;
return 1;
}
int
EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher,
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr))
{
cipher->ctrl = ctrl;
return 1;
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: evp_enc.c,v 1.81 2023/12/26 09:04:30 tb Exp $ */ /* $OpenBSD: evp_cipher.c,v 1.3 2023/12/29 06:56:38 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -55,17 +55,70 @@
* copied and put under another distribution licence * copied and put under another distribution licence
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
/* ====================================================================
* Copyright (c) 2015 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#include <limits.h> #include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <openssl/opensslconf.h> #include <openssl/asn1.h>
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/evp.h> #include <openssl/evp.h>
#include "asn1_local.h"
#include "evp_local.h" #include "evp_local.h"
int int
@ -685,3 +738,419 @@ EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
return 1; return 1;
} }
int
EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int ret;
if (c->cipher->set_asn1_parameters != NULL)
ret = c->cipher->set_asn1_parameters(c, type);
else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
ret = EVP_CIPHER_set_asn1_iv(c, type);
else
ret = -1;
return (ret);
}
int
EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int ret;
if (c->cipher->get_asn1_parameters != NULL)
ret = c->cipher->get_asn1_parameters(c, type);
else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
ret = EVP_CIPHER_get_asn1_iv(c, type);
else
ret = -1;
return (ret);
}
int
EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int i = 0;
int l;
if (type != NULL) {
l = EVP_CIPHER_CTX_iv_length(c);
if (l < 0 || l > sizeof(c->iv)) {
EVPerror(EVP_R_IV_TOO_LARGE);
return 0;
}
i = ASN1_TYPE_get_octetstring(type, c->oiv, l);
if (i != l)
return (-1);
else if (i > 0)
memcpy(c->iv, c->oiv, l);
}
return (i);
}
int
EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int i = 0;
int j;
if (type != NULL) {
j = EVP_CIPHER_CTX_iv_length(c);
if (j < 0 || j > sizeof(c->iv)) {
EVPerror(EVP_R_IV_TOO_LARGE);
return 0;
}
i = ASN1_TYPE_set_octetstring(type, c->oiv, j);
}
return (i);
}
/* Convert the various cipher NIDs and dummies to a proper OID NID */
int
EVP_CIPHER_type(const EVP_CIPHER *ctx)
{
int nid;
ASN1_OBJECT *otmp;
nid = EVP_CIPHER_nid(ctx);
switch (nid) {
case NID_rc2_cbc:
case NID_rc2_64_cbc:
case NID_rc2_40_cbc:
return NID_rc2_cbc;
case NID_rc4:
case NID_rc4_40:
return NID_rc4;
case NID_aes_128_cfb128:
case NID_aes_128_cfb8:
case NID_aes_128_cfb1:
return NID_aes_128_cfb128;
case NID_aes_192_cfb128:
case NID_aes_192_cfb8:
case NID_aes_192_cfb1:
return NID_aes_192_cfb128;
case NID_aes_256_cfb128:
case NID_aes_256_cfb8:
case NID_aes_256_cfb1:
return NID_aes_256_cfb128;
case NID_des_cfb64:
case NID_des_cfb8:
case NID_des_cfb1:
return NID_des_cfb64;
case NID_des_ede3_cfb64:
case NID_des_ede3_cfb8:
case NID_des_ede3_cfb1:
return NID_des_cfb64;
default:
/* Check it has an OID and it is valid */
otmp = OBJ_nid2obj(nid);
if (!otmp || !otmp->data)
nid = NID_undef;
ASN1_OBJECT_free(otmp);
return nid;
}
}
int
EVP_CIPHER_block_size(const EVP_CIPHER *e)
{
return e->block_size;
}
int
EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher->block_size;
}
const EVP_CIPHER *
EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher;
}
int
EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx)
{
return ctx->encrypt;
}
unsigned long
EVP_CIPHER_flags(const EVP_CIPHER *cipher)
{
return cipher->flags;
}
unsigned long
EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher->flags;
}
void *
EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
{
return ctx->app_data;
}
void
EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
{
ctx->app_data = data;
}
void *
EVP_CIPHER_CTX_get_cipher_data(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher_data;
}
void *
EVP_CIPHER_CTX_set_cipher_data(EVP_CIPHER_CTX *ctx, void *cipher_data)
{
void *old_cipher_data;
old_cipher_data = ctx->cipher_data;
ctx->cipher_data = cipher_data;
return old_cipher_data;
}
int
EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
{
return cipher->iv_len;
}
int
EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
{
int iv_length = 0;
if ((ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_IV_LENGTH) == 0)
return ctx->cipher->iv_len;
/*
* XXX - sanity would suggest to pass the size of the pointer along,
* but unfortunately we have to match the other crowd.
*/
if (EVP_CIPHER_CTX_ctrl((EVP_CIPHER_CTX *)ctx, EVP_CTRL_GET_IVLEN, 0,
&iv_length) != 1)
return -1;
return iv_length;
}
unsigned char *
EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx)
{
return ctx->buf;
}
int
EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
{
return cipher->key_len;
}
int
EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
{
return ctx->key_len;
}
int
EVP_CIPHER_nid(const EVP_CIPHER *cipher)
{
return cipher->nid;
}
int
EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher->nid;
}
int
EVP_CIPHER_CTX_get_iv(const EVP_CIPHER_CTX *ctx, unsigned char *iv, size_t len)
{
if (ctx == NULL || len != EVP_CIPHER_CTX_iv_length(ctx))
return 0;
if (len > EVP_MAX_IV_LENGTH)
return 0; /* sanity check; shouldn't happen */
/*
* Skip the memcpy entirely when the requested IV length is zero,
* since the iv pointer may be NULL or invalid.
*/
if (len != 0) {
if (iv == NULL)
return 0;
memcpy(iv, ctx->iv, len);
}
return 1;
}
int
EVP_CIPHER_CTX_set_iv(EVP_CIPHER_CTX *ctx, const unsigned char *iv, size_t len)
{
if (ctx == NULL || len != EVP_CIPHER_CTX_iv_length(ctx))
return 0;
if (len > EVP_MAX_IV_LENGTH)
return 0; /* sanity check; shouldn't happen */
/*
* Skip the memcpy entirely when the requested IV length is zero,
* since the iv pointer may be NULL or invalid.
*/
if (len != 0) {
if (iv == NULL)
return 0;
memcpy(ctx->iv, iv, len);
}
return 1;
}
void
EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
{
ctx->flags |= flags;
}
void
EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
{
ctx->flags &= ~flags;
}
int
EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
{
return (ctx->flags & flags);
}
EVP_CIPHER *
EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len)
{
EVP_CIPHER *cipher;
if (cipher_type < 0 || key_len < 0)
return NULL;
/* EVP_CipherInit() will fail for any other value. */
if (block_size != 1 && block_size != 8 && block_size != 16)
return NULL;
if ((cipher = calloc(1, sizeof(*cipher))) == NULL)
return NULL;
cipher->nid = cipher_type;
cipher->block_size = block_size;
cipher->key_len = key_len;
return cipher;
}
EVP_CIPHER *
EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher)
{
EVP_CIPHER *copy;
if ((copy = calloc(1, sizeof(*copy))) == NULL)
return NULL;
*copy = *cipher;
return copy;
}
void
EVP_CIPHER_meth_free(EVP_CIPHER *cipher)
{
free(cipher);
}
int
EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len)
{
cipher->iv_len = iv_len;
return 1;
}
int
EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags)
{
cipher->flags = flags;
return 1;
}
int
EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size)
{
cipher->ctx_size = ctx_size;
return 1;
}
int
EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher,
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc))
{
cipher->init = init;
return 1;
}
int
EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher,
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t inl))
{
cipher->do_cipher = do_cipher;
return 1;
}
int
EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher,
int (*cleanup)(EVP_CIPHER_CTX *))
{
cipher->cleanup = cleanup;
return 1;
}
int
EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher,
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *))
{
cipher->set_asn1_parameters = set_asn1_parameters;
return 1;
}
int
EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher,
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *))
{
cipher->get_asn1_parameters = get_asn1_parameters;
return 1;
}
int
EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher,
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr))
{
cipher->ctrl = ctrl;
return 1;
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: digest.c,v 1.41 2023/12/24 22:17:05 tb Exp $ */ /* $OpenBSD: evp_digest.c,v 1.7 2023/12/29 07:22:47 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -217,6 +217,72 @@ EVP_Digest(const void *data, size_t count,
return ret; return ret;
} }
EVP_MD_CTX *
EVP_MD_CTX_new(void)
{
return calloc(1, sizeof(EVP_MD_CTX));
}
void
EVP_MD_CTX_free(EVP_MD_CTX *ctx)
{
if (ctx == NULL)
return;
EVP_MD_CTX_cleanup(ctx);
free(ctx);
}
EVP_MD_CTX *
EVP_MD_CTX_create(void)
{
return EVP_MD_CTX_new();
}
void
EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
{
EVP_MD_CTX_free(ctx);
}
void
EVP_MD_CTX_init(EVP_MD_CTX *ctx)
{
memset(ctx, 0, sizeof(*ctx));
}
int
EVP_MD_CTX_reset(EVP_MD_CTX *ctx)
{
return EVP_MD_CTX_cleanup(ctx);
}
/* This call frees resources associated with the context */
int
EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
{
/*
* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
* because sometimes only copies of the context are ever finalised.
*/
if (ctx->digest && ctx->digest->cleanup &&
!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))
ctx->digest->cleanup(ctx);
if (ctx->digest && ctx->digest->ctx_size && ctx->md_data &&
!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE))
freezero(ctx->md_data, ctx->digest->ctx_size);
/*
* If EVP_MD_CTX_FLAG_KEEP_PKEY_CTX is set, EVP_MD_CTX_set_pkey() was
* called and its strange API contract implies we don't own ctx->pctx.
*/
if (!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX))
EVP_PKEY_CTX_free(ctx->pctx);
memset(ctx, 0, sizeof(*ctx));
return 1;
}
int int
EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in) EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
{ {
@ -279,72 +345,6 @@ EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
return 1; return 1;
} }
EVP_MD_CTX *
EVP_MD_CTX_new(void)
{
return calloc(1, sizeof(EVP_MD_CTX));
}
void
EVP_MD_CTX_free(EVP_MD_CTX *ctx)
{
if (ctx == NULL)
return;
EVP_MD_CTX_cleanup(ctx);
free(ctx);
}
void
EVP_MD_CTX_init(EVP_MD_CTX *ctx)
{
memset(ctx, 0, sizeof(*ctx));
}
int
EVP_MD_CTX_reset(EVP_MD_CTX *ctx)
{
return EVP_MD_CTX_cleanup(ctx);
}
EVP_MD_CTX *
EVP_MD_CTX_create(void)
{
return EVP_MD_CTX_new();
}
void
EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
{
EVP_MD_CTX_free(ctx);
}
/* This call frees resources associated with the context */
int
EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
{
/*
* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
* because sometimes only copies of the context are ever finalised.
*/
if (ctx->digest && ctx->digest->cleanup &&
!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))
ctx->digest->cleanup(ctx);
if (ctx->digest && ctx->digest->ctx_size && ctx->md_data &&
!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE))
freezero(ctx->md_data, ctx->digest->ctx_size);
/*
* If EVP_MD_CTX_FLAG_KEEP_PKEY_CTX is set, EVP_MD_CTX_set_pkey() was
* called and its strange API contract implies we don't own ctx->pctx.
*/
if (!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX))
EVP_PKEY_CTX_free(ctx->pctx);
memset(ctx, 0, sizeof(*ctx));
return 1;
}
int int
EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr) EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
{ {
@ -367,3 +367,210 @@ EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
} }
return ret; return ret;
} }
const EVP_MD *
EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
{
if (!ctx)
return NULL;
return ctx->digest;
}
void
EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
{
ctx->flags &= ~flags;
}
void
EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
{
ctx->flags |= flags;
}
int
EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
{
return (ctx->flags & flags);
}
void *
EVP_MD_CTX_md_data(const EVP_MD_CTX *ctx)
{
return ctx->md_data;
}
EVP_PKEY_CTX *
EVP_MD_CTX_pkey_ctx(const EVP_MD_CTX *ctx)
{
return ctx->pctx;
}
void
EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx)
{
if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX)) {
EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
} else {
EVP_PKEY_CTX_free(ctx->pctx);
}
ctx->pctx = pctx;
if (pctx != NULL) {
/*
* For unclear reasons it was decided that the caller keeps
* ownership of pctx. So a flag was invented to make sure we
* don't free it in EVP_MD_CTX_cleanup(). We also need to
* unset it in EVP_MD_CTX_copy_ex(). Fortunately, the flag
* isn't public...
*/
EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
}
}
int
EVP_MD_type(const EVP_MD *md)
{
return md->type;
}
int
EVP_MD_pkey_type(const EVP_MD *md)
{
return md->pkey_type;
}
int
EVP_MD_size(const EVP_MD *md)
{
if (!md) {
EVPerror(EVP_R_MESSAGE_DIGEST_IS_NULL);
return -1;
}
return md->md_size;
}
unsigned long
EVP_MD_flags(const EVP_MD *md)
{
return md->flags;
}
int
EVP_MD_block_size(const EVP_MD *md)
{
return md->block_size;
}
/*
* XXX - remove everything below in the next bump.
*/
EVP_MD *
EVP_MD_meth_new(int md_type, int pkey_type)
{
EVP_MD *md;
if ((md = calloc(1, sizeof(*md))) == NULL)
return NULL;
md->type = md_type;
md->pkey_type = pkey_type;
return md;
}
EVP_MD *
EVP_MD_meth_dup(const EVP_MD *md)
{
EVP_MD *to;
if ((to = EVP_MD_meth_new(md->type, md->pkey_type)) == NULL)
return NULL;
memcpy(to, md, sizeof(*to));
return to;
}
void
EVP_MD_meth_free(EVP_MD *md)
{
freezero(md, sizeof(*md));
}
int
EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize)
{
md->block_size = blocksize;
return 1;
}
int
EVP_MD_meth_set_result_size(EVP_MD *md, int result_size)
{
md->md_size = result_size;
return 1;
}
int
EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize)
{
md->ctx_size = datasize;
return 1;
}
int
EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags)
{
md->flags = flags;
return 1;
}
int
EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx))
{
md->init = init;
return 1;
}
int
EVP_MD_meth_set_update(EVP_MD *md,
int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count))
{
md->update = update;
return 1;
}
int
EVP_MD_meth_set_final(EVP_MD *md,
int (*final)(EVP_MD_CTX *ctx, unsigned char *md))
{
md->final = final;
return 1;
}
int
EVP_MD_meth_set_copy(EVP_MD *md,
int (*copy)(EVP_MD_CTX *to, const EVP_MD_CTX *from))
{
md->copy = copy;
return 1;
}
int
EVP_MD_meth_set_cleanup(EVP_MD *md,
int (*cleanup)(EVP_MD_CTX *ctx))
{
md->cleanup = cleanup;
return 1;
}
int
EVP_MD_meth_set_ctrl(EVP_MD *md,
int (*ctrl)(EVP_MD_CTX *ctx, int cmd, int p1, void *p2))
{
md->md_ctrl = ctrl;
return 1;
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: encode.c,v 1.32 2023/07/07 19:37:53 beck Exp $ */ /* $OpenBSD: evp_encode.c,v 1.2 2023/12/29 10:31:50 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *

View File

@ -1,565 +0,0 @@
/* $OpenBSD: evp_lib.c,v 1.30 2023/12/15 13:28:30 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* "This product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/
#include <stdio.h>
#include <string.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include "asn1_local.h"
#include "evp_local.h"
int
EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int ret;
if (c->cipher->set_asn1_parameters != NULL)
ret = c->cipher->set_asn1_parameters(c, type);
else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
ret = EVP_CIPHER_set_asn1_iv(c, type);
else
ret = -1;
return (ret);
}
int
EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int ret;
if (c->cipher->get_asn1_parameters != NULL)
ret = c->cipher->get_asn1_parameters(c, type);
else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
ret = EVP_CIPHER_get_asn1_iv(c, type);
else
ret = -1;
return (ret);
}
int
EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int i = 0;
int l;
if (type != NULL) {
l = EVP_CIPHER_CTX_iv_length(c);
if (l < 0 || l > sizeof(c->iv)) {
EVPerror(EVP_R_IV_TOO_LARGE);
return 0;
}
i = ASN1_TYPE_get_octetstring(type, c->oiv, l);
if (i != l)
return (-1);
else if (i > 0)
memcpy(c->iv, c->oiv, l);
}
return (i);
}
int
EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
{
int i = 0;
int j;
if (type != NULL) {
j = EVP_CIPHER_CTX_iv_length(c);
if (j < 0 || j > sizeof(c->iv)) {
EVPerror(EVP_R_IV_TOO_LARGE);
return 0;
}
i = ASN1_TYPE_set_octetstring(type, c->oiv, j);
}
return (i);
}
/* Convert the various cipher NIDs and dummies to a proper OID NID */
int
EVP_CIPHER_type(const EVP_CIPHER *ctx)
{
int nid;
ASN1_OBJECT *otmp;
nid = EVP_CIPHER_nid(ctx);
switch (nid) {
case NID_rc2_cbc:
case NID_rc2_64_cbc:
case NID_rc2_40_cbc:
return NID_rc2_cbc;
case NID_rc4:
case NID_rc4_40:
return NID_rc4;
case NID_aes_128_cfb128:
case NID_aes_128_cfb8:
case NID_aes_128_cfb1:
return NID_aes_128_cfb128;
case NID_aes_192_cfb128:
case NID_aes_192_cfb8:
case NID_aes_192_cfb1:
return NID_aes_192_cfb128;
case NID_aes_256_cfb128:
case NID_aes_256_cfb8:
case NID_aes_256_cfb1:
return NID_aes_256_cfb128;
case NID_des_cfb64:
case NID_des_cfb8:
case NID_des_cfb1:
return NID_des_cfb64;
case NID_des_ede3_cfb64:
case NID_des_ede3_cfb8:
case NID_des_ede3_cfb1:
return NID_des_cfb64;
default:
/* Check it has an OID and it is valid */
otmp = OBJ_nid2obj(nid);
if (!otmp || !otmp->data)
nid = NID_undef;
ASN1_OBJECT_free(otmp);
return nid;
}
}
int
EVP_CIPHER_block_size(const EVP_CIPHER *e)
{
return e->block_size;
}
int
EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher->block_size;
}
const EVP_CIPHER *
EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher;
}
int
EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx)
{
return ctx->encrypt;
}
unsigned long
EVP_CIPHER_flags(const EVP_CIPHER *cipher)
{
return cipher->flags;
}
unsigned long
EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher->flags;
}
void *
EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
{
return ctx->app_data;
}
void
EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
{
ctx->app_data = data;
}
void *
EVP_CIPHER_CTX_get_cipher_data(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher_data;
}
void *
EVP_CIPHER_CTX_set_cipher_data(EVP_CIPHER_CTX *ctx, void *cipher_data)
{
void *old_cipher_data;
old_cipher_data = ctx->cipher_data;
ctx->cipher_data = cipher_data;
return old_cipher_data;
}
int
EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
{
return cipher->iv_len;
}
int
EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
{
int iv_length = 0;
if ((ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_IV_LENGTH) == 0)
return ctx->cipher->iv_len;
/*
* XXX - sanity would suggest to pass the size of the pointer along,
* but unfortunately we have to match the other crowd.
*/
if (EVP_CIPHER_CTX_ctrl((EVP_CIPHER_CTX *)ctx, EVP_CTRL_GET_IVLEN, 0,
&iv_length) != 1)
return -1;
return iv_length;
}
unsigned char *
EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx)
{
return ctx->buf;
}
int
EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
{
return cipher->key_len;
}
int
EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
{
return ctx->key_len;
}
int
EVP_CIPHER_nid(const EVP_CIPHER *cipher)
{
return cipher->nid;
}
int
EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
{
return ctx->cipher->nid;
}
int
EVP_CIPHER_CTX_get_iv(const EVP_CIPHER_CTX *ctx, unsigned char *iv, size_t len)
{
if (ctx == NULL || len != EVP_CIPHER_CTX_iv_length(ctx))
return 0;
if (len > EVP_MAX_IV_LENGTH)
return 0; /* sanity check; shouldn't happen */
/*
* Skip the memcpy entirely when the requested IV length is zero,
* since the iv pointer may be NULL or invalid.
*/
if (len != 0) {
if (iv == NULL)
return 0;
memcpy(iv, ctx->iv, len);
}
return 1;
}
int
EVP_CIPHER_CTX_set_iv(EVP_CIPHER_CTX *ctx, const unsigned char *iv, size_t len)
{
if (ctx == NULL || len != EVP_CIPHER_CTX_iv_length(ctx))
return 0;
if (len > EVP_MAX_IV_LENGTH)
return 0; /* sanity check; shouldn't happen */
/*
* Skip the memcpy entirely when the requested IV length is zero,
* since the iv pointer may be NULL or invalid.
*/
if (len != 0) {
if (iv == NULL)
return 0;
memcpy(ctx->iv, iv, len);
}
return 1;
}
int
EVP_MD_block_size(const EVP_MD *md)
{
return md->block_size;
}
int
EVP_MD_type(const EVP_MD *md)
{
return md->type;
}
int
EVP_MD_pkey_type(const EVP_MD *md)
{
return md->pkey_type;
}
int
EVP_MD_size(const EVP_MD *md)
{
if (!md) {
EVPerror(EVP_R_MESSAGE_DIGEST_IS_NULL);
return -1;
}
return md->md_size;
}
unsigned long
EVP_MD_flags(const EVP_MD *md)
{
return md->flags;
}
EVP_MD *
EVP_MD_meth_new(int md_type, int pkey_type)
{
EVP_MD *md;
if ((md = calloc(1, sizeof(*md))) == NULL)
return NULL;
md->type = md_type;
md->pkey_type = pkey_type;
return md;
}
EVP_MD *
EVP_MD_meth_dup(const EVP_MD *md)
{
EVP_MD *to;
if ((to = EVP_MD_meth_new(md->type, md->pkey_type)) == NULL)
return NULL;
memcpy(to, md, sizeof(*to));
return to;
}
void
EVP_MD_meth_free(EVP_MD *md)
{
freezero(md, sizeof(*md));
}
int
EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize)
{
md->block_size = blocksize;
return 1;
}
int
EVP_MD_meth_set_result_size(EVP_MD *md, int result_size)
{
md->md_size = result_size;
return 1;
}
int
EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize)
{
md->ctx_size = datasize;
return 1;
}
int
EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags)
{
md->flags = flags;
return 1;
}
int
EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx))
{
md->init = init;
return 1;
}
int
EVP_MD_meth_set_update(EVP_MD *md,
int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count))
{
md->update = update;
return 1;
}
int
EVP_MD_meth_set_final(EVP_MD *md,
int (*final)(EVP_MD_CTX *ctx, unsigned char *md))
{
md->final = final;
return 1;
}
int
EVP_MD_meth_set_copy(EVP_MD *md,
int (*copy)(EVP_MD_CTX *to, const EVP_MD_CTX *from))
{
md->copy = copy;
return 1;
}
int
EVP_MD_meth_set_cleanup(EVP_MD *md,
int (*cleanup)(EVP_MD_CTX *ctx))
{
md->cleanup = cleanup;
return 1;
}
int
EVP_MD_meth_set_ctrl(EVP_MD *md,
int (*ctrl)(EVP_MD_CTX *ctx, int cmd, int p1, void *p2))
{
md->md_ctrl = ctrl;
return 1;
}
const EVP_MD *
EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
{
if (!ctx)
return NULL;
return ctx->digest;
}
void *
EVP_MD_CTX_md_data(const EVP_MD_CTX *ctx)
{
return ctx->md_data;
}
EVP_PKEY_CTX *
EVP_MD_CTX_pkey_ctx(const EVP_MD_CTX *ctx)
{
return ctx->pctx;
}
void
EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx)
{
if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX)) {
EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
} else {
EVP_PKEY_CTX_free(ctx->pctx);
}
ctx->pctx = pctx;
if (pctx != NULL) {
/*
* For unclear reasons it was decided that the caller keeps
* ownership of pctx. So a flag was invented to make sure we
* don't free it in EVP_MD_CTX_cleanup(). We also need to
* unset it in EVP_MD_CTX_copy_ex(). Fortunately, the flag
* isn't public...
*/
EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
}
}
void
EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
{
ctx->flags |= flags;
}
void
EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
{
ctx->flags &= ~flags;
}
int
EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
{
return (ctx->flags & flags);
}
void
EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
{
ctx->flags |= flags;
}
void
EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
{
ctx->flags &= ~flags;
}
int
EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
{
return (ctx->flags & flags);
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: evp_local.h,v 1.9 2023/12/22 17:25:47 tb Exp $ */ /* $OpenBSD: evp_local.h,v 1.10 2023/12/29 10:59:00 tb Exp $ */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project 2000. * project 2000.
*/ */
@ -89,6 +89,68 @@ struct ecx_key_st {
size_t pub_key_len; size_t pub_key_len;
}; };
struct evp_pkey_asn1_method_st {
int pkey_id;
int pkey_base_id;
unsigned long pkey_flags;
char *pem_str;
char *info;
int (*pub_decode)(EVP_PKEY *pk, X509_PUBKEY *pub);
int (*pub_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk);
int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent,
ASN1_PCTX *pctx);
int (*priv_decode)(EVP_PKEY *pk, const PKCS8_PRIV_KEY_INFO *p8inf);
int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk);
int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent,
ASN1_PCTX *pctx);
int (*pkey_size)(const EVP_PKEY *pk);
int (*pkey_bits)(const EVP_PKEY *pk);
int (*pkey_security_bits)(const EVP_PKEY *pk);
int (*param_decode)(EVP_PKEY *pkey, const unsigned char **pder,
int derlen);
int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder);
int (*param_missing)(const EVP_PKEY *pk);
int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from);
int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent,
ASN1_PCTX *pctx);
int (*sig_print)(BIO *out, const X509_ALGOR *sigalg,
const ASN1_STRING *sig, int indent, ASN1_PCTX *pctx);
void (*pkey_free)(EVP_PKEY *pkey);
int (*pkey_ctrl)(EVP_PKEY *pkey, int op, long arg1, void *arg2);
/* Legacy functions for old PEM */
int (*old_priv_decode)(EVP_PKEY *pkey, const unsigned char **pder,
int derlen);
int (*old_priv_encode)(const EVP_PKEY *pkey, unsigned char **pder);
/* Custom ASN1 signature verification */
int (*item_verify)(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
X509_ALGOR *a, ASN1_BIT_STRING *sig, EVP_PKEY *pkey);
int (*item_sign)(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig);
int (*pkey_check)(const EVP_PKEY *pk);
int (*pkey_public_check)(const EVP_PKEY *pk);
int (*pkey_param_check)(const EVP_PKEY *pk);
int (*set_priv_key)(EVP_PKEY *pk, const unsigned char *private_key,
size_t len);
int (*set_pub_key)(EVP_PKEY *pk, const unsigned char *public_key,
size_t len);
int (*get_priv_key)(const EVP_PKEY *pk, unsigned char *out_private_key,
size_t *out_len);
int (*get_pub_key)(const EVP_PKEY *pk, unsigned char *out_public_key,
size_t *out_len);
} /* EVP_PKEY_ASN1_METHOD */;
/* Type needs to be a bit field /* Type needs to be a bit field
* Sub-type needs to be for variations on the method, as in, can it do * Sub-type needs to be for variations on the method, as in, can it do
* arbitrary encryption.... */ * arbitrary encryption.... */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: p_lib.c,v 1.50 2023/12/25 22:41:50 tb Exp $ */ /* $OpenBSD: p_lib.c,v 1.51 2023/12/29 10:59:00 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -55,13 +55,62 @@
* copied and put under another distribution licence * copied and put under another distribution licence
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
/* ====================================================================
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* licensing@OpenSSL.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/opensslconf.h> #include <openssl/asn1.h>
#include <openssl/bio.h>
#include <openssl/bn.h>
#include <openssl/cmac.h> #include <openssl/cmac.h>
#include <openssl/crypto.h>
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/evp.h> #include <openssl/evp.h>
#include <openssl/objects.h> #include <openssl/objects.h>
@ -73,13 +122,152 @@
#ifndef OPENSSL_NO_DSA #ifndef OPENSSL_NO_DSA
#include <openssl/dsa.h> #include <openssl/dsa.h>
#endif #endif
#ifndef OPENSSL_NO_EC
#include <openssl/ec.h>
#endif
#ifndef OPENSSL_NO_RSA #ifndef OPENSSL_NO_RSA
#include <openssl/rsa.h> #include <openssl/rsa.h>
#endif #endif
#include "asn1_local.h"
#include "evp_local.h" #include "evp_local.h"
extern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD dh_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[];
extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD gostimit_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD gostr01_asn1_meths[];
extern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[];
extern const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth;
extern const EVP_PKEY_ASN1_METHOD x25519_asn1_meth;
static const EVP_PKEY_ASN1_METHOD *asn1_methods[] = {
&cmac_asn1_meth,
&dh_asn1_meth,
&dsa_asn1_meths[0],
&dsa_asn1_meths[1],
&dsa_asn1_meths[2],
&dsa_asn1_meths[3],
&dsa_asn1_meths[4],
&eckey_asn1_meth,
&ed25519_asn1_meth,
&gostimit_asn1_meth,
&gostr01_asn1_meths[0],
&gostr01_asn1_meths[1],
&gostr01_asn1_meths[2],
&hmac_asn1_meth,
&rsa_asn1_meths[0],
&rsa_asn1_meths[1],
&rsa_pss_asn1_meth,
&x25519_asn1_meth,
};
#define N_ASN1_METHODS (sizeof(asn1_methods) / sizeof(asn1_methods[0]))
int
EVP_PKEY_asn1_get_count(void)
{
return N_ASN1_METHODS;
}
const EVP_PKEY_ASN1_METHOD *
EVP_PKEY_asn1_get0(int idx)
{
if (idx < 0 || idx >= N_ASN1_METHODS)
return NULL;
return asn1_methods[idx];
}
static const EVP_PKEY_ASN1_METHOD *
pkey_asn1_find(int pkey_id)
{
const EVP_PKEY_ASN1_METHOD *ameth;
int i;
for (i = EVP_PKEY_asn1_get_count() - 1; i >= 0; i--) {
ameth = EVP_PKEY_asn1_get0(i);
if (ameth->pkey_id == pkey_id)
return ameth;
}
return NULL;
}
/*
* XXX - fix this. In what looks like an infinite loop, this API only makes two
* calls to pkey_asn1_find(): If the type resolves to an aliased ASN.1 method,
* the second call will find the method it aliases. Codify this in regress and
* make this explicit in code.
*/
const EVP_PKEY_ASN1_METHOD *
EVP_PKEY_asn1_find(ENGINE **pe, int type)
{
const EVP_PKEY_ASN1_METHOD *mp;
if (pe != NULL)
*pe = NULL;
for (;;) {
if ((mp = pkey_asn1_find(type)) == NULL)
break;
if ((mp->pkey_flags & ASN1_PKEY_ALIAS) == 0)
break;
type = mp->pkey_base_id;
}
return mp;
}
const EVP_PKEY_ASN1_METHOD *
EVP_PKEY_asn1_find_str(ENGINE **pe, const char *str, int len)
{
const EVP_PKEY_ASN1_METHOD *ameth;
int i;
if (len == -1)
len = strlen(str);
if (pe != NULL)
*pe = NULL;
for (i = EVP_PKEY_asn1_get_count() - 1; i >= 0; i--) {
ameth = EVP_PKEY_asn1_get0(i);
if (ameth->pkey_flags & ASN1_PKEY_ALIAS)
continue;
if (((int)strlen(ameth->pem_str) == len) &&
!strncasecmp(ameth->pem_str, str, len))
return ameth;
}
return NULL;
}
int
EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, int *ppkey_flags,
const char **pinfo, const char **ppem_str,
const EVP_PKEY_ASN1_METHOD *ameth)
{
if (!ameth)
return 0;
if (ppkey_id)
*ppkey_id = ameth->pkey_id;
if (ppkey_base_id)
*ppkey_base_id = ameth->pkey_base_id;
if (ppkey_flags)
*ppkey_flags = ameth->pkey_flags;
if (pinfo)
*pinfo = ameth->info;
if (ppem_str)
*ppem_str = ameth->pem_str;
return 1;
}
const EVP_PKEY_ASN1_METHOD*
EVP_PKEY_get0_asn1(const EVP_PKEY *pkey)
{
return pkey->ameth;
}
int int
EVP_PKEY_bits(const EVP_PKEY *pkey) EVP_PKEY_bits(const EVP_PKEY *pkey)
{ {

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: BN_generate_prime.3,v 1.24 2023/05/12 08:18:13 jsg Exp $ .\" $OpenBSD: BN_generate_prime.3,v 1.25 2023/12/29 19:12:46 tb Exp $
.\" full merge up to: OpenSSL f987a4dd Jun 27 10:12:08 2019 +0200 .\" full merge up to: OpenSSL f987a4dd Jun 27 10:12:08 2019 +0200
.\" .\"
.\" This file is a derived work. .\" This file is a derived work.
@ -67,7 +67,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
.\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.Dd $Mdocdate: May 12 2023 $ .Dd $Mdocdate: December 29 2023 $
.Dt BN_GENERATE_PRIME 3 .Dt BN_GENERATE_PRIME 3
.Os .Os
.Sh NAME .Sh NAME
@ -354,7 +354,7 @@ In some cases, error codes can be obtained by
.Sh SEE ALSO .Sh SEE ALSO
.Xr BN_new 3 , .Xr BN_new 3 ,
.Xr DH_generate_parameters 3 , .Xr DH_generate_parameters 3 ,
.Xr DSA_generate_parameters 3 , .Xr DSA_generate_parameters_ex 3 ,
.Xr RSA_generate_key 3 .Xr RSA_generate_key 3
.Sh HISTORY .Sh HISTORY
.Fn BN_generate_prime_ex , .Fn BN_generate_prime_ex ,

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: DSA_generate_key.3,v 1.10 2019/06/10 14:58:48 schwarze Exp $ .\" $OpenBSD: DSA_generate_key.3,v 1.11 2023/12/29 19:12:47 tb Exp $
.\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 .\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100
.\" .\"
.\" This file was written by Ulf Moeller <ulf@openssl.org>. .\" This file was written by Ulf Moeller <ulf@openssl.org>.
@ -48,7 +48,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
.\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.Dd $Mdocdate: June 10 2019 $ .Dd $Mdocdate: December 29 2023 $
.Dt DSA_GENERATE_KEY 3 .Dt DSA_GENERATE_KEY 3
.Os .Os
.Sh NAME .Sh NAME
@ -75,7 +75,7 @@ returns 1 on success or 0 otherwise.
The error codes can be obtained by The error codes can be obtained by
.Xr ERR_get_error 3 . .Xr ERR_get_error 3 .
.Sh SEE ALSO .Sh SEE ALSO
.Xr DSA_generate_parameters 3 , .Xr DSA_generate_parameters_ex 3 ,
.Xr DSA_get0_key 3 , .Xr DSA_get0_key 3 ,
.Xr DSA_new 3 .Xr DSA_new 3
.Sh HISTORY .Sh HISTORY

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: DSA_generate_parameters.3,v 1.13 2023/05/14 09:27:15 tb Exp $ .\" $OpenBSD: DSA_generate_parameters_ex.3,v 1.1 2023/12/29 19:15:15 tb Exp $
.\" OpenSSL 9b86974e Aug 7 22:14:47 2015 -0400 .\" OpenSSL 9b86974e Aug 7 22:14:47 2015 -0400
.\" .\"
.\" This file was written by Ulf Moeller <ulf@openssl.org>, .\" This file was written by Ulf Moeller <ulf@openssl.org>,
@ -49,12 +49,13 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
.\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.Dd $Mdocdate: May 14 2023 $ .Dd $Mdocdate: December 29 2023 $
.Dt DSA_GENERATE_PARAMETERS 3 .Dt DSA_GENERATE_PARAMETERS_EX 3
.Os .Os
.Sh NAME .Sh NAME
.Nm DSA_generate_parameters_ex , .\" .Nm DSA_generate_parameters is intentionally undocumented
.Nm DSA_generate_parameters .\" because it will be removed in the next major bump
.Nm DSA_generate_parameters_ex
.Nd generate DSA parameters .Nd generate DSA parameters
.Sh SYNOPSIS .Sh SYNOPSIS
.In openssl/dsa.h .In openssl/dsa.h
@ -68,19 +69,6 @@
.Fa "unsigned long *h_ret" .Fa "unsigned long *h_ret"
.Fa "BN_GENCB *cb" .Fa "BN_GENCB *cb"
.Fc .Fc
.Pp
Deprecated:
.Pp
.Ft DSA *
.Fo DSA_generate_parameters
.Fa "int bits"
.Fa "unsigned char *seed"
.Fa "int seed_len"
.Fa "int *counter_ret"
.Fa "unsigned long *h_ret"
.Fa "void (*callback)(int, int, void *)"
.Fa "void *cb_arg"
.Fc
.Sh DESCRIPTION .Sh DESCRIPTION
.Fn DSA_generate_parameters_ex .Fn DSA_generate_parameters_ex
generates primes p and q and a generator g for use in the DSA and stores generates primes p and q and a generator g for use in the DSA and stores
@ -168,32 +156,10 @@ When the generator has been found,
.Fn BN_GENCB_call cb 3 1 .Fn BN_GENCB_call cb 3 1
is called. is called.
.El .El
.Pp
.Fn DSA_generate_parameters
(deprecated) works in much the same way as for
.Fn DSA_generate_parameters_ex ,
except that no
.Fa dsa
parameter is passed and instead a newly allocated
.Vt DSA
structure is returned.
Additionally "old style" callbacks are used instead of the newer
.Vt BN_GENCB
based approach.
Refer to
.Xr BN_generate_prime 3
for further information.
.Sh RETURN VALUES .Sh RETURN VALUES
.Fn DSA_generate_parameters_ex .Fn DSA_generate_parameters_ex
returns a 1 on success, or 0 otherwise. returns a 1 on success, or 0 otherwise.
.Pp .Pp
.Fn DSA_generate_parameters
returns a pointer to the
.Vt DSA
structure, or
.Dv NULL
if the parameter generation fails.
.Pp
The error codes can be obtained by The error codes can be obtained by
.Xr ERR_get_error 3 . .Xr ERR_get_error 3 .
.Sh SEE ALSO .Sh SEE ALSO
@ -201,24 +167,6 @@ The error codes can be obtained by
.Xr DSA_get0_pqg 3 , .Xr DSA_get0_pqg 3 ,
.Xr DSA_new 3 .Xr DSA_new 3
.Sh HISTORY .Sh HISTORY
.Fn DSA_generate_parameters
first appeared in SSLeay 0.8.0 and had its
.Fa cb_arg
argument added in SSLeay 0.9.0.
It has been available since
.Ox 2.4 .
.Pp
In versions up to OpenSSL 0.9.4,
.Fn callback 1 ...\&
was called in the inner loop of the Miller-Rabin test whenever it
reached the squaring step (the parameters to
.Fn callback
did not reveal how many witnesses had been tested); since OpenSSL 0.9.5,
.Fn callback 1 ...\&
is called as in
.Xr BN_is_prime_ex 3 ,
i.e. once for each witness.
.Pp
.Fn DSA_generate_parameters_ex .Fn DSA_generate_parameters_ex
first appeared in OpenSSL 0.9.8 and has been available since first appeared in OpenSSL 0.9.8 and has been available since
.Ox 4.5 . .Ox 4.5 .

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: DSA_get0_pqg.3,v 1.7 2023/03/07 06:15:07 tb Exp $ .\" $OpenBSD: DSA_get0_pqg.3,v 1.10 2023/12/29 22:37:47 tb Exp $
.\" full merge up to: OpenSSL e90fc053 Jul 15 09:39:45 2017 -0400 .\" full merge up to: OpenSSL e90fc053 Jul 15 09:39:45 2017 -0400
.\" .\"
.\" This file was written by Matt Caswell <matt@openssl.org>. .\" This file was written by Matt Caswell <matt@openssl.org>.
@ -48,7 +48,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
.\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.Dd $Mdocdate: March 7 2023 $ .Dd $Mdocdate: December 29 2023 $
.Dt DSA_GET0_PQG 3 .Dt DSA_GET0_PQG 3
.Os .Os
.Sh NAME .Sh NAME
@ -296,7 +296,7 @@ if no engine was set for this object.
.Xr DSA_do_sign 3 , .Xr DSA_do_sign 3 ,
.Xr DSA_dup_DH 3 , .Xr DSA_dup_DH 3 ,
.Xr DSA_generate_key 3 , .Xr DSA_generate_key 3 ,
.Xr DSA_generate_parameters 3 , .Xr DSA_generate_parameters_ex 3 ,
.Xr DSA_new 3 , .Xr DSA_new 3 ,
.Xr DSA_print 3 , .Xr DSA_print 3 ,
.Xr DSA_security_bits 3 , .Xr DSA_security_bits 3 ,

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: DSA_new.3,v 1.13 2022/07/13 21:51:35 schwarze Exp $ .\" $OpenBSD: DSA_new.3,v 1.14 2023/12/29 19:12:47 tb Exp $
.\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 .\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100
.\" .\"
.\" This file was written by Ulf Moeller <ulf@openssl.org>. .\" This file was written by Ulf Moeller <ulf@openssl.org>.
@ -48,7 +48,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
.\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.Dd $Mdocdate: July 13 2022 $ .Dd $Mdocdate: December 29 2023 $
.Dt DSA_NEW 3 .Dt DSA_NEW 3
.Os .Os
.Sh NAME .Sh NAME
@ -114,7 +114,7 @@ returns 1 for success or 0 for failure.
.Xr DSA_do_sign 3 , .Xr DSA_do_sign 3 ,
.Xr DSA_dup_DH 3 , .Xr DSA_dup_DH 3 ,
.Xr DSA_generate_key 3 , .Xr DSA_generate_key 3 ,
.Xr DSA_generate_parameters 3 , .Xr DSA_generate_parameters_ex 3 ,
.Xr DSA_get0_pqg 3 , .Xr DSA_get0_pqg 3 ,
.Xr DSA_get_ex_new_index 3 , .Xr DSA_get_ex_new_index 3 ,
.Xr DSA_meth_new 3 , .Xr DSA_meth_new 3 ,

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.279 2023/12/16 10:26:10 tb Exp $ # $OpenBSD: Makefile,v 1.280 2023/12/29 19:15:15 tb Exp $
.include <bsd.own.mk> .include <bsd.own.mk>
@ -123,7 +123,7 @@ MAN= \
DSA_do_sign.3 \ DSA_do_sign.3 \
DSA_dup_DH.3 \ DSA_dup_DH.3 \
DSA_generate_key.3 \ DSA_generate_key.3 \
DSA_generate_parameters.3 \ DSA_generate_parameters_ex.3 \
DSA_get0_pqg.3 \ DSA_get0_pqg.3 \
DSA_get_ex_new_index.3 \ DSA_get_ex_new_index.3 \
DSA_meth_new.3 \ DSA_meth_new.3 \

View File

@ -1,4 +1,4 @@
/* $OpenBSD: by_dir.c,v 1.45 2023/12/25 22:14:23 tb Exp $ */ /* $OpenBSD: by_dir.c,v 1.46 2023/12/29 05:33:32 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -118,10 +118,8 @@ static int
dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl, dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
char **retp) char **retp)
{ {
BY_DIR *ld = ctx->method_data;
int ret = 0; int ret = 0;
BY_DIR *ld;
ld = (BY_DIR *)ctx->method_data;
switch (cmd) { switch (cmd) {
case X509_L_ADD_DIR: case X509_L_ADD_DIR:
@ -153,7 +151,7 @@ new_dir(X509_LOOKUP *lu)
return 0; return 0;
} }
a->dirs = NULL; a->dirs = NULL;
lu->method_data = (char *)a; lu->method_data = a;
return 1; return 1;
} }
@ -187,7 +185,7 @@ free_dir(X509_LOOKUP *lu)
{ {
BY_DIR *a; BY_DIR *a;
a = (BY_DIR *)lu->method_data; a = lu->method_data;
sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free); sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
BUF_MEM_free(a->buffer); BUF_MEM_free(a->buffer);
free(a); free(a);
@ -300,7 +298,7 @@ get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
goto finish; goto finish;
} }
ctx = (BY_DIR *)xl->method_data; ctx = xl->method_data;
h = X509_NAME_hash(name); h = X509_NAME_hash(name);
for (i = 0; i < sk_BY_DIR_ENTRY_num(ctx->dirs); i++) { for (i = 0; i < sk_BY_DIR_ENTRY_num(ctx->dirs); i++) {

View File

@ -1,4 +1,4 @@
/* $OpenBSD: x509_local.h,v 1.15 2023/12/25 22:14:23 tb Exp $ */ /* $OpenBSD: x509_local.h,v 1.17 2023/12/29 05:33:32 tb Exp $ */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project 2013. * project 2013.
*/ */
@ -299,9 +299,8 @@ struct x509_store_st {
/* This is the functions plus an instance of the local variables. */ /* This is the functions plus an instance of the local variables. */
struct x509_lookup_st { struct x509_lookup_st {
int init; /* have we been started */
X509_LOOKUP_METHOD *method; /* the functions */ X509_LOOKUP_METHOD *method; /* the functions */
char *method_data; /* method data */ void *method_data; /* method data */
X509_STORE *store_ctx; /* who owns us */ X509_STORE *store_ctx; /* who owns us */
} /* X509_LOOKUP */; } /* X509_LOOKUP */;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_clnt.c,v 1.162 2023/11/19 15:50:29 tb Exp $ */ /* $OpenBSD: ssl_clnt.c,v 1.163 2023/12/29 12:24:33 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -631,11 +631,6 @@ ssl3_connect(SSL *s)
/* did we do anything */ /* did we do anything */
if (!s->s3->hs.tls12.reuse_message && !skip) { if (!s->s3->hs.tls12.reuse_message && !skip) {
if (s->debug) {
if ((ret = BIO_flush(s->wbio)) <= 0)
goto end;
}
if (s->s3->hs.state != state) { if (s->s3->hs.state != state) {
new_state = s->s3->hs.state; new_state = s->s3->hs.state;
s->s3->hs.state = state; s->s3->hs.state = state;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_lib.c,v 1.317 2023/11/29 13:39:34 tb Exp $ */ /* $OpenBSD: ssl_lib.c,v 1.318 2023/12/29 12:24:33 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -2933,8 +2933,6 @@ SSL_dup(SSL *s)
SSL_set_info_callback(ret, SSL_get_info_callback(s)); SSL_set_info_callback(ret, SSL_get_info_callback(s));
ret->debug = s->debug;
/* copy app data, a little dangerous perhaps */ /* copy app data, a little dangerous perhaps */
if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL,
&ret->ex_data, &s->ex_data)) &ret->ex_data, &s->ex_data))
@ -3488,7 +3486,7 @@ LSSL_ALIAS(SSL_set_msg_callback);
void void
SSL_set_debug(SSL *s, int debug) SSL_set_debug(SSL *s, int debug)
{ {
s->debug = debug; SSLerror(s, ERR_R_DISABLED);
} }
LSSL_ALIAS(SSL_set_debug); LSSL_ALIAS(SSL_set_debug);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_local.h,v 1.11 2023/11/29 13:39:34 tb Exp $ */ /* $OpenBSD: ssl_local.h,v 1.12 2023/12/29 12:24:33 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -1074,9 +1074,6 @@ struct ssl_st {
/* for server side, keep the list of CA_dn we can use */ /* for server side, keep the list of CA_dn we can use */
STACK_OF(X509_NAME) *client_CA; STACK_OF(X509_NAME) *client_CA;
/* set this flag to 1 and a sleep(1) is put into all SSL_read()
* and SSL_write() calls, good for nbio debugging :-) */
int debug;
long max_cert_list; long max_cert_list;
int first_packet; int first_packet;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_srvr.c,v 1.157 2023/11/18 10:51:09 tb Exp $ */ /* $OpenBSD: ssl_srvr.c,v 1.158 2023/12/29 12:24:33 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -740,12 +740,6 @@ ssl3_accept(SSL *s)
} }
if (!s->s3->hs.tls12.reuse_message && !skip) { if (!s->s3->hs.tls12.reuse_message && !skip) {
if (s->debug) {
if ((ret = BIO_flush(s->wbio)) <= 0)
goto end;
}
if (s->s3->hs.state != state) { if (s->s3->hs.state != state) {
new_state = s->s3->hs.state; new_state = s->s3->hs.state;
s->s3->hs.state = state; s->s3->hs.state = state;

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: imsg_init.3,v 1.32 2023/12/13 00:37:42 jsg Exp $ .\" $OpenBSD: imsg_init.3,v 1.33 2023/12/29 11:48:47 claudio Exp $
.\" .\"
.\" Copyright (c) 2023 Claudio Jeker <claudio@openbsd.org> .\" Copyright (c) 2023 Claudio Jeker <claudio@openbsd.org>
.\" Copyright (c) 2010 Nicholas Marriott <nicm@openbsd.org> .\" Copyright (c) 2010 Nicholas Marriott <nicm@openbsd.org>
@ -15,7 +15,7 @@
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: December 13 2023 $ .Dd $Mdocdate: December 29 2023 $
.Dt IMSG_INIT 3 .Dt IMSG_INIT 3
.Os .Os
.Sh NAME .Sh NAME
@ -41,10 +41,7 @@
.Nm imsg_clear .Nm imsg_clear
.Nd IPC messaging functions .Nd IPC messaging functions
.Sh SYNOPSIS .Sh SYNOPSIS
.In sys/types.h
.In sys/queue.h .In sys/queue.h
.In sys/uio.h
.In stdint.h
.In imsg.h .In imsg.h
.Ft void .Ft void
.Fn imsg_init "struct imsgbuf *imsgbuf" "int fd" .Fn imsg_init "struct imsgbuf *imsgbuf" "int fd"
@ -70,9 +67,6 @@
.Fn imsg_compose "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \ .Fn imsg_compose "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \
"pid_t pid" "int fd" "const void *data" "size_t datalen" "pid_t pid" "int fd" "const void *data" "size_t datalen"
.Ft int .Ft int
.Fn imsg_composev "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \
"pid_t pid" "int fd" "const struct iovec *iov" "int iovcnt"
.Ft int
.Fn imsg_compose_ibuf "struct imsgbuf *imsgbuf" "uint32_t type" \ .Fn imsg_compose_ibuf "struct imsgbuf *imsgbuf" "uint32_t type" \
"uint32_t id" "pid_t pid" "struct ibuf *buf" "uint32_t id" "pid_t pid" "struct ibuf *buf"
.Ft "struct ibuf *" .Ft "struct ibuf *"
@ -90,6 +84,10 @@
.Fn imsg_flush "struct imsgbuf *imsgbuf" .Fn imsg_flush "struct imsgbuf *imsgbuf"
.Ft void .Ft void
.Fn imsg_clear "struct imsgbuf *imsgbuf" .Fn imsg_clear "struct imsgbuf *imsgbuf"
.In sys/uio.h
.Ft int
.Fn imsg_composev "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \
"pid_t pid" "int fd" "const struct iovec *iov" "int iovcnt"
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Nm imsg .Nm imsg

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ibuf_test.c,v 1.4 2023/06/19 17:22:46 claudio Exp $ */ /* $OpenBSD: ibuf_test.c,v 1.5 2023/12/29 16:02:29 claudio Exp $ */
/* /*
* Copyright (c) Tobias Stoeckmann <tobias@openbsd.org> * Copyright (c) Tobias Stoeckmann <tobias@openbsd.org>
* *
@ -17,7 +17,6 @@
#include <sys/queue.h> #include <sys/queue.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/uio.h>
#include <imsg.h> #include <imsg.h>
#include <limits.h> #include <limits.h>

View File

@ -1,5 +1,24 @@
# $OpenBSD: Makefile,v 1.1 2002/06/11 22:10:22 provos Exp $ # $OpenBSD: Makefile,v 1.2 2023/12/29 02:37:39 aisha Exp $
PROG= rb-test NAMED_TESTS = random-inserts sequential-inserts \
sequential-removes random-removes remove-nfind \
remove-pfind node-iterations iteration-macros insert-next \
insert-prev benchmarks
REGRESS_TARGETS = all-tests ${NAMED_TESTS}
PROGS = rb-test rbt-test
all-tests: rb-test rbt-test
@echo "===== testing RB macros ====="
./rb-test
@echo "===== testing RBT macros ====="
./rbt-test
${NAMED_TESTS}: rb-test rbt-test
@echo "===== testing RB macros ====="
./rb-test $@
@echo "===== testing RBT macros ====="
./rbt-test $@
.include <bsd.regress.mk> .include <bsd.regress.mk>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,975 @@
/*
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/time.h>
#include <assert.h>
#include <err.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec start, end, diff, rstart, rend, rdiff, rtot = {0, 0};
#ifndef timespecsub
#define timespecsub(tsp, usp, vsp) \
do { \
(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \
(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \
if ((vsp)->tv_nsec < 0) { \
(vsp)->tv_sec--; \
(vsp)->tv_nsec += 1000000000L; \
} \
} while (0)
#endif
#ifndef timespecadd
#define timespecadd(tsp, usp, vsp) \
do { \
(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \
(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \
if ((vsp)->tv_nsec >= 1000000000L) { \
(vsp)->tv_sec++; \
(vsp)->tv_nsec -= 1000000000L; \
} \
} while (0)
#endif
//#define RBT_SMALL
//#define RBT_TEST_RANK
//#define RBT_TEST_DIAGNOSTIC
//#define _RBT_DIAGNOSTIC
#ifdef DOAUGMENT
#define RBT_AUGMENT(elm) tree_augment(elm)
#endif
#include <sys/tree.h>
#define TDEBUGF(fmt, ...) \
fprintf(stderr, "%s:%d:%s(): " fmt "\n", \
__FILE__, __LINE__, __func__, ##__VA_ARGS__)
#ifdef __OpenBSD__
#define SEED_RANDOM srandom_deterministic
#else
#define SEED_RANDOM srandom
#endif
int ITER=150000;
int RANK_TEST_ITERATIONS=10000;
#define MAX(a, b) ((a) > (b) ? (a) : (b))
/* declarations */
struct node;
struct tree;
static int compare(const struct node *, const struct node *);
static void mix_operations(int *, int, struct node *, int, int, int, int);
#ifdef DOAUGMENT
static int tree_augment(struct node *);
#else
#define tree_augment(x) (0)
#endif
#ifdef RBT_TEST_DIAGNOSTIC
static void print_helper(const struct node *, int);
static void print_tree(const struct tree *);
#else
#define print_helper(x, y) do {} while (0)
#define print_tree(x) do {} while (0)
#endif
/* definitions */
struct node {
RBT_ENTRY(node) node_link;
int key;
size_t height;
size_t size;
};
RBT_HEAD(tree, node);
struct tree root = RBT_INITIALIZER(&root);
RBT_PROTOTYPE(tree, node, node_link, compare)
RBT_GENERATE(tree, node, node_link, compare);
#ifndef RBT_RANK
#define RBT_RANK(x, y) 0
#endif
#ifndef _RBT_GET_RDIFF
#define _RBT_GET_RDIFF(x, y, z) 0
#endif
int
main(int argc, char **argv)
{
char *test_target = NULL;
struct node *tmp, *ins, *nodes;
int i, r, rank, *perm, *nums;
if (argc > 1)
test_target = argv[1];
nodes = calloc((ITER + 5), sizeof(struct node));
perm = calloc(ITER, sizeof(int));
nums = calloc(ITER, sizeof(int));
// for determinism
SEED_RANDOM(4201);
TDEBUGF("generating a 'random' permutation");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
perm[0] = 0;
nums[0] = 0;
for(i = 1; i < ITER; i++) {
r = random() % i; // arc4random_uniform(i);
perm[i] = perm[r];
perm[r] = i;
nums[i] = i;
}
/*
fprintf(stderr, "{");
for(int i = 0; i < ITER; i++) {
fprintf(stderr, "%d, ", perm[i]);
}
fprintf(stderr, "}\n");
int nperm[10] = {2, 4, 9, 7, 8, 3, 0, 1, 6, 5};
int nperm[6] = {2, 6, 1, 4, 5, 3};
int nperm[10] = {10, 3, 7, 8, 6, 1, 9, 2, 5, 4};
int nperm[2] = {0, 1};
int nperm[100] = {
54, 47, 31, 35, 40, 73, 29, 66, 15, 45, 9, 71, 51, 32, 28, 62,
12, 46, 50, 26, 36, 91, 10, 76, 33, 43, 34, 58, 55, 72, 37, 24,
75, 4, 90, 88, 30, 25, 82, 18, 67, 81, 80, 65, 23, 41, 61, 86,
20, 99, 59, 14, 79, 21, 68, 27, 1, 7, 94, 44, 89, 64, 96, 2, 49,
53, 74, 13, 48, 42, 60, 52, 95, 17, 11, 0, 22, 97, 77, 69, 6,
16, 84, 78, 8, 83, 98, 93, 39, 38, 85, 70, 3, 19, 57, 5, 87,
92, 63, 56
};
ITER = 100;
for(int i = 0; i < ITER; i++){
perm[i] = nperm[i];
}
*/
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done generating a 'random' permutation in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
RBT_INIT(tree, &root);
// testing random inserts
// due to codependency between inserts and removals, this also tests
// root removals
if (test_target == NULL ||
strcmp(test_target, "random-inserts") == 0
) {
TDEBUGF("starting random insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(perm, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done random insertions in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#ifdef DOAUGMENT
ins = RBT_ROOT(tree, &root);
assert(ITER + 1 == ins->size);
#endif
TDEBUGF("getting min");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
ins = RBT_MIN(tree, &root);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done getting min in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
assert(0 == ins->key);
TDEBUGF("getting max");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
ins = RBT_MAX(tree, &root);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done getting max in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
assert(ITER + 5 == ins->key);
ins = RBT_ROOT(tree, &root);
TDEBUGF("getting root");
assert(RBT_REMOVE(tree, &root, ins) == ins);
#ifdef DOAUGMENT
assert(ITER == (RBT_ROOT(tree, &root))->size);
#endif
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER; i++) {
tmp = RBT_ROOT(tree, &root);
assert(NULL != tmp);
assert(RBT_REMOVE(tree, &root, tmp) == tmp);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
assert(-2 != rank);
print_tree(&root);
}
#endif
#ifdef DOAUGMENT
if (!(RBT_EMPTY(&root)) && (RBT_ROOT(tree, &root))->size != ITER - 1 - i)
errx(1, "RBT_REMOVE size error");
#endif
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
// testing insertions in increasing sequential order
// removals are done using root removals (separate test)
if (test_target == NULL ||
strcmp(test_target, "sequential-inserts") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER + 1; i++) {
tmp = RBT_ROOT(tree, &root);
assert(NULL != tmp);
assert(RBT_REMOVE(tree, &root, tmp) == tmp);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
// testing the RBT_FIND function and using it to do removals in
// sequential order
// insertions are done using sequential insertions (separate test)
if (test_target == NULL ||
strcmp(test_target, "sequential-removes") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing find and remove in sequential order");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = malloc(sizeof(struct node));
for(i = 0; i < ITER; i++) {
tmp->key = i;
ins = RBT_FIND(tree, &root, tmp);
assert(NULL != tmp);
assert(RBT_REMOVE(tree, &root, ins) == ins);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
free(tmp);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done removals in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
ins = RBT_ROOT(tree, &root);
if (ins == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, ins) != ins)
errx(1, "RBT_REMOVE failed");
}
// testing removals in random order
// the elements are found using RBT_FIND
// insertions are done using sequential insertions (separate test)
if (test_target == NULL ||
strcmp(test_target, "random-removes") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing find and remove in random order");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = malloc(sizeof(struct node));
for(i = 0; i < ITER; i++) {
tmp->key = perm[i];
ins = RBT_FIND(tree, &root, tmp);
if (ins == NULL) {
errx(1, "RBT_FIND %d failed: %d", i, perm[i]);
}
if (RBT_REMOVE(tree, &root, ins) == NULL)
errx(1, "RBT_REMOVE failed: %d", i);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
free(tmp);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done removals in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
ins = RBT_ROOT(tree, &root);
if (ins == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, ins) != ins)
errx(1, "RBT_REMOVE failed");
}
// testing removals by finding the next largest element
// this is testing the RBT_NFIND macro
// insertions are done using sequential insertions (separate test)
if (test_target == NULL ||
strcmp(test_target, "remove-nfind") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing nfind and remove");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = malloc(sizeof(struct node));
for(i = 0; i < ITER + 1; i++) {
tmp->key = i;
ins = RBT_NFIND(tree, &root, tmp);
if (ins == NULL)
errx(1, "RBT_NFIND failed");
if (RBT_REMOVE(tree, &root, ins) == NULL)
errx(1, "RBT_REMOVE failed: %d", i);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
free(tmp);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done removals in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
#ifdef RBT_PFIND
// testing removals by finding the previous element
// this is testing the RBT_PFIND macro
// insertions are done using sequential insertions (separate test)
if (test_target == NULL ||
strcmp(test_target, "remove-pfind") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing pfind and remove");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = malloc(sizeof(struct node));
for(i = 0; i < ITER + 1; i++) {
tmp->key = ITER + 6;
ins = RBT_PFIND(tree, &root, tmp);
if (ins == NULL)
errx(1, "RBT_PFIND failed");
if (RBT_REMOVE(tree, &root, ins) == NULL)
errx(1, "RBT_REMOVE failed: %d", i);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
free(tmp);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done removals in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
#endif
// iterate over the tree using RBT_NEXT/RBT_PREV
// insertions and removals have separate tests
if (test_target == NULL ||
strcmp(test_target, "node-iterations") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("iterating over tree with RBT_NEXT");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = RBT_MIN(tree, &root);
assert(tmp != NULL);
assert(tmp->key == 0);
for(i = 1; i < ITER; i++) {
tmp = RBT_NEXT(tree, tmp);
assert(tmp != NULL);
assert(tmp->key == i);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("iterating over tree with RBT_PREV");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = RBT_MAX(tree, &root);
assert(tmp != NULL);
assert(tmp->key == ITER + 5);
for(i = 0; i < ITER; i++) {
tmp = RBT_PREV(tree, tmp);
assert(tmp != NULL);
assert(tmp->key == ITER - 1 - i);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER + 1; i++) {
tmp = RBT_ROOT(tree, &root);
assert(NULL != tmp);
assert(RBT_REMOVE(tree, &root, tmp) == tmp);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
// iterate over the tree using RBT_FOREACH* macros
// the *_SAFE macros are tested by using them to clear the tree
// insertions and removals have separate tests
if (test_target == NULL ||
strcmp(test_target, "iteration-macros") == 0
) {
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#ifdef RBT_FOREACH
TDEBUGF("iterating over tree with RBT_FOREACH");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
i = 0;
RBT_FOREACH(ins, tree, &root) {
if (i < ITER)
assert(ins->key == i);
else
assert(ins->key == ITER + 5);
i++;
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#endif
#ifdef RBT_FOREACH_REVERSE
TDEBUGF("iterating over tree with RBT_FOREACH_REVERSE");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
i = ITER + 5;
RBT_FOREACH_REVERSE(ins, tree, &root) {
assert(ins->key == i);
if (i > ITER)
i = ITER - 1;
else
i--;
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#endif
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER + 1; i++) {
tmp = RBT_ROOT(tree, &root);
assert(NULL != tmp);
assert(RBT_REMOVE(tree, &root, tmp) == tmp);
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#ifdef RBT_FOREACH_SAFE
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("iterating over tree and clearing with RBT_FOREACH_SAFE");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
i = 0;
RBT_FOREACH_SAFE(ins, tree, &root, tmp) {
if (i < ITER)
assert(ins->key == i);
else
assert(ins->key == ITER + 5);
i++;
assert(RBT_REMOVE(tree, &root, ins) == ins);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#endif
#ifdef RBT_FOREACH_REVERSE_SAFE
TDEBUGF("starting sequential insertions");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(nums, ITER, nodes, ITER, ITER, 0, 0);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done sequential insertions in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("iterating over tree and clearing with RBT_FOREACH_REVERSE_SAFE");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
i = ITER + 5;
RBT_FOREACH_REVERSE_SAFE(ins, tree, &root, tmp) {
assert(ins->key == i);
if (i > ITER)
i = ITER - 1;
else
i--;
assert(RBT_REMOVE(tree, &root, ins) == ins);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
#endif
}
#ifdef RBT_INSERT_NEXT
// testing insertions at specific points in the tree
// the insertions are done at the next position in the tree at a give node
// this assumes that the location is correct for the given ordering
if (test_target == NULL ||
strcmp(test_target, "insert-next") == 0
) {
TDEBUGF("starting sequential insertions using INSERT_NEXT");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = &(nodes[0]);
tmp->size = 1;
tmp->height = 1;
tmp->key = 0;
if (RBT_INSERT(tree, &root, tmp) != NULL)
errx(1, "RBT_INSERT failed");
ins = tmp;
for(i = 1; i < ITER; i++) {
tmp = &(nodes[i]);
tmp->size = 1;
tmp->height = 1;
tmp->key = i;
if (RBT_INSERT_NEXT(tree, &root, ins, tmp) != NULL)
errx(1, "RBT_INSERT failed");
ins = tmp;
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done insertions in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("iterating over tree and clearing with RBT_FOREACH_REVERSE_SAFE");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
RBT_FOREACH_REVERSE_SAFE(ins, tree, &root, tmp) {
assert(RBT_REMOVE(tree, &root, ins) == ins);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
#endif
#ifdef RBT_INSERT_PREV
// testing insertions at specific points in the tree
// the insertions are done at the next position in the tree at a give node
// this assumes that the location is correct for the given ordering
if (test_target == NULL ||
strcmp(test_target, "insert-prev") == 0
) {
TDEBUGF("starting sequential insertions using INSERT_PREV");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
tmp = &(nodes[ITER]);
tmp->size = 1;
tmp->height = 1;
tmp->key = ITER;
if (RBT_INSERT(tree, &root, tmp) != NULL)
errx(1, "RBT_INSERT failed");
ins = tmp;
for(i = ITER - 1; i >= 0; i--) {
tmp = &(nodes[i]);
tmp->size = 1;
tmp->height = 1;
tmp->key = i;
if (RBT_INSERT_PREV(tree, &root, ins, tmp) != NULL)
errx(1, "RBT_INSERT failed");
ins = tmp;
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done insertions in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("iterating over tree and clearing with RBT_FOREACH_REVERSE_SAFE");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
RBT_FOREACH_REVERSE_SAFE(ins, tree, &root, tmp) {
assert(RBT_REMOVE(tree, &root, ins) == ins);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done iterations in %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
#endif
if (test_target == NULL ||
strcmp(test_target, "benchmarks") == 0
) {
TDEBUGF("doing 50%% insertions, 50%% lookups");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(perm, ITER, nodes, ITER, ITER / 2, ITER / 2, 1);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done operations in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER / 2 + 1; i++) {
tmp = RBT_ROOT(tree, &root);
if (tmp == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, tmp) != tmp)
errx(1, "RBT_REMOVE error");
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing 20%% insertions, 80%% lookups");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(perm, ITER, nodes, ITER, ITER / 5, 4 * (ITER / 5), 1);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done operations in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER / 5 + 1; i++) {
tmp = RBT_ROOT(tree, &root);
if (tmp == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, tmp) != tmp)
errx(1, "RBT_REMOVE error");
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing 10%% insertions, 90%% lookups");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(perm, ITER, nodes, ITER, ITER / 10, 9 * (ITER / 10), 1);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done operations in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < ITER / 10 + 1; i++) {
tmp = RBT_ROOT(tree, &root);
if (tmp == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, tmp) != tmp)
errx(1, "RBT_REMOVE error");
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing 5%% insertions, 95%% lookups");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(perm, ITER, nodes,
ITER, 5 * (ITER / 100),
95 * (ITER / 100), 1);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done operations in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < 5 * (ITER / 100) + 1; i++) {
tmp = RBT_ROOT(tree, &root);
if (tmp == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, tmp) != tmp)
errx(1, "RBT_REMOVE error");
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing 2%% insertions, 98%% lookups");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
mix_operations(perm, ITER, nodes, ITER,
2 * (ITER / 100),
98 * (ITER / 100), 1);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done operations in: %lld.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
TDEBUGF("doing root removals");
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start);
for (i = 0; i < 2 * (ITER / 100) + 1; i++) {
tmp = RBT_ROOT(tree, &root);
if (tmp == NULL)
errx(1, "RBT_ROOT error");
if (RBT_REMOVE(tree, &root, tmp) != tmp)
errx(1, "RBT_REMOVE error");
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end);
timespecsub(&end, &start, &diff);
TDEBUGF("done root removals in: %llu.%09llu s",
(unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_nsec);
}
free(nodes);
free(perm);
free(nums);
return 0;
}
static int
compare(const struct node *a, const struct node *b)
{
return a->key - b->key;
}
#ifdef RBT_TEST_DIAGNOSTIC
static void
print_helper(const struct node *n, int indent)
{
if (RBT_RIGHT(n, node_link))
print_helper(RBT_RIGHT(n, node_link), indent + 4);
TDEBUGF("%*s key=%d :: size=%zu :: rank=%d :: rdiff %lu:%lu",
indent, "", n->key, n->size, RBT_RANK(tree, n),
_RBT_GET_RDIFF(n, _RBT_LDIR, node_link),
_RBT_GET_RDIFF(n, _RBT_RDIR, node_link));
if (RBT_LEFT(n, node_link))
print_helper(RBT_LEFT(n, node_link), indent + 4);
}
static void
print_tree(const struct tree *t)
{
if (RBT_ROOT(tree, t)) print_helper(RBT_ROOT(tree, t), 0);
}
#endif
#ifdef DOAUGMENT
static int
tree_augment(struct node *elm)
{
size_t newsize = 1, newheight = 0;
if ((RBT_LEFT(elm, node_link))) {
newsize += (RBT_LEFT(elm, node_link))->size;
newheight = MAX((RBT_LEFT(elm, node_link))->height, newheight);
}
if ((RBT_RIGHT(elm, node_link))) {
newsize += (RBT_RIGHT(elm, node_link))->size;
newheight = MAX((RBT_RIGHT(elm, node_link))->height, newheight);
}
newheight += 1;
if (elm->size != newsize || elm->height != newheight) {
elm->size = newsize;
elm->height = newheight;
return 1;
}
return 0;
}
#endif
void
mix_operations(int *perm, int psize, struct node *nodes, int nsize,
int insertions, int reads, int do_reads)
{
int i, rank;
struct node *tmp, *ins;
struct node it;
assert(psize == nsize);
assert(insertions + reads <= psize);
for(i = 0; i < insertions; i++) {
//TDEBUGF("iteration %d", i);
tmp = &(nodes[i]);
if (tmp == NULL) err(1, "malloc");
tmp->size = 1;
tmp->height = 1;
tmp->key = perm[i];
//TDEBUGF("inserting %d", tmp->key);
if (RBT_INSERT(tree, &root, tmp) != NULL)
errx(1, "RBT_INSERT failed");
print_tree(&root);
#ifdef DOAUGMENT
//TDEBUGF("size = %zu", RBT_ROOT(tree, &root)->size);
assert(RBT_ROOT(tree, &root)->size == i + 1);
#endif
#ifdef RBT_TEST_RANK
if (i % RANK_TEST_ITERATIONS == 0) {
rank = RBT_RANK(tree, RBT_ROOT(tree, &root));
if (rank == -2)
errx(1, "rank error");
}
#endif
}
tmp = &(nodes[insertions]);
tmp->key = ITER + 5;
tmp->size = 1;
tmp->height = 1;
RBT_INSERT(tree, &root, tmp);
if (do_reads) {
for (i = 0; i < insertions; i++) {
it.key = perm[i];
ins = RBT_FIND(tree, &root, &it);
if ((ins == NULL) || ins->key != it.key)
errx(1, "RBT_FIND failed");
}
for (i = insertions; i < insertions + reads; i++) {
it.key = perm[i];
ins = RBT_NFIND(tree, &root, &it);
if (ins->key < it.key)
errx(1, "RBT_NFIND failed");
}
}
}

View File

@ -30,10 +30,10 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.\" $OpenBSD: login.conf.5,v 1.70 2022/03/31 17:27:23 naddy Exp $ .\" $OpenBSD: login.conf.5,v 1.71 2023/12/29 11:57:38 claudio Exp $
.\" BSDI $From: login.conf.5,v 2.20 2000/06/26 14:50:38 prb Exp $ .\" BSDI $From: login.conf.5,v 2.20 2000/06/26 14:50:38 prb Exp $
.\" .\"
.Dd $Mdocdate: March 31 2022 $ .Dd $Mdocdate: December 29 2023 $
.Dt LOGIN.CONF 5 .Dt LOGIN.CONF 5
.Os .Os
.Sh NAME .Sh NAME
@ -284,7 +284,7 @@ Initial priority (nice) level.
Require home directory to login. Require home directory to login.
.\" .\"
.Pp .Pp
.It rtable Ta number Ta Dv 0 Ta .It rtable Ta number Ta "" Ta
Rtable to be set for the class. Rtable to be set for the class.
.\" .\"
.Pp .Pp

View File

@ -1,4 +1,4 @@
/* $OpenBSD: pmap.c,v 1.164 2023/04/13 15:23:21 miod Exp $ */ /* $OpenBSD: pmap.c,v 1.165 2023/12/29 13:23:27 jca Exp $ */
/* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */ /* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */
/* /*
@ -913,6 +913,12 @@ pmap_bootstrap(paddr_t first_avail, paddr_t max_pa)
return first_avail; return first_avail;
} }
void
pmap_init_percpu(void)
{
pool_cache_init(&pmap_pv_pool);
}
/* /*
* pmap_randomize * pmap_randomize
* *

View File

@ -1,4 +1,4 @@
/* $OpenBSD: pmap.h,v 1.87 2023/12/11 22:12:52 kettenis Exp $ */ /* $OpenBSD: pmap.h,v 1.88 2023/12/29 13:23:28 jca Exp $ */
/* $NetBSD: pmap.h,v 1.1 2003/04/26 18:39:46 fvdl Exp $ */ /* $NetBSD: pmap.h,v 1.1 2003/04/26 18:39:46 fvdl Exp $ */
/* /*
@ -375,7 +375,6 @@ extern const long nbpd[], nkptpmax[];
#define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */ #define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */
#define pmap_proc_iflush(p,va,len) /* nothing */ #define pmap_proc_iflush(p,va,len) /* nothing */
#define pmap_init_percpu() do { /* nothing */ } while (0)
#define pmap_unuse_final(p) /* nothing */ #define pmap_unuse_final(p) /* nothing */
#define pmap_remove_holes(vm) do { /* nothing */ } while (0) #define pmap_remove_holes(vm) do { /* nothing */ } while (0)
@ -386,6 +385,7 @@ extern const long nbpd[], nkptpmax[];
void map_tramps(void); /* machdep.c */ void map_tramps(void); /* machdep.c */
paddr_t pmap_bootstrap(paddr_t, paddr_t); paddr_t pmap_bootstrap(paddr_t, paddr_t);
void pmap_init_percpu(void);
void pmap_randomize(void); void pmap_randomize(void);
void pmap_randomize_level(pd_entry_t *, int); void pmap_randomize_level(pd_entry_t *, int);
int pmap_clear_attrs(struct vm_page *, unsigned long); int pmap_clear_attrs(struct vm_page *, unsigned long);

View File

@ -1556,9 +1556,6 @@ struct drm_device *
drm_get_device_from_kdev(dev_t kdev) drm_get_device_from_kdev(dev_t kdev)
{ {
int unit = minor(kdev) & ((1 << CLONE_SHIFT) - 1); int unit = minor(kdev) & ((1 << CLONE_SHIFT) - 1);
/* control */
if (unit >= 64 && unit < 128)
unit -= 64;
/* render */ /* render */
if (unit >= 128) if (unit >= 128)
unit -= 128; unit -= 128;
@ -1701,12 +1698,18 @@ drmopen(dev_t kdev, int flags, int fmt, struct proc *p)
realminor = dminor & ((1 << CLONE_SHIFT) - 1); realminor = dminor & ((1 << CLONE_SHIFT) - 1);
if (realminor < 64) if (realminor < 64)
minor_type = DRM_MINOR_PRIMARY; minor_type = DRM_MINOR_PRIMARY;
else if (realminor >= 64 && realminor < 128) else if (realminor >= 128 && realminor < 192)
minor_type = DRM_MINOR_CONTROL;
else
minor_type = DRM_MINOR_RENDER; minor_type = DRM_MINOR_RENDER;
else {
ret = ENXIO;
goto err;
}
dm = *drm_minor_get_slot(dev, minor_type); dm = *drm_minor_get_slot(dev, minor_type);
if (dm == NULL) {
ret = ENXIO;
goto err;
}
dm->index = minor(kdev); dm->index = minor(kdev);
file_priv = drm_file_alloc(dm); file_priv = drm_file_alloc(dm);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: if.c,v 1.713 2023/12/23 10:52:54 bluhm Exp $ */ /* $OpenBSD: if.c,v 1.714 2023/12/29 11:43:04 bluhm Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */ /* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/* /*
@ -839,11 +839,14 @@ if_input_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
if (ISSET(keepcksum, M_ICMP_CSUM_OUT)) if (ISSET(keepcksum, M_ICMP_CSUM_OUT))
m->m_pkthdr.csum_flags |= M_ICMP_CSUM_IN_OK; m->m_pkthdr.csum_flags |= M_ICMP_CSUM_IN_OK;
if (ifp->if_counters == NULL) {
/* XXXSMP multicast loopback and simplex interfaces */
ifp->if_opackets++; ifp->if_opackets++;
ifp->if_obytes += m->m_pkthdr.len; ifp->if_obytes += m->m_pkthdr.len;
} else {
ifp->if_ipackets++; counters_pkt(ifp->if_counters, ifc_opackets, ifc_obytes,
ifp->if_ibytes += m->m_pkthdr.len; m->m_pkthdr.len);
}
switch (af) { switch (af) {
case AF_INET: case AF_INET:

View File

@ -1,4 +1,4 @@
/* $OpenBSD: if_loop.c,v 1.97 2023/07/21 22:24:41 bluhm Exp $ */ /* $OpenBSD: if_loop.c,v 1.98 2023/12/29 11:43:04 bluhm Exp $ */
/* $NetBSD: if_loop.c,v 1.15 1996/05/07 02:40:33 thorpej Exp $ */ /* $NetBSD: if_loop.c,v 1.15 1996/05/07 02:40:33 thorpej Exp $ */
/* /*
@ -185,6 +185,7 @@ loop_clone_create(struct if_clone *ifc, int unit)
ifp->if_output = looutput; ifp->if_output = looutput;
ifp->if_type = IFT_LOOP; ifp->if_type = IFT_LOOP;
ifp->if_hdrlen = sizeof(u_int32_t); ifp->if_hdrlen = sizeof(u_int32_t);
if_counters_alloc(ifp);
if (unit == 0) { if (unit == 0) {
if_attachhead(ifp); if_attachhead(ifp);
if_addgroup(ifp, ifc->ifc_name); if_addgroup(ifp, ifc->ifc_name);
@ -250,7 +251,7 @@ loinput(struct ifnet *ifp, struct mbuf *m)
error = if_input_local(ifp, m, m->m_pkthdr.ph_family); error = if_input_local(ifp, m, m->m_pkthdr.ph_family);
if (error) if (error)
ifp->if_ierrors++; counters_inc(ifp->if_counters, ifc_ierrors);
} }
int int

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: openssl.1,v 1.152 2023/07/27 07:01:50 tb Exp $ .\" $OpenBSD: openssl.1,v 1.153 2023/12/29 12:06:48 tb Exp $
.\" ==================================================================== .\" ====================================================================
.\" Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. .\" Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
.\" .\"
@ -110,7 +110,7 @@
.\" copied and put under another distribution licence .\" copied and put under another distribution licence
.\" [including the GNU Public Licence.] .\" [including the GNU Public Licence.]
.\" .\"
.Dd $Mdocdate: July 27 2023 $ .Dd $Mdocdate: December 29 2023 $
.Dt OPENSSL 1 .Dt OPENSSL 1
.Os .Os
.Sh NAME .Sh NAME
@ -4279,7 +4279,6 @@ Verify the input data and output the recovered data.
.Op Fl no_tls1_2 .Op Fl no_tls1_2
.Op Fl no_tls1_3 .Op Fl no_tls1_3
.Op Fl pass Ar arg .Op Fl pass Ar arg
.Op Fl pause
.Op Fl policy_check .Op Fl policy_check
.Op Fl port Ar port .Op Fl port Ar port
.Op Fl prexit .Op Fl prexit
@ -4445,8 +4444,6 @@ Disable the use of TLS1.2 and 1.3, respectively.
Disable RFC 4507 session ticket support. Disable RFC 4507 session ticket support.
.It Fl pass Ar arg .It Fl pass Ar arg
The private key password source. The private key password source.
.It Fl pause
Pause 1 second between each read and write call.
.It Fl port Ar port .It Fl port Ar port
The The
.Ar port .Ar port

View File

@ -1,4 +1,4 @@
/* $OpenBSD: s_client.c,v 1.62 2023/07/03 08:03:56 beck Exp $ */ /* $OpenBSD: s_client.c,v 1.64 2023/12/29 12:15:49 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -223,7 +223,6 @@ static struct {
char *npn_in; char *npn_in;
unsigned int off; unsigned int off;
char *passarg; char *passarg;
int pause;
int peekaboo; int peekaboo;
char *port; char *port;
int prexit; int prexit;
@ -659,9 +658,7 @@ static const struct option s_client_options[] = {
}, },
{ {
.name = "pause", .name = "pause",
.desc = "Pause 1 second between each read and write call", .type = OPTION_DISCARD,
.type = OPTION_FLAG,
.opt.flag = &cfg.pause,
}, },
{ {
.name = "peekaboo", .name = "peekaboo",
@ -832,7 +829,7 @@ sc_usage(void)
" [-keymatexport label] [-keymatexportlen len] [-legacy_server_connect]\n" " [-keymatexport label] [-keymatexportlen len] [-legacy_server_connect]\n"
" [-msg] [-mtu mtu] [-nbio] [-nbio_test] [-no_comp] [-no_ign_eof]\n" " [-msg] [-mtu mtu] [-nbio] [-nbio_test] [-no_comp] [-no_ign_eof]\n"
" [-no_legacy_server_connect] [-no_ticket] \n" " [-no_legacy_server_connect] [-no_ticket] \n"
" [-no_tls1_2] [-no_tls1_3] [-pass arg] [-pause] [-policy_check]\n" " [-no_tls1_2] [-no_tls1_3] [-pass arg] [-policy_check]\n"
" [-port port] [-prexit] [-proxy host:port] [-quiet] [-reconnect]\n" " [-port port] [-prexit] [-proxy host:port] [-quiet] [-reconnect]\n"
" [-servername name] [-serverpref] [-sess_in file] [-sess_out file]\n" " [-servername name] [-serverpref] [-sess_in file] [-sess_out file]\n"
" [-showcerts] [-starttls protocol] [-state] [-status] [-timeout]\n" " [-showcerts] [-starttls protocol] [-state] [-status] [-timeout]\n"
@ -1088,8 +1085,6 @@ s_client_main(int argc, char **argv)
goto end; goto end;
} }
} }
if (cfg.pause & 0x01)
SSL_set_debug(con, 1);
if (SSL_is_dtls(con)) { if (SSL_is_dtls(con)) {
sbio = BIO_new_dgram(s, BIO_NOCLOSE); sbio = BIO_new_dgram(s, BIO_NOCLOSE);
@ -1130,7 +1125,6 @@ s_client_main(int argc, char **argv)
sbio = BIO_push(test, sbio); sbio = BIO_push(test, sbio);
} }
if (cfg.debug) { if (cfg.debug) {
SSL_set_debug(con, 1);
BIO_set_callback(sbio, bio_dump_callback); BIO_set_callback(sbio, bio_dump_callback);
BIO_set_callback_arg(sbio, (char *) bio_c_out); BIO_set_callback_arg(sbio, (char *) bio_c_out);
} }

View File

@ -1,4 +1,4 @@
/* $OpenBSD: s_server.c,v 1.58 2023/07/03 08:03:56 beck Exp $ */ /* $OpenBSD: s_server.c,v 1.59 2023/12/29 12:15:49 tb Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *
@ -1548,7 +1548,6 @@ sv_body(int s, unsigned char *context)
/* SSL_set_fd(con,s); */ /* SSL_set_fd(con,s); */
if (cfg.debug) { if (cfg.debug) {
SSL_set_debug(con, 1);
BIO_set_callback(SSL_get_rbio(con), bio_dump_callback); BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
BIO_set_callback_arg(SSL_get_rbio(con), (char *) bio_s_out); BIO_set_callback_arg(SSL_get_rbio(con), (char *) bio_s_out);
} }
@ -1949,7 +1948,6 @@ www_body(int s, unsigned char *context)
BIO_push(io, ssl_bio); BIO_push(io, ssl_bio);
if (cfg.debug) { if (cfg.debug) {
SSL_set_debug(con, 1);
BIO_set_callback(SSL_get_rbio(con), bio_dump_callback); BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
BIO_set_callback_arg(SSL_get_rbio(con), (char *) bio_s_out); BIO_set_callback_arg(SSL_get_rbio(con), (char *) bio_s_out);
} }

View File

@ -1,4 +1,4 @@
/* $OpenBSD: parser.c,v 1.104 2023/12/18 23:42:20 job Exp $ */ /* $OpenBSD: parser.c,v 1.106 2023/12/29 17:15:10 tb Exp $ */
/* /*
* Copyright (c) 2019 Claudio Jeker <claudio@openbsd.org> * Copyright (c) 2019 Claudio Jeker <claudio@openbsd.org>
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
@ -394,11 +394,10 @@ proc_parser_mft(struct entity *entp, struct mft **mp, char **crlfile,
*mp = proc_parser_mft_post(file1, mft1, entp->path, err1, *mp = proc_parser_mft_post(file1, mft1, entp->path, err1,
&warned); &warned);
if (*mp == NULL) { if (*mp == NULL) {
if (mft2 != NULL)
warnx("%s#%s: failed fetch, continuing with #%s"
" from cache", file1, mft1->seqnum,
mft2->seqnum);
mft1 = NULL; mft1 = NULL;
if (mft2 != NULL)
warnx("%s: failed fetch, continuing with #%s"
" from cache", file2, mft2->seqnum);
} }
} }

View File

@ -1,3 +1,3 @@
/* $OpenBSD: version.h,v 1.19 2023/12/18 09:51:06 benno Exp $ */ /* $OpenBSD: version.h,v 1.20 2023/12/29 18:52:11 tb Exp $ */
#define RPKI_VERSION "8.7" #define RPKI_VERSION "8.8"