mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-19 12:58:13 +00:00
refactor(crypto): adapt ripemd160 implementation
This commit is contained in:
parent
3167684d08
commit
fb471a96f2
@ -32,7 +32,7 @@
|
||||
/// digest_size: int
|
||||
typedef struct _mp_obj_Ripemd160_t {
|
||||
mp_obj_base_t base;
|
||||
RIPEMD160_CTX ctx;
|
||||
ripemd160_state ctx;
|
||||
} mp_obj_Ripemd160_t;
|
||||
|
||||
STATIC mp_obj_t mod_trezorcrypto_Ripemd160_update(mp_obj_t self, mp_obj_t data);
|
||||
@ -47,7 +47,7 @@ STATIC mp_obj_t mod_trezorcrypto_Ripemd160_make_new(const mp_obj_type_t *type,
|
||||
mp_arg_check_num(n_args, n_kw, 0, 1, false);
|
||||
mp_obj_Ripemd160_t *o = m_new_obj_with_finaliser(mp_obj_Ripemd160_t);
|
||||
o->base.type = type;
|
||||
ripemd160_Init(&(o->ctx));
|
||||
ripemd160_init(&(o->ctx));
|
||||
// constructor called with bytes/str as first parameter
|
||||
if (n_args == 1) {
|
||||
mod_trezorcrypto_Ripemd160_update(MP_OBJ_FROM_PTR(o), args[0]);
|
||||
@ -65,7 +65,7 @@ STATIC mp_obj_t mod_trezorcrypto_Ripemd160_update(mp_obj_t self,
|
||||
mp_buffer_info_t msg = {0};
|
||||
mp_get_buffer_raise(data, &msg, MP_BUFFER_READ);
|
||||
if (msg.len > 0) {
|
||||
ripemd160_Update(&(o->ctx), msg.buf, msg.len);
|
||||
ripemd160_process(&(o->ctx), msg.buf, msg.len);
|
||||
}
|
||||
return mp_const_none;
|
||||
}
|
||||
@ -80,10 +80,10 @@ STATIC mp_obj_t mod_trezorcrypto_Ripemd160_digest(mp_obj_t self) {
|
||||
mp_obj_Ripemd160_t *o = MP_OBJ_TO_PTR(self);
|
||||
vstr_t hash = {0};
|
||||
vstr_init_len(&hash, RIPEMD160_DIGEST_LENGTH);
|
||||
RIPEMD160_CTX ctx = {0};
|
||||
memcpy(&ctx, &(o->ctx), sizeof(RIPEMD160_CTX));
|
||||
ripemd160_Final(&ctx, (uint8_t *)hash.buf);
|
||||
memzero(&ctx, sizeof(RIPEMD160_CTX));
|
||||
ripemd160_state ctx = {0};
|
||||
memcpy(&ctx, &(o->ctx), sizeof(ripemd160_state));
|
||||
ripemd160_done(&ctx, (uint8_t *)hash.buf);
|
||||
memzero(&ctx, sizeof(ripemd160_state));
|
||||
return mp_obj_new_str_from_vstr(&mp_type_bytes, &hash);
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_Ripemd160_digest_obj,
|
||||
@ -91,7 +91,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_Ripemd160_digest_obj,
|
||||
|
||||
STATIC mp_obj_t mod_trezorcrypto_Ripemd160___del__(mp_obj_t self) {
|
||||
mp_obj_Ripemd160_t *o = MP_OBJ_TO_PTR(self);
|
||||
memzero(&(o->ctx), sizeof(RIPEMD160_CTX));
|
||||
memzero(&(o->ctx), sizeof(ripemd160_state));
|
||||
return mp_const_none;
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_Ripemd160___del___obj,
|
||||
|
@ -1,9 +1,8 @@
|
||||
#define _RIPEMD160_C_ 1
|
||||
|
||||
#include "ripemd160.h"
|
||||
#include <assert.h>
|
||||
#include "memzero.h"
|
||||
|
||||
#define NDEBUG
|
||||
// Downlaoded from https://github.com/sipa/Coin25519/blob/master/src/crypto/ripemd160.c
|
||||
|
||||
// adapted by Pieter Wuille in 2012; all changes are in the public domain
|
||||
|
||||
@ -56,8 +55,7 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define RIPEMD160_DIGEST_SIZE 20
|
||||
#define BLOCK_SIZE 64
|
||||
#define RIPEMD160_DIGEST_SIZE RIPEMD160_DIGEST_LENGTH
|
||||
|
||||
/* cyclic left-shift the 32-bit word n left by s bits */
|
||||
#define ROL(s, n) (((n) << (s)) | ((n) >> (32-(s))))
|
||||
@ -155,9 +153,10 @@ void ripemd160_init(ripemd160_state *self)
|
||||
self->bufpos = 0;
|
||||
}
|
||||
|
||||
#ifdef PCT_BIG_ENDIAN
|
||||
static inline void byteswap32(uint32_t *v)
|
||||
{
|
||||
union { uint32_t w; uint8_t b[4]; } x, y;
|
||||
union { uint32_t w; uint8_t b[4]; } x = {0}, y = {0};
|
||||
|
||||
x.w = *v;
|
||||
y.b[0] = x.b[3];
|
||||
@ -172,7 +171,7 @@ static inline void byteswap32(uint32_t *v)
|
||||
|
||||
static inline void byteswap_digest(uint32_t *p)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int i = 0;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
byteswap32(p++);
|
||||
@ -181,14 +180,15 @@ static inline void byteswap_digest(uint32_t *p)
|
||||
byteswap32(p++);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The RIPEMD160 compression function. Operates on self->buf */
|
||||
static void ripemd160_compress(ripemd160_state *self)
|
||||
{
|
||||
uint8_t w, round;
|
||||
uint32_t T;
|
||||
uint32_t AL, BL, CL, DL, EL; /* left line */
|
||||
uint32_t AR, BR, CR, DR, ER; /* right line */
|
||||
uint8_t w = 0, round = 0;
|
||||
uint32_t T = 0;
|
||||
uint32_t AL = 0, BL = 0, CL = 0, DL = 0, EL = 0; /* left line */
|
||||
uint32_t AR = 0, BR = 0, CR = 0, DR = 0, ER = 0; /* right line */
|
||||
|
||||
/* Sanity check */
|
||||
assert(self->bufpos == 64);
|
||||
@ -269,17 +269,27 @@ static void ripemd160_compress(ripemd160_state *self)
|
||||
self->h[0] = T;
|
||||
|
||||
/* Clear the buffer and wipe the temporary variables */
|
||||
T = AL = BL = CL = DL = EL = AR = BR = CR = DR = ER = 0;
|
||||
memset(&self->buf, 0, sizeof(self->buf));
|
||||
memzero(&self->buf, sizeof(self->buf));
|
||||
memzero(&T, sizeof(T));
|
||||
memzero(&AL, sizeof(AL));
|
||||
memzero(&BL, sizeof(BL));
|
||||
memzero(&CL, sizeof(CL));
|
||||
memzero(&DL, sizeof(DL));
|
||||
memzero(&EL, sizeof(EL));
|
||||
memzero(&AR, sizeof(AR));
|
||||
memzero(&BR, sizeof(BR));
|
||||
memzero(&CR, sizeof(CR));
|
||||
memzero(&DR, sizeof(DR));
|
||||
memzero(&ER, sizeof(ER));
|
||||
self->bufpos = 0;
|
||||
}
|
||||
|
||||
void ripemd160_process(ripemd160_state *self, const unsigned char *p, unsigned long length)
|
||||
void ripemd160_process(ripemd160_state * self, const uint8_t *p, size_t length)
|
||||
{
|
||||
unsigned long bytes_needed;
|
||||
unsigned long bytes_needed = 0;
|
||||
|
||||
/* Some assertions */
|
||||
assert(p != NULL && length >= 0);
|
||||
assert(p != NULL);
|
||||
|
||||
/* We never leave a full buffer */
|
||||
assert(self->bufpos < 64);
|
||||
@ -309,7 +319,7 @@ void ripemd160_process(ripemd160_state *self, const unsigned char *p, unsigned l
|
||||
}
|
||||
}
|
||||
|
||||
void ripemd160_done(ripemd160_state *self, unsigned char *out)
|
||||
void ripemd160_done(ripemd160_state * self, uint8_t out[RIPEMD160_DIGEST_LENGTH])
|
||||
{
|
||||
/* Append the padding */
|
||||
self->buf.b[self->bufpos++] = 0x80;
|
||||
@ -334,11 +344,12 @@ void ripemd160_done(ripemd160_state *self, unsigned char *out)
|
||||
byteswap_digest(self->h);
|
||||
#endif
|
||||
memcpy(out, &self->h, RIPEMD160_DIGEST_SIZE);
|
||||
memzero(self, sizeof(ripemd160_state));
|
||||
}
|
||||
|
||||
void ripemd160(const void* in, unsigned long length, void* out)
|
||||
void ripemd160(const uint8_t *in, size_t length, uint8_t out[RIPEMD160_DIGEST_LENGTH])
|
||||
{
|
||||
ripemd160_state md;
|
||||
ripemd160_state md = {0};
|
||||
ripemd160_init(&md);
|
||||
ripemd160_process(&md, in, length);
|
||||
ripemd160_done(&md, out);
|
||||
|
@ -1,7 +1,11 @@
|
||||
#ifndef _RIPEMD160_H_
|
||||
#define _RIPEMD160_H_
|
||||
#ifndef __RIPEMD160_H__
|
||||
#define __RIPEMD160_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define RIPEMD160_BLOCK_LENGTH 64
|
||||
#define RIPEMD160_DIGEST_LENGTH 20
|
||||
|
||||
typedef struct {
|
||||
uint64_t length;
|
||||
@ -13,11 +17,8 @@ typedef struct {
|
||||
uint8_t bufpos;
|
||||
} ripemd160_state;
|
||||
|
||||
#ifndef _RIPEMD160_C_
|
||||
void ripemd160_init(ripemd160_state * md);
|
||||
void ripemd160_process(ripemd160_state * md, const void *in, unsigned long inlen);
|
||||
void ripemd160_done(ripemd160_state * md, void *out);
|
||||
void ripemd160(const void *in, unsigned long inlen, void *out);
|
||||
#endif
|
||||
|
||||
void ripemd160_init(ripemd160_state * self);
|
||||
void ripemd160_process(ripemd160_state * self, const uint8_t *in, size_t length);
|
||||
void ripemd160_done(ripemd160_state * self, uint8_t out[RIPEMD160_DIGEST_LENGTH]);
|
||||
void ripemd160(const uint8_t *in, size_t length, uint8_t out[RIPEMD160_DIGEST_LENGTH]);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user