@@ -1890,10 +1890,8 @@ static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen,
18901890 volatile byte invalid = 0 ;
18911891 volatile byte minPad ;
18921892 volatile int invalidMask ;
1893- word16 pastSepCopy ;
1894- byte invalidCopy ;
1895- byte minPadCopy ;
1896- int invalidMaskCopy ;
1893+ byte inv ;
1894+ word16 sep ;
18971895
18981896 i = 0 ;
18991897 /* Decrypted with private key - unpad must be constant time. */
@@ -1904,27 +1902,25 @@ static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen,
19041902 pastSep |= ctMask16Eq (pkcsBlock [j ], 0x00 );
19051903 }
19061904
1905+ /* Snapshot volatiles to avoid multiple volatile accesses per
1906+ * expression. */
1907+ inv = invalid ;
1908+ sep = pastSep ;
1909+
19071910 /* Minimum of 11 bytes of pre-message data - including leading 0x00. */
19081911 minPad = ctMaskLT (i , RSA_MIN_PAD_SZ );
1909- minPadCopy = minPad ;
1910- invalidCopy = invalid ;
1911- invalid = invalidCopy | minPadCopy ;
1912+ inv |= minPad ;
19121913 /* Must have seen separator. */
1913- pastSepCopy = pastSep ;
1914- invalidCopy = invalid ;
1915- invalid = invalidCopy | (byte )~pastSepCopy ;
1914+ inv |= (byte )~sep ;
19161915 /* First byte must be 0x00. */
1917- invalidCopy = invalid ;
1918- invalid = invalidCopy | ctMaskNotEq (pkcsBlock [0 ], 0x00 );
1916+ inv |= ctMaskNotEq (pkcsBlock [0 ], 0x00 );
19191917 /* Check against expected block type: padValue */
1920- invalidCopy = invalid ;
1921- invalid = invalidCopy | ctMaskNotEq (pkcsBlock [1 ], padValue );
1918+ inv |= ctMaskNotEq (pkcsBlock [1 ], padValue );
19221919
1920+ invalid = inv ;
19231921 * output = (byte * )(pkcsBlock + i );
1924- invalidCopy = invalid ;
1925- invalidMask = (int )-1 + (int )(invalidCopy >> 7 );
1926- invalidMaskCopy = invalidMask ;
1927- ret = invalidMaskCopy & ((int )pkcsBlockLen - i );
1922+ invalidMask = (int )-1 + (int )(inv >> 7 );
1923+ ret = invalidMask & ((int )pkcsBlockLen - i );
19281924 }
19291925#endif
19301926
0 commit comments