File: speck.h

package info (click to toggle)
n2n 3.1.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,776 kB
  • sloc: ansic: 29,672; sh: 1,502; python: 621; makefile: 442; perl: 270; exp: 4
file content (142 lines) | stat: -rw-r--r-- 3,720 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
 * (C) 2007-22 - ntop.org and contributors
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not see see <http://www.gnu.org/licenses/>
 *
 */


// cipher SPECK -- 128 bit block size -- 128 and 256 bit key size -- CTR mode
// taken from (and modified: removed pure crypto-stream generation and seperated key expansion)
// https://github.com/nsacyber/simon-speck-supercop/blob/master/crypto_stream/speck128256ctr/


#ifndef SPECK_H
#define SPECK_H


#include <stdint.h>
#include <stdlib.h>

#include "portable_endian.h"


#define u32 uint32_t
#define u64 uint64_t

#define N2N_SPECK_IVEC_SIZE     16
#define SPECK_KEY_BYTES       (256/8)


#if defined (__AVX512F__) // AVX512 support -----------------------------------------------------------------------


#include <immintrin.h>
#include <string.h>    /* memcpy() */

#define u512 __m512i

#define SPECK_ALIGNED_CTX       64

typedef struct {
    u512 rk[34];
    u64 key[34];
    u32 keysize;
} speck_context_t;


#elif defined (__AVX2__) // AVX2 support --------------------------------------------------------------------------


#include <immintrin.h>

#define u256 __m256i

#define SPECK_ALIGNED_CTX       32

typedef struct {
    u256 rk[34];
    u64 key[34];
    u32 keysize;
} speck_context_t;


#elif defined (__SSE2__) // SSE support ---------------------------------------------------------------------------


#include <immintrin.h>

#define u128 __m128i

#define SPECK_ALIGNED_CTX       16
#define SPECK_CTX_BYVAL          1

typedef struct {
    u128 rk[34];
    u64 key[34];
    u32 keysize;
} speck_context_t;


#elif defined (__ARM_NEON) && defined (SPECK_ARM_NEON)      // NEON support ---------------------------------------


#include <arm_neon.h>

#define u128 uint64x2_t

typedef struct {
    u128 rk[34];
    u64 key[34];
    u32 keysize;
} speck_context_t;


#else // plain C --------------------------------------------------------------------------------------------------


typedef struct {
    u64 key[34];
    u32 keysize;
} speck_context_t;


#endif // ---------------------------------------------------------------------------------------------------------


int speck_ctr (unsigned char *out, const unsigned char *in, unsigned long long inlen,
               const unsigned char *n,
               speck_context_t *ctx);

int speck_init (speck_context_t **ctx, const unsigned char *k, int keysize);

int speck_deinit (speck_context_t *ctx);


// ----------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------------------


// cipher SPECK -- 128 bit block size -- 128 bit key size -- ECB mode
// follows endianess rules as used in official implementation guide and NOT as in original 2013 cipher presentation
// used for IV in header encryption (one block) and challenge encryption (user/password)
// for now: just plain C -- probably no need for AVX, SSE, NEON


int speck_128_decrypt (unsigned char *inout, speck_context_t *ctx);

int speck_128_encrypt (unsigned char *inout, speck_context_t *ctx);


#endif // SPECK_H