logo

oasis

Own branch of Oasis Linux (upstream: <https://git.sr.ht/~mcf/oasis/>) git clone https://anongit.hacktivis.me/git/oasis.git
commit: 34b8700ea794be83682173793c30d7bdad77cef4
parent 8d227327dfa4fff51e5a6cc74afdd89dfa742746
Author: Michael Forney <mforney@mforney.org>
Date:   Fri, 15 Nov 2019 21:50:34 -0800

tinyemu: Use BearSSL for HMAC-SHA256 and AES-CBC

Diffstat:

Mpkg/tinyemu/gen.lua6+++---
Apkg/tinyemu/patch/0002-Use-BearSSL-for-HMAC-SHA256-and-AES-CBC.patch143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkg/tinyemu/ver2+-
3 files changed, 147 insertions(+), 4 deletions(-)

diff --git a/pkg/tinyemu/gen.lua b/pkg/tinyemu/gen.lua @@ -5,13 +5,13 @@ cflags{ '-D CONFIG_SLIRP', '-D CONFIG_X86EMU', [[-D 'CONFIG_VERSION="2019-02-10"']], + '-I $builddir/pkg/bearssl/include', '-I $builddir/pkg/curl/include', - '-I $builddir/pkg/libressl/include', } pkg.deps = { + 'pkg/bearssl/headers', 'pkg/curl/headers', - 'pkg/libressl/headers', } build('cc', '$outdir/riscv_cpu32.o', '$srcdir/riscv_cpu.c', {cflags='$cflags -DMAX_XLEN=32'}) @@ -28,8 +28,8 @@ exe('temu', [[ fs_disk.c fs_net.c fs_wget.c fs_utils.c block_net.c riscv_machine.c softfp.c riscv_cpu32.o riscv_cpu64.o x86_cpu.c x86_machine.c ide.c ps2.c vmmouse.c pckbd.c vga.c + $builddir/pkg/bearssl/libbearssl.a $builddir/pkg/curl/libcurl.a.d - $builddir/pkg/libressl/libcrypto.a.d ]]) file('bin/temu', '755', '$outdir/temu') diff --git a/pkg/tinyemu/patch/0002-Use-BearSSL-for-HMAC-SHA256-and-AES-CBC.patch b/pkg/tinyemu/patch/0002-Use-BearSSL-for-HMAC-SHA256-and-AES-CBC.patch @@ -0,0 +1,143 @@ +From d08311dfe9776fcb5e1b5ca3a4efe0402ad704be Mon Sep 17 00:00:00 2001 +From: Michael Forney <mforney@mforney.org> +Date: Fri, 15 Nov 2019 21:47:49 -0800 +Subject: [PATCH] Use BearSSL for HMAC-SHA256 and AES-CBC + +--- + fs_net.c | 4 ++-- + fs_wget.c | 45 +++++++++++++++++++++++++++++++++++++-------- + fs_wget.h | 5 ++--- + 3 files changed, 41 insertions(+), 13 deletions(-) + +diff --git a/fs_net.c b/fs_net.c +index c7c7484..18c8407 100644 +--- a/fs_net.c ++++ b/fs_net.c +@@ -2556,7 +2556,7 @@ static int fs_cmd_xhr(FSDevice *fs, FSFile *f, + s->fd = fd; + s->post_fd = post_fd; + if (aes_key_len != 0) { +- AES_set_decrypt_key(aes_key, FS_KEY_LEN * 8, &s->aes_state); ++ br_aes_big_cbcdec_init(&s->aes_state.c_big, aes_key, FS_KEY_LEN); + paes_state = &s->aes_state; + } else { + paes_state = NULL; +@@ -2646,7 +2646,7 @@ static int fs_cmd_set_base_url(FSDevice *fs, const char *p) + if (aes_key_len != 0) { + if (aes_key_len != FS_KEY_LEN) + goto fail; +- AES_set_decrypt_key(aes_key, FS_KEY_LEN * 8, &aes_state); ++ br_aes_big_cbcdec_init(&aes_state.c_big, aes_key, FS_KEY_LEN); + paes_state = &aes_state; + } else { + paes_state = NULL; +diff --git a/fs_wget.c b/fs_wget.c +index b4857b0..5a36dbc 100644 +--- a/fs_wget.c ++++ b/fs_wget.c +@@ -327,6 +327,8 @@ XHRState *fs_wget(const char *url, const char *user, const char *password, + /***********************************************/ + /* file decryption */ + ++#define AES_BLOCK_SIZE br_aes_big_BLOCK_SIZE ++ + #define ENCRYPTED_FILE_HEADER_SIZE (4 + AES_BLOCK_SIZE) + + #define DEC_BUF_SIZE (256 * AES_BLOCK_SIZE) +@@ -379,8 +381,7 @@ int decrypt_file(DecryptFileState *s, const uint8_t *data, + if (s->dec_buf_pos >= DEC_BUF_SIZE) { + /* keep one block in case it is the padding */ + len = s->dec_buf_pos - AES_BLOCK_SIZE; +- AES_cbc_encrypt(s->dec_buf, s->dec_buf, len, +- s->aes_state, s->iv, FALSE); ++ br_aes_big_cbcdec_run(&s->aes_state->c_big, s->iv, s->dec_buf, len); + ret = s->write_cb(s->opaque, s->dec_buf, len); + if (ret < 0) + return ret; +@@ -409,8 +410,7 @@ int decrypt_file_flush(DecryptFileState *s) + if (len == 0 || + (len % AES_BLOCK_SIZE) != 0) + return -1; +- AES_cbc_encrypt(s->dec_buf, s->dec_buf, len, +- s->aes_state, s->iv, FALSE); ++ br_aes_big_cbcdec_run(&s->aes_state->c_big, s->iv, s->dec_buf, len); + pad_len = s->dec_buf[s->dec_buf_pos - 1]; + if (pad_len < 1 || pad_len > AES_BLOCK_SIZE) + return -1; +@@ -532,6 +532,8 @@ void fs_wget_file2(FSDevice *fs, FSFile *f, const char *url, + /***********************************************/ + /* PBKDF2 */ + ++#define SALT_LEN_MAX 32 ++ + #ifdef USE_BUILTIN_CRYPTO + + #define HMAC_BLOCK_SIZE 64 +@@ -575,8 +577,6 @@ void hmac_sha256_final(HMAC_SHA256_CTX *s, uint8_t *out) + SHA256(s->K, HMAC_BLOCK_SIZE + SHA256_DIGEST_LENGTH, out); + } + +-#define SALT_LEN_MAX 32 +- + void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len, + const uint8_t *salt, int salt_len, + int iter, int key_len, uint8_t *out) +@@ -618,8 +618,37 @@ void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len, + const uint8_t *salt, int salt_len, + int iter, int key_len, uint8_t *out) + { +- PKCS5_PBKDF2_HMAC((const char *)pwd, pwd_len, salt, salt_len, +- iter, EVP_sha256(), key_len, out); ++ uint8_t F[br_sha256_SIZE], U[SALT_LEN_MAX + 4]; ++ br_hmac_key_context kc; ++ br_hmac_context ctx; ++ int it, U_len, j, l; ++ uint32_t i; ++ ++ assert(salt_len <= SALT_LEN_MAX); ++ i = 1; ++ br_hmac_key_init(&kc, &br_sha256_vtable, pwd, pwd_len); ++ while (key_len > 0) { ++ memset(F, 0, br_sha256_SIZE); ++ memcpy(U, salt, salt_len); ++ U[salt_len] = i >> 24; ++ U[salt_len + 1] = i >> 16; ++ U[salt_len + 2] = i >> 8; ++ U[salt_len + 3] = i; ++ U_len = salt_len + 4; ++ for(it = 0; it < iter; it++) { ++ br_hmac_init(&ctx, &kc, 0); ++ br_hmac_update(&ctx, U, U_len); ++ br_hmac_out(&ctx, U); ++ for(j = 0; j < br_sha256_SIZE; j++) ++ F[j] ^= U[j]; ++ U_len = br_sha256_SIZE; ++ } ++ l = min_int(key_len, br_sha256_SIZE); ++ memcpy(out, F, l); ++ out += l; ++ key_len -= l; ++ i++; ++ } + } + + #endif /* !USE_BUILTIN_CRYPTO */ +diff --git a/fs_wget.h b/fs_wget.h +index 35b6a4b..952bb69 100644 +--- a/fs_wget.h ++++ b/fs_wget.h +@@ -29,9 +29,8 @@ + #include "aes.h" + #include "sha256.h" + #else +-#include <openssl/aes.h> +-#include <openssl/sha.h> +-#include <openssl/evp.h> ++#include <bearssl.h> ++typedef br_aes_gen_cbcdec_keys AES_KEY; + #endif + #ifdef _WIN32 + #include <winsock2.h> +-- +2.24.0 + diff --git a/pkg/tinyemu/ver b/pkg/tinyemu/ver @@ -1 +1 @@ -20190210 r1 +20190210 r2