Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
lwc
/
candidates
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
b6e4586f
authored
Jul 06, 2020
by
Enrico Pozzobon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed knot128v1/armcortexm_1 for GCC
parent
e49defae
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
122 additions
and
86 deletions
+122
-86
knot/Implementations/crypto_aead/knot128v1/armcortexm_1/encrypt.c
+122
-86
No files found.
knot/Implementations/crypto_aead/knot128v1/armcortexm_1/encrypt.c
View file @
b6e4586f
...
...
@@ -54,99 +54,135 @@ unsigned char constant6[63] = {
b = s0 ^ b;
*/
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
;
uint32_t
one
=
0x1
;
uint32_t
ff
=
0xff
;
__asm
volatile
(
"enc_loop_%=:
\n\t
"
"ldr %[w0], [%[in]]
\n\t
"
"ldr %[w4], [%[in], #4]
\n\t
"
"ldr %[w1], [%[in], #8]
\n\t
"
"ldr %[w5], [%[in], #12]
\n\t
"
"ldr %[w2], [%[in], #16]
\n\t
"
"ldr %[w6], [%[in], #20]
\n\t
"
"ldr %[w3], [%[in], #24]
\n\t
"
"ldr %[w7], [%[in], #28]
\n\t
"
"mov %[s0], 0xfff
\n\t
"
"mov %[s2], 0x1fff
\n\t
"
"lsl %[s2], %[s2], #12
\n\t
"
"eors %[s2], %[s2], %[s0]
\n\t
"
/* ----------------------------------- */
/* r0 - point of plain keys */
/* r1 - rounds */
/* r2 - round constants */
/* r3 - tmp 0 */
/* r4 - p0 lower 32 bits */
/* r5 - p1 lower 32 bits */
/* r6 - p2 lower 32 bits */
/* r7 - p3 lower 32 bits */
/* r8 - p0 32 bits */
/* r9 - p1 32 bits */
/* r10 - p2 32 bits */
/* r11 - p3 32 bits */
/* r12 - tmp 1 */
/* r14 - tmp 2 */
asm
volatile
(
/*
* 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
"
"ldrb %[s0], [%[rc]]
\n\t
"
"eors %[w0], %[w0], %[s0]
\n\t
"
"ldrb r3, [%[rc]]
\n\t
"
"eors r4, r4, r3
\n\t
"
"/*sbox first column*/
\n\t
"
"mvns %[w0], %[w0]
\n\t
"
"ands %[s0], %[w1], %[w0]
\n\t
"
"eors %[s0], %[w2], %[s0]
\n\t
"
"orrs %[w2], %[w1], %[w2]
\n\t
"
"eors %[w0], %[w3], %[w0]
\n\t
"
"eors %[w2], %[w2], %[w0]
\n\t
"
"eors %[s1], %[w1], %[w3]
\n\t
"
"eors %[w3], %[w3], %[s0]
\n\t
"
"ands %[w0], %[s0], %[w0]
\n\t
"
"eors %[w0], %[s1], %[w0]
\n\t
"
"ands %[w1], %[w2], %[s1]
\n\t
"
"eors %[w1], %[s0], %[w1]
\n\t
"
"mvns r4, r4
\n\t
"
"ands r3, r5, r4
\n\t
"
"eors r3, r6, r3
\n\t
"
"orrs r6, r5, r6
\n\t
"
"eors r4, r7, r4
\n\t
"
"eors r6, r6, r4
\n\t
"
"eors r12, r5, r7
\n\t
"
"eors r7, r7, r3
\n\t
"
"ands r4, r3, r4
\n\t
"
"eors r4, r12,r4
\n\t
"
"ands r5, r6, r12
\n\t
"
"eors r5, r3, r5
\n\t
"
"/*sbox second column*/
\n\t
"
"mvns %[w4], %[w4]
\n\t
"
"ands %[s0], %[w5], %[w4]
\n\t
"
"eors %[s0], %[w6], %[s0]
\n\t
"
"orrs %[w6], %[w5], %[w6]
\n\t
"
"eors %[w4], %[w7], %[w4]
\n\t
"
"eors %[w6], %[w6], %[w4]
\n\t
"
"eors %[s1], %[w5], %[w7]
\n\t
"
"eors %[w7], %[w7], %[s0]
\n\t
"
"ands %[w4], %[s0], %[w4]
\n\t
"
"eors %[w4], %[s1], %[w4]
\n\t
"
"ands %[w5], %[w6], %[s1]
\n\t
"
"eors %[w5], %[s0], %[w5]
\n\t
"
"mvns r8, r8
\n\t
"
"ands r3, r9, r8
\n\t
"
"eors r3, r10,r3
\n\t
"
"orrs r10, r9, r10
\n\t
"
"eors r8, r11,r8
\n\t
"
"eors r10, r10,r8
\n\t
"
"eors r12, r9, r11
\n\t
"
"eors r11, r11,r3
\n\t
"
"ands r8, r3, r8
\n\t
"
"eors r8, r12,r8
\n\t
"
"ands r9, r10,r12
\n\t
"
"eors r9, r3, r9
\n\t
"
"/*rotate shift left 1 bit*/
\n\t
"
"ror %[s0], %[w1], #31
\n\t
"
"ands %[s0], %[s0], %[one]
\n\t
"
"lsl %[w1], %[w1], #1
\n\t
"
"ror %[s1], %[w5], #31
\n\t
"
"ands %[s1], %[s1], %[one]
\n\t
"
"eors %[w1], %[w1], %[s1]
\n\t
"
"lsl %[w5], %[w5], #1
\n\t
"
"eors %[w5], %[w5], %[s0]
\n\t
"
"ldr r14, [sp, #8]
\n\t
"
"ror r3, r5, #31
\n\t
"
"ands r3, r3, r14
\n\t
"
"lsl r5, r5, #1
\n\t
"
"ror r12, r9, #31
\n\t
"
"ands r12, r12,r14
\n\t
"
"eors r5, r5, r12
\n\t
"
"lsl r9, r9, #1
\n\t
"
"eors r9, r9, r3
\n\t
"
"/*rotate shift left 8 bits*/
\n\t
"
"ror %[s0], %[w2], #24
\n\t
"
"ands %[s0], %[s0], %[ff]
\n\t
"
"lsl %[w2], %[w2], #8
\n\t
"
"ror %[s1], %[w6], #24
\n\t
"
"ands %[s1], %[s1], %[ff]
\n\t
"
"eors %[w2], %[w2], %[s1]
\n\t
"
"lsl %[w6], %[w6], #8
\n\t
"
"eors %[w6], %[w6], %[s0]
\n\t
"
"ldr r14, [sp, #4]
\n\t
"
"ror r3, r6, #24
\n\t
"
"ands r3, r3, r14
\n\t
"
"lsl r6, r6, #8
\n\t
"
"ror r12, r10,#24
\n\t
"
"ands r12, r12,r14
\n\t
"
"eors r6, r6, r12
\n\t
"
"lsl r10, r10,#8
\n\t
"
"eors r10, r10,r3
\n\t
"
"/*rotate shift left 25 bits*/
\n\t
"
"ror %[s0], %[w3], #7
\n\t
"
"ands %[s0], %[s0], %[s2]
\n\t
"
"lsl %[w3], %[w3], #25
\n\t
"
"ror %[s1], %[w7], #7
\n\t
"
"ands %[s1], %[s1], %[s2]
\n\t
"
"eors %[w3], %[w3], %[s1]
\n\t
"
"lsl %[w7], %[w7], #25
\n\t
"
"eors %[w7], %[w7], %[s0]
\n\t
"
"ldr r14, [sp]
\n\t
"
"ror r3, r7, #7
\n\t
"
"ands r3, r3, r14
\n\t
"
"lsl r7, r7, #25
\n\t
"
"ror r12, r11,#7
\n\t
"
"ands r12, r12,r14
\n\t
"
"eors r7, r7, r12
\n\t
"
"lsl r11, r11,#25
\n\t
"
"eors r11, r11,r3
\n\t
"
"/*loop control*/
\n\t
"
"adds %[rc], %[rc], #1
\n\t
"
"subs %[rounds], %[rounds], #1
\n\t
"
"bne enc_loop_%=
\n\t
"
"str %[w0], [%[in]]
\n\t
"
"str %[w4], [%[in], #4]
\n\t
"
"str %[w1], [%[in], #8]
\n\t
"
"str %[w5], [%[in], #12]
\n\t
"
"str %[w2], [%[in], #16]
\n\t
"
"str %[w6], [%[in], #20]
\n\t
"
"str %[w3], [%[in], #24]
\n\t
"
"str %[w7], [%[in], #28]
\n\t
"
:
[
rounds
]
"=r"
(
rounds
),
[
rc
]
"=r"
(
rc
),
[
w0
]
"=r"
(
w0
),
[
w1
]
"=r"
(
w1
),
[
w2
]
"=r"
(
w2
),
[
w3
]
"=r"
(
w3
),
[
w4
]
"=r"
(
w4
),
[
w5
]
"=r"
(
w5
),
[
w6
]
"=r"
(
w6
),
[
w7
]
"=r"
(
w7
),
[
s0
]
"=r"
(
s0
),
[
s1
]
"=r"
(
s1
),
[
s2
]
"=r"
(
s2
)
:
[
in
]
"r"
(
in
),
"[rounds]"
(
rounds
),
"[rc]"
(
rc
),
[
ff
]
"r"
(
ff
),
[
one
]
"r"
(
one
)
);
"subs %[ro], %[ro], #1
\n\t
"
"bne enc_loop
\n\t
"
"str r4, [%[in]]
\n\t
"
"str r8, [%[in], #4]
\n\t
"
"str r5, [%[in], #8]
\n\t
"
"str r9, [%[in], #12]
\n\t
"
"str r6, [%[in], #16]
\n\t
"
"str r10, [%[in], #20]
\n\t
"
"str r7, [%[in], #24]
\n\t
"
"str r11, [%[in], #28]
\n\t
"
/* ----------------------------- */
"add sp, sp, #12
\n\t
"
:
/* output variables - including inputs that are changed */
[
ro
]
"=r"
(
rounds
),
[
rc
]
"=r"
(
rc
)
:
/* input variables */
[
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
,
...
...
@@ -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
*
npub
,
const
unsigned
char
*
k
)
{
unsigned
int
u
;
unsigned
int
u
=
0
;
unsigned
int
v
=
((
clen
-
CRYPTO_ABYTES
)
>>
3
)
+
1
;
unsigned
int
v1
;
unsigned
int
last_index
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment