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
32c03519
authored
4 years ago
by
Christoph Dobraunig
Committed by
Enrico Pozzobon
4 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ascon lowsize
parent
7090c60d
Show whitespace changes
Inline
Side-by-side
Showing
45 changed files
with
1466 additions
and
0 deletions
+1466
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/api.h
+5
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/core.c
+123
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/core.h
+27
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/decrypt.c
+32
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/encrypt.c
+24
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/endian.h
+29
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/implementors
+2
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/permutations.c
+50
-0
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/permutations.h
+71
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/api.h
+5
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/core.c
+78
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/core.h
+27
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/decrypt.c
+29
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/encrypt.c
+21
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/endian.h
+29
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/implementors
+2
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/permutations.c
+8
-0
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/permutations.h
+66
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/api.h
+5
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/core.c
+93
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/core.h
+27
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/decrypt.c
+32
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/encrypt.c
+24
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/endian.h
+29
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/implementors
+2
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/permutations.c
+50
-0
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/permutations.h
+71
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/api.h
+5
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/core.c
+64
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/core.h
+27
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/decrypt.c
+29
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/encrypt.c
+21
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/endian.h
+29
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/implementors
+2
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/permutations.c
+8
-0
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/permutations.h
+66
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/api.h
+5
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/core.c
+67
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/core.h
+27
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/decrypt.c
+29
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/encrypt.c
+21
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/endian.h
+29
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/implementors
+2
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/permutations.c
+8
-0
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/permutations.h
+66
-0
No files found.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/api.h
0 → 100644
View file @
32c03519
#define CRYPTO_KEYBYTES 16
#define CRYPTO_NSECBYTES 0
#define CRYPTO_NPUBBYTES 16
#define CRYPTO_ABYTES 16
#define CRYPTO_NOOVERLAP 1
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/core.c
0 → 100644
View file @
32c03519
#include "core.h"
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
)
{
u32_2
t0
,
t1
;
u64
tmp0
,
tmp1
;
u64
i
;
while
(
len
>=
RATE
)
{
tmp0
=
U64BIG
(
*
(
u64
*
)
in
);
t0
=
to_bit_interleaving
(
tmp0
);
s
->
x0
.
e
^=
t0
.
e
;
s
->
x0
.
o
^=
t0
.
o
;
tmp1
=
U64BIG
(
*
(
u64
*
)(
in
+
8
));
t1
=
to_bit_interleaving
(
tmp1
);
s
->
x1
.
e
^=
t1
.
e
;
s
->
x1
.
o
^=
t1
.
o
;
if
(
mode
!=
ASCON_AD
)
{
tmp0
=
from_bit_interleaving
(
s
->
x0
);
*
(
u64
*
)
out
=
U64BIG
(
tmp0
);
tmp1
=
from_bit_interleaving
(
s
->
x1
);
*
(
u64
*
)(
out
+
8
)
=
U64BIG
(
tmp1
);
}
if
(
mode
==
ASCON_DEC
)
{
s
->
x0
=
t0
;
s
->
x1
=
t1
;
}
P
(
s
,
PB_ROUNDS
);
in
+=
RATE
;
out
+=
RATE
;
len
-=
RATE
;
}
tmp0
=
0
;
tmp1
=
0
;
for
(
i
=
0
;
i
<
len
;
++
i
,
++
in
)
if
(
i
<
8
)
tmp0
^=
INS_BYTE64
(
*
in
,
i
);
else
tmp1
^=
INS_BYTE64
(
*
in
,
i
%
8
);
in
-=
len
;
if
(
len
<
8
)
tmp0
^=
INS_BYTE64
(
0x80
,
len
);
else
tmp1
^=
INS_BYTE64
(
0x80
,
len
%
8
);
t0
=
to_bit_interleaving
(
tmp0
);
s
->
x0
.
e
^=
t0
.
e
;
s
->
x0
.
o
^=
t0
.
o
;
t1
=
to_bit_interleaving
(
tmp1
);
s
->
x1
.
e
^=
t1
.
e
;
s
->
x1
.
o
^=
t1
.
o
;
if
(
mode
!=
ASCON_AD
)
{
tmp0
=
from_bit_interleaving
(
s
->
x0
);
tmp1
=
from_bit_interleaving
(
s
->
x1
);
for
(
i
=
0
;
i
<
len
;
++
i
,
++
out
)
if
(
i
<
8
)
*
out
=
EXT_BYTE64
(
tmp0
,
i
);
else
*
out
=
EXT_BYTE64
(
tmp1
,
i
%
8
);
}
if
(
mode
==
ASCON_DEC
)
{
for
(
i
=
0
;
i
<
len
;
++
i
,
++
in
)
if
(
i
<
8
)
{
tmp0
&=
~
INS_BYTE64
(
0xff
,
i
);
tmp0
|=
INS_BYTE64
(
*
in
,
i
);
}
else
{
tmp1
&=
~
INS_BYTE64
(
0xff
,
i
%
8
);
tmp1
|=
INS_BYTE64
(
*
in
,
i
%
8
);
}
s
->
x0
=
to_bit_interleaving
(
tmp0
);
s
->
x1
=
to_bit_interleaving
(
tmp1
);
}
}
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
)
{
u32_2
K0
,
K1
,
N0
,
N1
;
// load key and nonce
K0
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)
k
));
K1
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
k
+
8
)));
N0
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)
npub
));
N1
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
npub
+
8
)));
// initialization
s
->
x0
=
to_bit_interleaving
(
IV
);
s
->
x1
.
o
=
K0
.
o
;
s
->
x1
.
e
=
K0
.
e
;
s
->
x2
.
e
=
K1
.
e
;
s
->
x2
.
o
=
K1
.
o
;
s
->
x3
.
e
=
N0
.
e
;
s
->
x3
.
o
=
N0
.
o
;
s
->
x4
.
e
=
N1
.
e
;
s
->
x4
.
o
=
N1
.
o
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
.
e
^=
K0
.
e
;
s
->
x3
.
o
^=
K0
.
o
;
s
->
x4
.
e
^=
K1
.
e
;
s
->
x4
.
o
^=
K1
.
o
;
// process associated data
if
(
adlen
)
{
process_data
(
s
,
(
void
*
)
0
,
ad
,
adlen
,
ASCON_AD
);
P
(
s
,
PB_ROUNDS
);
}
s
->
x4
.
e
^=
1
;
// process plaintext/ciphertext
process_data
(
s
,
out
,
in
,
tlen
,
mode
);
// finalization
s
->
x2
.
e
^=
K0
.
e
;
s
->
x2
.
o
^=
K0
.
o
;
s
->
x3
.
e
^=
K1
.
e
;
s
->
x3
.
o
^=
K1
.
o
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
.
e
^=
K0
.
e
;
s
->
x3
.
o
^=
K0
.
o
;
s
->
x4
.
e
^=
K1
.
e
;
s
->
x4
.
o
^=
K1
.
o
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/core.h
0 → 100644
View file @
32c03519
#ifndef CORE_H_
#define CORE_H_
#include "api.h"
#include "endian.h"
#include "permutations.h"
#define ASCON_AD 0
#define ASCON_ENC 1
#define ASCON_DEC 2
#define RATE (128 / 8)
#define PA_ROUNDS 12
#define PB_ROUNDS 8
#define IV \
((u64)(8 * (CRYPTO_KEYBYTES)) << 56 | (u64)(8 * (RATE)) << 48 | \
(u64)(PA_ROUNDS) << 40 | (u64)(PB_ROUNDS) << 32)
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
);
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
);
#endif // CORE_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/decrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_decrypt
(
unsigned
char
*
m
,
unsigned
long
long
*
mlen
,
unsigned
char
*
nsec
,
const
unsigned
char
*
c
,
unsigned
long
long
clen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
if
(
clen
<
CRYPTO_ABYTES
)
{
*
mlen
=
0
;
return
-
1
;
}
state
s
;
u32_2
t0
,
t1
;
(
void
)
nsec
;
// set plaintext size
*
mlen
=
clen
-
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
m
,
c
,
*
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_DEC
);
// verify tag (should be constant time, check compiler output)
t0
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
)));
t1
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
+
8
)));
if
(((
s
.
x3
.
e
^
t0
.
e
)
|
(
s
.
x3
.
o
^
t0
.
o
)
|
(
s
.
x4
.
e
^
t1
.
e
)
|
(
s
.
x4
.
o
^
t1
.
o
))
!=
0
)
{
*
mlen
=
0
;
return
-
1
;
}
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/encrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_encrypt
(
unsigned
char
*
c
,
unsigned
long
long
*
clen
,
const
unsigned
char
*
m
,
unsigned
long
long
mlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
nsec
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
state
s
;
u64
tmp0
,
tmp1
;
(
void
)
nsec
;
// set ciphertext size
*
clen
=
mlen
+
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
c
,
m
,
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_ENC
);
// set tag
tmp0
=
from_bit_interleaving
(
s
.
x3
);
*
(
u64
*
)(
c
+
mlen
)
=
U64BIG
(
tmp0
);
tmp1
=
from_bit_interleaving
(
s
.
x4
);
*
(
u64
*
)(
c
+
mlen
+
8
)
=
U64BIG
(
tmp1
);
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/endian.h
0 → 100644
View file @
32c03519
#ifndef ENDIAN_H_
#define ENDIAN_H_
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// macros for big endian machines
#define U64BIG(x) (x)
#define U32BIG(x) (x)
#define U16BIG(x) (x)
#elif defined(_MSC_VER) || \
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
// macros for little endian machines
#define U64BIG(x) \
((((x)&0x00000000000000FFULL) << 56) | (((x)&0x000000000000FF00ULL) << 40) | \
(((x)&0x0000000000FF0000ULL) << 24) | (((x)&0x00000000FF000000ULL) << 8) | \
(((x)&0x000000FF00000000ULL) >> 8) | (((x)&0x0000FF0000000000ULL) >> 24) | \
(((x)&0x00FF000000000000ULL) >> 40) | (((x)&0xFF00000000000000ULL) >> 56))
#define U32BIG(x) \
((((x)&0x000000FF) << 24) | (((x)&0x0000FF00) << 8) | \
(((x)&0x00FF0000) >> 8) | (((x)&0xFF000000) >> 24))
#define U16BIG(x) ((((x)&0x00FF) << 8) | (((x)&0xFF00) >> 8))
#else
#error "ascon byte order macros not defined in endian.h"
#endif
#endif // ENDIAN_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/implementors
0 → 100644
View file @
32c03519
Christoph Dobraunig
Martin Schläffer
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/permutations.c
0 → 100644
View file @
32c03519
#include "permutations.h"
static
const
u8
constants
[][
2
]
=
{
{
0xc
,
0xc
},
{
0x9
,
0xc
},
{
0xc
,
0x9
},
{
0x9
,
0x9
},
{
0x6
,
0xc
},
{
0x3
,
0xc
},
{
0x6
,
0x9
},
{
0x3
,
0x9
},
{
0xc
,
0x6
},
{
0x9
,
0x6
},
{
0xc
,
0x3
},
{
0x9
,
0x3
}};
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u32_2
to_bit_interleaving
(
u64
in
)
{
u32
hi
=
(
in
)
>>
32
;
u32
lo
=
(
u32
)(
in
);
u32
r0
,
r1
;
u32_2
out
;
r0
=
(
lo
^
(
lo
>>
1
))
&
0x22222222
,
lo
^=
r0
^
(
r0
<<
1
);
r0
=
(
lo
^
(
lo
>>
2
))
&
0x0C0C0C0C
,
lo
^=
r0
^
(
r0
<<
2
);
r0
=
(
lo
^
(
lo
>>
4
))
&
0x00F000F0
,
lo
^=
r0
^
(
r0
<<
4
);
r0
=
(
lo
^
(
lo
>>
8
))
&
0x0000FF00
,
lo
^=
r0
^
(
r0
<<
8
);
r1
=
(
hi
^
(
hi
>>
1
))
&
0x22222222
,
hi
^=
r1
^
(
r1
<<
1
);
r1
=
(
hi
^
(
hi
>>
2
))
&
0x0C0C0C0C
,
hi
^=
r1
^
(
r1
<<
2
);
r1
=
(
hi
^
(
hi
>>
4
))
&
0x00F000F0
,
hi
^=
r1
^
(
r1
<<
4
);
r1
=
(
hi
^
(
hi
>>
8
))
&
0x0000FF00
,
hi
^=
r1
^
(
r1
<<
8
);
out
.
e
=
(
lo
&
0x0000FFFF
)
|
(
hi
<<
16
);
out
.
o
=
(
lo
>>
16
)
|
(
hi
&
0xFFFF0000
);
return
out
;
}
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u64
from_bit_interleaving
(
u32_2
in
)
{
u32
lo
=
(
in
.
e
&
0x0000FFFF
)
|
(
in
.
o
<<
16
);
u32
hi
=
(
in
.
e
>>
16
)
|
(
in
.
o
&
0xFFFF0000
);
u32
r0
,
r1
;
u64
out
;
r0
=
(
lo
^
(
lo
>>
8
))
&
0x0000FF00
,
lo
^=
r0
^
(
r0
<<
8
);
r0
=
(
lo
^
(
lo
>>
4
))
&
0x00F000F0
,
lo
^=
r0
^
(
r0
<<
4
);
r0
=
(
lo
^
(
lo
>>
2
))
&
0x0C0C0C0C
,
lo
^=
r0
^
(
r0
<<
2
);
r0
=
(
lo
^
(
lo
>>
1
))
&
0x22222222
,
lo
^=
r0
^
(
r0
<<
1
);
r1
=
(
hi
^
(
hi
>>
8
))
&
0x0000FF00
,
hi
^=
r1
^
(
r1
<<
8
);
r1
=
(
hi
^
(
hi
>>
4
))
&
0x00F000F0
,
hi
^=
r1
^
(
r1
<<
4
);
r1
=
(
hi
^
(
hi
>>
2
))
&
0x0C0C0C0C
,
hi
^=
r1
^
(
r1
<<
2
);
r1
=
(
hi
^
(
hi
>>
1
))
&
0x22222222
,
hi
^=
r1
^
(
r1
<<
1
);
out
=
(
u64
)
hi
<<
32
|
lo
;
return
out
;
}
void
P
(
state
*
p
,
u8
rounds
)
{
state
s
=
*
p
;
u32_2
t0
,
t1
,
t2
,
t3
,
t4
;
u32
i
,
start
=
START_ROUND
(
rounds
);
for
(
i
=
start
;
i
<
12
;
i
++
)
ROUND
(
constants
[
i
][
0
],
constants
[
i
][
1
]);
*
p
=
s
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/bi32_lowsize/permutations.h
0 → 100644
View file @
32c03519
#ifndef PERMUTATIONS_H_
#define PERMUTATIONS_H_
typedef
unsigned
char
u8
;
typedef
unsigned
int
u32
;
typedef
unsigned
long
long
u64
;
typedef
struct
{
u32
e
;
u32
o
;
}
u32_2
;
typedef
struct
{
u32_2
x0
;
u32_2
x1
;
u32_2
x2
;
u32_2
x3
;
u32_2
x4
;
}
state
;
#define EXT_BYTE64(x, n) ((u8)((u64)(x) >> (8 * (7 - (n)))))
#define INS_BYTE64(x, n) ((u64)(x) << (8 * (7 - (n))))
#define ROTR32(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
#define START_ROUND(x) (12 - (x))
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u32_2
to_bit_interleaving
(
u64
in
);
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u64
from_bit_interleaving
(
u32_2
in
);
/* clang-format off */
#define ROUND(C_e, C_o) \
do { \
/* round constant */
\
s.x2.e ^= C_e; s.x2.o ^= C_o; \
/* s-box layer */
\
s.x0.e ^= s.x4.e; s.x0.o ^= s.x4.o; \
s.x4.e ^= s.x3.e; s.x4.o ^= s.x3.o; \
s.x2.e ^= s.x1.e; s.x2.o ^= s.x1.o; \
t0.e = s.x0.e; t0.o = s.x0.o; \
t4.e = s.x4.e; t4.o = s.x4.o; \
t3.e = s.x3.e; t3.o = s.x3.o; \
t1.e = s.x1.e; t1.o = s.x1.o; \
t2.e = s.x2.e; t2.o = s.x2.o; \
s.x0.e = t0.e ^ (~t1.e & t2.e); s.x0.o = t0.o ^ (~t1.o & t2.o); \
s.x2.e = t2.e ^ (~t3.e & t4.e); s.x2.o = t2.o ^ (~t3.o & t4.o); \
s.x4.e = t4.e ^ (~t0.e & t1.e); s.x4.o = t4.o ^ (~t0.o & t1.o); \
s.x1.e = t1.e ^ (~t2.e & t3.e); s.x1.o = t1.o ^ (~t2.o & t3.o); \
s.x3.e = t3.e ^ (~t4.e & t0.e); s.x3.o = t3.o ^ (~t4.o & t0.o); \
s.x1.e ^= s.x0.e; s.x1.o ^= s.x0.o; \
s.x3.e ^= s.x2.e; s.x3.o ^= s.x2.o; \
s.x0.e ^= s.x4.e; s.x0.o ^= s.x4.o; \
/* linear layer */
\
t0.e = s.x0.e ^ ROTR32(s.x0.o, 4); t0.o = s.x0.o ^ ROTR32(s.x0.e, 5); \
t1.e = s.x1.e ^ ROTR32(s.x1.e, 11); t1.o = s.x1.o ^ ROTR32(s.x1.o, 11); \
t2.e = s.x2.e ^ ROTR32(s.x2.o, 2); t2.o = s.x2.o ^ ROTR32(s.x2.e, 3); \
t3.e = s.x3.e ^ ROTR32(s.x3.o, 3); t3.o = s.x3.o ^ ROTR32(s.x3.e, 4); \
t4.e = s.x4.e ^ ROTR32(s.x4.e, 17); t4.o = s.x4.o ^ ROTR32(s.x4.o, 17); \
s.x0.e ^= ROTR32(t0.o, 9); s.x0.o ^= ROTR32(t0.e, 10); \
s.x1.e ^= ROTR32(t1.o, 19); s.x1.o ^= ROTR32(t1.e, 20); \
s.x2.e ^= t2.o; s.x2.o ^= ROTR32(t2.e, 1); \
s.x3.e ^= ROTR32(t3.e, 5); s.x3.o ^= ROTR32(t3.o, 5); \
s.x4.e ^= ROTR32(t4.o, 3); s.x4.o ^= ROTR32(t4.e, 4); \
s.x2.e = ~s.x2.e; s.x2.o = ~s.x2.o; \
} while(0)
/* clang-format on */
void
P
(
state
*
p
,
u8
rounds
);
#endif // PERMUTATIONS_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/api.h
0 → 100644
View file @
32c03519
#define CRYPTO_KEYBYTES 16
#define CRYPTO_NSECBYTES 0
#define CRYPTO_NPUBBYTES 16
#define CRYPTO_ABYTES 16
#define CRYPTO_NOOVERLAP 1
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/core.c
0 → 100644
View file @
32c03519
#include "core.h"
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
)
{
u64
*
x
;
u64
i
;
while
(
len
>=
RATE
)
{
s
->
x0
^=
U64BIG
(
*
(
u64
*
)
in
);
s
->
x1
^=
U64BIG
(
*
(
u64
*
)(
in
+
8
));
if
(
mode
!=
ASCON_AD
)
{
*
(
u64
*
)
out
=
U64BIG
(
s
->
x0
);
*
(
u64
*
)(
out
+
8
)
=
U64BIG
(
s
->
x1
);
}
if
(
mode
==
ASCON_DEC
)
{
s
->
x0
=
U64BIG
(
*
((
u64
*
)
in
));
s
->
x1
=
U64BIG
(
*
((
u64
*
)(
in
+
8
)));
}
P
(
s
,
PB_ROUNDS
);
in
+=
RATE
;
out
+=
RATE
;
len
-=
RATE
;
}
for
(
i
=
0
;
i
<
len
;
++
i
,
++
out
,
++
in
)
{
if
(
i
<
8
)
x
=
&
(
s
->
x0
);
else
x
=
&
(
s
->
x1
);
*
x
^=
INS_BYTE64
(
*
in
,
i
%
8
);
if
(
mode
!=
ASCON_AD
)
*
out
=
EXT_BYTE64
(
*
x
,
i
%
8
);
if
(
mode
==
ASCON_DEC
)
{
*
x
&=
~
INS_BYTE64
(
0xff
,
i
%
8
);
*
x
|=
INS_BYTE64
(
*
in
,
i
%
8
);
}
}
if
(
len
<
8
)
s
->
x0
^=
INS_BYTE64
(
0x80
,
len
);
else
s
->
x1
^=
INS_BYTE64
(
0x80
,
len
%
8
);
}
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
)
{
const
u64
K0
=
U64BIG
(
*
(
u64
*
)
k
);
const
u64
K1
=
U64BIG
(
*
(
u64
*
)(
k
+
8
));
const
u64
N0
=
U64BIG
(
*
(
u64
*
)
npub
);
const
u64
N1
=
U64BIG
(
*
(
u64
*
)(
npub
+
8
));
// initialization
s
->
x0
=
IV
;
s
->
x1
=
K0
;
s
->
x2
=
K1
;
s
->
x3
=
N0
;
s
->
x4
=
N1
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
^=
K0
;
s
->
x4
^=
K1
;
// process associated data
if
(
adlen
)
{
process_data
(
s
,
(
void
*
)
0
,
ad
,
adlen
,
ASCON_AD
);
P
(
s
,
PB_ROUNDS
);
}
s
->
x4
^=
1
;
// process plaintext/ciphertext
process_data
(
s
,
out
,
in
,
tlen
,
mode
);
// finalization
s
->
x2
^=
K0
;
s
->
x3
^=
K1
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
^=
K0
;
s
->
x4
^=
K1
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/core.h
0 → 100644
View file @
32c03519
#ifndef CORE_H_
#define CORE_H_
#include "api.h"
#include "endian.h"
#include "permutations.h"
#define ASCON_AD 0
#define ASCON_ENC 1
#define ASCON_DEC 2
#define RATE (128 / 8)
#define PA_ROUNDS 12
#define PB_ROUNDS 8
#define IV \
((u64)(8 * (CRYPTO_KEYBYTES)) << 56 | (u64)(8 * (RATE)) << 48 | \
(u64)(PA_ROUNDS) << 40 | (u64)(PB_ROUNDS) << 32)
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
);
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
);
#endif // CORE_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/decrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_decrypt
(
unsigned
char
*
m
,
unsigned
long
long
*
mlen
,
unsigned
char
*
nsec
,
const
unsigned
char
*
c
,
unsigned
long
long
clen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
if
(
clen
<
CRYPTO_ABYTES
)
{
*
mlen
=
0
;
return
-
1
;
}
state
s
;
(
void
)
nsec
;
// set plaintext size
*
mlen
=
clen
-
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
m
,
c
,
*
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_DEC
);
// verify tag (should be constant time, check compiler output)
if
(((
s
.
x3
^
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
)))
|
(
s
.
x4
^
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
+
8
))))
!=
0
)
{
*
mlen
=
0
;
return
-
1
;
}
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/encrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_encrypt
(
unsigned
char
*
c
,
unsigned
long
long
*
clen
,
const
unsigned
char
*
m
,
unsigned
long
long
mlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
nsec
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
state
s
;
(
void
)
nsec
;
// set ciphertext size
*
clen
=
mlen
+
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
c
,
m
,
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_ENC
);
// set tag
*
(
u64
*
)(
c
+
mlen
)
=
U64BIG
(
s
.
x3
);
*
(
u64
*
)(
c
+
mlen
+
8
)
=
U64BIG
(
s
.
x4
);
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/endian.h
0 → 100644
View file @
32c03519
#ifndef ENDIAN_H_
#define ENDIAN_H_
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// macros for big endian machines
#define U64BIG(x) (x)
#define U32BIG(x) (x)
#define U16BIG(x) (x)
#elif defined(_MSC_VER) || \
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
// macros for little endian machines
#define U64BIG(x) \
((((x)&0x00000000000000FFULL) << 56) | (((x)&0x000000000000FF00ULL) << 40) | \
(((x)&0x0000000000FF0000ULL) << 24) | (((x)&0x00000000FF000000ULL) << 8) | \
(((x)&0x000000FF00000000ULL) >> 8) | (((x)&0x0000FF0000000000ULL) >> 24) | \
(((x)&0x00FF000000000000ULL) >> 40) | (((x)&0xFF00000000000000ULL) >> 56))
#define U32BIG(x) \
((((x)&0x000000FF) << 24) | (((x)&0x0000FF00) << 8) | \
(((x)&0x00FF0000) >> 8) | (((x)&0xFF000000) >> 24))
#define U16BIG(x) ((((x)&0x00FF) << 8) | (((x)&0xFF00) >> 8))
#else
#error "ascon byte order macros not defined in endian.h"
#endif
#endif // ENDIAN_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/implementors
0 → 100644
View file @
32c03519
Christoph Dobraunig
Martin Schläffer
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/permutations.c
0 → 100644
View file @
32c03519
#include "permutations.h"
void
P
(
state
*
p
,
u8
rounds
)
{
state
s
=
*
p
;
u8
i
,
start
=
START_CONSTANT
(
rounds
);
for
(
i
=
start
;
i
>
0x4a
;
i
-=
0x0f
)
ROUND
(
i
);
*
p
=
s
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128av12/opt64_lowsize/permutations.h
0 → 100644
View file @
32c03519
#ifndef PERMUTATIONS_H_
#define PERMUTATIONS_H_
typedef
unsigned
char
u8
;
typedef
unsigned
long
long
u64
;
typedef
struct
{
u64
x0
,
x1
,
x2
,
x3
,
x4
;
}
state
;
#define EXT_BYTE64(x, n) ((u8)((u64)(x) >> (8 * (7 - (n)))))
#define INS_BYTE64(x, n) ((u64)(x) << (8 * (7 - (n))))
#define ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n))))
#define START_CONSTANT(x) (((0xf - (12 - (x))) << 4) | (12 - (x)))
#define ROUND(C) \
do { \
state t; \
s.x2 ^= C; \
s.x0 ^= s.x4; \
s.x4 ^= s.x3; \
s.x2 ^= s.x1; \
t.x0 = s.x0; \
t.x4 = s.x4; \
t.x3 = s.x3; \
t.x1 = s.x1; \
t.x2 = s.x2; \
s.x0 = t.x0 ^ ((~t.x1) & t.x2); \
s.x2 = t.x2 ^ ((~t.x3) & t.x4); \
s.x4 = t.x4 ^ ((~t.x0) & t.x1); \
s.x1 = t.x1 ^ ((~t.x2) & t.x3); \
s.x3 = t.x3 ^ ((~t.x4) & t.x0); \
s.x1 ^= s.x0; \
t.x1 = s.x1; \
s.x1 = ROTR64(s.x1, 39); \
s.x3 ^= s.x2; \
t.x2 = s.x2; \
s.x2 = ROTR64(s.x2, 1); \
t.x4 = s.x4; \
t.x2 ^= s.x2; \
s.x2 = ROTR64(s.x2, 6 - 1); \
t.x3 = s.x3; \
t.x1 ^= s.x1; \
s.x3 = ROTR64(s.x3, 10); \
s.x0 ^= s.x4; \
s.x4 = ROTR64(s.x4, 7); \
t.x3 ^= s.x3; \
s.x2 ^= t.x2; \
s.x1 = ROTR64(s.x1, 61 - 39); \
t.x0 = s.x0; \
s.x2 = ~s.x2; \
s.x3 = ROTR64(s.x3, 17 - 10); \
t.x4 ^= s.x4; \
s.x4 = ROTR64(s.x4, 41 - 7); \
s.x3 ^= t.x3; \
s.x1 ^= t.x1; \
s.x0 = ROTR64(s.x0, 19); \
s.x4 ^= t.x4; \
t.x0 ^= s.x0; \
s.x0 = ROTR64(s.x0, 28 - 19); \
s.x0 ^= t.x0; \
} while (0)
void
P
(
state
*
p
,
u8
rounds
);
#endif // PERMUTATIONS_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/api.h
0 → 100644
View file @
32c03519
#define CRYPTO_KEYBYTES 16
#define CRYPTO_NSECBYTES 0
#define CRYPTO_NPUBBYTES 16
#define CRYPTO_ABYTES 16
#define CRYPTO_NOOVERLAP 1
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/core.c
0 → 100644
View file @
32c03519
#include "core.h"
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
)
{
u32_2
t0
;
u64
tmp0
;
u64
i
;
while
(
len
>=
RATE
)
{
tmp0
=
U64BIG
(
*
(
u64
*
)
in
);
t0
=
to_bit_interleaving
(
tmp0
);
s
->
x0
.
e
^=
t0
.
e
;
s
->
x0
.
o
^=
t0
.
o
;
if
(
mode
!=
ASCON_AD
)
{
tmp0
=
from_bit_interleaving
(
s
->
x0
);
*
(
u64
*
)
out
=
U64BIG
(
tmp0
);
}
if
(
mode
==
ASCON_DEC
)
s
->
x0
=
t0
;
P
(
s
,
PB_ROUNDS
);
in
+=
RATE
;
out
+=
RATE
;
len
-=
RATE
;
}
tmp0
=
0
;
for
(
i
=
0
;
i
<
len
;
++
i
,
++
in
)
tmp0
|=
INS_BYTE64
(
*
in
,
i
);
in
-=
len
;
tmp0
|=
INS_BYTE64
(
0x80
,
len
);
t0
=
to_bit_interleaving
(
tmp0
);
s
->
x0
.
e
^=
t0
.
e
;
s
->
x0
.
o
^=
t0
.
o
;
if
(
mode
!=
ASCON_AD
)
{
tmp0
=
from_bit_interleaving
(
s
->
x0
);
for
(
i
=
0
;
i
<
len
;
++
i
,
++
out
)
*
out
=
EXT_BYTE64
(
tmp0
,
i
);
}
if
(
mode
==
ASCON_DEC
)
{
for
(
i
=
0
;
i
<
len
;
++
i
,
++
in
)
{
tmp0
&=
~
INS_BYTE64
(
0xff
,
i
);
tmp0
|=
INS_BYTE64
(
*
in
,
i
);
}
s
->
x0
=
to_bit_interleaving
(
tmp0
);
}
}
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
)
{
u32_2
K0
,
K1
,
N0
,
N1
;
// load key and nonce
K0
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)
k
));
K1
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
k
+
8
)));
N0
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)
npub
));
N1
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
npub
+
8
)));
// initialization
s
->
x0
=
to_bit_interleaving
(
IV
);
s
->
x1
.
o
=
K0
.
o
;
s
->
x1
.
e
=
K0
.
e
;
s
->
x2
.
e
=
K1
.
e
;
s
->
x2
.
o
=
K1
.
o
;
s
->
x3
.
e
=
N0
.
e
;
s
->
x3
.
o
=
N0
.
o
;
s
->
x4
.
e
=
N1
.
e
;
s
->
x4
.
o
=
N1
.
o
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
.
e
^=
K0
.
e
;
s
->
x3
.
o
^=
K0
.
o
;
s
->
x4
.
e
^=
K1
.
e
;
s
->
x4
.
o
^=
K1
.
o
;
// process associated data
if
(
adlen
)
{
process_data
(
s
,
(
void
*
)
0
,
ad
,
adlen
,
ASCON_AD
);
P
(
s
,
PB_ROUNDS
);
}
s
->
x4
.
e
^=
1
;
// process plaintext/ciphertext
process_data
(
s
,
out
,
in
,
tlen
,
mode
);
// finalization
s
->
x1
.
e
^=
K0
.
e
;
s
->
x1
.
o
^=
K0
.
o
;
s
->
x2
.
e
^=
K1
.
e
;
s
->
x2
.
o
^=
K1
.
o
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
.
e
^=
K0
.
e
;
s
->
x3
.
o
^=
K0
.
o
;
s
->
x4
.
e
^=
K1
.
e
;
s
->
x4
.
o
^=
K1
.
o
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/core.h
0 → 100644
View file @
32c03519
#ifndef CORE_H_
#define CORE_H_
#include "api.h"
#include "endian.h"
#include "permutations.h"
#define ASCON_AD 0
#define ASCON_ENC 1
#define ASCON_DEC 2
#define RATE (64 / 8)
#define PA_ROUNDS 12
#define PB_ROUNDS 6
#define IV \
((u64)(8 * (CRYPTO_KEYBYTES)) << 56 | (u64)(8 * (RATE)) << 48 | \
(u64)(PA_ROUNDS) << 40 | (u64)(PB_ROUNDS) << 32)
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
);
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
);
#endif // CORE_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/decrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_decrypt
(
unsigned
char
*
m
,
unsigned
long
long
*
mlen
,
unsigned
char
*
nsec
,
const
unsigned
char
*
c
,
unsigned
long
long
clen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
if
(
clen
<
CRYPTO_ABYTES
)
{
*
mlen
=
0
;
return
-
1
;
}
state
s
;
u32_2
t0
,
t1
;
(
void
)
nsec
;
// set plaintext size
*
mlen
=
clen
-
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
m
,
c
,
*
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_DEC
);
// verify tag (should be constant time, check compiler output)
t0
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
)));
t1
=
to_bit_interleaving
(
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
+
8
)));
if
(((
s
.
x3
.
e
^
t0
.
e
)
|
(
s
.
x3
.
o
^
t0
.
o
)
|
(
s
.
x4
.
e
^
t1
.
e
)
|
(
s
.
x4
.
o
^
t1
.
o
))
!=
0
)
{
*
mlen
=
0
;
return
-
1
;
}
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/encrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_encrypt
(
unsigned
char
*
c
,
unsigned
long
long
*
clen
,
const
unsigned
char
*
m
,
unsigned
long
long
mlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
nsec
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
state
s
;
u64
tmp0
,
tmp1
;
(
void
)
nsec
;
// set ciphertext size
*
clen
=
mlen
+
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
c
,
m
,
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_ENC
);
// set tag
tmp0
=
from_bit_interleaving
(
s
.
x3
);
*
(
u64
*
)(
c
+
mlen
)
=
U64BIG
(
tmp0
);
tmp1
=
from_bit_interleaving
(
s
.
x4
);
*
(
u64
*
)(
c
+
mlen
+
8
)
=
U64BIG
(
tmp1
);
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/endian.h
0 → 100644
View file @
32c03519
#ifndef ENDIAN_H_
#define ENDIAN_H_
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// macros for big endian machines
#define U64BIG(x) (x)
#define U32BIG(x) (x)
#define U16BIG(x) (x)
#elif defined(_MSC_VER) || \
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
// macros for little endian machines
#define U64BIG(x) \
((((x)&0x00000000000000FFULL) << 56) | (((x)&0x000000000000FF00ULL) << 40) | \
(((x)&0x0000000000FF0000ULL) << 24) | (((x)&0x00000000FF000000ULL) << 8) | \
(((x)&0x000000FF00000000ULL) >> 8) | (((x)&0x0000FF0000000000ULL) >> 24) | \
(((x)&0x00FF000000000000ULL) >> 40) | (((x)&0xFF00000000000000ULL) >> 56))
#define U32BIG(x) \
((((x)&0x000000FF) << 24) | (((x)&0x0000FF00) << 8) | \
(((x)&0x00FF0000) >> 8) | (((x)&0xFF000000) >> 24))
#define U16BIG(x) ((((x)&0x00FF) << 8) | (((x)&0xFF00) >> 8))
#else
#error "ascon byte order macros not defined in endian.h"
#endif
#endif // ENDIAN_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/implementors
0 → 100644
View file @
32c03519
Christoph Dobraunig
Martin Schläffer
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/permutations.c
0 → 100644
View file @
32c03519
#include "permutations.h"
static
const
u8
constants
[][
2
]
=
{
{
0xc
,
0xc
},
{
0x9
,
0xc
},
{
0xc
,
0x9
},
{
0x9
,
0x9
},
{
0x6
,
0xc
},
{
0x3
,
0xc
},
{
0x6
,
0x9
},
{
0x3
,
0x9
},
{
0xc
,
0x6
},
{
0x9
,
0x6
},
{
0xc
,
0x3
},
{
0x9
,
0x3
}};
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u32_2
to_bit_interleaving
(
u64
in
)
{
u32
hi
=
(
in
)
>>
32
;
u32
lo
=
(
u32
)(
in
);
u32
r0
,
r1
;
u32_2
out
;
r0
=
(
lo
^
(
lo
>>
1
))
&
0x22222222
,
lo
^=
r0
^
(
r0
<<
1
);
r0
=
(
lo
^
(
lo
>>
2
))
&
0x0C0C0C0C
,
lo
^=
r0
^
(
r0
<<
2
);
r0
=
(
lo
^
(
lo
>>
4
))
&
0x00F000F0
,
lo
^=
r0
^
(
r0
<<
4
);
r0
=
(
lo
^
(
lo
>>
8
))
&
0x0000FF00
,
lo
^=
r0
^
(
r0
<<
8
);
r1
=
(
hi
^
(
hi
>>
1
))
&
0x22222222
,
hi
^=
r1
^
(
r1
<<
1
);
r1
=
(
hi
^
(
hi
>>
2
))
&
0x0C0C0C0C
,
hi
^=
r1
^
(
r1
<<
2
);
r1
=
(
hi
^
(
hi
>>
4
))
&
0x00F000F0
,
hi
^=
r1
^
(
r1
<<
4
);
r1
=
(
hi
^
(
hi
>>
8
))
&
0x0000FF00
,
hi
^=
r1
^
(
r1
<<
8
);
out
.
e
=
(
lo
&
0x0000FFFF
)
|
(
hi
<<
16
);
out
.
o
=
(
lo
>>
16
)
|
(
hi
&
0xFFFF0000
);
return
out
;
}
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u64
from_bit_interleaving
(
u32_2
in
)
{
u32
lo
=
(
in
.
e
&
0x0000FFFF
)
|
(
in
.
o
<<
16
);
u32
hi
=
(
in
.
e
>>
16
)
|
(
in
.
o
&
0xFFFF0000
);
u32
r0
,
r1
;
u64
out
;
r0
=
(
lo
^
(
lo
>>
8
))
&
0x0000FF00
,
lo
^=
r0
^
(
r0
<<
8
);
r0
=
(
lo
^
(
lo
>>
4
))
&
0x00F000F0
,
lo
^=
r0
^
(
r0
<<
4
);
r0
=
(
lo
^
(
lo
>>
2
))
&
0x0C0C0C0C
,
lo
^=
r0
^
(
r0
<<
2
);
r0
=
(
lo
^
(
lo
>>
1
))
&
0x22222222
,
lo
^=
r0
^
(
r0
<<
1
);
r1
=
(
hi
^
(
hi
>>
8
))
&
0x0000FF00
,
hi
^=
r1
^
(
r1
<<
8
);
r1
=
(
hi
^
(
hi
>>
4
))
&
0x00F000F0
,
hi
^=
r1
^
(
r1
<<
4
);
r1
=
(
hi
^
(
hi
>>
2
))
&
0x0C0C0C0C
,
hi
^=
r1
^
(
r1
<<
2
);
r1
=
(
hi
^
(
hi
>>
1
))
&
0x22222222
,
hi
^=
r1
^
(
r1
<<
1
);
out
=
(
u64
)
hi
<<
32
|
lo
;
return
out
;
}
void
P
(
state
*
p
,
u8
rounds
)
{
state
s
=
*
p
;
u32_2
t0
,
t1
,
t2
,
t3
,
t4
;
u32
i
,
start
=
START_ROUND
(
rounds
);
for
(
i
=
start
;
i
<
12
;
i
++
)
ROUND
(
constants
[
i
][
0
],
constants
[
i
][
1
]);
*
p
=
s
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/bi32_lowsize/permutations.h
0 → 100644
View file @
32c03519
#ifndef PERMUTATIONS_H_
#define PERMUTATIONS_H_
typedef
unsigned
char
u8
;
typedef
unsigned
int
u32
;
typedef
unsigned
long
long
u64
;
typedef
struct
{
u32
e
;
u32
o
;
}
u32_2
;
typedef
struct
{
u32_2
x0
;
u32_2
x1
;
u32_2
x2
;
u32_2
x3
;
u32_2
x4
;
}
state
;
#define EXT_BYTE64(x, n) ((u8)((u64)(x) >> (8 * (7 - (n)))))
#define INS_BYTE64(x, n) ((u64)(x) << (8 * (7 - (n))))
#define ROTR32(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
#define START_ROUND(x) (12 - (x))
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u32_2
to_bit_interleaving
(
u64
in
);
// Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
u64
from_bit_interleaving
(
u32_2
in
);
/* clang-format off */
#define ROUND(C_e, C_o) \
do { \
/* round constant */
\
s.x2.e ^= C_e; s.x2.o ^= C_o; \
/* s-box layer */
\
s.x0.e ^= s.x4.e; s.x0.o ^= s.x4.o; \
s.x4.e ^= s.x3.e; s.x4.o ^= s.x3.o; \
s.x2.e ^= s.x1.e; s.x2.o ^= s.x1.o; \
t0.e = s.x0.e; t0.o = s.x0.o; \
t4.e = s.x4.e; t4.o = s.x4.o; \
t3.e = s.x3.e; t3.o = s.x3.o; \
t1.e = s.x1.e; t1.o = s.x1.o; \
t2.e = s.x2.e; t2.o = s.x2.o; \
s.x0.e = t0.e ^ (~t1.e & t2.e); s.x0.o = t0.o ^ (~t1.o & t2.o); \
s.x2.e = t2.e ^ (~t3.e & t4.e); s.x2.o = t2.o ^ (~t3.o & t4.o); \
s.x4.e = t4.e ^ (~t0.e & t1.e); s.x4.o = t4.o ^ (~t0.o & t1.o); \
s.x1.e = t1.e ^ (~t2.e & t3.e); s.x1.o = t1.o ^ (~t2.o & t3.o); \
s.x3.e = t3.e ^ (~t4.e & t0.e); s.x3.o = t3.o ^ (~t4.o & t0.o); \
s.x1.e ^= s.x0.e; s.x1.o ^= s.x0.o; \
s.x3.e ^= s.x2.e; s.x3.o ^= s.x2.o; \
s.x0.e ^= s.x4.e; s.x0.o ^= s.x4.o; \
/* linear layer */
\
t0.e = s.x0.e ^ ROTR32(s.x0.o, 4); t0.o = s.x0.o ^ ROTR32(s.x0.e, 5); \
t1.e = s.x1.e ^ ROTR32(s.x1.e, 11); t1.o = s.x1.o ^ ROTR32(s.x1.o, 11); \
t2.e = s.x2.e ^ ROTR32(s.x2.o, 2); t2.o = s.x2.o ^ ROTR32(s.x2.e, 3); \
t3.e = s.x3.e ^ ROTR32(s.x3.o, 3); t3.o = s.x3.o ^ ROTR32(s.x3.e, 4); \
t4.e = s.x4.e ^ ROTR32(s.x4.e, 17); t4.o = s.x4.o ^ ROTR32(s.x4.o, 17); \
s.x0.e ^= ROTR32(t0.o, 9); s.x0.o ^= ROTR32(t0.e, 10); \
s.x1.e ^= ROTR32(t1.o, 19); s.x1.o ^= ROTR32(t1.e, 20); \
s.x2.e ^= t2.o; s.x2.o ^= ROTR32(t2.e, 1); \
s.x3.e ^= ROTR32(t3.e, 5); s.x3.o ^= ROTR32(t3.o, 5); \
s.x4.e ^= ROTR32(t4.o, 3); s.x4.o ^= ROTR32(t4.e, 4); \
s.x2.e = ~s.x2.e; s.x2.o = ~s.x2.o; \
} while(0)
/* clang-format on */
void
P
(
state
*
p
,
u8
rounds
);
#endif // PERMUTATIONS_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/api.h
0 → 100644
View file @
32c03519
#define CRYPTO_KEYBYTES 16
#define CRYPTO_NSECBYTES 0
#define CRYPTO_NPUBBYTES 16
#define CRYPTO_ABYTES 16
#define CRYPTO_NOOVERLAP 1
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/core.c
0 → 100644
View file @
32c03519
#include "core.h"
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
)
{
u64
i
;
while
(
len
>=
RATE
)
{
s
->
x0
^=
U64BIG
(
*
(
u64
*
)
in
);
if
(
mode
!=
ASCON_AD
)
*
(
u64
*
)
out
=
U64BIG
(
s
->
x0
);
if
(
mode
==
ASCON_DEC
)
s
->
x0
=
U64BIG
(
*
((
u64
*
)
in
));
P
(
s
,
PB_ROUNDS
);
in
+=
RATE
;
out
+=
RATE
;
len
-=
RATE
;
}
for
(
i
=
0
;
i
<
len
;
++
i
,
++
out
,
++
in
)
{
s
->
x0
^=
INS_BYTE64
(
*
in
,
i
);
if
(
mode
!=
ASCON_AD
)
*
out
=
EXT_BYTE64
(
s
->
x0
,
i
);
if
(
mode
==
ASCON_DEC
)
{
s
->
x0
&=
~
INS_BYTE64
(
0xff
,
i
);
s
->
x0
|=
INS_BYTE64
(
*
in
,
i
);
}
}
s
->
x0
^=
INS_BYTE64
(
0x80
,
len
);
}
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
)
{
const
u64
K0
=
U64BIG
(
*
(
u64
*
)
k
);
const
u64
K1
=
U64BIG
(
*
(
u64
*
)(
k
+
8
));
const
u64
N0
=
U64BIG
(
*
(
u64
*
)
npub
);
const
u64
N1
=
U64BIG
(
*
(
u64
*
)(
npub
+
8
));
// initialization
s
->
x0
=
IV
;
s
->
x1
=
K0
;
s
->
x2
=
K1
;
s
->
x3
=
N0
;
s
->
x4
=
N1
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
^=
K0
;
s
->
x4
^=
K1
;
// process associated data
if
(
adlen
)
{
process_data
(
s
,
(
void
*
)
0
,
ad
,
adlen
,
ASCON_AD
);
P
(
s
,
PB_ROUNDS
);
}
s
->
x4
^=
1
;
// process plaintext/ciphertext
process_data
(
s
,
out
,
in
,
tlen
,
mode
);
// finalization
s
->
x1
^=
K0
;
s
->
x2
^=
K1
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
^=
K0
;
s
->
x4
^=
K1
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/core.h
0 → 100644
View file @
32c03519
#ifndef CORE_H_
#define CORE_H_
#include "api.h"
#include "endian.h"
#include "permutations.h"
#define ASCON_AD 0
#define ASCON_ENC 1
#define ASCON_DEC 2
#define RATE (64 / 8)
#define PA_ROUNDS 12
#define PB_ROUNDS 6
#define IV \
((u64)(8 * (CRYPTO_KEYBYTES)) << 56 | (u64)(8 * (RATE)) << 48 | \
(u64)(PA_ROUNDS) << 40 | (u64)(PB_ROUNDS) << 32)
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
);
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
);
#endif // CORE_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/decrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_decrypt
(
unsigned
char
*
m
,
unsigned
long
long
*
mlen
,
unsigned
char
*
nsec
,
const
unsigned
char
*
c
,
unsigned
long
long
clen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
if
(
clen
<
CRYPTO_ABYTES
)
{
*
mlen
=
0
;
return
-
1
;
}
state
s
;
(
void
)
nsec
;
// set plaintext size
*
mlen
=
clen
-
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
m
,
c
,
*
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_DEC
);
// verify tag (should be constant time, check compiler output)
if
(((
s
.
x3
^
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
)))
|
(
s
.
x4
^
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
+
8
))))
!=
0
)
{
*
mlen
=
0
;
return
-
1
;
}
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/encrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_encrypt
(
unsigned
char
*
c
,
unsigned
long
long
*
clen
,
const
unsigned
char
*
m
,
unsigned
long
long
mlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
nsec
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
state
s
;
(
void
)
nsec
;
// set ciphertext size
*
clen
=
mlen
+
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
c
,
m
,
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_ENC
);
// set tag
*
(
u64
*
)(
c
+
mlen
)
=
U64BIG
(
s
.
x3
);
*
(
u64
*
)(
c
+
mlen
+
8
)
=
U64BIG
(
s
.
x4
);
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/endian.h
0 → 100644
View file @
32c03519
#ifndef ENDIAN_H_
#define ENDIAN_H_
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// macros for big endian machines
#define U64BIG(x) (x)
#define U32BIG(x) (x)
#define U16BIG(x) (x)
#elif defined(_MSC_VER) || \
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
// macros for little endian machines
#define U64BIG(x) \
((((x)&0x00000000000000FFULL) << 56) | (((x)&0x000000000000FF00ULL) << 40) | \
(((x)&0x0000000000FF0000ULL) << 24) | (((x)&0x00000000FF000000ULL) << 8) | \
(((x)&0x000000FF00000000ULL) >> 8) | (((x)&0x0000FF0000000000ULL) >> 24) | \
(((x)&0x00FF000000000000ULL) >> 40) | (((x)&0xFF00000000000000ULL) >> 56))
#define U32BIG(x) \
((((x)&0x000000FF) << 24) | (((x)&0x0000FF00) << 8) | \
(((x)&0x00FF0000) >> 8) | (((x)&0xFF000000) >> 24))
#define U16BIG(x) ((((x)&0x00FF) << 8) | (((x)&0xFF00) >> 8))
#else
#error "ascon byte order macros not defined in endian.h"
#endif
#endif // ENDIAN_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/implementors
0 → 100644
View file @
32c03519
Christoph Dobraunig
Martin Schläffer
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/permutations.c
0 → 100644
View file @
32c03519
#include "permutations.h"
void
P
(
state
*
p
,
u8
rounds
)
{
state
s
=
*
p
;
u8
i
,
start
=
START_CONSTANT
(
rounds
);
for
(
i
=
start
;
i
>
0x4a
;
i
-=
0x0f
)
ROUND
(
i
);
*
p
=
s
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon128v12/opt64_lowsize/permutations.h
0 → 100644
View file @
32c03519
#ifndef PERMUTATIONS_H_
#define PERMUTATIONS_H_
typedef
unsigned
char
u8
;
typedef
unsigned
long
long
u64
;
typedef
struct
{
u64
x0
,
x1
,
x2
,
x3
,
x4
;
}
state
;
#define EXT_BYTE64(x, n) ((u8)((u64)(x) >> (8 * (7 - (n)))))
#define INS_BYTE64(x, n) ((u64)(x) << (8 * (7 - (n))))
#define ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n))))
#define START_CONSTANT(x) (((0xf - (12 - (x))) << 4) | (12 - (x)))
#define ROUND(C) \
do { \
state t; \
s.x2 ^= C; \
s.x0 ^= s.x4; \
s.x4 ^= s.x3; \
s.x2 ^= s.x1; \
t.x0 = s.x0; \
t.x4 = s.x4; \
t.x3 = s.x3; \
t.x1 = s.x1; \
t.x2 = s.x2; \
s.x0 = t.x0 ^ ((~t.x1) & t.x2); \
s.x2 = t.x2 ^ ((~t.x3) & t.x4); \
s.x4 = t.x4 ^ ((~t.x0) & t.x1); \
s.x1 = t.x1 ^ ((~t.x2) & t.x3); \
s.x3 = t.x3 ^ ((~t.x4) & t.x0); \
s.x1 ^= s.x0; \
t.x1 = s.x1; \
s.x1 = ROTR64(s.x1, 39); \
s.x3 ^= s.x2; \
t.x2 = s.x2; \
s.x2 = ROTR64(s.x2, 1); \
t.x4 = s.x4; \
t.x2 ^= s.x2; \
s.x2 = ROTR64(s.x2, 6 - 1); \
t.x3 = s.x3; \
t.x1 ^= s.x1; \
s.x3 = ROTR64(s.x3, 10); \
s.x0 ^= s.x4; \
s.x4 = ROTR64(s.x4, 7); \
t.x3 ^= s.x3; \
s.x2 ^= t.x2; \
s.x1 = ROTR64(s.x1, 61 - 39); \
t.x0 = s.x0; \
s.x2 = ~s.x2; \
s.x3 = ROTR64(s.x3, 17 - 10); \
t.x4 ^= s.x4; \
s.x4 = ROTR64(s.x4, 41 - 7); \
s.x3 ^= t.x3; \
s.x1 ^= t.x1; \
s.x0 = ROTR64(s.x0, 19); \
s.x4 ^= t.x4; \
t.x0 ^= s.x0; \
s.x0 = ROTR64(s.x0, 28 - 19); \
s.x0 ^= t.x0; \
} while (0)
void
P
(
state
*
p
,
u8
rounds
);
#endif // PERMUTATIONS_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/api.h
0 → 100644
View file @
32c03519
#define CRYPTO_KEYBYTES 20
#define CRYPTO_NSECBYTES 0
#define CRYPTO_NPUBBYTES 16
#define CRYPTO_ABYTES 16
#define CRYPTO_NOOVERLAP 1
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/core.c
0 → 100644
View file @
32c03519
#include "core.h"
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
)
{
u64
i
;
while
(
len
>=
RATE
)
{
s
->
x0
^=
U64BIG
(
*
(
u64
*
)
in
);
if
(
mode
!=
ASCON_AD
)
*
(
u64
*
)
out
=
U64BIG
(
s
->
x0
);
if
(
mode
==
ASCON_DEC
)
s
->
x0
=
U64BIG
(
*
((
u64
*
)
in
));
P
(
s
,
PB_ROUNDS
);
in
+=
RATE
;
out
+=
RATE
;
len
-=
RATE
;
}
for
(
i
=
0
;
i
<
len
;
++
i
,
++
out
,
++
in
)
{
s
->
x0
^=
INS_BYTE64
(
*
in
,
i
);
if
(
mode
!=
ASCON_AD
)
*
out
=
EXT_BYTE64
(
s
->
x0
,
i
);
if
(
mode
==
ASCON_DEC
)
{
s
->
x0
&=
~
INS_BYTE64
(
0xff
,
i
);
s
->
x0
|=
INS_BYTE64
(
*
in
,
i
);
}
}
s
->
x0
^=
INS_BYTE64
(
0x80
,
len
);
}
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
)
{
const
u64
K0
=
U64BIG
(
*
(
u64
*
)(
k
+
0
))
>>
32
;
const
u64
K1
=
U64BIG
(
*
(
u64
*
)(
k
+
4
));
const
u64
K2
=
U64BIG
(
*
(
u64
*
)(
k
+
12
));
const
u64
N0
=
U64BIG
(
*
(
u64
*
)
npub
);
const
u64
N1
=
U64BIG
(
*
(
u64
*
)(
npub
+
8
));
// initialization
s
->
x0
=
IV
|
K0
;
s
->
x1
=
K1
;
s
->
x2
=
K2
;
s
->
x3
=
N0
;
s
->
x4
=
N1
;
P
(
s
,
PA_ROUNDS
);
s
->
x2
^=
K0
;
s
->
x3
^=
K1
;
s
->
x4
^=
K2
;
// process associated data
if
(
adlen
)
{
process_data
(
s
,
(
void
*
)
0
,
ad
,
adlen
,
ASCON_AD
);
P
(
s
,
PB_ROUNDS
);
}
s
->
x4
^=
1
;
// process plaintext/ciphertext
process_data
(
s
,
out
,
in
,
tlen
,
mode
);
// finalization
s
->
x1
^=
K0
<<
32
|
K1
>>
32
;
s
->
x2
^=
K1
<<
32
|
K2
>>
32
;
s
->
x3
^=
K2
<<
32
;
P
(
s
,
PA_ROUNDS
);
s
->
x3
^=
K1
;
s
->
x4
^=
K2
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/core.h
0 → 100644
View file @
32c03519
#ifndef CORE_H_
#define CORE_H_
#include "api.h"
#include "endian.h"
#include "permutations.h"
#define ASCON_AD 0
#define ASCON_ENC 1
#define ASCON_DEC 2
#define RATE (64 / 8)
#define PA_ROUNDS 12
#define PB_ROUNDS 6
#define IV \
((u64)(8 * (CRYPTO_KEYBYTES)) << 56 | (u64)(8 * (RATE)) << 48 | \
(u64)(PA_ROUNDS) << 40 | (u64)(PB_ROUNDS) << 32)
void
process_data
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
len
,
u8
mode
);
void
ascon_core
(
state
*
s
,
unsigned
char
*
out
,
const
unsigned
char
*
in
,
unsigned
long
long
tlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
,
u8
mode
);
#endif // CORE_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/decrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_decrypt
(
unsigned
char
*
m
,
unsigned
long
long
*
mlen
,
unsigned
char
*
nsec
,
const
unsigned
char
*
c
,
unsigned
long
long
clen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
if
(
clen
<
CRYPTO_ABYTES
)
{
*
mlen
=
0
;
return
-
1
;
}
state
s
;
(
void
)
nsec
;
// set plaintext size
*
mlen
=
clen
-
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
m
,
c
,
*
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_DEC
);
// verify tag (should be constant time, check compiler output)
if
(((
s
.
x3
^
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
)))
|
(
s
.
x4
^
U64BIG
(
*
(
u64
*
)(
c
+
*
mlen
+
8
))))
!=
0
)
{
*
mlen
=
0
;
return
-
1
;
}
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/encrypt.c
0 → 100644
View file @
32c03519
#include "core.h"
int
crypto_aead_encrypt
(
unsigned
char
*
c
,
unsigned
long
long
*
clen
,
const
unsigned
char
*
m
,
unsigned
long
long
mlen
,
const
unsigned
char
*
ad
,
unsigned
long
long
adlen
,
const
unsigned
char
*
nsec
,
const
unsigned
char
*
npub
,
const
unsigned
char
*
k
)
{
state
s
;
(
void
)
nsec
;
// set ciphertext size
*
clen
=
mlen
+
CRYPTO_ABYTES
;
ascon_core
(
&
s
,
c
,
m
,
mlen
,
ad
,
adlen
,
npub
,
k
,
ASCON_ENC
);
// set tag
*
(
u64
*
)(
c
+
mlen
)
=
U64BIG
(
s
.
x3
);
*
(
u64
*
)(
c
+
mlen
+
8
)
=
U64BIG
(
s
.
x4
);
return
0
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/endian.h
0 → 100644
View file @
32c03519
#ifndef ENDIAN_H_
#define ENDIAN_H_
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
// macros for big endian machines
#define U64BIG(x) (x)
#define U32BIG(x) (x)
#define U16BIG(x) (x)
#elif defined(_MSC_VER) || \
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
// macros for little endian machines
#define U64BIG(x) \
((((x)&0x00000000000000FFULL) << 56) | (((x)&0x000000000000FF00ULL) << 40) | \
(((x)&0x0000000000FF0000ULL) << 24) | (((x)&0x00000000FF000000ULL) << 8) | \
(((x)&0x000000FF00000000ULL) >> 8) | (((x)&0x0000FF0000000000ULL) >> 24) | \
(((x)&0x00FF000000000000ULL) >> 40) | (((x)&0xFF00000000000000ULL) >> 56))
#define U32BIG(x) \
((((x)&0x000000FF) << 24) | (((x)&0x0000FF00) << 8) | \
(((x)&0x00FF0000) >> 8) | (((x)&0xFF000000) >> 24))
#define U16BIG(x) ((((x)&0x00FF) << 8) | (((x)&0xFF00) >> 8))
#else
#error "ascon byte order macros not defined in endian.h"
#endif
#endif // ENDIAN_H_
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/implementors
0 → 100644
View file @
32c03519
Christoph Dobraunig
Martin Schläffer
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/permutations.c
0 → 100644
View file @
32c03519
#include "permutations.h"
void
P
(
state
*
p
,
u8
rounds
)
{
state
s
=
*
p
;
u8
i
,
start
=
START_CONSTANT
(
rounds
);
for
(
i
=
start
;
i
>
0x4a
;
i
-=
0x0f
)
ROUND
(
i
);
*
p
=
s
;
}
This diff is collapsed.
Click to expand it.
ascon/Implementations/crypto_aead/ascon80pqv12/opt64_lowsize/permutations.h
0 → 100644
View file @
32c03519
#ifndef PERMUTATIONS_H_
#define PERMUTATIONS_H_
typedef
unsigned
char
u8
;
typedef
unsigned
long
long
u64
;
typedef
struct
{
u64
x0
,
x1
,
x2
,
x3
,
x4
;
}
state
;
#define EXT_BYTE64(x, n) ((u8)((u64)(x) >> (8 * (7 - (n)))))
#define INS_BYTE64(x, n) ((u64)(x) << (8 * (7 - (n))))
#define ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n))))
#define START_CONSTANT(x) (((0xf - (12 - (x))) << 4) | (12 - (x)))
#define ROUND(C) \
do { \
state t; \
s.x2 ^= C; \
s.x0 ^= s.x4; \
s.x4 ^= s.x3; \
s.x2 ^= s.x1; \
t.x0 = s.x0; \
t.x4 = s.x4; \
t.x3 = s.x3; \
t.x1 = s.x1; \
t.x2 = s.x2; \
s.x0 = t.x0 ^ ((~t.x1) & t.x2); \
s.x2 = t.x2 ^ ((~t.x3) & t.x4); \
s.x4 = t.x4 ^ ((~t.x0) & t.x1); \
s.x1 = t.x1 ^ ((~t.x2) & t.x3); \
s.x3 = t.x3 ^ ((~t.x4) & t.x0); \
s.x1 ^= s.x0; \
t.x1 = s.x1; \
s.x1 = ROTR64(s.x1, 39); \
s.x3 ^= s.x2; \
t.x2 = s.x2; \
s.x2 = ROTR64(s.x2, 1); \
t.x4 = s.x4; \
t.x2 ^= s.x2; \
s.x2 = ROTR64(s.x2, 6 - 1); \
t.x3 = s.x3; \
t.x1 ^= s.x1; \
s.x3 = ROTR64(s.x3, 10); \
s.x0 ^= s.x4; \
s.x4 = ROTR64(s.x4, 7); \
t.x3 ^= s.x3; \
s.x2 ^= t.x2; \
s.x1 = ROTR64(s.x1, 61 - 39); \
t.x0 = s.x0; \
s.x2 = ~s.x2; \
s.x3 = ROTR64(s.x3, 17 - 10); \
t.x4 ^= s.x4; \
s.x4 = ROTR64(s.x4, 41 - 7); \
s.x3 ^= t.x3; \
s.x1 ^= t.x1; \
s.x0 = ROTR64(s.x0, 19); \
s.x4 ^= t.x4; \
t.x0 ^= s.x0; \
s.x0 = ROTR64(s.x0, 28 - 19); \
s.x0 ^= t.x0; \
} while (0)
void
P
(
state
*
p
,
u8
rounds
);
#endif // PERMUTATIONS_H_
This diff is collapsed.
Click to expand it.
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