.struct ctx_a + 8 * 5 * 5
ctx_r:
.struct ctx_r + 2
-ctx_c:
- .struct ctx_c + 2
-ctx_d:
- .struct ctx_d + 1
ctx_bs:
.section .text
keccak_nextBlock:
movw ZL, r24
subi ZL, lo8(-ctx_bs)
- sbci ZL, hi8(-ctx_bs)
+ sbci ZH, hi8(-ctx_bs)
ld r20, Z
movw XL, r24
movw ZL, r22
st X+, r22
dec r20
brne 10b
+ .endfunc
.global keccak_f1600
+ .func keccak_f1600
keccak_f1600:
push_range 2, 9
push r16
*/
; memcpy(a, b, 200)
; X points at b + 32 + 8 = b + 40 = b[1][0] has to point to b[0][0]
- ldi r16, 200
+ ldi r16, 200 / 8
sbiw XL, 5 * 8
movw ZL, XL
subi YL, lo8(5 * 5 * 8)
sbci YH, hi8(5 * 5 * 8)
movw r2, YL
10:
+ .rept 8
ld r22, X+
st Y+, r22
+ .endr
dec r16
brne 10b
pop_range 28, 29
pop r16
pop_range 2, 9
+ ret
+ .endfunc
+/*
+void keccak_ctx2hash(void* dest, uint16_t length_b, keccak_ctx_t* ctx){
+ while(length_b>=ctx->r){
+ memcpy(dest, ctx->a, ctx->bs);
+ dest = (uint8_t*)dest + ctx->bs;
+ length_b -= ctx->r;
+ keccak_f1600(ctx->a);
+ }
+ memcpy(dest, ctx->a, (length_b+7)/8);
+}
+*/
+; .global keccak_ctx2hash
+; .func keccak_ctx2hash
+;keccak_ctx2hash:
+ push_range 2, 10
+ movw r4, r20
+ movw r6, r24
+ movw ZL, r24
+ movw r8, r22
+ subi ZL, lo8(-ctx_r)
+ sbci ZH, hi8(-ctx_r)
+ ld r2, Z+
+ ld r3, Z+
+ ldd r10, Z+3 ; load blocksize (in bytes)
+10:
+ ; length_b = (r9:r8) ; r = (r3:r2) ; (H:L)
+ cp r2, r8
+ cpc r3, r9
+ rjmp 40f
+ brsh 40f
+ movw XL, r4
+ movw ZL, r6
+ mov r24, r10
+20:
+ ld r22, X+
+ st Z+, r22
+ dec r24
+ brne 20b
+ movw r6, ZL
+ sub r8, r2
+ sbc r9, r3
+ movw r24, r4
+ rcall keccak_f1600
+ rjmp 10b
+40:
+ movw XL, r4
+ movw ZL, r6
+ movw r24, r8
+ adiw r24, 7
+ lsr r25
+ ror r24
+ lsr r25
+ ror r24
+ lsr r25
+ ror r24
+ adiw r24, 0
+ breq 99f
+10:
+ ld r22, X+
+ st Z+, r22
+ sbiw r24, 1
+ brne 10b
+99:
+ pop_range 2, 10
ret
+; .endfunc
+