mirror of
https://github.com/urbit/shrub.git
synced 2025-01-03 01:54:43 +03:00
cleaning up a bit, rethinking things
This commit is contained in:
parent
ab8d0dd7ef
commit
ca14af11a7
@ -3,8 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "all.h"
|
#include "all.h"
|
||||||
|
|
||||||
#include <openssl/aes.h>
|
|
||||||
|
|
||||||
#include "aes_siv.h"
|
#include "aes_siv.h"
|
||||||
|
|
||||||
/* functions
|
/* functions
|
||||||
|
@ -5,12 +5,12 @@ static urcrypt_malloc_t urcrypt_malloc_ptr;
|
|||||||
static urcrypt_realloc_t urcrypt_realloc_ptr;
|
static urcrypt_realloc_t urcrypt_realloc_ptr;
|
||||||
static urcrypt_free_t urcrypt_free_ptr;
|
static urcrypt_free_t urcrypt_free_ptr;
|
||||||
|
|
||||||
void* urcrypt_malloc(size_t len)
|
static void* _urcrypt_malloc(size_t len)
|
||||||
{
|
{
|
||||||
return (*urcrypt_malloc_ptr)(len);
|
return (*urcrypt_malloc_ptr)(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* urcrypt_realloc(void *ptr, size_t len)
|
static void* _urcrypt_realloc(void *ptr, size_t len)
|
||||||
{
|
{
|
||||||
return (*urcrypt_realloc_ptr)(ptr, len);
|
return (*urcrypt_realloc_ptr)(ptr, len);
|
||||||
}
|
}
|
||||||
@ -21,48 +21,47 @@ void urcrypt_free(void *ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
urcrypt_malloc_ssl(size_t len
|
_urcrypt_malloc_ssl(size_t len
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||||
, const char* file, int line
|
, const char* file, int line
|
||||||
#endif
|
#endif
|
||||||
) { return urcrypt_malloc(len); }
|
) { return _urcrypt_malloc(len); }
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
urcrypt_realloc_ssl(void* ptr, size_t len
|
_urcrypt_realloc_ssl(void* ptr, size_t len
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||||
, const char* file, int line
|
, const char* file, int line
|
||||||
#endif
|
#endif
|
||||||
) { return urcrypt_realloc(ptr, len); }
|
) { return _urcrypt_realloc(ptr, len); }
|
||||||
|
|
||||||
static void
|
static void
|
||||||
urcrypt_free_ssl(void* ptr
|
_urcrypt_free_ssl(void* ptr
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||||
, const char* file, int line
|
, const char* file, int line
|
||||||
#endif
|
#endif
|
||||||
) { urcrypt_free(ptr); }
|
) { urcrypt_free(ptr); }
|
||||||
|
|
||||||
/* IMPORTANT: it is an error (undefined behavior) to call functions in
|
|
||||||
* this library without first calling urcrypt_init() exactly once.
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
urcrypt_init(urcrypt_malloc_t m, urcrypt_realloc_t r, urcrypt_free_t f)
|
urcrypt_init(_urcrypt_malloc_t m, _urcrypt_realloc_t r, urcrypt_free_t f)
|
||||||
{
|
{
|
||||||
if ( initialized ) {
|
if ( initialized ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if ( (NULL == m) || (NULL == r) || (NULL == f) ) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
initialized = true;
|
initialized = true;
|
||||||
urcrypt_malloc_ptr = ( NULL == m ) ? &malloc : m;
|
urcrypt_malloc_ptr = m;
|
||||||
urcrypt_realloc_ptr = ( NULL == r ) ? &realloc : r;
|
urcrypt_realloc_ptr = r;
|
||||||
urcrypt_free_ptr = ( NULL == f ) ? &free : f;
|
urcrypt_free_ptr = f;
|
||||||
|
if ( CRYPTO_set_mem_functions(&_urcrypt_malloc_ssl,
|
||||||
if ( CRYPTO_set_mem_functions(&urcrypt_malloc_ssl,
|
&_urcrypt_realloc_ssl,
|
||||||
&urcrypt_realloc_ssl,
|
&_urcrypt_free_ssl) ) {
|
||||||
&urcrypt_free_ssl) ) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return -2;
|
return -3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,7 +251,7 @@ _urcrypt_reverse_copy(size_t size, const uint8_t *in, uint8_t *out) {
|
|||||||
static uint8_t*
|
static uint8_t*
|
||||||
_urcrypt_reverse_alloc(size_t size, const uint8_t *in)
|
_urcrypt_reverse_alloc(size_t size, const uint8_t *in)
|
||||||
{
|
{
|
||||||
uint8_t *out = urcrypt_malloc(size);
|
uint8_t *out = _urcrypt_malloc(size);
|
||||||
_urcrypt_reverse_copy(size, in, out);
|
_urcrypt_reverse_copy(size, in, out);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@ -401,7 +400,7 @@ _urcrypt_cbc_pad(size_t *length_ptr, const uint8_t *message)
|
|||||||
rem = length % 16,
|
rem = length % 16,
|
||||||
padding = rem ? 16 - rem : 0,
|
padding = rem ? 16 - rem : 0,
|
||||||
padded = length + padding;
|
padded = length + padding;
|
||||||
uint8_t *buf = urcrypt_malloc(padded);
|
uint8_t *buf = _urcrypt_malloc(padded);
|
||||||
|
|
||||||
memset(buf, 0, padding);
|
memset(buf, 0, padding);
|
||||||
_urcrypt_reverse_copy(length, message, buf + padding);
|
_urcrypt_reverse_copy(length, message, buf + padding);
|
||||||
@ -422,7 +421,7 @@ _urcrypt_cbc_help(const uint8_t *message,
|
|||||||
|
|
||||||
_urcrypt_reverse_copy(16, ivec, riv);
|
_urcrypt_reverse_copy(16, ivec, riv);
|
||||||
in = _urcrypt_cbc_pad(&length, message);
|
in = _urcrypt_cbc_pad(&length, message);
|
||||||
out = urcrypt_malloc(length);
|
out = _urcrypt_malloc(length);
|
||||||
AES_cbc_encrypt(in, out, length, key, riv, enc);
|
AES_cbc_encrypt(in, out, length, key, riv, enc);
|
||||||
urcrypt_free(in);
|
urcrypt_free(in);
|
||||||
|
|
||||||
@ -584,7 +583,7 @@ urcrypt_aes_cbcc_de(const uint8_t *message,
|
|||||||
static int
|
static int
|
||||||
_urcrypt_argon2_alloc(uint8_t** output, size_t bytes)
|
_urcrypt_argon2_alloc(uint8_t** output, size_t bytes)
|
||||||
{
|
{
|
||||||
*output = urcrypt_malloc(bytes);
|
*output = _urcrypt_malloc(bytes);
|
||||||
return (NULL != output);
|
return (NULL != output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,8 +597,6 @@ _urcrypt_argon2_free(uint8_t* memory, size_t bytes)
|
|||||||
// in uint32_t, so here's a helper macro for ensuring equivalence.
|
// in uint32_t, so here's a helper macro for ensuring equivalence.
|
||||||
#define SZ_32(s) ( sizeof(size_t) <= sizeof(uint32_t) || s <= 0xFFFFFFFF )
|
#define SZ_32(s) ( sizeof(size_t) <= sizeof(uint32_t) || s <= 0xFFFFFFFF )
|
||||||
|
|
||||||
// returns a constant error message string or NULL for success
|
|
||||||
// (so user doesn't have to call argon2_error_message)
|
|
||||||
const char*
|
const char*
|
||||||
urcrypt_argon2(urcrypt_argon2_type type,
|
urcrypt_argon2(urcrypt_argon2_type type,
|
||||||
uint32_t version,
|
uint32_t version,
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef URCRYPT_H
|
#ifndef URCRYPT_H
|
||||||
#define URCRYPT_H
|
#define URCRYPT_H
|
||||||
|
|
||||||
|
// XX most of these should be moved to urcrypt.c
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -19,10 +21,26 @@ typedef void *(*urcrypt_malloc_t)(size_t);
|
|||||||
typedef void *(*urcrypt_realloc_t)(void*, size_t);
|
typedef void *(*urcrypt_realloc_t)(void*, size_t);
|
||||||
typedef void (*urcrypt_free_t)(void*);
|
typedef void (*urcrypt_free_t)(void*);
|
||||||
|
|
||||||
|
/* We depend on OpenSSL for various reasons, which doesn't promise not to
|
||||||
|
* allocate memory and has the annoying CRYPTO_set_mem_functions api. We
|
||||||
|
* are therefore forced to use it, so we adopt a similar approach with
|
||||||
|
* urcrypt_init().
|
||||||
|
*
|
||||||
|
* This creates an issue for certain link configurations when the client of
|
||||||
|
* urcrypt also uses the CRYPTO_set_mem_functions() api. The simplest thing
|
||||||
|
* that is guaranteed to work is to call first CRYPTO_set_mem_functions() and
|
||||||
|
* then urcrypt_init() with the same arguments during process initialization.
|
||||||
|
*
|
||||||
|
* You should call this function once. It will return 0 on success. Calling
|
||||||
|
* any other library functions without exactly one successful call to
|
||||||
|
* urcrypt_init() will result in undefined behavior.
|
||||||
|
*/
|
||||||
int urcrypt_init(urcrypt_malloc_t, urcrypt_realloc_t, urcrypt_free_t);
|
int urcrypt_init(urcrypt_malloc_t, urcrypt_realloc_t, urcrypt_free_t);
|
||||||
|
|
||||||
void *urcrypt_malloc(size_t);
|
/* We can transparently deal with padding since we already use memory
|
||||||
void *urcrypt_realloc(void*, size_t);
|
* allocation; in cases where we return allocated memory, it should
|
||||||
|
* be freed with urcrypt_free() by the caller.
|
||||||
|
*/
|
||||||
void urcrypt_free(void*);
|
void urcrypt_free(void*);
|
||||||
|
|
||||||
int urcrypt_ed_point_add(const uint8_t a[32],
|
int urcrypt_ed_point_add(const uint8_t a[32],
|
||||||
@ -57,6 +75,10 @@ bool urcrypt_ed_veri(const uint8_t *message,
|
|||||||
const uint8_t signature[64],
|
const uint8_t signature[64],
|
||||||
const uint8_t public[32]);
|
const uint8_t public[32]);
|
||||||
|
|
||||||
|
// XX let's de-const the reversed arrays and promise to trash them instead,
|
||||||
|
// it will save us a malloc in some cases and it's a better API since
|
||||||
|
// it puts the decision to copy in the caller's hands.
|
||||||
|
|
||||||
int urcrypt_aes_ecba_en(const uint8_t key[16],
|
int urcrypt_aes_ecba_en(const uint8_t key[16],
|
||||||
const uint8_t block[16],
|
const uint8_t block[16],
|
||||||
uint8_t out[16]);
|
uint8_t out[16]);
|
||||||
@ -76,6 +98,10 @@ int urcrypt_aes_ecbc_de(const uint8_t key[32],
|
|||||||
const uint8_t block[16],
|
const uint8_t block[16],
|
||||||
uint8_t out[16]);
|
uint8_t out[16]);
|
||||||
|
|
||||||
|
/* return an alloc'd output pointer and write its length to out_length
|
||||||
|
* caller should urcrypt_free() the returned pointer. The return value
|
||||||
|
* is NULL on an error. */
|
||||||
|
|
||||||
uint8_t* urcrypt_aes_cbca_en(const uint8_t *message,
|
uint8_t* urcrypt_aes_cbca_en(const uint8_t *message,
|
||||||
size_t length,
|
size_t length,
|
||||||
const uint8_t key[16],
|
const uint8_t key[16],
|
||||||
@ -114,6 +140,7 @@ typedef enum urcrypt_argon2_type {
|
|||||||
urcrypt_argon2_u = 10,
|
urcrypt_argon2_u = 10,
|
||||||
} urcrypt_argon2_type;
|
} urcrypt_argon2_type;
|
||||||
|
|
||||||
|
/* returns a constant error message string or NULL for success */
|
||||||
const char* urcrypt_argon2(urcrypt_argon2_type type,
|
const char* urcrypt_argon2(urcrypt_argon2_type type,
|
||||||
uint32_t version,
|
uint32_t version,
|
||||||
uint32_t threads,
|
uint32_t threads,
|
||||||
|
Loading…
Reference in New Issue
Block a user