Commit b6e4586f by Enrico Pozzobon

Fixed knot128v1/armcortexm_1 for GCC

parent e49defae
...@@ -54,99 +54,135 @@ unsigned char constant6[63] = { ...@@ -54,99 +54,135 @@ unsigned char constant6[63] = {
b = s0 ^ b; b = s0 ^ b;
*/ */
static void permutation256(unsigned char *in, int rounds, unsigned char *rc) { static void permutation256(unsigned char *in, int rounds, unsigned char *rc) {
uint32_t w0, w1, w2, w3, w4, w5, w6, w7; /* ----------------------------------- */
uint32_t s0, s1, s2; /* r0 - point of plain keys */
uint32_t one = 0x1; /* r1 - rounds */
uint32_t ff = 0xff; /* r2 - round constants */
__asm volatile( /* r3 - tmp 0 */
"enc_loop_%=: \n\t" /* r4 - p0 lower 32 bits */
"ldr %[w0], [%[in]] \n\t" /* r5 - p1 lower 32 bits */
"ldr %[w4], [%[in], #4] \n\t" /* r6 - p2 lower 32 bits */
"ldr %[w1], [%[in], #8] \n\t" /* r7 - p3 lower 32 bits */
"ldr %[w5], [%[in], #12] \n\t" /* r8 - p0 32 bits */
"ldr %[w2], [%[in], #16] \n\t" /* r9 - p1 32 bits */
"ldr %[w6], [%[in], #20] \n\t" /* r10 - p2 32 bits */
"ldr %[w3], [%[in], #24] \n\t" /* r11 - p3 32 bits */
"ldr %[w7], [%[in], #28] \n\t" /* r12 - tmp 1 */
"mov %[s0], 0xfff \n\t" /* r14 - tmp 2 */
"mov %[s2], 0x1fff \n\t" asm volatile (
"lsl %[s2], %[s2], #12 \n\t" /*
"eors %[s2], %[s2], %[s0] \n\t" * http://stackoverflow.com/questions/261419/arm-to-c-calling-convention-registers-to-save
*
* the first argument is stored in r0, the second in r1, third in r2 and fourth in r3
* if add '!', the value will be updated
*/
"sub sp, sp, #12 \n\t"
"/* store 0xff */ \n\t"
"mov r3, 0xff \n\t"
"str r3, [sp, #4] \n\t"
"/* store 0x1ffffff */ \n\t"
"mov r12, r3 \n\t"
"lsl r3, r3, #8 \n\t"
"eors r3, r3, r12 \n\t"
"lsl r3, r3, #8 \n\t"
"eors r3, r3, r12 \n\t"
"lsl r3, r3, #1 \n\t"
"mov r14, 0x1 \n\t"
"eors r3, r3, r14 \n\t"
"str r3, [sp] \n\t"
"/* store 0x1 */ \n\t"
"str r14, [sp, #8] \n\t"
"/* load plain text */\n\t"
"ldr r4, [%[in]] \n\t"
"ldr r8, [%[in], #4] \n\t"
"ldr r5, [%[in], #8] \n\t"
"ldr r9, [%[in], #12] \n\t"
"ldr r6, [%[in], #16] \n\t"
"ldr r10, [%[in], #20] \n\t"
"ldr r7, [%[in], #24] \n\t"
"ldr r11, [%[in], #28] \n\t"
"enc_loop: \n\t"
"/*add round const*/ \n\t" "/*add round const*/ \n\t"
"ldrb %[s0], [%[rc]] \n\t" "ldrb r3, [%[rc]] \n\t"
"eors %[w0], %[w0], %[s0] \n\t" "eors r4, r4, r3 \n\t"
"/*sbox first column*/ \n\t" "/*sbox first column*/ \n\t"
"mvns %[w0], %[w0] \n\t" "mvns r4, r4 \n\t"
"ands %[s0], %[w1], %[w0] \n\t" "ands r3, r5, r4 \n\t"
"eors %[s0], %[w2], %[s0] \n\t" "eors r3, r6, r3 \n\t"
"orrs %[w2], %[w1], %[w2] \n\t" "orrs r6, r5, r6 \n\t"
"eors %[w0], %[w3], %[w0] \n\t" "eors r4, r7, r4 \n\t"
"eors %[w2], %[w2], %[w0] \n\t" "eors r6, r6, r4 \n\t"
"eors %[s1], %[w1], %[w3] \n\t" "eors r12, r5, r7 \n\t"
"eors %[w3], %[w3], %[s0] \n\t" "eors r7, r7, r3 \n\t"
"ands %[w0], %[s0], %[w0] \n\t" "ands r4, r3, r4 \n\t"
"eors %[w0], %[s1], %[w0] \n\t" "eors r4, r12,r4 \n\t"
"ands %[w1], %[w2], %[s1] \n\t" "ands r5, r6, r12 \n\t"
"eors %[w1], %[s0], %[w1] \n\t" "eors r5, r3, r5 \n\t"
"/*sbox second column*/ \n\t" "/*sbox second column*/ \n\t"
"mvns %[w4], %[w4] \n\t" "mvns r8, r8 \n\t"
"ands %[s0], %[w5], %[w4] \n\t" "ands r3, r9, r8 \n\t"
"eors %[s0], %[w6], %[s0] \n\t" "eors r3, r10,r3 \n\t"
"orrs %[w6], %[w5], %[w6] \n\t" "orrs r10, r9, r10 \n\t"
"eors %[w4], %[w7], %[w4] \n\t" "eors r8, r11,r8 \n\t"
"eors %[w6], %[w6], %[w4] \n\t" "eors r10, r10,r8 \n\t"
"eors %[s1], %[w5], %[w7] \n\t" "eors r12, r9, r11 \n\t"
"eors %[w7], %[w7], %[s0] \n\t" "eors r11, r11,r3 \n\t"
"ands %[w4], %[s0], %[w4] \n\t" "ands r8, r3, r8 \n\t"
"eors %[w4], %[s1], %[w4] \n\t" "eors r8, r12,r8 \n\t"
"ands %[w5], %[w6], %[s1] \n\t" "ands r9, r10,r12 \n\t"
"eors %[w5], %[s0], %[w5] \n\t" "eors r9, r3, r9 \n\t"
"/*rotate shift left 1 bit*/ \n\t" "/*rotate shift left 1 bit*/ \n\t"
"ror %[s0], %[w1], #31 \n\t" "ldr r14, [sp, #8] \n\t"
"ands %[s0], %[s0], %[one] \n\t" "ror r3, r5, #31 \n\t"
"lsl %[w1], %[w1], #1 \n\t" "ands r3, r3, r14 \n\t"
"ror %[s1], %[w5], #31 \n\t" "lsl r5, r5, #1 \n\t"
"ands %[s1], %[s1], %[one] \n\t" "ror r12, r9, #31 \n\t"
"eors %[w1], %[w1], %[s1] \n\t" "ands r12, r12,r14 \n\t"
"lsl %[w5], %[w5], #1 \n\t" "eors r5, r5, r12 \n\t"
"eors %[w5], %[w5], %[s0] \n\t" "lsl r9, r9, #1 \n\t"
"eors r9, r9, r3 \n\t"
"/*rotate shift left 8 bits*/ \n\t" "/*rotate shift left 8 bits*/ \n\t"
"ror %[s0], %[w2], #24 \n\t" "ldr r14, [sp, #4] \n\t"
"ands %[s0], %[s0], %[ff] \n\t" "ror r3, r6, #24 \n\t"
"lsl %[w2], %[w2], #8 \n\t" "ands r3, r3, r14 \n\t"
"ror %[s1], %[w6], #24 \n\t" "lsl r6, r6, #8 \n\t"
"ands %[s1], %[s1], %[ff] \n\t" "ror r12, r10,#24 \n\t"
"eors %[w2], %[w2], %[s1] \n\t" "ands r12, r12,r14 \n\t"
"lsl %[w6], %[w6], #8 \n\t" "eors r6, r6, r12 \n\t"
"eors %[w6], %[w6], %[s0] \n\t" "lsl r10, r10,#8 \n\t"
"eors r10, r10,r3 \n\t"
"/*rotate shift left 25 bits*/ \n\t" "/*rotate shift left 25 bits*/ \n\t"
"ror %[s0], %[w3], #7 \n\t" "ldr r14, [sp] \n\t"
"ands %[s0], %[s0], %[s2] \n\t" "ror r3, r7, #7 \n\t"
"lsl %[w3], %[w3], #25 \n\t" "ands r3, r3, r14 \n\t"
"ror %[s1], %[w7], #7 \n\t" "lsl r7, r7, #25 \n\t"
"ands %[s1], %[s1], %[s2] \n\t" "ror r12, r11,#7 \n\t"
"eors %[w3], %[w3], %[s1] \n\t" "ands r12, r12,r14 \n\t"
"lsl %[w7], %[w7], #25 \n\t" "eors r7, r7, r12 \n\t"
"eors %[w7], %[w7], %[s0] \n\t" "lsl r11, r11,#25 \n\t"
"eors r11, r11,r3 \n\t"
"/*loop control*/ \n\t" "/*loop control*/ \n\t"
"adds %[rc], %[rc], #1 \n\t" "adds %[rc], %[rc], #1 \n\t"
"subs %[rounds], %[rounds], #1 \n\t" "subs %[ro], %[ro], #1 \n\t"
"bne enc_loop_%= \n\t" "bne enc_loop \n\t"
"str %[w0], [%[in]] \n\t" "str r4, [%[in]] \n\t"
"str %[w4], [%[in], #4] \n\t" "str r8, [%[in], #4] \n\t"
"str %[w1], [%[in], #8] \n\t" "str r5, [%[in], #8] \n\t"
"str %[w5], [%[in], #12] \n\t" "str r9, [%[in], #12] \n\t"
"str %[w2], [%[in], #16] \n\t" "str r6, [%[in], #16] \n\t"
"str %[w6], [%[in], #20] \n\t" "str r10, [%[in], #20] \n\t"
"str %[w3], [%[in], #24] \n\t" "str r7, [%[in], #24] \n\t"
"str %[w7], [%[in], #28] \n\t" "str r11, [%[in], #28] \n\t"
/* ----------------------------- */
: [rounds] "=r" (rounds), [rc] "=r" (rc), "add sp, sp, #12 \n\t"
[w0] "=r" (w0), [w1] "=r" (w1), [w2] "=r" (w2), [w3] "=r" (w3), : /* output variables - including inputs that are changed */
[w4] "=r" (w4), [w5] "=r" (w5), [w6] "=r" (w6), [w7] "=r" (w7), [ro] "=r" (rounds), [rc] "=r" (rc)
[s0] "=r" (s0), [s1] "=r" (s1), [s2] "=r" (s2) : /* input variables */
: [in] "r" (in), "[rounds]" (rounds), "[rc]" (rc), [ff] "r" (ff), [one] "r" (one) [in] "r" (in), "[ro]" (rounds), "[rc]" (rc)
); : /* clobber registers for temporary values */
"r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
"r11", "r12", "r14"
);
} }
int crypto_aead_encrypt(unsigned char *c, unsigned long long *clen, int crypto_aead_encrypt(unsigned char *c, unsigned long long *clen,
...@@ -253,7 +289,7 @@ int crypto_aead_decrypt(unsigned char *m, unsigned long long *mlen, ...@@ -253,7 +289,7 @@ int crypto_aead_decrypt(unsigned char *m, unsigned long long *mlen,
const unsigned char *ad, unsigned long long adlen, const unsigned char *ad, unsigned long long adlen,
const unsigned char *npub, const unsigned char *k) const unsigned char *npub, const unsigned char *k)
{ {
unsigned int u; unsigned int u = 0;
unsigned int v = ((clen - CRYPTO_ABYTES) >> 3) + 1; unsigned int v = ((clen - CRYPTO_ABYTES) >> 3) + 1;
unsigned int v1; unsigned int v1;
unsigned int last_index; unsigned int last_index;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment