@@ -278,31 +278,39 @@ init_rstate:
278
278
str r1 ,[ r4 , #TRNG_TRNG_CONFIG_OFFSET - TRNG_RNG_IMR_OFFSET ] @ turn off rand source and wipe SHA bits left in TRNG config ; r1=0
279
279
str r1 ,[ r4 , #TRNG_RND_SOURCE_ENABLE_OFFSET - TRNG_RNG_IMR_OFFSET ]
280
280
adds r5 , r5 , #SHA256_SUM0_OFFSET
281
- ldmia r5! , {r0 - r3}
282
- ldr r5 , =rstate_sha
283
- stmia r5 , {r0 - r3}
281
+ @ r5=SHA256 SUM0 register (r5 + 4 =SUM1 , r4 + 8 =SUM2 , etc)
282
+ ldmia r5 , {r0 - r3} @ load first 4 words of the 8 word SHA256 output
283
+ ldr r6 , =rstate_sha
284
+ @ r5=SHA256 SUM0 register (r5 + 4 =SUM1 , r4 + 8 =SUM2 , etc) , r6=rstate_sha
285
+ stmia r6 , {r0 - r3}
284
286
CHK_COUNT 26 , 6
285
-
286
- @ r5=rstate_sha
287
287
movs r0 , # 0
288
- strb r0 ,[ r5 ] @ make sure rstate_sha [ 0 ] has byte 0 set to 0 , representing "out of data"
289
- @ try to find a non - zero initialiser to create a non - degenerate LFSR
290
- ldr r1 ,[ r5 , # 4 ]
291
- cbnz r1 , 1f @ is word 1 non - zero? then use it
292
- ldr r1 ,[ r5 , # 8 ]
293
- cbnz r1 , 1f @ otherwise , is word 2 non - zero? use it
294
- ldr r1 ,[ r5 , # 12 ]
295
- cbnz r1 , 1f @ otherwise , is word 3 non - zero? use it
296
- mov r1 , r5 @ give up and use the address of rstate_sha (which is non - zero) ; this can't really happen (2^{-96} probability)
288
+ strb r0 ,[ r6 ] @ make sure rstate_sha [ 0 ] has byte 0 set to 0 , representing "out of data"
289
+
290
+ @ try to find a non - zero initialiser to create a non - degenerate LFSR random state
291
+ ldr r1 ,[ r5 , # 16 ] @ SHA SUM4
292
+ cbnz r1 , 1f @ is word 4 non - zero? then use it
293
+ ldr r1 ,[ r5 , # 20 ] @ SHA SUM5
294
+ cbnz r1 , 1f @ otherwise , is word 5 non - zero? use it
295
+ mov r1 , r6 @ give up and use the address of rstate_sha (which is non - zero) ; this can't really happen (2^{-64} probability)
296
+ 1 :
297
+ str r1 ,[ r6 , #rstate_lfsr - rstate_sha ]
298
+
299
+ @ try to find a non - zero initialiser to create a non - degenerate ROSC random state
300
+ ldr r1 ,[ r5 , # 24 ] @ SHA SUM6
301
+ cbnz r1 , 1f @ is word 6 non - zero? then use it
302
+ ldr r1 ,[ r5 , # 28 ] @ SHA SUM7
303
+ cbnz r1 , 1f @ otherwise , is word 7 non - zero? use it
304
+ mov r1 , r6 @ give up and use the address of rstate_sha (which is non - zero) ; this can't really happen (2^{-64} probability)
297
305
1 :
298
- str r1 ,[ r5 , #rstate_lfsr - rstate_sha ]
299
306
ldr r2 , =ROSC_RANDOM_OFFSET + ROSC_BASE
300
- str r1 ,[ r2 , # 0 ]
307
+ str r1 ,[ r2 , # 0 ] @ Initialise ROSC LFSR
301
308
CHK_COUNT 27 , 6
309
+
302
310
.if GEN_RAND_SHA
303
311
.if SH_JITTER
304
312
movs r2 , # 0
305
- str r2 ,[ r5 , #jstate - rstate_sha ]
313
+ str r2 ,[ r6 , #jstate - rstate_sha ]
306
314
.endif
307
315
.endif
308
316
@@ -1655,14 +1663,23 @@ ctr_crypt_s:
1655
1663
pop {r1}
1656
1664
ldmia r1 , { r8 - r11 } @ r8 - r11 = IVshareB
1657
1665
clear03 32
1658
- bl gen_rand_sha_nonpres ; eors r4,r4,r0; mov r8, r8, ror#16; eor r8, r8, r0,ror#16
1659
- bl gen_rand_sha_nonpres ; eors r5,r5,r0; mov r9, r9, ror#16; eor r9, r9, r0,ror#16
1660
- bl gen_rand_sha_nonpres ; eors r6,r6,r0; mov r10,r10,ror#16; eor r10,r10,r0,ror#16
1661
- bl gen_rand_sha_nonpres ; eors r7,r7,r0; mov r11,r11,ror#16; eor r11,r11,r0,ror#16
1666
+ bl gen_rand_sha_nonpres ; eors r4,r4,r0; movs r1,#0; mov r8, r8, ror#16; eor r8, r8, r0,ror#16 @ Barriers between shares to prevent implicit r4^r8 etc
1667
+ bl gen_rand_sha_nonpres ; eors r5,r5,r0; movs r1,#0; mov r9, r9, ror#16; eor r9, r9, r0,ror#16
1668
+ bl gen_rand_sha_nonpres ; eors r6,r6,r0; movs r1,#0; mov r10,r10,ror#16; eor r10,r10,r0,ror#16
1669
+ bl gen_rand_sha_nonpres ; eors r7,r7,r0; movs r1,#0; mov r11,r11,ror#16; eor r11,r11,r0,ror#16
1662
1670
ldr r0 , =IV0
1663
1671
stmia r0 , {r4 - r7}
1664
1672
adds r0 , r0 , # 20
1665
1673
stmia r0 , { r8 - r11 }
1674
+ @ "Decommission" IV0 so th at it doesn't get stacked
1675
+ bl gen_rand_sha_nonpres ; movs r4,r0
1676
+ bl gen_rand_sha_nonpres ; movs r5,r0
1677
+ bl gen_rand_sha_nonpres ; movs r6,r0
1678
+ bl gen_rand_sha_nonpres ; movs r7,r0
1679
+ bl gen_rand_sha_nonpres ; mov r8,r0
1680
+ bl gen_rand_sha_nonpres ; mov r9,r0
1681
+ bl gen_rand_sha_nonpres ; mov r10,r0
1682
+ bl gen_rand_sha_nonpres ; mov r11,r0
1666
1683
pop {r1 , r2}
1667
1684
@ r1=cipher/plaintext buffer , r2=number of blocks
1668
1685
0 commit comments