diff options
-rw-r--r-- | utils/imxtools/sbtools/xorcrypt.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/utils/imxtools/sbtools/xorcrypt.c b/utils/imxtools/sbtools/xorcrypt.c index 89dde07ddc..5ecf9208d6 100644 --- a/utils/imxtools/sbtools/xorcrypt.c +++ b/utils/imxtools/sbtools/xorcrypt.c | |||
@@ -54,6 +54,49 @@ static uint32_t do_round(union xorcrypt_key_t *key) | |||
54 | return key->k[0]; | 54 | return key->k[0]; |
55 | } | 55 | } |
56 | 56 | ||
57 | static uint32_t do_unround(union xorcrypt_key_t *key) | ||
58 | { | ||
59 | uint32_t k7 = key->k[6]; | ||
60 | uint32_t k2 = key->k[1]; | ||
61 | uint32_t k11 = key->k[10] >> 31 | key->k[10] << 1; | ||
62 | uint32_t k0 = key->k[0]; | ||
63 | key->k[0] = key->k[15]; | ||
64 | key->k[15] = key->k[14]; | ||
65 | key->k[14] = key->k[13]; | ||
66 | key->k[13] = key->k[12]; | ||
67 | key->k[12] = key->k[11] ^ k11; | ||
68 | key->k[11] = k11; | ||
69 | key->k[10] = key->k[9]; | ||
70 | key->k[9] = key->k[8]; | ||
71 | key->k[8] = key->k[7] ^ k7; | ||
72 | key->k[7] = key->k[6]; | ||
73 | key->k[6] = key->k[5]; | ||
74 | key->k[5] = key->k[4]; | ||
75 | key->k[4] = key->k[3]; | ||
76 | key->k[3] = key->k[2] ^ k2; | ||
77 | key->k[2] = key->k[1]; | ||
78 | key->k[1] = k0 ^ key->k[0] ^ key->k[5] ^ key->k[3] ^ key->k[7] ^ key->k[11] ^ key->k[13]; | ||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | static void test_round(union xorcrypt_key_t keys[2]) | ||
83 | { | ||
84 | union xorcrypt_key_t save[2]; | ||
85 | memcpy(save, keys, sizeof(save)); | ||
86 | do_round(keys); | ||
87 | do_unround(keys); | ||
88 | if(memcmp(save, keys, sizeof(save))) | ||
89 | { | ||
90 | printf("Mismatch\n"); | ||
91 | for(int i = 0; i < 16; i++) | ||
92 | printf(" %s%08x", save[0].k[i] == keys[0].k[i] ? YELLOW : RED, save[0].k[i]); | ||
93 | printf("\n"); | ||
94 | for(int i = 0; i < 16; i++) | ||
95 | printf(" %s%08x", save[0].k[i] == keys[0].k[i] ? YELLOW : RED, keys[0].k[i]); | ||
96 | printf("\n"); | ||
97 | } | ||
98 | } | ||
99 | |||
57 | uint32_t xor_encrypt(union xorcrypt_key_t keys[2], void *_data, int size) | 100 | uint32_t xor_encrypt(union xorcrypt_key_t keys[2], void *_data, int size) |
58 | { | 101 | { |
59 | if(size % 4) | 102 | if(size % 4) |