[keccak-asm] *_lastBlock in asm
This commit is contained in:
parent
c48e9f61be
commit
ae1ab232c9
|
@ -789,3 +789,125 @@ keccak_init_1:
|
||||||
ret
|
ret
|
||||||
.endfunc
|
.endfunc
|
||||||
|
|
||||||
|
/*
|
||||||
|
void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
|
||||||
|
uint8_t length_B;
|
||||||
|
uint8_t t;
|
||||||
|
while(length_b >= ctx->r){
|
||||||
|
keccak_nextBlock(ctx, block);
|
||||||
|
block = (uint8_t*)block + ctx->bs;
|
||||||
|
length_b -= ctx->r;
|
||||||
|
}
|
||||||
|
length_B = length_b / 8;
|
||||||
|
memxor(ctx->a, block, length_B);
|
||||||
|
/ * append 1 * /
|
||||||
|
if(length_b & 7){
|
||||||
|
/ * we have some single bits * /
|
||||||
|
t = ((uint8_t*)block)[length_B] >> (8 - (length_b & 7));
|
||||||
|
t |= 0x01 << (length_b & 7);
|
||||||
|
}else{
|
||||||
|
t = 0x01;
|
||||||
|
}
|
||||||
|
ctx->a[length_B] ^= t;
|
||||||
|
if(length_b == ctx->r - 1){
|
||||||
|
keccak_f1600(ctx->a);
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
.set length_b_l, 2
|
||||||
|
.set length_b_h, 3
|
||||||
|
.set pbs, 10
|
||||||
|
.set pr_l, 8
|
||||||
|
.set pr_h, 9
|
||||||
|
.set ctx_l, 6
|
||||||
|
.set ctx_h, 7
|
||||||
|
|
||||||
|
.global keccak_lastBlock
|
||||||
|
.func keccak_lastBlock
|
||||||
|
keccak_lastBlock:
|
||||||
|
push_range 2, 10
|
||||||
|
movw r2, r20
|
||||||
|
movw r4, r22
|
||||||
|
movw r6, r24
|
||||||
|
movw XL, r24
|
||||||
|
subi XL, lo8(-ctx_r)
|
||||||
|
sbci XH, hi8(-ctx_r)
|
||||||
|
ld pr_l, X+
|
||||||
|
ld pr_h, X+
|
||||||
|
ld pbs, X
|
||||||
|
10:
|
||||||
|
cp length_b_l, pr_l
|
||||||
|
cpc length_b_h, pr_h
|
||||||
|
brlo 20f
|
||||||
|
movw r24, ctx_l
|
||||||
|
movw r22, r4
|
||||||
|
rcall keccak_nextBlock
|
||||||
|
sub r4, pbs
|
||||||
|
sbc r5, __zero_reg__
|
||||||
|
sub length_b_l, pr_l
|
||||||
|
sbc length_b_l, pr_h
|
||||||
|
rjmp 10b
|
||||||
|
20:
|
||||||
|
movw XL, r4
|
||||||
|
movw ZL, ctx_l
|
||||||
|
movw r22, length_b_l
|
||||||
|
lsr r23
|
||||||
|
ror r22
|
||||||
|
lsr r23
|
||||||
|
ror r22
|
||||||
|
lsr r23
|
||||||
|
ror r22
|
||||||
|
mov r23, r22
|
||||||
|
breq 20f
|
||||||
|
10:
|
||||||
|
ld r25, X+
|
||||||
|
ld r24, Z
|
||||||
|
eor r24, r25
|
||||||
|
st Z+, r24
|
||||||
|
dec r23
|
||||||
|
brne 10b
|
||||||
|
20:
|
||||||
|
mov r18, length_b_l
|
||||||
|
andi r18, 7
|
||||||
|
mov r19, r18
|
||||||
|
ldi r25, 1
|
||||||
|
breq 30f
|
||||||
|
/* we have trailing bits */
|
||||||
|
ld r24, X+
|
||||||
|
subi r18, 8
|
||||||
|
neg r18
|
||||||
|
10:
|
||||||
|
lsr r24
|
||||||
|
dec r18
|
||||||
|
brne 10b
|
||||||
|
10:
|
||||||
|
lsl r25
|
||||||
|
dec r19
|
||||||
|
brne 10b
|
||||||
|
or r25, r24
|
||||||
|
30:
|
||||||
|
ld r24, Z
|
||||||
|
eor r24, r25
|
||||||
|
st Z, r24
|
||||||
|
|
||||||
|
movw r24, pr_l
|
||||||
|
sbiw r24, 1
|
||||||
|
cp length_b_l, r24
|
||||||
|
cpc length_b_h, r25
|
||||||
|
brne 20f
|
||||||
|
movw r24, ctx_l
|
||||||
|
rcall keccak_f1600
|
||||||
|
20:
|
||||||
|
movw XL, ctx_l
|
||||||
|
dec pbs
|
||||||
|
add XL, pbs
|
||||||
|
adc XH, __zero_reg__
|
||||||
|
ld r24, X
|
||||||
|
ldi r25, 0x80
|
||||||
|
eor r24, r25
|
||||||
|
st X, r24
|
||||||
|
movw r24, ctx_l
|
||||||
|
pop_range 2, 10
|
||||||
|
rjmp keccak_f1600
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
|
|
@ -23,32 +23,13 @@
|
||||||
#include "memxor.h"
|
#include "memxor.h"
|
||||||
#include "keccak.h"
|
#include "keccak.h"
|
||||||
|
|
||||||
void keccak_f1600(uint8_t a[200]);
|
/*
|
||||||
|
//void keccak_f1600(uint8_t a[200]);
|
||||||
|
void keccak_lastBlock_f1(keccak_ctx_t* ctx, const void* block, uint16_t length_b);
|
||||||
void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
|
void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
|
||||||
uint8_t length_B;
|
keccak_lastBlock_f1(ctx, block, length_b);
|
||||||
while(length_b >= ctx->r){
|
// ctx->a[ctx->bs - 1] ^= 0x80;
|
||||||
keccak_nextBlock(ctx, block);
|
// keccak_f1600(ctx->a);
|
||||||
block = (uint8_t*)block + ctx->bs;
|
|
||||||
length_b -= ctx->r;
|
|
||||||
}
|
|
||||||
length_B = length_b / 8;
|
|
||||||
memxor(ctx->a, block, length_B);
|
|
||||||
/* append 1 */
|
|
||||||
if(length_b & 7){
|
|
||||||
/* we have some single bits */
|
|
||||||
uint8_t t;
|
|
||||||
t = ((uint8_t*)block)[length_B] >> (8 - (length_b & 7));
|
|
||||||
t |= 0x01 << (length_b & 7);
|
|
||||||
ctx->a[length_B] ^= t;
|
|
||||||
}else{
|
|
||||||
ctx->a[length_B] ^= 0x01;
|
|
||||||
}
|
|
||||||
if(length_b == ctx->r - 1){
|
|
||||||
keccak_f1600(ctx->a);
|
|
||||||
}
|
|
||||||
ctx->a[ctx->bs - 1] ^= 0x80;
|
|
||||||
keccak_f1600(ctx->a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
|
@ -179,6 +179,7 @@ void keccak_nextBlock(keccak_ctx_t* ctx, const void* block){
|
||||||
|
|
||||||
void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
|
void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
|
||||||
uint8_t length_B;
|
uint8_t length_B;
|
||||||
|
uint8_t t;
|
||||||
while(length_b >= ctx->r){
|
while(length_b >= ctx->r){
|
||||||
keccak_nextBlock(ctx, block);
|
keccak_nextBlock(ctx, block);
|
||||||
block = (uint8_t*)block + ctx->bs;
|
block = (uint8_t*)block + ctx->bs;
|
||||||
|
@ -189,13 +190,12 @@ void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
|
||||||
/* append 1 */
|
/* append 1 */
|
||||||
if(length_b & 7){
|
if(length_b & 7){
|
||||||
/* we have some single bits */
|
/* we have some single bits */
|
||||||
uint8_t t;
|
|
||||||
t = ((uint8_t*)block)[length_B] >> (8 - (length_b & 7));
|
t = ((uint8_t*)block)[length_B] >> (8 - (length_b & 7));
|
||||||
t |= 0x01 << (length_b & 7);
|
t |= 0x01 << (length_b & 7);;
|
||||||
ctx->a[length_B] ^= t;
|
|
||||||
}else{
|
}else{
|
||||||
ctx->a[length_B] ^= 0x01;
|
t = 0x01;
|
||||||
}
|
}
|
||||||
|
ctx->a[length_B] ^= t
|
||||||
if(length_b == ctx->r - 1){
|
if(length_b == ctx->r - 1){
|
||||||
keccak_f1600(ctx->a);
|
keccak_f1600(ctx->a);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue