@@ -1890,6 +1890,10 @@ 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 ;
18931897
18941898 i = 0 ;
18951899 /* Decrypted with private key - unpad must be constant time. */
@@ -1902,17 +1906,25 @@ static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen,
19021906
19031907 /* Minimum of 11 bytes of pre-message data - including leading 0x00. */
19041908 minPad = ctMaskLT (i , RSA_MIN_PAD_SZ );
1905- invalid |= minPad ;
1909+ minPadCopy = minPad ;
1910+ invalidCopy = invalid ;
1911+ invalid = invalidCopy | minPadCopy ;
19061912 /* Must have seen separator. */
1907- invalid |= (byte )~pastSep ;
1913+ pastSepCopy = pastSep ;
1914+ invalidCopy = invalid ;
1915+ invalid = invalidCopy | (byte )~pastSepCopy ;
19081916 /* First byte must be 0x00. */
1909- invalid |= ctMaskNotEq (pkcsBlock [0 ], 0x00 );
1917+ invalidCopy = invalid ;
1918+ invalid = invalidCopy | ctMaskNotEq (pkcsBlock [0 ], 0x00 );
19101919 /* Check against expected block type: padValue */
1911- invalid |= ctMaskNotEq (pkcsBlock [1 ], padValue );
1920+ invalidCopy = invalid ;
1921+ invalid = invalidCopy | ctMaskNotEq (pkcsBlock [1 ], padValue );
19121922
19131923 * output = (byte * )(pkcsBlock + i );
1914- invalidMask = (int )-1 + (int )(invalid >> 7 );
1915- ret = invalidMask & ((int )pkcsBlockLen - i );
1924+ invalidCopy = invalid ;
1925+ invalidMask = (int )-1 + (int )(invalidCopy >> 7 );
1926+ invalidMaskCopy = invalidMask ;
1927+ ret = invalidMaskCopy & ((int )pkcsBlockLen - i );
19161928 }
19171929#endif
19181930
0 commit comments