2 * Written in 2013 by Gregor Pintar <grpintar@gmail.com>
4 * To the extent possible under law, the author(s) have dedicated
5 * all copyright and related and neighboring rights to this software
6 * to the public domain worldwide.
8 * This software is distributed without any warranty.
10 * You should have received a copy of the CC0 Public Domain Dedication.
11 * If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
18 #include <kripto/cast.h>
19 #include <kripto/loadstore.h>
20 #include <kripto/rotate.h>
21 #include <kripto/memwipe.h>
22 #include <kripto/block.h>
23 #include <kripto/desc/block.h>
24 #include <kripto/object/block.h>
26 #include <kripto/block/speck32.h>
30 struct kripto_block_object obj
;
38 A = (ROR16_07(A) + B) ^ (K); \
39 B = ROL16_02(B) ^ A; \
44 B = ROR16_02(B ^ A); \
45 A = ROL16_07((A ^ (K)) - B); \
48 static void speck32_encrypt
50 const kripto_block
*s
,
60 b
= LOAD16B(CU8(pt
) + 2);
62 for(i
= 0; i
< s
->rounds
; i
++)
66 STORE16B(b
, U8(ct
) + 2);
69 static void speck32_decrypt
71 const kripto_block
*s
,
81 b
= LOAD16B(CU8(ct
) + 2);
83 for(i
= s
->rounds
; i
--;)
87 STORE16B(b
, U8(pt
) + 2);
90 static void speck32_setup
98 uint16_t k
[4] = {0, 0, 0, 0};
100 for(i
= 0; i
< len
; i
++)
101 k
[3 - (i
>> 1)] |= (uint16_t)key
[i
] << (8 - ((i
& 1) << 3));
105 for(i
= 0; i
< s
->rounds
- 1;)
107 R(k
[(i
% 3) + 1], k
[0], i
);
111 kripto_memwipe(k
, 8);
114 static kripto_block
*speck32_create
125 s
= malloc(sizeof(kripto_block
) + (r
<< 1));
128 s
->obj
.desc
= kripto_block_speck32
;
129 s
->size
= sizeof(kripto_block
) + (r
<< 1);
130 s
->k
= (uint16_t *)(((uint8_t *)s
) + sizeof(kripto_block
));
133 speck32_setup(s
, key
, key_len
);
138 static void speck32_destroy(kripto_block
*s
)
140 kripto_memwipe(s
, s
->size
);
144 static kripto_block
*speck32_recreate
154 if(sizeof(kripto_block
) + (r
<< 1) > s
->size
)
157 s
= speck32_create(r
, key
, key_len
);
162 speck32_setup(s
, key
, key_len
);
168 static const kripto_block_desc speck32
=
181 const kripto_block_desc
*const kripto_block_speck32
= &speck32
;