/*
The eXtended Keccak Code Package (XKCP)
https://github.com/XKCP/XKCP

Keyak, designed by Guido Bertoni, Joan Daemen, Michaƫl Peeters, Gilles Van Assche and Ronny Van Keer.

Implementation by Ronny Van Keer, hereby denoted as "the implementer".

For more information, feedback or questions, please refer to the Keccak Team website:
https://keccak.team/

To the extent possible under law, the implementer has waived all copyright
and related or neighboring rights to the source code in this file.
http://creativecommons.org/publicdomain/zero/1.0/
*/

#ifdef KeccakReference
    #include "displayIntermediateValues.h"
#endif

#include "config.h"
#include "Keyakv2.h"

#ifdef XKCP_has_KeccakP800
    #include "KeccakP-800-SnP.h"

    #define prefix                      KeyakWidth800
    #define SnP                         KeccakP800
    #define SnP_width                   800
    #define PlSnP_parallelism           1
    #define SnP_Permute KeccakP800_Permute_12rounds
        #include "Motorist.inc"
    #undef prefix
    #undef SnP
    #undef SnP_width
    #undef PlSnP_parallelism
    #undef SnP_Permute

    #define prefix                      River
    #define prefixMotorist              KeyakWidth800
        #include "Keyakv2.inc"
    #undef prefix
    #undef prefixMotorist
#endif

#ifdef XKCP_has_KeccakP1600
    #include "KeccakP-1600-SnP.h"

    #define prefix                      KeyakWidth1600
    #define SnP                         KeccakP1600
    #define SnP_width                   1600
    #define PlSnP_parallelism           1
    #define SnP_Permute KeccakP1600_Permute_12rounds
        #include "Motorist.inc"
    #undef prefix
    #undef SnP
    #undef SnP_width
    #undef PlSnP_parallelism
    #undef SnP_Permute

    #define prefix                      Lake
    #define prefixMotorist              KeyakWidth1600
        #include "Keyakv2.inc"
    #undef prefix
    #undef prefixMotorist
#endif

#ifdef XKCP_has_KeccakP1600times2
    #include "KeccakP-1600-times2-SnP.h"

    #define prefix                      KeyakWidth1600times2
    #define PlSnP                       KeccakP1600times2
    #define PlSnP_parallelism           2
    #define PlSnP_PermuteAll            KeccakP1600times2_PermuteAll_12rounds
    #define SnP_width                   1600
        #include "Motorist.inc"
    #undef prefix
    #undef PlSnP
    #undef PlSnP_parallelism
    #undef PlSnP_PermuteAll
    #undef SnP_width

    #define prefix                      Sea
    #define prefixMotorist              KeyakWidth1600times2
        #include "Keyakv2.inc"
    #undef prefix
    #undef prefixMotorist
#endif

#ifdef XKCP_has_KeccakP1600times4
    #include "KeccakP-1600-times4-SnP.h"

    #define prefix                      KeyakWidth1600times4
    #define PlSnP                       KeccakP1600times4
    #define PlSnP_parallelism           4
    #define PlSnP_PermuteAll            KeccakP1600times4_PermuteAll_12rounds
    #define SnP_width                   1600
        #include "Motorist.inc"
    #undef prefix
    #undef PlSnP
    #undef PlSnP_parallelism
    #undef PlSnP_PermuteAll
    #undef SnP_width

    #define prefix                      Ocean
    #define prefixMotorist              KeyakWidth1600times4
        #include "Keyakv2.inc"
    #undef prefix
    #undef prefixMotorist
#endif

#ifdef XKCP_has_KeccakP1600times8
    #include "KeccakP-1600-times8-SnP.h"

    #define prefix                      KeyakWidth1600times8
    #define PlSnP                       KeccakP1600times8
    #define PlSnP_parallelism           8
    #define PlSnP_PermuteAll            KeccakP1600times8_PermuteAll_12rounds
    #define SnP_width                   1600
        #include "Motorist.inc"
    #undef prefix
    #undef PlSnP
    #undef PlSnP_parallelism
    #undef PlSnP_PermuteAll
    #undef SnP_width

    #define prefix                      Lunar
    #define prefixMotorist              KeyakWidth1600times8
        #include "Keyakv2.inc"
    #undef prefix
    #undef prefixMotorist
#endif