根據Intel的文檔,`_mm_aeskeygenassist_si128` 指令執行以下操作:
result[31:0] = SubWord(RotWord(temp)) xor Rcon;
result[63:32] = SubWord(RotWord(temp));
result[95:64] = SubWord(RotWord(temp)) xor Rcon;
result[127:96] = SubWord(RotWord(temp));
其中,temp是輸入寄存器的32位部分,實際上,該指令將輸入分成兩個64位部分,對每個64位部分的高32位進行RotWord和SubWord,然后與輪常數異或(對于第一個和第三個32位塊),然后復制到輸出寄存器的相應位置。
在AES-256的密鑰擴展中,我們通常使用該指令生成一個中間值,然后與之前的輪密鑰異或。
而 shuffle 操作是為了將這個中間值調整為正確的形式。在代碼中,我們使用了0xFF和0xAA。