First go at using cifra for SHA512
This commit is contained in:
parent
54241ecd42
commit
0c296bba30
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -13,3 +13,6 @@
|
|||||||
[submodule "targets/stm32l442/dfuse-tool"]
|
[submodule "targets/stm32l442/dfuse-tool"]
|
||||||
path = targets/stm32l442/dfuse-tool
|
path = targets/stm32l442/dfuse-tool
|
||||||
url = https://github.com/solokeys/dfuse-tool
|
url = https://github.com/solokeys/dfuse-tool
|
||||||
|
[submodule "crypto/cifra"]
|
||||||
|
path = crypto/cifra
|
||||||
|
url = https://github.com/ctz/cifra.git
|
||||||
|
1
crypto/cifra
Submodule
1
crypto/cifra
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit d04dd318609733d809904d4f2973597240655cde
|
@ -19,6 +19,10 @@ void crypto_sha256_final(uint8_t * hash);
|
|||||||
void crypto_sha256_hmac_init(uint8_t * key, uint32_t klen, uint8_t * hmac);
|
void crypto_sha256_hmac_init(uint8_t * key, uint32_t klen, uint8_t * hmac);
|
||||||
void crypto_sha256_hmac_final(uint8_t * key, uint32_t klen, uint8_t * hmac);
|
void crypto_sha256_hmac_final(uint8_t * key, uint32_t klen, uint8_t * hmac);
|
||||||
|
|
||||||
|
void crypto_sha512_init();
|
||||||
|
void crypto_sha512_update(const uint8_t * data, size_t len);
|
||||||
|
void crypto_sha512_final(uint8_t * hash);
|
||||||
|
|
||||||
|
|
||||||
void crypto_ecc256_init();
|
void crypto_ecc256_init();
|
||||||
void crypto_ecc256_derive_public_key(uint8_t * data, int len, uint8_t * x, uint8_t * y);
|
void crypto_ecc256_derive_public_key(uint8_t * data, int len, uint8_t * x, uint8_t * y);
|
||||||
|
@ -16,6 +16,12 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "extensions.h"
|
#include "extensions.h"
|
||||||
|
|
||||||
|
// move custom HASH512 command out,
|
||||||
|
// and the following headers too
|
||||||
|
#include "sha2.h"
|
||||||
|
#include "crypto.h"
|
||||||
|
|
||||||
#include APP_CONFIG
|
#include APP_CONFIG
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@ -718,6 +724,27 @@ uint8_t ctaphid_handle_packet(uint8_t * pkt_raw)
|
|||||||
ctaphid_write(&wb, NULL, 0);
|
ctaphid_write(&wb, NULL, 0);
|
||||||
is_busy = 0;
|
is_busy = 0;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#if defined(SOLO_HACKER)
|
||||||
|
case CTAPHID_HASH512:
|
||||||
|
// some random logging
|
||||||
|
printf1(TAG_HID,"CTAPHID_HASH512\n");
|
||||||
|
// initialise CTAP response object
|
||||||
|
ctap_response_init(&ctap_resp);
|
||||||
|
// initialise write buffer
|
||||||
|
ctaphid_write_buffer_init(&wb);
|
||||||
|
wb.cid = cid;
|
||||||
|
wb.cmd = CTAPHID_HASH512;
|
||||||
|
wb.bcnt = CF_SHA512_HASHSZ; // 64 bytes
|
||||||
|
// calculate hash
|
||||||
|
crypto_sha512_init();
|
||||||
|
crypto_sha512_update(ctap_buffer, buffer_len());
|
||||||
|
crypto_sha512_final(ctap_buffer);
|
||||||
|
// copy to output
|
||||||
|
ctaphid_write(&wb, &ctap_buffer, CF_SHA512_HASHSZ);
|
||||||
|
ctaphid_write(&wb, NULL, 0);
|
||||||
|
is_busy = 0;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
printf2(TAG_ERR,"error, unimplemented HID cmd: %02x\r\n", buffer_cmd());
|
printf2(TAG_ERR,"error, unimplemented HID cmd: %02x\r\n", buffer_cmd());
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#define CTAPHID_ENTERBOOT (TYPE_INIT | 0x51)
|
#define CTAPHID_ENTERBOOT (TYPE_INIT | 0x51)
|
||||||
#define CTAPHID_ENTERSTBOOT (TYPE_INIT | 0x52)
|
#define CTAPHID_ENTERSTBOOT (TYPE_INIT | 0x52)
|
||||||
#define CTAPHID_GETRNG (TYPE_INIT | 0x60)
|
#define CTAPHID_GETRNG (TYPE_INIT | 0x60)
|
||||||
|
#define CTAPHID_HASH512 (TYPE_INIT | 0x70)
|
||||||
|
|
||||||
#define ERR_INVALID_CMD 0x01
|
#define ERR_INVALID_CMD 0x01
|
||||||
#define ERR_INVALID_PAR 0x02
|
#define ERR_INVALID_PAR 0x02
|
||||||
|
@ -14,6 +14,7 @@ SRC += ../../fido2/extensions/extensions.c ../../fido2/extensions/solo.c
|
|||||||
|
|
||||||
# Crypto libs
|
# Crypto libs
|
||||||
SRC += ../../crypto/sha256/sha256.c ../../crypto/micro-ecc/uECC.c ../../crypto/tiny-AES-c/aes.c
|
SRC += ../../crypto/sha256/sha256.c ../../crypto/micro-ecc/uECC.c ../../crypto/tiny-AES-c/aes.c
|
||||||
|
SRC += ../../crypto/cifra/src/sha512.c ../../crypto/cifra/src/blockwise.c
|
||||||
|
|
||||||
OBJ1=$(SRC:.c=.o)
|
OBJ1=$(SRC:.c=.o)
|
||||||
OBJ=$(OBJ1:.s=.o)
|
OBJ=$(OBJ1:.s=.o)
|
||||||
@ -21,6 +22,7 @@ OBJ=$(OBJ1:.s=.o)
|
|||||||
INC = -Isrc/ -Isrc/cmsis/ -Ilib/ -Ilib/usbd/ -I../../fido2/ -I../../fido2/extensions
|
INC = -Isrc/ -Isrc/cmsis/ -Ilib/ -Ilib/usbd/ -I../../fido2/ -I../../fido2/extensions
|
||||||
INC += -I../../tinycbor/src -I../../crypto/sha256 -I../../crypto/micro-ecc
|
INC += -I../../tinycbor/src -I../../crypto/sha256 -I../../crypto/micro-ecc
|
||||||
INC += -I../../crypto/tiny-AES-c
|
INC += -I../../crypto/tiny-AES-c
|
||||||
|
INC += -I../../crypto/cifra/src
|
||||||
|
|
||||||
SEARCH=-L../../tinycbor/lib
|
SEARCH=-L../../tinycbor/lib
|
||||||
|
|
||||||
@ -66,6 +68,7 @@ all: $(TARGET).elf
|
|||||||
$(CC) $^ $(HW) $(LDFLAGS) -o $@
|
$(CC) $^ $(HW) $(LDFLAGS) -o $@
|
||||||
|
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
|
$(SZ) $^
|
||||||
$(CP) -O ihex $^ $(TARGET).hex
|
$(CP) -O ihex $^ $(TARGET).hex
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
#include "aes.h"
|
#include "aes.h"
|
||||||
#include "ctap.h"
|
#include "ctap.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
// stuff for SHA512
|
||||||
|
#include "sha2.h"
|
||||||
|
#include "blockwise.h"
|
||||||
#include APP_CONFIG
|
#include APP_CONFIG
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "memory_layout.h"
|
#include "memory_layout.h"
|
||||||
@ -48,6 +51,7 @@ typedef enum
|
|||||||
|
|
||||||
|
|
||||||
static SHA256_CTX sha256_ctx;
|
static SHA256_CTX sha256_ctx;
|
||||||
|
static cf_sha512_context sha512_ctx;
|
||||||
static const struct uECC_Curve_t * _es256_curve = NULL;
|
static const struct uECC_Curve_t * _es256_curve = NULL;
|
||||||
static const uint8_t * _signing_key = NULL;
|
static const uint8_t * _signing_key = NULL;
|
||||||
static int _key_len = 0;
|
static int _key_len = 0;
|
||||||
@ -62,6 +66,9 @@ void crypto_sha256_init()
|
|||||||
sha256_init(&sha256_ctx);
|
sha256_init(&sha256_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void crypto_sha512_init() {
|
||||||
|
cf_sha512_init(&sha512_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
void crypto_load_master_secret(uint8_t * key)
|
void crypto_load_master_secret(uint8_t * key)
|
||||||
{
|
{
|
||||||
@ -86,6 +93,10 @@ void crypto_sha256_update(uint8_t * data, size_t len)
|
|||||||
sha256_update(&sha256_ctx, data, len);
|
sha256_update(&sha256_ctx, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void crypto_sha512_update(const uint8_t * data, size_t len) {
|
||||||
|
cf_sha512_update(&sha512_ctx, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
void crypto_sha256_update_secret()
|
void crypto_sha256_update_secret()
|
||||||
{
|
{
|
||||||
sha256_update(&sha256_ctx, master_secret, 32);
|
sha256_update(&sha256_ctx, master_secret, 32);
|
||||||
@ -96,6 +107,11 @@ void crypto_sha256_final(uint8_t * hash)
|
|||||||
sha256_final(&sha256_ctx, hash);
|
sha256_final(&sha256_ctx, hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void crypto_sha512_final(uint8_t * hash) {
|
||||||
|
// NB: there is also cf_sha512_digest
|
||||||
|
cf_sha512_digest_final(&sha512_ctx, hash);
|
||||||
|
}
|
||||||
|
|
||||||
void crypto_sha256_hmac_init(uint8_t * key, uint32_t klen, uint8_t * hmac)
|
void crypto_sha256_hmac_init(uint8_t * key, uint32_t klen, uint8_t * hmac)
|
||||||
{
|
{
|
||||||
uint8_t buf[64];
|
uint8_t buf[64];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user