请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
工具/软件:TI C/C++编译器
在-OS 模式下使用 TI 编译器16.9.6进行编译时 、mbedTLS SHA-512实现 会产生错误的结果。
下面的测试代码是错误行为的摘录、特别是看起来64位移位超过32个位置的操作不正确。
#define GET_UINT64_BE (n、b、i)
\{ \
(n)=((uint64_t)(b)[(i)]<< 56) \
|(uint64_t)(b)[(i)+1]<< 48) \
|(uint64_t)(b)[(i)+ 2]<< 40) \
|(uint64_t)(b)[(i)+3]<< 32) \
|(uint64_t)(b)[(i)+ 4]<< 24) \
|(uint64_t)(b)[(i)+ 5]<< 16) \
|(uint64_t)(b)[(i)+6]<< 8) \
|((uint64_t)(b)[(i)+ 7] ); \
}
静态 void test64 (void){
uint64_t w[2]={0、0};
int i;
静态常量 uint8_t TD[16]={
0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、
0x08、0x09、0x0a、0x0B、0x0c、 0x0D、0x0E、0x0F
};
对于(i = 0;i < 2;i++){
get_UINT64_BE (w[i]、td、I << 3);
}
对于(i = 0;i < sizeof (w);i++){
printf ("%02x "、((uint8_t *) w)[i]);
}
printf ("\n");
}
运行时、它会产生以下输出:
07 06 05 05 04 03 00 00 0f 0e 0d 0c 0b 00 00
请注意、uint64_ts 中的前3个字节为零、因此看起来像在上面的|运算符中移位40、48和56会导致0。
这是编译器生成的汇编器代码:
0103叶4 : 103eaf4: b5f0 按{R4、R5、R6、r7、LR} 103eaf6: 2100 MOV R1、#0 103eaf8: 2210. MOV R2、#16 103eafa: f1ad 0d14 sub.w sp、#20 103eafe: 4668 MOV r0、sp 103eb00: f005 fc3e. BL 1044380 103eb04: 4c24. LDR R4,[PC,#144];(103eb98 ) 103eb06: 466 d MOV R5、sp 103eb08: 2300 MOV R3、#0 103eb0a: 2702 MOV r7、#2 103eb0c: 78e6. ldrb R6、[R4、#3] 103eb0e: 78a0 ldrb r0、[R4、#2] 103eb10: 17F1 ASRS R1、R6、#31 103eb12: 4318 r0、r3 103eb14: 0202. lls R2、r0、#8 103eb16: e46 0003 ORR.w r0、R6、R3 103eb1a: 4311. 电阻器 R1、R2 103eb1c: 0e02 LSR R2、r0、#24 103eb1e: 0206 Lls R6、r0、#8 103eb20: 7920. ldrb r0、[R4、#4] 103eb22: 0209 Lls R1、R1、#8 103eb24: 4311. ORRs R1、R2 103eb26: 17c2. ASRS R2、r0、#31 103eb28: 430A 电阻器 R2、R1 103eb2a: 4330 R0、R6 103eb2c: 0211. Lls R1、R2、#8 103eb2e: 0206 Lls R6、r0、#8 103eb30: 0e02 LSR R2、r0、#24 103eb32: 7960 ldrb r0、[R4、#5] 103eb34: 4311. ORRs R1、R2 103eb36: 17c2. ASRS R2、r0、#31 103eb38: 430A R2/R1 103eb3a: 4330 r0、r6 103eb3c: 0211. Lls R1、R2、#8 103eb3e: 0206 Lls R6、r0、#8 103eb40: 0e02 LSR R2、r0、#24 103eb42: 79a0 ldrb r0、[R4、#6] 103eb44: 4311. Rr R1、R2 103eb46: 17c2. ASRS R2、r0、#31 103eb48: 430A R2/R1 103eb4a: 4330 R0、R6 103eb4c: 0211. Lls R1、R2、#8 103eb4e: 0206 Lls R6、r0、#8 103eb50: 0e02 LSR R2、r0、#24 103eb52: 79e0 ldrb r0、[R4、#7] 103eb54: 1e7f subs r7、r7、#1 103eb56: ea41 0102 ORR.w R1、R1、R2 103eb5a: e4f 72e0 MOV.w R2、r0、ASR #31 103eb5e: f104 0408 ADD.W R4、R4、#8 103eb62: ea42 0101 ORR.w R1、R2、R1 103eb66: ea40 0006 ORr.w r0、r0、r6 103eb6a: c503. stmia R5!、{r0、r1} 103eb6c: D1ce BNE.n 103eb0c 103eb6e: 2410. MOV R4、#16 103eb70: 466 d MOV R5、sp 103eb72: f815 1b01 ldrb.w R1、[R5]、#1 103eb76: A005. 添加 R0、PC、#20 ;(Adr r0、103eb8c ) 103eb78: f006 ffd0 BL 1045b1c 103eb7c: 1e64 SUS R4、R4、#1 103eb7e: d1f8. BNE.n 103eb72 103eb80: A004. 添加 R0、PC、#16 ;(ADR r0、103eb94 ) 103eb82: f006 ffcb BL 1045b1c 103eb86: B005 添加 SP、#20 103eb88: bdf0 弹出 {R4、R5、R6、r7、PC} 103eb8a: 46c0 NOP ;(mov R8、R8) 103eb8c: 78323025 .word 0x78323025 103eb90: 46c00020 .word 0x46c00020 103eb94: 46c0000a .word 0x46c0000a 103eb98: 01059282 字0x01059282