mov j, r24
movw h0, r20
movw m0, r22
- mov r25, r24
- lsl r25
- lsl r25
+ lsl r24
+ lsl r24
ldi r30, lo8(const_lut)
ldi r31, hi8(const_lut)
- add r30, r25
+ add r30, r24
adc r31, r1
lpm acc0, Z+
lpm acc1, Z+
dec r22
brne 1b
ret
+
+/*******************************************************************************
+* void bmw256(void* dest, const void* msg, uint32_t length_b){
+* bmw_small_ctx_t ctx;
+* bmw256_init(&ctx);
+* while(length_b>=BMW_SMALL_BLOCKSIZE){
+* bmw_small_nextBlock(&ctx, msg);
+* length_b -= BMW_SMALL_BLOCKSIZE;
+* msg = (uint8_t*)msg + BMW_SMALL_BLOCKSIZE_B;
+* }
+* bmw_small_lastBlock(&ctx, msg, length_b);
+* bmw256_ctx2hash(dest, &ctx);
+* }
+*
+* param dest: r24:r25
+* param msg: r22:r23
+* param length_b: r18:r21
+*/
+ctx0 = 2
+ctx1 = 3
+msg0 = 4
+msg1 = 5
+len0 = 6
+len1 = 7
+len2 = 8
+len3 = 9
+dst0 = 10
+dst1 = 11
+.global bmw256
+bmw256:
+ push r16
+ ldi r16, 1
+ rjmp bmw_small_all
+
+/*******************************************************************************
+* void bmw224(void* dest, const void* msg, uint32_t length_b){
+* bmw_small_ctx_t ctx;
+* bmw224_init(&ctx);
+* while(length_b>=BMW_SMALL_BLOCKSIZE){
+* bmw_small_nextBlock(&ctx, msg);
+* length_b -= BMW_SMALL_BLOCKSIZE;
+* msg = (uint8_t*)msg + BMW_SMALL_BLOCKSIZE_B;
+* }
+* bmw_small_lastBlock(&ctx, msg, length_b);
+* bmw224_ctx2hash(dest, &ctx);
+* }
+*
+* param dest: r24:r25
+* param msg: r22:r23
+* param length_b: r18:r21
+*/
+ctx0 = 2
+ctx1 = 3
+msg0 = 4
+msg1 = 5
+len0 = 6
+len1 = 7
+len2 = 8
+len3 = 9
+dst0 = 10
+dst1 = 11
+.global bmw224
+bmw224:
+ push r16
+ clr r16
+
+bmw_small_all:
+ push_range 2, 11
+ stack_alloc_large 64+4
+ adiw r30, 1
+ movw ctx0, r30
+ movw dst0, r24
+ movw msg0, r22
+ movw len0, r18
+ movw len2, r20
+ movw r24, ctx0
+ ldi r30, pm_lo8(init_lut)
+ ldi r31, pm_hi8(init_lut)
+ add r30, r16
+ adc r31, r1
+ icall
+20:
+ mov r18, len2
+ or r18, len3
+ breq 50f
+ movw r24, ctx0
+ movw r22, msg0
+ rcall bmw_small_nextBlock
+ ldi r20, 2
+ sub len1, r20
+ sbc len2, r1
+ sbc len3, r1
+ ldi r20, 64
+ add msg0, r20
+ adc msg1, r1
+ rjmp 20b
+50:
+ movw r24, ctx0
+ movw r22, msg0
+ movw r20, len0
+ rcall bmw_small_lastBlock
+ movw r24, dst0
+ movw r22, ctx0
+ ldi r30, pm_lo8(c2h_lut)
+ ldi r31, pm_hi8(c2h_lut)
+ add r30, r16
+ adc r31, r1
+ icall
+ stack_free_large 64+4
+ pop_range 2, 11
+ pop r16
+ ret
+
+init_lut:
+ rjmp bmw224_init
+ rjmp bmw256_init
+c2h_lut:
+ rjmp bmw224_ctx2hash
+ rjmp bmw256_ctx2hash