summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-09-20 20:40:52 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-09-20 20:41:43 +0800
commitc67b8d9b094bd29fdc5b834f70261946eb76e0ec (patch)
treeda4bae01c753453472d6a38a53c9863e55ed148b
parent92bbbbf894b4683299c31ba62c60ef8e1e18ca06 (diff)
ppssrc: Add decrypt functions
-rw-r--r--src/aes.c66
-rw-r--r--src/aes.h6
2 files changed, 57 insertions, 15 deletions
diff --git a/src/aes.c b/src/aes.c
index 4a82b90..81d63b3 100644
--- a/src/aes.c
+++ b/src/aes.c
@@ -41,9 +41,9 @@ static uchar Sbox[256] = { // forward s-box
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+};
-#if 0
static uchar InvSbox[256] = { // inverse s-box
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
@@ -60,8 +60,8 @@ static uchar InvSbox[256] = { // inverse s-box
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
- 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};
-#endif
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+};
// combined Xtimes2[Sbox[]]
static uchar Xtime2Sbox[256] = {
@@ -125,7 +125,9 @@ static uchar Xtime2[256] = {
0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85,
0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5,
0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5,
- 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5};
+ 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5
+};
+#endif
static uchar Xtime9[256] = {
0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
@@ -143,7 +145,8 @@ static uchar Xtime9[256] = {
0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed,
0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d,
0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6,
- 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46};
+ 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46
+};
static uchar XtimeB[256] = {
0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69,
@@ -161,7 +164,8 @@ static uchar XtimeB[256] = {
0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68,
0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8,
0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13,
- 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3};
+ 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3
+};
static uchar XtimeD[256] = {
0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b,
@@ -179,7 +183,8 @@ static uchar XtimeD[256] = {
0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc,
0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c,
0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47,
- 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97};
+ 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97
+};
static uchar XtimeE[256] = {
0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a,
@@ -197,9 +202,8 @@ static uchar XtimeE[256] = {
0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6,
0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56,
0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d,
- 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d};
-
-#endif
+ 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d
+};
// exchanges columns in each of 4 rows
// row0 - unchanged, row1- shifted left 1,
@@ -228,7 +232,6 @@ static void ShiftRows (uchar *state)
// restores columns in each of 4 rows
// row0 - unchanged, row1- shifted right 1,
// row2 - shifted right 2 and row3 - shifted right 3
-#if 0
static void InvShiftRows (uchar *state)
{
uchar tmp;
@@ -249,7 +252,6 @@ static void InvShiftRows (uchar *state)
tmp = InvSbox[state[3]], state[3] = InvSbox[state[7]];
state[7] = InvSbox[state[11]], state[11] = InvSbox[state[15]], state[15] = tmp;
}
-#endif
// recombine and mix each row in a column
static void MixSubColumns (uchar *state)
@@ -284,7 +286,6 @@ static void MixSubColumns (uchar *state)
}
// restore and un-mix each row in a column
-#if 0
static void InvMixSubColumns (uchar *state)
{
uchar tmp[4 * Nb];
@@ -317,7 +318,6 @@ static void InvMixSubColumns (uchar *state)
for( i=0; i < 4 * Nb; i++ )
state[i] = InvSbox[tmp[i]];
}
-#endif
// encrypt/decrypt columns of the key
// n.b. you can replace this with
@@ -388,6 +388,26 @@ static void Encrypt (const uchar *in, const uchar *expkey, uchar *out)
memcpy (out, state, sizeof(state));
}
+static void Decrypt (const uchar *in, const uchar *expkey, uchar *out)
+{
+ uchar state[Nb * 4];
+ unsigned round;
+
+ memcpy (state, in, sizeof(state));
+
+ AddRoundKey ((unsigned *)state, (unsigned *)expkey + Nr * Nb);
+ InvShiftRows(state);
+
+ for( round = Nr; round--; )
+ {
+ AddRoundKey ((unsigned *)state, (unsigned *)expkey + round * Nb);
+ if( round )
+ InvMixSubColumns (state);
+ }
+
+ memcpy (out, state, sizeof(state));
+}
+
int AES_set_encrypt_key(const unsigned char* key, int block_size,
AES_KEY * aes_key)
{
@@ -403,3 +423,19 @@ void AES_encrypt (const unsigned char *in, unsigned char *out,
{
Encrypt (in, aes_key->data, out);
}
+
+int AES_set_decrypt_key(const unsigned char* key, int block_size,
+ AES_KEY * aes_key)
+{
+ if (block_size != 128)
+ return -1;
+
+ ExpandKey (key, aes_key->data);
+ return 0;
+}
+
+void AES_decrypt (const unsigned char *in, unsigned char *out,
+ const AES_KEY *aes_key)
+{
+ Decrypt (in, aes_key->data, out);
+}
diff --git a/src/aes.h b/src/aes.h
index d54fe03..5023fc2 100644
--- a/src/aes.h
+++ b/src/aes.h
@@ -26,4 +26,10 @@ int AES_set_encrypt_key(const unsigned char* key, int block_size,
void AES_encrypt (const unsigned char *in, unsigned char *out,
const AES_KEY *aes_key);
+int AES_set_decrypt_key(const unsigned char* key, int block_size,
+ AES_KEY * aes_key);
+
+void AES_decrypt (const unsigned char *in, unsigned char *out,
+ const AES_KEY *aes_key);
+
#endif