MCPcopy Create free account
hub / github.com/abbeycode/UnrarKit / blockEncrypt

Method blockEncrypt

Libraries/unrar/rijndael.cpp:125–188  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

123}
124
125void Rijndael::blockEncrypt(const byte *input,size_t inputLen,byte *outBuffer)
126{
127 if (inputLen <= 0)
128 return;
129
130 size_t numBlocks = inputLen/16;
131#ifdef USE_SSE
132 if (AES_NI)
133 {
134 blockEncryptSSE(input,numBlocks,outBuffer);
135 return;
136 }
137#endif
138
139 byte *prevBlock = m_initVector;
140 for(size_t i = numBlocks;i > 0;i--)
141 {
142 byte block[16];
143 if (CBCMode)
144 Xor128(block,prevBlock,input);
145 else
146 Copy128(block,input);
147
148 byte temp[4][4];
149
150 Xor128(temp,block,m_expandedKey[0]);
151 Xor128(outBuffer, T1[temp[0][0]],T2[temp[1][1]],T3[temp[2][2]],T4[temp[3][3]]);
152 Xor128(outBuffer+4, T1[temp[1][0]],T2[temp[2][1]],T3[temp[3][2]],T4[temp[0][3]]);
153 Xor128(outBuffer+8, T1[temp[2][0]],T2[temp[3][1]],T3[temp[0][2]],T4[temp[1][3]]);
154 Xor128(outBuffer+12,T1[temp[3][0]],T2[temp[0][1]],T3[temp[1][2]],T4[temp[2][3]]);
155
156 for(int r = 1; r < m_uRounds-1; r++)
157 {
158 Xor128(temp,outBuffer,m_expandedKey[r]);
159 Xor128(outBuffer, T1[temp[0][0]],T2[temp[1][1]],T3[temp[2][2]],T4[temp[3][3]]);
160 Xor128(outBuffer+4, T1[temp[1][0]],T2[temp[2][1]],T3[temp[3][2]],T4[temp[0][3]]);
161 Xor128(outBuffer+8, T1[temp[2][0]],T2[temp[3][1]],T3[temp[0][2]],T4[temp[1][3]]);
162 Xor128(outBuffer+12,T1[temp[3][0]],T2[temp[0][1]],T3[temp[1][2]],T4[temp[2][3]]);
163 }
164 Xor128(temp,outBuffer,m_expandedKey[m_uRounds-1]);
165 outBuffer[ 0] = T1[temp[0][0]][1];
166 outBuffer[ 1] = T1[temp[1][1]][1];
167 outBuffer[ 2] = T1[temp[2][2]][1];
168 outBuffer[ 3] = T1[temp[3][3]][1];
169 outBuffer[ 4] = T1[temp[1][0]][1];
170 outBuffer[ 5] = T1[temp[2][1]][1];
171 outBuffer[ 6] = T1[temp[3][2]][1];
172 outBuffer[ 7] = T1[temp[0][3]][1];
173 outBuffer[ 8] = T1[temp[2][0]][1];
174 outBuffer[ 9] = T1[temp[3][1]][1];
175 outBuffer[10] = T1[temp[0][2]][1];
176 outBuffer[11] = T1[temp[1][3]][1];
177 outBuffer[12] = T1[temp[3][0]][1];
178 outBuffer[13] = T1[temp[0][1]][1];
179 outBuffer[14] = T1[temp[1][2]][1];
180 outBuffer[15] = T1[temp[2][3]][1];
181 Xor128(outBuffer,outBuffer,m_expandedKey[m_uRounds]);
182 prevBlock=outBuffer;

Callers 1

TestRijndaelFunction · 0.80

Calls 2

Xor128Function · 0.85
Copy128Function · 0.85

Tested by 1

TestRijndaelFunction · 0.64