Artifact
04e1edcd5b722a93cc712e0d3db8a451871f013f :
File
keccak/KeccakF-1600-neon.c
— part of check-in
[a90f1eb37d]
at
2019-03-09 13:56:49
on branch trunk
— Replace memcpy with memmove, non-ambiguous copy
(user:
bernd
size: 2202)
File
keccakp/KeccakF-1600-neon.c
— part of check-in
[90b0958714]
at
2020-01-12 21:09:56
on branch trunk
— Improve haves
(user:
bernd
size: 2202)
0000: 2f 2a 0a 54 68 65 20 4b 65 63 63 61 6b 20 73 70 /*.The Keccak sp
0010: 6f 6e 67 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 onge function, d
0020: 65 73 69 67 6e 65 64 20 62 79 20 47 75 69 64 6f esigned by Guido
0030: 20 42 65 72 74 6f 6e 69 2c 20 4a 6f 61 6e 20 44 Bertoni, Joan D
0040: 61 65 6d 65 6e 2c 0a 4d 69 63 68 61 c3 ab 6c 20 aemen,.Michaël
0050: 50 65 65 74 65 72 73 20 61 6e 64 20 47 69 6c 6c Peeters and Gill
0060: 65 73 20 56 61 6e 20 41 73 73 63 68 65 2e 20 46 es Van Assche. F
0070: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 or more informat
0080: 69 6f 6e 2c 20 66 65 65 64 62 61 63 6b 20 6f 72 ion, feedback or
0090: 0a 71 75 65 73 74 69 6f 6e 73 2c 20 70 6c 65 61 .questions, plea
00a0: 73 65 20 72 65 66 65 72 20 74 6f 20 6f 75 72 20 se refer to our
00b0: 77 65 62 73 69 74 65 3a 20 68 74 74 70 3a 2f 2f website: http://
00c0: 6b 65 63 63 61 6b 2e 6e 6f 65 6b 65 6f 6e 2e 6f keccak.noekeon.o
00d0: 72 67 2f 0a 0a 49 6d 70 6c 65 6d 65 6e 74 61 74 rg/..Implementat
00e0: 69 6f 6e 20 62 79 20 74 68 65 20 64 65 73 69 67 ion by the desig
00f0: 6e 65 72 73 2c 0a 68 65 72 65 62 79 20 64 65 6e ners,.hereby den
0100: 6f 74 65 64 20 61 73 20 22 74 68 65 20 69 6d 70 oted as "the imp
0110: 6c 65 6d 65 6e 74 65 72 22 2e 0a 0a 54 6f 20 74 lementer"...To t
0120: 68 65 20 65 78 74 65 6e 74 20 70 6f 73 73 69 62 he extent possib
0130: 6c 65 20 75 6e 64 65 72 20 6c 61 77 2c 20 74 68 le under law, th
0140: 65 20 69 6d 70 6c 65 6d 65 6e 74 65 72 20 68 61 e implementer ha
0150: 73 20 77 61 69 76 65 64 20 61 6c 6c 20 63 6f 70 s waived all cop
0160: 79 72 69 67 68 74 0a 61 6e 64 20 72 65 6c 61 74 yright.and relat
0170: 65 64 20 6f 72 20 6e 65 69 67 68 62 6f 72 69 6e ed or neighborin
0180: 67 20 72 69 67 68 74 73 20 74 6f 20 74 68 65 20 g rights to the
0190: 73 6f 75 72 63 65 20 63 6f 64 65 20 69 6e 20 74 source code in t
01a0: 68 69 73 20 66 69 6c 65 2e 0a 68 74 74 70 3a 2f his file..http:/
01b0: 2f 63 72 65 61 74 69 76 65 63 6f 6d 6d 6f 6e 73 /creativecommons
01c0: 2e 6f 72 67 2f 70 75 62 6c 69 63 64 6f 6d 61 69 .org/publicdomai
01d0: 6e 2f 7a 65 72 6f 2f 31 2e 30 2f 0a 2a 2f 0a 0a n/zero/1.0/.*/..
01e0: 23 64 65 66 69 6e 65 20 53 54 41 54 45 49 20 75 #define STATEI u
01f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e nsigned long lon
0200: 67 20 69 6e 74 0a 23 69 6e 63 6c 75 64 65 20 3c g int.#include <
0210: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 string.h>.#inclu
0220: 64 65 20 22 62 72 67 5f 65 6e 64 69 61 6e 2e 68 de "brg_endian.h
0230: 22 0a 23 69 6e 63 6c 75 64 65 20 22 4b 65 63 63 ".#include "Kecc
0240: 61 6b 46 2d 31 36 30 30 2d 6f 70 74 36 34 2d 73 akF-1600-opt64-s
0250: 65 74 74 69 6e 67 73 2e 68 22 0a 23 69 6e 63 6c ettings.h".#incl
0260: 75 64 65 20 22 4b 65 63 63 61 6b 46 2d 31 36 30 ude "KeccakF-160
0270: 30 2e 68 22 0a 0a 76 6f 69 64 20 4b 65 63 63 61 0.h"..void Kecca
0280: 6b 46 28 6b 65 63 63 61 6b 5f 73 74 61 74 65 20 kF(keccak_state
0290: 73 74 61 74 65 2c 20 69 6e 74 20 72 6f 75 6e 64 state, int round
02a0: 29 0a 7b 0a 20 20 4b 65 63 63 61 6b 46 5f 61 72 ).{. KeccakF_ar
02b0: 6d 76 37 61 5f 6e 65 6f 6e 28 73 74 61 74 65 2c mv7a_neon(state,
02c0: 20 72 6f 75 6e 64 29 3b 0a 7d 0a 0a 76 6f 69 64 round);.}..void
02d0: 20 4b 65 63 63 61 6b 49 6e 69 74 69 61 6c 69 7a KeccakInitializ
02e0: 65 53 74 61 74 65 28 6b 65 63 63 61 6b 5f 73 74 eState(keccak_st
02f0: 61 74 65 20 73 74 61 74 65 29 0a 7b 0a 20 20 20 ate state).{.
0300: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 2c 20 30 memset(state, 0
0310: 2c 20 32 30 30 29 3b 0a 7d 0a 0a 76 6f 69 64 20 , 200);.}..void
0320: 4b 65 63 63 61 6b 49 6e 69 74 69 61 6c 69 7a 65 KeccakInitialize
0330: 28 29 0a 7b 0a 7d 0a 0a 76 6f 69 64 20 4b 65 63 ().{.}..void Kec
0340: 63 61 6b 45 78 74 72 61 63 74 28 6b 65 63 63 61 cakExtract(kecca
0350: 6b 5f 73 74 61 74 65 20 73 74 61 74 65 2c 20 55 k_state state, U
0360: 49 4e 54 36 34 20 2a 64 61 74 61 2c 20 69 6e 74 INT64 *data, int
0370: 20 62 79 74 65 43 6f 75 6e 74 29 0a 7b 0a 20 20 byteCount).{.
0380: 6d 65 6d 6d 6f 76 65 28 64 61 74 61 2c 20 73 74 memmove(data, st
0390: 61 74 65 2c 20 62 79 74 65 43 6f 75 6e 74 29 3b ate, byteCount);
03a0: 0a 7d 0a 0a 76 6f 69 64 20 4b 65 63 63 61 6b 41 .}..void KeccakA
03b0: 62 73 6f 72 62 28 6b 65 63 63 61 6b 5f 73 74 61 bsorb(keccak_sta
03c0: 74 65 20 73 74 61 74 65 2c 20 55 49 4e 54 36 34 te state, UINT64
03d0: 20 2a 64 61 74 61 2c 20 69 6e 74 20 62 79 74 65 *data, int byte
03e0: 43 6f 75 6e 74 29 0a 7b 0a 20 20 69 6e 74 20 69 Count).{. int i
03f0: 3b 0a 20 20 6b 65 63 63 61 6b 5f 73 74 61 74 65 ;. keccak_state
0400: 20 64 61 74 61 69 3b 0a 20 20 6d 65 6d 6d 6f 76 datai;. memmov
0410: 65 28 64 61 74 61 69 2c 20 64 61 74 61 2c 20 62 e(datai, data, b
0420: 79 74 65 43 6f 75 6e 74 29 3b 0a 20 20 66 6f 72 yteCount);. for
0430: 28 69 3d 30 3b 20 69 3c 62 79 74 65 43 6f 75 6e (i=0; i<byteCoun
0440: 74 2d 37 3b 20 69 2b 3d 38 29 20 7b 0a 20 20 20 t-7; i+=8) {.
0450: 20 73 74 61 74 65 5b 69 3e 3e 33 5d 20 5e 3d 20 state[i>>3] ^=
0460: 64 61 74 61 69 5b 69 3e 3e 33 5d 3b 0a 20 20 7d datai[i>>3];. }
0470: 0a 20 20 69 66 28 62 79 74 65 43 6f 75 6e 74 20 . if(byteCount
0480: 26 20 37 29 20 7b 0a 20 20 20 20 55 49 4e 54 36 & 7) {. UINT6
0490: 34 20 6d 20 3d 20 30 78 66 66 66 66 66 66 66 66 4 m = 0xffffffff
04a0: 66 66 66 66 66 66 66 66 75 6c 6c 20 3e 3e 20 28 ffffffffull >> (
04b0: 28 38 2d 62 79 74 65 43 6f 75 6e 74 29 20 26 20 (8-byteCount) &
04c0: 37 29 2a 38 3b 0a 20 20 20 20 73 74 61 74 65 5b 7)*8;. state[
04d0: 69 3e 3e 33 5d 20 5e 3d 20 64 61 74 61 69 5b 69 i>>3] ^= datai[i
04e0: 3e 3e 33 5d 20 26 20 6d 3b 0a 20 20 7d 0a 7d 0a >>3] & m;. }.}.
04f0: 0a 76 6f 69 64 20 4b 65 63 63 61 6b 45 6e 63 72 .void KeccakEncr
0500: 79 70 74 28 6b 65 63 63 61 6b 5f 73 74 61 74 65 ypt(keccak_state
0510: 20 73 74 61 74 65 2c 20 55 49 4e 54 36 34 20 2a state, UINT64 *
0520: 64 61 74 61 2c 20 69 6e 74 20 62 79 74 65 43 6f data, int byteCo
0530: 75 6e 74 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a unt).{. int i;.
0540: 20 20 6b 65 63 63 61 6b 5f 73 74 61 74 65 20 64 keccak_state d
0550: 61 74 61 69 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 atai;. memmove(
0560: 64 61 74 61 69 2c 20 64 61 74 61 2c 20 62 79 74 datai, data, byt
0570: 65 43 6f 75 6e 74 29 3b 0a 20 20 66 6f 72 28 69 eCount);. for(i
0580: 3d 30 3b 20 69 3c 62 79 74 65 43 6f 75 6e 74 2d =0; i<byteCount-
0590: 37 3b 20 69 2b 3d 38 29 20 7b 0a 20 20 20 20 64 7; i+=8) {. d
05a0: 61 74 61 69 5b 69 3e 3e 33 5d 20 3d 20 73 74 61 atai[i>>3] = sta
05b0: 74 65 5b 69 3e 3e 33 5d 20 5e 3d 20 64 61 74 61 te[i>>3] ^= data
05c0: 69 5b 69 3e 3e 33 5d 3b 0a 20 20 7d 0a 20 20 69 i[i>>3];. }. i
05d0: 66 28 62 79 74 65 43 6f 75 6e 74 20 26 20 37 29 f(byteCount & 7)
05e0: 20 7b 0a 20 20 20 20 55 49 4e 54 36 34 20 6d 20 {. UINT64 m
05f0: 3d 20 30 78 66 66 66 66 66 66 66 66 66 66 66 66 = 0xffffffffffff
0600: 66 66 66 66 75 6c 6c 20 3e 3e 20 28 28 38 2d 62 ffffull >> ((8-b
0610: 79 74 65 43 6f 75 6e 74 29 20 26 20 37 29 2a 38 yteCount) & 7)*8
0620: 3b 0a 20 20 20 20 73 74 61 74 65 5b 69 3e 3e 33 ;. state[i>>3
0630: 5d 20 5e 3d 20 64 61 74 61 69 5b 69 3e 3e 33 5d ] ^= datai[i>>3]
0640: 20 26 20 6d 3b 0a 20 20 20 20 64 61 74 61 69 5b & m;. datai[
0650: 69 3e 3e 33 5d 20 3d 20 73 74 61 74 65 5b 69 3e i>>3] = state[i>
0660: 3e 33 5d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 6d 6f >3];. }. memmo
0670: 76 65 28 64 61 74 61 2c 20 64 61 74 61 69 2c 20 ve(data, datai,
0680: 62 79 74 65 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 76 byteCount);.}..v
0690: 6f 69 64 20 4b 65 63 63 61 6b 44 65 63 72 79 70 oid KeccakDecryp
06a0: 74 28 6b 65 63 63 61 6b 5f 73 74 61 74 65 20 73 t(keccak_state s
06b0: 74 61 74 65 2c 20 55 49 4e 54 36 34 20 2a 64 61 tate, UINT64 *da
06c0: 74 61 2c 20 69 6e 74 20 62 79 74 65 43 6f 75 6e ta, int byteCoun
06d0: 74 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 t).{. int i;.
06e0: 55 49 4e 54 36 34 20 74 6d 70 3b 0a 20 20 6b 65 UINT64 tmp;. ke
06f0: 63 63 61 6b 5f 73 74 61 74 65 20 64 61 74 61 69 ccak_state datai
0700: 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 64 61 74 61 ;. memmove(data
0710: 69 2c 20 64 61 74 61 2c 20 62 79 74 65 43 6f 75 i, data, byteCou
0720: 6e 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 nt);. for(i=0;
0730: 69 3c 62 79 74 65 43 6f 75 6e 74 2d 37 3b 20 69 i<byteCount-7; i
0740: 2b 3d 38 29 20 7b 0a 20 20 20 20 74 6d 70 20 3d +=8) {. tmp =
0750: 20 64 61 74 61 69 5b 69 3e 3e 33 5d 20 5e 20 73 datai[i>>3] ^ s
0760: 74 61 74 65 5b 69 3e 3e 33 5d 3b 0a 20 20 20 20 tate[i>>3];.
0770: 73 74 61 74 65 5b 69 3e 3e 33 5d 20 3d 20 64 61 state[i>>3] = da
0780: 74 61 69 5b 69 3e 3e 33 5d 3b 0a 20 20 20 20 64 tai[i>>3];. d
0790: 61 74 61 69 5b 69 3e 3e 33 5d 20 3d 20 74 6d 70 atai[i>>3] = tmp
07a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 62 79 74 65 43 ;. }. if(byteC
07b0: 6f 75 6e 74 20 26 20 37 29 20 7b 0a 20 20 20 20 ount & 7) {.
07c0: 55 49 4e 54 36 34 20 6d 20 3d 20 30 78 66 66 66 UINT64 m = 0xfff
07d0: 66 66 66 66 66 66 66 66 66 66 66 66 66 75 6c 6c fffffffffffffull
07e0: 20 3e 3e 20 28 28 38 2d 62 79 74 65 43 6f 75 6e >> ((8-byteCoun
07f0: 74 29 20 26 20 37 29 2a 38 3b 0a 20 20 20 20 74 t) & 7)*8;. t
0800: 6d 70 20 3d 20 64 61 74 61 69 5b 69 3e 3e 33 5d mp = datai[i>>3]
0810: 20 5e 20 73 74 61 74 65 5b 69 3e 3e 33 5d 3b 0a ^ state[i>>3];.
0820: 20 20 20 20 73 74 61 74 65 5b 69 3e 3e 33 5d 20 state[i>>3]
0830: 3d 20 28 64 61 74 61 69 5b 69 3e 3e 33 5d 20 26 = (datai[i>>3] &
0840: 20 6d 29 20 7c 20 28 73 74 61 74 65 5b 69 3e 3e m) | (state[i>>
0850: 33 5d 20 26 20 7e 6d 29 3b 0a 20 20 20 20 64 61 3] & ~m);. da
0860: 74 61 69 5b 69 3e 3e 33 5d 20 3d 20 74 6d 70 3b tai[i>>3] = tmp;
0870: 0a 20 20 7d 0a 20 20 6d 65 6d 6d 6f 76 65 28 64 . }. memmove(d
0880: 61 74 61 2c 20 64 61 74 61 69 2c 20 62 79 74 65 ata, datai, byte
0890: 43 6f 75 6e 74 29 3b 0a 7d 0a Count);.}.