mirror of https://github.com/getdnsapi/getdns.git
Update components from Unbound
This commit is contained in:
parent
55be327f69
commit
1184f2b8ea
|
@ -138,6 +138,69 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** hash structure for keeping track of running hashes */
|
||||||
|
struct secalgo_hash {
|
||||||
|
/** the openssl message digest context */
|
||||||
|
EVP_MD_CTX* ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** create secalgo hash with hash type */
|
||||||
|
static struct secalgo_hash* secalgo_hash_create_md(const EVP_MD* md)
|
||||||
|
{
|
||||||
|
struct secalgo_hash* h;
|
||||||
|
if(!md)
|
||||||
|
return NULL;
|
||||||
|
h = calloc(1, sizeof(*h));
|
||||||
|
if(!h)
|
||||||
|
return NULL;
|
||||||
|
h->ctx = EVP_MD_CTX_create();
|
||||||
|
if(!h->ctx) {
|
||||||
|
free(h);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(!EVP_DigestInit_ex(h->ctx, md, NULL)) {
|
||||||
|
EVP_MD_CTX_destroy(h->ctx);
|
||||||
|
free(h);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha384(void)
|
||||||
|
{
|
||||||
|
return secalgo_hash_create_md(EVP_sha384());
|
||||||
|
}
|
||||||
|
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha512(void)
|
||||||
|
{
|
||||||
|
return secalgo_hash_create_md(EVP_sha512());
|
||||||
|
}
|
||||||
|
|
||||||
|
int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
|
||||||
|
{
|
||||||
|
return EVP_DigestUpdate(hash->ctx, (unsigned char*)data,
|
||||||
|
(unsigned int)len);
|
||||||
|
}
|
||||||
|
|
||||||
|
int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
|
||||||
|
size_t maxlen, size_t* resultlen)
|
||||||
|
{
|
||||||
|
if(EVP_MD_CTX_size(hash->ctx) > (int)maxlen) {
|
||||||
|
*resultlen = 0;
|
||||||
|
log_err("secalgo_hash_final: hash buffer too small");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*resultlen = EVP_MD_CTX_size(hash->ctx);
|
||||||
|
return EVP_DigestFinal_ex(hash->ctx, result, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void secalgo_hash_delete(struct secalgo_hash* hash)
|
||||||
|
{
|
||||||
|
if(!hash) return;
|
||||||
|
EVP_MD_CTX_destroy(hash->ctx);
|
||||||
|
free(hash);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return size of DS digest according to its hash algorithm.
|
* Return size of DS digest according to its hash algorithm.
|
||||||
* @param algo: DS digest algo.
|
* @param algo: DS digest algo.
|
||||||
|
@ -820,6 +883,64 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
|
||||||
(void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len);
|
(void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** the secalgo hash structure */
|
||||||
|
struct secalgo_hash {
|
||||||
|
/** hash context */
|
||||||
|
HASHContext* ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** create hash struct of type */
|
||||||
|
static struct secalgo_hash* secalgo_hash_create_type(HASH_HashType tp)
|
||||||
|
{
|
||||||
|
struct secalgo_hash* h = calloc(1, sizeof(*h));
|
||||||
|
if(!h)
|
||||||
|
return NULL;
|
||||||
|
h->ctx = HASH_Create(tp);
|
||||||
|
if(!h->ctx) {
|
||||||
|
free(h);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha384(void)
|
||||||
|
{
|
||||||
|
return secalgo_hash_create_type(HASH_AlgSHA384);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha512(void)
|
||||||
|
{
|
||||||
|
return secalgo_hash_create_type(HASH_AlgSHA512);
|
||||||
|
}
|
||||||
|
|
||||||
|
int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
|
||||||
|
{
|
||||||
|
HASH_Update(hash->ctx, (unsigned char*)data, (unsigned int)len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
|
||||||
|
size_t maxlen, size_t* resultlen)
|
||||||
|
{
|
||||||
|
unsigned int reslen = 0;
|
||||||
|
if(HASH_ResultLenContext(hash->ctx) > (unsigned int)maxlen) {
|
||||||
|
*resultlen = 0;
|
||||||
|
log_err("secalgo_hash_final: hash buffer too small");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
HASH_End(hash->ctx, (unsigned char*)result, &reslen,
|
||||||
|
(unsigned int)maxlen);
|
||||||
|
*resultlen = (size_t)reslen;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void secalgo_hash_delete(struct secalgo_hash* hash)
|
||||||
|
{
|
||||||
|
if(!hash) return;
|
||||||
|
HASH_Destroy(hash->ctx);
|
||||||
|
free(hash);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
ds_digest_size_supported(int algo)
|
ds_digest_size_supported(int algo)
|
||||||
{
|
{
|
||||||
|
@ -987,6 +1108,7 @@ static SECKEYPublicKey* nss_buf2ecdsa(unsigned char* key, size_t len, int algo)
|
||||||
return pk;
|
return pk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(USE_DSA) && defined(USE_SHA1)
|
||||||
static SECKEYPublicKey* nss_buf2dsa(unsigned char* key, size_t len)
|
static SECKEYPublicKey* nss_buf2dsa(unsigned char* key, size_t len)
|
||||||
{
|
{
|
||||||
SECKEYPublicKey* pk;
|
SECKEYPublicKey* pk;
|
||||||
|
@ -1047,6 +1169,7 @@ static SECKEYPublicKey* nss_buf2dsa(unsigned char* key, size_t len)
|
||||||
}
|
}
|
||||||
return pk;
|
return pk;
|
||||||
}
|
}
|
||||||
|
#endif /* USE_DSA && USE_SHA1 */
|
||||||
|
|
||||||
static SECKEYPublicKey* nss_buf2rsa(unsigned char* key, size_t len)
|
static SECKEYPublicKey* nss_buf2rsa(unsigned char* key, size_t len)
|
||||||
{
|
{
|
||||||
|
@ -1446,6 +1569,82 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
|
||||||
_digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res);
|
_digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** secalgo hash structure */
|
||||||
|
struct secalgo_hash {
|
||||||
|
/** if it is 384 or 512 */
|
||||||
|
int active;
|
||||||
|
/** context for sha384 */
|
||||||
|
struct sha384_ctx ctx384;
|
||||||
|
/** context for sha512 */
|
||||||
|
struct sha512_ctx ctx512;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha384(void)
|
||||||
|
{
|
||||||
|
struct secalgo_hash* h = calloc(1, sizeof(*h));
|
||||||
|
if(!h)
|
||||||
|
return NULL;
|
||||||
|
h->active = 384;
|
||||||
|
sha384_init(&h->ctx384);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha512(void)
|
||||||
|
{
|
||||||
|
struct secalgo_hash* h = calloc(1, sizeof(*h));
|
||||||
|
if(!h)
|
||||||
|
return NULL;
|
||||||
|
h->active = 512;
|
||||||
|
sha512_init(&h->ctx512);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
|
||||||
|
{
|
||||||
|
if(hash->active == 384) {
|
||||||
|
sha384_update(&hash->ctx384, len, data);
|
||||||
|
} else if(hash->active == 512) {
|
||||||
|
sha512_update(&hash->ctx512, len, data);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
|
||||||
|
size_t maxlen, size_t* resultlen)
|
||||||
|
{
|
||||||
|
if(hash->active == 384) {
|
||||||
|
if(SHA384_DIGEST_SIZE > maxlen) {
|
||||||
|
*resultlen = 0;
|
||||||
|
log_err("secalgo_hash_final: hash buffer too small");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*resultlen = SHA384_DIGEST_SIZE;
|
||||||
|
sha384_digest(&hash->ctx384, SHA384_DIGEST_SIZE,
|
||||||
|
(unsigned char*)result);
|
||||||
|
} else if(hash->active == 512) {
|
||||||
|
if(SHA512_DIGEST_SIZE > maxlen) {
|
||||||
|
*resultlen = 0;
|
||||||
|
log_err("secalgo_hash_final: hash buffer too small");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*resultlen = SHA512_DIGEST_SIZE;
|
||||||
|
sha512_digest(&hash->ctx512, SHA512_DIGEST_SIZE,
|
||||||
|
(unsigned char*)result);
|
||||||
|
} else {
|
||||||
|
*resultlen = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void secalgo_hash_delete(struct secalgo_hash* hash)
|
||||||
|
{
|
||||||
|
if(!hash) return;
|
||||||
|
free(hash);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return size of DS digest according to its hash algorithm.
|
* Return size of DS digest according to its hash algorithm.
|
||||||
* @param algo: DS digest algo.
|
* @param algo: DS digest algo.
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "util/locks.h"
|
#include "util/locks.h"
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
|
||||||
#ifdef HAVE_SYS_WAIT_H
|
#ifdef HAVE_SYS_WAIT_H
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -53,18 +53,21 @@ on 1 byte), but shoehorning those bytes into integers efficiently is messy.
|
||||||
#include "util/storage/lookup3.h"
|
#include "util/storage/lookup3.h"
|
||||||
#include <stdio.h> /* defines printf for tests */
|
#include <stdio.h> /* defines printf for tests */
|
||||||
#include <time.h> /* defines time_t for timings in the test */
|
#include <time.h> /* defines time_t for timings in the test */
|
||||||
|
/*#include <stdint.h> defines uint32_t etc (from config.h) */
|
||||||
#if defined(HAVE_TARGET_ENDIANNESS)
|
#include <sys/param.h> /* attempt to define endianness */
|
||||||
# if defined(TARGET_IS_BIG_ENDIAN)
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
# define HASH_LITTLE_ENDIAN 0
|
# include <sys/types.h> /* attempt to define endianness (solaris) */
|
||||||
# define HASH_BIG_ENDIAN 1
|
#endif
|
||||||
|
#if defined(linux) || defined(__OpenBSD__)
|
||||||
|
# ifdef HAVE_ENDIAN_H
|
||||||
|
# include <endian.h> /* attempt to define endianness */
|
||||||
# else
|
# else
|
||||||
# define HASH_LITTLE_ENDIAN 1
|
# include <machine/endian.h> /* on older OpenBSD */
|
||||||
# define HASH_BIG_ENDIAN 0
|
|
||||||
# endif
|
# endif
|
||||||
#else
|
#endif
|
||||||
# error "Target endianness required."
|
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
|
||||||
#endif /* defined(HAVE_TARGET_ENDIANNESS) */
|
#include <sys/endian.h> /* attempt to define endianness */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* random initial value */
|
/* random initial value */
|
||||||
static uint32_t raninit = (uint32_t)0xdeadbeef;
|
static uint32_t raninit = (uint32_t)0xdeadbeef;
|
||||||
|
@ -75,6 +78,36 @@ hash_set_raninit(uint32_t v)
|
||||||
raninit = v;
|
raninit = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* My best guess at if you are big-endian or little-endian. This may
|
||||||
|
* need adjustment.
|
||||||
|
*/
|
||||||
|
#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
|
||||||
|
__BYTE_ORDER == __LITTLE_ENDIAN) || \
|
||||||
|
(defined(i386) || defined(__i386__) || defined(__i486__) || \
|
||||||
|
defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL) || defined(__x86))
|
||||||
|
# define HASH_LITTLE_ENDIAN 1
|
||||||
|
# define HASH_BIG_ENDIAN 0
|
||||||
|
#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
|
||||||
|
__BYTE_ORDER == __BIG_ENDIAN) || \
|
||||||
|
(defined(sparc) || defined(__sparc) || defined(__sparc__) || defined(POWERPC) || defined(mc68000) || defined(sel))
|
||||||
|
# define HASH_LITTLE_ENDIAN 0
|
||||||
|
# define HASH_BIG_ENDIAN 1
|
||||||
|
#elif defined(_MACHINE_ENDIAN_H_)
|
||||||
|
/* test for machine_endian_h protects failure if some are empty strings */
|
||||||
|
# if defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && _BYTE_ORDER == _BIG_ENDIAN
|
||||||
|
# define HASH_LITTLE_ENDIAN 0
|
||||||
|
# define HASH_BIG_ENDIAN 1
|
||||||
|
# endif
|
||||||
|
# if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && _BYTE_ORDER == _LITTLE_ENDIAN
|
||||||
|
# define HASH_LITTLE_ENDIAN 1
|
||||||
|
# define HASH_BIG_ENDIAN 0
|
||||||
|
# endif /* _MACHINE_ENDIAN_H_ */
|
||||||
|
#else
|
||||||
|
# define HASH_LITTLE_ENDIAN 0
|
||||||
|
# define HASH_BIG_ENDIAN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#define hashsize(n) ((uint32_t)1<<(n))
|
#define hashsize(n) ((uint32_t)1<<(n))
|
||||||
#define hashmask(n) (hashsize(n)-1)
|
#define hashmask(n) (hashsize(n)-1)
|
||||||
#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
|
#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
|
||||||
|
|
|
@ -40,8 +40,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "util/storage/lruhash.h"
|
#include "util/storage/lruhash.h"
|
||||||
#include "util/fptr_wlist.h"
|
#include "util/fptr_wlist.h"
|
||||||
|
@ -401,12 +399,12 @@ lruhash_remove(struct lruhash* table, hashvalue_type hash, void* key)
|
||||||
}
|
}
|
||||||
table->num--;
|
table->num--;
|
||||||
table->space_used -= (*table->sizefunc)(entry->key, entry->data);
|
table->space_used -= (*table->sizefunc)(entry->key, entry->data);
|
||||||
lock_quick_unlock(&table->lock);
|
|
||||||
lock_rw_wrlock(&entry->lock);
|
lock_rw_wrlock(&entry->lock);
|
||||||
if(table->markdelfunc)
|
if(table->markdelfunc)
|
||||||
(*table->markdelfunc)(entry->key);
|
(*table->markdelfunc)(entry->key);
|
||||||
lock_rw_unlock(&entry->lock);
|
lock_rw_unlock(&entry->lock);
|
||||||
lock_quick_unlock(&bin->lock);
|
lock_quick_unlock(&bin->lock);
|
||||||
|
lock_quick_unlock(&table->lock);
|
||||||
/* finish removal */
|
/* finish removal */
|
||||||
d = entry->data;
|
d = entry->data;
|
||||||
(*table->delkeyfunc)(entry->key, table->cb_arg);
|
(*table->delkeyfunc)(entry->key, table->cb_arg);
|
||||||
|
|
|
@ -36,8 +36,6 @@
|
||||||
#ifndef UTIL_LOCKS_H
|
#ifndef UTIL_LOCKS_H
|
||||||
#define UTIL_LOCKS_H
|
#define UTIL_LOCKS_H
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \file
|
* \file
|
||||||
* Locking primitives.
|
* Locking primitives.
|
||||||
|
@ -221,7 +219,6 @@ void* ub_thread_key_get(ub_thread_key_type key);
|
||||||
#else /* we do not HAVE_SOLARIS_THREADS and no PTHREADS */
|
#else /* we do not HAVE_SOLARIS_THREADS and no PTHREADS */
|
||||||
/******************* WINDOWS THREADS ************************/
|
/******************* WINDOWS THREADS ************************/
|
||||||
#ifdef HAVE_WINDOWS_THREADS
|
#ifdef HAVE_WINDOWS_THREADS
|
||||||
#include <winsock2.h>
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
/* Use a mutex */
|
/* Use a mutex */
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#ifndef VALIDATOR_VAL_SECALGO_H
|
#ifndef VALIDATOR_VAL_SECALGO_H
|
||||||
#define VALIDATOR_VAL_SECALGO_H
|
#define VALIDATOR_VAL_SECALGO_H
|
||||||
struct sldns_buffer;
|
struct sldns_buffer;
|
||||||
|
struct secalgo_hash;
|
||||||
|
|
||||||
/** Return size of nsec3 hash algorithm, 0 if not supported */
|
/** Return size of nsec3 hash algorithm, 0 if not supported */
|
||||||
size_t nsec3_hash_algo_size_supported(int id);
|
size_t nsec3_hash_algo_size_supported(int id);
|
||||||
|
@ -67,6 +68,48 @@ int secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
|
||||||
*/
|
*/
|
||||||
void secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res);
|
void secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a hash of type sha384. Allocates structure, then inits it,
|
||||||
|
* so that a series of updates can be performed, before the final result.
|
||||||
|
* @return hash structure. NULL on malloc failure or no support.
|
||||||
|
*/
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha384(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a hash of type sha512. Allocates structure, then inits it,
|
||||||
|
* so that a series of updates can be performed, before the final result.
|
||||||
|
* @return hash structure. NULL on malloc failure or no support.
|
||||||
|
*/
|
||||||
|
struct secalgo_hash* secalgo_hash_create_sha512(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update a hash with more information to add to it.
|
||||||
|
* @param hash: the hash that is updated.
|
||||||
|
* @param data: data to add.
|
||||||
|
* @param len: length of data.
|
||||||
|
* @return false on failure.
|
||||||
|
*/
|
||||||
|
int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the final result of the hash.
|
||||||
|
* @param hash: the hash that has had updates to it.
|
||||||
|
* @param result: where to store the result.
|
||||||
|
* @param maxlen: length of the result buffer, eg. size of the allocation.
|
||||||
|
* If not large enough the routine fails.
|
||||||
|
* @param resultlen: the length of the result, returned to the caller.
|
||||||
|
* How much of maxlen is used.
|
||||||
|
* @return false on failure.
|
||||||
|
*/
|
||||||
|
int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
|
||||||
|
size_t maxlen, size_t* resultlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete the hash structure.
|
||||||
|
* @param hash: the hash to delete.
|
||||||
|
*/
|
||||||
|
void secalgo_hash_delete(struct secalgo_hash* hash);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return size of DS digest according to its hash algorithm.
|
* Return size of DS digest according to its hash algorithm.
|
||||||
* @param algo: DS digest algo.
|
* @param algo: DS digest algo.
|
||||||
|
|
|
@ -39,8 +39,6 @@
|
||||||
* Implementation of a redblack tree.
|
* Implementation of a redblack tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "fptr_wlist.h"
|
#include "fptr_wlist.h"
|
||||||
|
|
Loading…
Reference in New Issue