mirror of https://github.com/GOSTSec/sgminer
ystarnaud
11 years ago
29 changed files with 13094 additions and 363 deletions
@ -0,0 +1,253 @@
@@ -0,0 +1,253 @@
|
||||
/*-
|
||||
* Copyright 2009 Colin Percival, 2011 ArtForz |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions |
||||
* are met: |
||||
* 1. Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
||||
* SUCH DAMAGE. |
||||
* |
||||
* This file was originally written by Colin Percival as part of the Tarsnap |
||||
* online backup system. |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
#include "miner.h" |
||||
|
||||
#include <stdlib.h> |
||||
#include <stdint.h> |
||||
#include <string.h> |
||||
|
||||
|
||||
#include "sph/sph_blake.h" |
||||
#include "sph/sph_bmw.h" |
||||
#include "sph/sph_groestl.h" |
||||
#include "sph/sph_jh.h" |
||||
#include "sph/sph_keccak.h" |
||||
#include "sph/sph_skein.h" |
||||
#include "sph/sph_luffa.h" |
||||
#include "sph/sph_cubehash.h" |
||||
#include "sph/sph_shavite.h" |
||||
#include "sph/sph_simd.h" |
||||
#include "sph/sph_echo.h" |
||||
#include "sph/sph_hamsi.h" |
||||
#include "sph/sph_fugue.h" |
||||
#include "sph/sph_shabal.h" |
||||
#include "sph/sph_whirlpool.h" |
||||
|
||||
/* Move init out of loop, so init once externally, and then use one single memcpy with that bigger memory block */ |
||||
typedef struct { |
||||
sph_blake512_context blake1; |
||||
sph_bmw512_context bmw1; |
||||
sph_groestl512_context groestl1; |
||||
sph_skein512_context skein1; |
||||
sph_jh512_context jh1; |
||||
sph_keccak512_context keccak1; |
||||
sph_luffa512_context luffa1; |
||||
sph_cubehash512_context cubehash1; |
||||
sph_shavite512_context shavite1; |
||||
sph_simd512_context simd1; |
||||
sph_echo512_context echo1; |
||||
sph_hamsi512_context hamsi1; |
||||
sph_fugue512_context fugue1; |
||||
sph_shabal512_context shabal1; |
||||
sph_whirlpool_context whilpool1; |
||||
} Xhash_context_holder; |
||||
|
||||
static Xhash_context_holder base_contexts; |
||||
|
||||
|
||||
void init_Bhash_contexts() |
||||
{ |
||||
sph_blake512_init(&base_contexts.blake1); |
||||
sph_bmw512_init(&base_contexts.bmw1); |
||||
sph_groestl512_init(&base_contexts.groestl1); |
||||
sph_skein512_init(&base_contexts.skein1); |
||||
sph_jh512_init(&base_contexts.jh1); |
||||
sph_keccak512_init(&base_contexts.keccak1); |
||||
sph_luffa512_init(&base_contexts.luffa1); |
||||
sph_cubehash512_init(&base_contexts.cubehash1); |
||||
sph_shavite512_init(&base_contexts.shavite1); |
||||
sph_simd512_init(&base_contexts.simd1); |
||||
sph_echo512_init(&base_contexts.echo1); |
||||
sph_hamsi512_init(&base_contexts.hamsi1); |
||||
sph_fugue512_init(&base_contexts.fugue1); |
||||
sph_shabal512_init(&base_contexts.shabal1); |
||||
sph_whirlpool_init(&base_contexts.whilpool1); |
||||
} |
||||
|
||||
/*
|
||||
* Encode a length len/4 vector of (uint32_t) into a length len vector of |
||||
* (unsigned char) in big-endian form. Assumes len is a multiple of 4. |
||||
*/ |
||||
static inline void |
||||
be32enc_vect(uint32_t *dst, const uint32_t *src, uint32_t len) |
||||
{ |
||||
uint32_t i; |
||||
|
||||
for (i = 0; i < len; i++) |
||||
dst[i] = htobe32(src[i]); |
||||
} |
||||
|
||||
|
||||
inline void bitblockhash(void *state, const void *input) |
||||
{ |
||||
init_Bhash_contexts(); |
||||
|
||||
Xhash_context_holder ctx; |
||||
|
||||
uint32_t hashA[16], hashB[16]; |
||||
//blake-bmw-groestl-sken-jh-meccak-luffa-cubehash-shivite-simd-echo
|
||||
memcpy(&ctx, &base_contexts, sizeof(base_contexts)); |
||||
|
||||
sph_blake512 (&ctx.blake1, input, 80); |
||||
sph_blake512_close (&ctx.blake1, hashA); |
||||
|
||||
sph_bmw512 (&ctx.bmw1, hashA, 64); |
||||
sph_bmw512_close(&ctx.bmw1, hashB); |
||||
|
||||
sph_groestl512 (&ctx.groestl1, hashB, 64); |
||||
sph_groestl512_close(&ctx.groestl1, hashA); |
||||
|
||||
sph_skein512 (&ctx.skein1, hashA, 64); |
||||
sph_skein512_close(&ctx.skein1, hashB); |
||||
|
||||
sph_jh512 (&ctx.jh1, hashB, 64); |
||||
sph_jh512_close(&ctx.jh1, hashA); |
||||
|
||||
sph_keccak512 (&ctx.keccak1, hashA, 64); |
||||
sph_keccak512_close(&ctx.keccak1, hashB); |
||||
|
||||
sph_luffa512 (&ctx.luffa1, hashB, 64); |
||||
sph_luffa512_close (&ctx.luffa1, hashA); |
||||
|
||||
sph_cubehash512 (&ctx.cubehash1, hashA, 64); |
||||
sph_cubehash512_close(&ctx.cubehash1, hashB); |
||||
|
||||
sph_shavite512 (&ctx.shavite1, hashB, 64); |
||||
sph_shavite512_close(&ctx.shavite1, hashA); |
||||
|
||||
sph_simd512 (&ctx.simd1, hashA, 64); |
||||
sph_simd512_close(&ctx.simd1, hashB); |
||||
|
||||
sph_echo512 (&ctx.echo1, hashB, 64); |
||||
sph_echo512_close(&ctx.echo1, hashA); |
||||
|
||||
sph_hamsi512 (&ctx.hamsi1, hashA, 64); |
||||
sph_hamsi512_close(&ctx.hamsi1, hashB); |
||||
|
||||
sph_fugue512 (&ctx.fugue1, hashB, 64); |
||||
sph_fugue512_close(&ctx.fugue1, hashA); |
||||
|
||||
sph_shabal512 (&ctx.shabal1, (const unsigned char*)hashA, 64); |
||||
sph_shabal512_close(&ctx.shabal1, hashB); |
||||
|
||||
sph_whirlpool(&ctx.whilpool1, hashB, 64); |
||||
sph_whirlpool_close(&ctx.whilpool1, hashA); |
||||
|
||||
memcpy(state, hashA, 32); |
||||
|
||||
} |
||||
|
||||
static const uint32_t diff1targ = 0x0000ffff; |
||||
|
||||
|
||||
/* Used externally as confirmation of correct OCL code */ |
||||
int bitblock_test(unsigned char *pdata, const unsigned char *ptarget, uint32_t nonce) |
||||
{ |
||||
uint32_t tmp_hash7, Htarg = le32toh(((const uint32_t *)ptarget)[7]); |
||||
uint32_t data[20], ohash[8]; |
||||
|
||||
be32enc_vect(data, (const uint32_t *)pdata, 19); |
||||
data[19] = htobe32(nonce); |
||||
bitblockhash(ohash, data); |
||||
tmp_hash7 = be32toh(ohash[7]); |
||||
|
||||
applog(LOG_DEBUG, "htarget %08lx diff1 %08lx hash %08lx", |
||||
(long unsigned int)Htarg, |
||||
(long unsigned int)diff1targ, |
||||
(long unsigned int)tmp_hash7); |
||||
if (tmp_hash7 > diff1targ) |
||||
return -1; |
||||
if (tmp_hash7 > Htarg) |
||||
return 0; |
||||
return 1; |
||||
} |
||||
|
||||
void bitblock_regenhash(struct work *work) |
||||
{ |
||||
uint32_t data[20]; |
||||
uint32_t *nonce = (uint32_t *)(work->data + 76); |
||||
uint32_t *ohash = (uint32_t *)(work->hash); |
||||
|
||||
be32enc_vect(data, (const uint32_t *)work->data, 19); |
||||
data[19] = htobe32(*nonce); |
||||
bitblockhash(ohash, data); |
||||
} |
||||
|
||||
static inline void be32enc(void *pp, uint32_t x) |
||||
{ |
||||
uint8_t *p = (uint8_t *)pp; |
||||
p[3] = x & 0xff; |
||||
p[2] = (x >> 8) & 0xff; |
||||
p[1] = (x >> 16) & 0xff; |
||||
p[0] = (x >> 24) & 0xff; |
||||
} |
||||
|
||||
bool scanhash_bitblock(struct thr_info *thr, const unsigned char __maybe_unused *pmidstate, |
||||
unsigned char *pdata, unsigned char __maybe_unused *phash1, |
||||
unsigned char __maybe_unused *phash, const unsigned char *ptarget, |
||||
uint32_t max_nonce, uint32_t *last_nonce, uint32_t n) |
||||
{ |
||||
uint32_t *nonce = (uint32_t *)(pdata + 76); |
||||
uint32_t data[20]; |
||||
uint32_t tmp_hash7; |
||||
uint32_t Htarg = le32toh(((const uint32_t *)ptarget)[7]); |
||||
bool ret = false; |
||||
|
||||
be32enc_vect(data, (const uint32_t *)pdata, 19); |
||||
|
||||
while(1) { |
||||
uint32_t ostate[8]; |
||||
*nonce = ++n; |
||||
data[19] = (n); |
||||
bitblockhash(ostate, data); |
||||
tmp_hash7 = (ostate[7]); |
||||
|
||||
applog(LOG_INFO, "data7 %08lx", |
||||
(long unsigned int)data[7]); |
||||
|
||||
if (unlikely(tmp_hash7 <= Htarg)) { |
||||
((uint32_t *)pdata)[19] = htobe32(n); |
||||
*last_nonce = n; |
||||
ret = true; |
||||
break; |
||||
} |
||||
|
||||
if (unlikely((n >= max_nonce) || thr->work_restart)) { |
||||
*last_nonce = n; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
|
||||
|
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
#ifndef BITBLOCK_H |
||||
#define BITBLOCK_H |
||||
|
||||
#include "miner.h" |
||||
|
||||
extern int bitblock_test(unsigned char *pdata, const unsigned char *ptarget, |
||||
uint32_t nonce); |
||||
extern void bitblock_regenhash(struct work *work); |
||||
|
||||
#endif /* BITBLOCK_H */ |
@ -0,0 +1,247 @@
@@ -0,0 +1,247 @@
|
||||
/*-
|
||||
* Copyright 2009 Colin Percival, 2011 ArtForz |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions |
||||
* are met: |
||||
* 1. Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
||||
* SUCH DAMAGE. |
||||
* |
||||
* This file was originally written by Colin Percival as part of the Tarsnap |
||||
* online backup system. |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
#include "miner.h" |
||||
|
||||
#include <stdlib.h> |
||||
#include <stdint.h> |
||||
#include <string.h> |
||||
|
||||
|
||||
#include "sph/sph_blake.h" |
||||
#include "sph/sph_bmw.h" |
||||
#include "sph/sph_groestl.h" |
||||
#include "sph/sph_jh.h" |
||||
#include "sph/sph_keccak.h" |
||||
#include "sph/sph_skein.h" |
||||
#include "sph/sph_luffa.h" |
||||
#include "sph/sph_cubehash.h" |
||||
#include "sph/sph_shavite.h" |
||||
#include "sph/sph_simd.h" |
||||
#include "sph/sph_echo.h" |
||||
#include "sph/sph_hamsi.h" |
||||
#include "sph/sph_fugue.h" |
||||
#include "sph/sph_shabal.h" |
||||
|
||||
/* Move init out of loop, so init once externally, and then use one single memcpy with that bigger memory block */ |
||||
typedef struct { |
||||
sph_blake512_context blake1; |
||||
sph_bmw512_context bmw1; |
||||
sph_groestl512_context groestl1; |
||||
sph_skein512_context skein1; |
||||
sph_jh512_context jh1; |
||||
sph_keccak512_context keccak1; |
||||
sph_luffa512_context luffa1; |
||||
sph_cubehash512_context cubehash1; |
||||
sph_shavite512_context shavite1; |
||||
sph_simd512_context simd1; |
||||
sph_echo512_context echo1; |
||||
sph_hamsi512_context hamsi1; |
||||
sph_fugue512_context fugue1; |
||||
sph_shabal512_context shabal1; |
||||
} Xhash_context_holder; |
||||
|
||||
static Xhash_context_holder base_contexts; |
||||
|
||||
void init_X14hash_contexts() |
||||
{ |
||||
sph_blake512_init(&base_contexts.blake1); |
||||
sph_bmw512_init(&base_contexts.bmw1); |
||||
sph_groestl512_init(&base_contexts.groestl1); |
||||
sph_skein512_init(&base_contexts.skein1); |
||||
sph_jh512_init(&base_contexts.jh1); |
||||
sph_keccak512_init(&base_contexts.keccak1); |
||||
sph_luffa512_init(&base_contexts.luffa1); |
||||
sph_cubehash512_init(&base_contexts.cubehash1); |
||||
sph_shavite512_init(&base_contexts.shavite1); |
||||
sph_simd512_init(&base_contexts.simd1); |
||||
sph_echo512_init(&base_contexts.echo1); |
||||
sph_hamsi512_init(&base_contexts.hamsi1); |
||||
sph_fugue512_init(&base_contexts.fugue1); |
||||
sph_shabal512_init(&base_contexts.shabal1); |
||||
} |
||||
|
||||
/*
|
||||
* Encode a length len/4 vector of (uint32_t) into a length len vector of |
||||
* (unsigned char) in big-endian form. Assumes len is a multiple of 4. |
||||
*/ |
||||
static inline void be32enc_vect(uint32_t *dst, const uint32_t *src, uint32_t len) |
||||
{ |
||||
uint32_t i; |
||||
|
||||
for (i = 0; i < len; i++) |
||||
dst[i] = htobe32(src[i]); |
||||
} |
||||
|
||||
|
||||
inline void x14hash(void *state, const void *input) |
||||
{ |
||||
init_X14hash_contexts(); |
||||
|
||||
Xhash_context_holder ctx; |
||||
|
||||
uint32_t hashA[16], hashB[16]; |
||||
//blake-bmw-groestl-sken-jh-meccak-luffa-cubehash-shivite-simd-echo
|
||||
memcpy(&ctx, &base_contexts, sizeof(base_contexts)); |
||||
|
||||
sph_blake512 (&ctx.blake1, input, 80); |
||||
sph_blake512_close (&ctx.blake1, hashA); |
||||
|
||||
sph_bmw512 (&ctx.bmw1, hashA, 64); |
||||
sph_bmw512_close(&ctx.bmw1, hashB); |
||||
|
||||
sph_groestl512 (&ctx.groestl1, hashB, 64); |
||||
sph_groestl512_close(&ctx.groestl1, hashA); |
||||
|
||||
sph_skein512 (&ctx.skein1, hashA, 64); |
||||
sph_skein512_close(&ctx.skein1, hashB); |
||||
|
||||
sph_jh512 (&ctx.jh1, hashB, 64); |
||||
sph_jh512_close(&ctx.jh1, hashA); |
||||
|
||||
sph_keccak512 (&ctx.keccak1, hashA, 64); |
||||
sph_keccak512_close(&ctx.keccak1, hashB); |
||||
|
||||
sph_luffa512 (&ctx.luffa1, hashB, 64); |
||||
sph_luffa512_close (&ctx.luffa1, hashA); |
||||
|
||||
sph_cubehash512 (&ctx.cubehash1, hashA, 64); |
||||
sph_cubehash512_close(&ctx.cubehash1, hashB); |
||||
|
||||
sph_shavite512 (&ctx.shavite1, hashB, 64); |
||||
sph_shavite512_close(&ctx.shavite1, hashA); |
||||
|
||||
sph_simd512 (&ctx.simd1, hashA, 64); |
||||
sph_simd512_close(&ctx.simd1, hashB); |
||||
|
||||
sph_echo512 (&ctx.echo1, hashB, 64); |
||||
sph_echo512_close(&ctx.echo1, hashA); |
||||
|
||||
sph_hamsi512 (&ctx.hamsi1, hashA, 64); |
||||
sph_hamsi512_close(&ctx.hamsi1, hashB); |
||||
|
||||
sph_fugue512 (&ctx.fugue1, hashB, 64); |
||||
sph_fugue512_close(&ctx.fugue1, hashA); |
||||
|
||||
sph_shabal512 (&ctx.shabal1, (const unsigned char*)hashA, 64); |
||||
sph_shabal512_close(&ctx.shabal1, hashB); |
||||
|
||||
memcpy(state, hashB, 32); |
||||
} |
||||
|
||||
static const uint32_t diff1targ = 0x0000ffff; |
||||
|
||||
/* Used externally as confirmation of correct OCL code */ |
||||
int x14_test(unsigned char *pdata, const unsigned char *ptarget, uint32_t nonce) |
||||
{ |
||||
uint32_t tmp_hash7, Htarg = le32toh(((const uint32_t *)ptarget)[7]); |
||||
uint32_t data[20], ohash[8]; |
||||
|
||||
be32enc_vect(data, (const uint32_t *)pdata, 19); |
||||
data[19] = htobe32(nonce); |
||||
x14hash(ohash, data); |
||||
tmp_hash7 = be32toh(ohash[7]); |
||||
|
||||
applog(LOG_DEBUG, "htarget %08lx diff1 %08lx hash %08lx", |
||||
(long unsigned int)Htarg, |
||||
(long unsigned int)diff1targ, |
||||
(long unsigned int)tmp_hash7); |
||||
|
||||
if (tmp_hash7 > diff1targ) |
||||
return -1; |
||||
|
||||
if (tmp_hash7 > Htarg) |
||||
return 0; |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
void x14_regenhash(struct work *work) |
||||
{ |
||||
uint32_t data[20]; |
||||
uint32_t *nonce = (uint32_t *)(work->data + 76); |
||||
uint32_t *ohash = (uint32_t *)(work->hash); |
||||
|
||||
be32enc_vect(data, (const uint32_t *)work->data, 19); |
||||
data[19] = htobe32(*nonce); |
||||
x14hash(ohash, data); |
||||
} |
||||
|
||||
static inline void be32enc(void *pp, uint32_t x) |
||||
{ |
||||
uint8_t *p = (uint8_t *)pp; |
||||
p[3] = x & 0xff; |
||||
p[2] = (x >> 8) & 0xff; |
||||
p[1] = (x >> 16) & 0xff; |
||||
p[0] = (x >> 24) & 0xff; |
||||
} |
||||
|
||||
bool scanhash_x14(struct thr_info *thr, const unsigned char __maybe_unused *pmidstate, |
||||
unsigned char *pdata, unsigned char __maybe_unused *phash1, |
||||
unsigned char __maybe_unused *phash, const unsigned char *ptarget, |
||||
uint32_t max_nonce, uint32_t *last_nonce, uint32_t n) |
||||
{ |
||||
uint32_t *nonce = (uint32_t *)(pdata + 76); |
||||
uint32_t data[20]; |
||||
uint32_t tmp_hash7; |
||||
uint32_t Htarg = le32toh(((const uint32_t *)ptarget)[7]); |
||||
bool ret = false; |
||||
|
||||
be32enc_vect(data, (const uint32_t *)pdata, 19); |
||||
|
||||
while(1) |
||||
{ |
||||
uint32_t ostate[8]; |
||||
*nonce = ++n; |
||||
data[19] = (n); |
||||
x14hash(ostate, data); |
||||
tmp_hash7 = (ostate[7]); |
||||
|
||||
applog(LOG_INFO, "data7 %08lx", (long unsigned int)data[7]); |
||||
|
||||
if(unlikely(tmp_hash7 <= Htarg)) |
||||
{ |
||||
((uint32_t *)pdata)[19] = htobe32(n); |
||||
*last_nonce = n; |
||||
ret = true; |
||||
break; |
||||
} |
||||
|
||||
if (unlikely((n >= max_nonce) || thr->work_restart)) |
||||
{ |
||||
*last_nonce = n; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
|
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
#ifndef X14_H |
||||
#define X14_H |
||||
|
||||
#include "miner.h" |
||||
|
||||
extern int x14_test(unsigned char *pdata, const unsigned char *ptarget, |
||||
uint32_t nonce); |
||||
extern void x14_regenhash(struct work *work); |
||||
|
||||
#endif /* X14_H */ |
@ -0,0 +1,515 @@
@@ -0,0 +1,515 @@
|
||||
/* $Id: hamsi_helper.c 202 2010-05-31 15:46:48Z tp $ */ |
||||
/* |
||||
* Helper code for Hamsi (input block expansion). This code is |
||||
* automatically generated and includes precomputed tables for |
||||
* expansion code which handles 2 to 8 bits at a time. |
||||
* |
||||
* This file is included from hamsi.c, and is not meant to be compiled |
||||
* independently. |
||||
* |
||||
* ==========================(LICENSE BEGIN)============================ |
||||
* |
||||
* Copyright (c) 2007-2010 Projet RNRT SAPHIR |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining |
||||
* a copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sublicense, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice shall be |
||||
* included in all copies or substantial portions of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
* ===========================(LICENSE END)============================= |
||||
* |
||||
* @author Thomas Pornin <thomas.pornin@cryptolog.com> |
||||
*/ |
||||
|
||||
#if SPH_HAMSI_EXPAND_BIG == 1 |
||||
|
||||
/* Note: this table lists bits within each byte from least |
||||
siginificant to most significant. */ |
||||
__constant const sph_u32 T512[64][16] = { |
||||
{ SPH_C32(0xef0b0270), SPH_C32(0x3afd0000), SPH_C32(0x5dae0000), |
||||
SPH_C32(0x69490000), SPH_C32(0x9b0f3c06), SPH_C32(0x4405b5f9), |
||||
SPH_C32(0x66140a51), SPH_C32(0x924f5d0a), SPH_C32(0xc96b0030), |
||||
SPH_C32(0xe7250000), SPH_C32(0x2f840000), SPH_C32(0x264f0000), |
||||
SPH_C32(0x08695bf9), SPH_C32(0x6dfcf137), SPH_C32(0x509f6984), |
||||
SPH_C32(0x9e69af68) }, |
||||
{ SPH_C32(0xc96b0030), SPH_C32(0xe7250000), SPH_C32(0x2f840000), |
||||
SPH_C32(0x264f0000), SPH_C32(0x08695bf9), SPH_C32(0x6dfcf137), |
||||
SPH_C32(0x509f6984), SPH_C32(0x9e69af68), SPH_C32(0x26600240), |
||||
SPH_C32(0xddd80000), SPH_C32(0x722a0000), SPH_C32(0x4f060000), |
||||
SPH_C32(0x936667ff), SPH_C32(0x29f944ce), SPH_C32(0x368b63d5), |
||||
SPH_C32(0x0c26f262) }, |
||||
{ SPH_C32(0x145a3c00), SPH_C32(0xb9e90000), SPH_C32(0x61270000), |
||||
SPH_C32(0xf1610000), SPH_C32(0xce613d6c), SPH_C32(0xb0493d78), |
||||
SPH_C32(0x47a96720), SPH_C32(0xe18e24c5), SPH_C32(0x23671400), |
||||
SPH_C32(0xc8b90000), SPH_C32(0xf4c70000), SPH_C32(0xfb750000), |
||||
SPH_C32(0x73cd2465), SPH_C32(0xf8a6a549), SPH_C32(0x02c40a3f), |
||||
SPH_C32(0xdc24e61f) }, |
||||
{ SPH_C32(0x23671400), SPH_C32(0xc8b90000), SPH_C32(0xf4c70000), |
||||
SPH_C32(0xfb750000), SPH_C32(0x73cd2465), SPH_C32(0xf8a6a549), |
||||
SPH_C32(0x02c40a3f), SPH_C32(0xdc24e61f), SPH_C32(0x373d2800), |
||||
SPH_C32(0x71500000), SPH_C32(0x95e00000), SPH_C32(0x0a140000), |
||||
SPH_C32(0xbdac1909), SPH_C32(0x48ef9831), SPH_C32(0x456d6d1f), |
||||
SPH_C32(0x3daac2da) }, |
||||
{ SPH_C32(0x54285c00), SPH_C32(0xeaed0000), SPH_C32(0xc5d60000), |
||||
SPH_C32(0xa1c50000), SPH_C32(0xb3a26770), SPH_C32(0x94a5c4e1), |
||||
SPH_C32(0x6bb0419d), SPH_C32(0x551b3782), SPH_C32(0x9cbb1800), |
||||
SPH_C32(0xb0d30000), SPH_C32(0x92510000), SPH_C32(0xed930000), |
||||
SPH_C32(0x593a4345), SPH_C32(0xe114d5f4), SPH_C32(0x430633da), |
||||
SPH_C32(0x78cace29) }, |
||||
{ SPH_C32(0x9cbb1800), SPH_C32(0xb0d30000), SPH_C32(0x92510000), |
||||
SPH_C32(0xed930000), SPH_C32(0x593a4345), SPH_C32(0xe114d5f4), |
||||
SPH_C32(0x430633da), SPH_C32(0x78cace29), SPH_C32(0xc8934400), |
||||
SPH_C32(0x5a3e0000), SPH_C32(0x57870000), SPH_C32(0x4c560000), |
||||
SPH_C32(0xea982435), SPH_C32(0x75b11115), SPH_C32(0x28b67247), |
||||
SPH_C32(0x2dd1f9ab) }, |
||||
{ SPH_C32(0x29449c00), SPH_C32(0x64e70000), SPH_C32(0xf24b0000), |
||||
SPH_C32(0xc2f30000), SPH_C32(0x0ede4e8f), SPH_C32(0x56c23745), |
||||
SPH_C32(0xf3e04259), SPH_C32(0x8d0d9ec4), SPH_C32(0x466d0c00), |
||||
SPH_C32(0x08620000), SPH_C32(0xdd5d0000), SPH_C32(0xbadd0000), |
||||
SPH_C32(0x6a927942), SPH_C32(0x441f2b93), SPH_C32(0x218ace6f), |
||||
SPH_C32(0xbf2c0be2) }, |
||||
{ SPH_C32(0x466d0c00), SPH_C32(0x08620000), SPH_C32(0xdd5d0000), |
||||
SPH_C32(0xbadd0000), SPH_C32(0x6a927942), SPH_C32(0x441f2b93), |
||||
SPH_C32(0x218ace6f), SPH_C32(0xbf2c0be2), SPH_C32(0x6f299000), |
||||
SPH_C32(0x6c850000), SPH_C32(0x2f160000), SPH_C32(0x782e0000), |
||||
SPH_C32(0x644c37cd), SPH_C32(0x12dd1cd6), SPH_C32(0xd26a8c36), |
||||
SPH_C32(0x32219526) }, |
||||
{ SPH_C32(0xf6800005), SPH_C32(0x3443c000), SPH_C32(0x24070000), |
||||
SPH_C32(0x8f3d0000), SPH_C32(0x21373bfb), SPH_C32(0x0ab8d5ae), |
||||
SPH_C32(0xcdc58b19), SPH_C32(0xd795ba31), SPH_C32(0xa67f0001), |
||||
SPH_C32(0x71378000), SPH_C32(0x19fc0000), SPH_C32(0x96db0000), |
||||
SPH_C32(0x3a8b6dfd), SPH_C32(0xebcaaef3), SPH_C32(0x2c6d478f), |
||||
SPH_C32(0xac8e6c88) }, |
||||
{ SPH_C32(0xa67f0001), SPH_C32(0x71378000), SPH_C32(0x19fc0000), |
||||
SPH_C32(0x96db0000), SPH_C32(0x3a8b6dfd), SPH_C32(0xebcaaef3), |
||||
SPH_C32(0x2c6d478f), SPH_C32(0xac8e6c88), SPH_C32(0x50ff0004), |
||||
SPH_C32(0x45744000), SPH_C32(0x3dfb0000), SPH_C32(0x19e60000), |
||||
SPH_C32(0x1bbc5606), SPH_C32(0xe1727b5d), SPH_C32(0xe1a8cc96), |
||||
SPH_C32(0x7b1bd6b9) }, |
||||
{ SPH_C32(0xf7750009), SPH_C32(0xcf3cc000), SPH_C32(0xc3d60000), |
||||
SPH_C32(0x04920000), SPH_C32(0x029519a9), SPH_C32(0xf8e836ba), |
||||
SPH_C32(0x7a87f14e), SPH_C32(0x9e16981a), SPH_C32(0xd46a0000), |
||||
SPH_C32(0x8dc8c000), SPH_C32(0xa5af0000), SPH_C32(0x4a290000), |
||||
SPH_C32(0xfc4e427a), SPH_C32(0xc9b4866c), SPH_C32(0x98369604), |
||||
SPH_C32(0xf746c320) }, |
||||
{ SPH_C32(0xd46a0000), SPH_C32(0x8dc8c000), SPH_C32(0xa5af0000), |
||||
SPH_C32(0x4a290000), SPH_C32(0xfc4e427a), SPH_C32(0xc9b4866c), |
||||
SPH_C32(0x98369604), SPH_C32(0xf746c320), SPH_C32(0x231f0009), |
||||
SPH_C32(0x42f40000), SPH_C32(0x66790000), SPH_C32(0x4ebb0000), |
||||
SPH_C32(0xfedb5bd3), SPH_C32(0x315cb0d6), SPH_C32(0xe2b1674a), |
||||
SPH_C32(0x69505b3a) }, |
||||
{ SPH_C32(0x774400f0), SPH_C32(0xf15a0000), SPH_C32(0xf5b20000), |
||||
SPH_C32(0x34140000), SPH_C32(0x89377e8c), SPH_C32(0x5a8bec25), |
||||
SPH_C32(0x0bc3cd1e), SPH_C32(0xcf3775cb), SPH_C32(0xf46c0050), |
||||
SPH_C32(0x96180000), SPH_C32(0x14a50000), SPH_C32(0x031f0000), |
||||
SPH_C32(0x42947eb8), SPH_C32(0x66bf7e19), SPH_C32(0x9ca470d2), |
||||
SPH_C32(0x8a341574) }, |
||||
{ SPH_C32(0xf46c0050), SPH_C32(0x96180000), SPH_C32(0x14a50000), |
||||
SPH_C32(0x031f0000), SPH_C32(0x42947eb8), SPH_C32(0x66bf7e19), |
||||
SPH_C32(0x9ca470d2), SPH_C32(0x8a341574), SPH_C32(0x832800a0), |
||||
SPH_C32(0x67420000), SPH_C32(0xe1170000), SPH_C32(0x370b0000), |
||||
SPH_C32(0xcba30034), SPH_C32(0x3c34923c), SPH_C32(0x9767bdcc), |
||||
SPH_C32(0x450360bf) }, |
||||
{ SPH_C32(0xe8870170), SPH_C32(0x9d720000), SPH_C32(0x12db0000), |
||||
SPH_C32(0xd4220000), SPH_C32(0xf2886b27), SPH_C32(0xa921e543), |
||||
SPH_C32(0x4ef8b518), SPH_C32(0x618813b1), SPH_C32(0xb4370060), |
||||
SPH_C32(0x0c4c0000), SPH_C32(0x56c20000), SPH_C32(0x5cae0000), |
||||
SPH_C32(0x94541f3f), SPH_C32(0x3b3ef825), SPH_C32(0x1b365f3d), |
||||
SPH_C32(0xf3d45758) }, |
||||
{ SPH_C32(0xb4370060), SPH_C32(0x0c4c0000), SPH_C32(0x56c20000), |
||||
SPH_C32(0x5cae0000), SPH_C32(0x94541f3f), SPH_C32(0x3b3ef825), |
||||
SPH_C32(0x1b365f3d), SPH_C32(0xf3d45758), SPH_C32(0x5cb00110), |
||||
SPH_C32(0x913e0000), SPH_C32(0x44190000), SPH_C32(0x888c0000), |
||||
SPH_C32(0x66dc7418), SPH_C32(0x921f1d66), SPH_C32(0x55ceea25), |
||||
SPH_C32(0x925c44e9) }, |
||||
{ SPH_C32(0x0c720000), SPH_C32(0x49e50f00), SPH_C32(0x42790000), |
||||
SPH_C32(0x5cea0000), SPH_C32(0x33aa301a), SPH_C32(0x15822514), |
||||
SPH_C32(0x95a34b7b), SPH_C32(0xb44b0090), SPH_C32(0xfe220000), |
||||
SPH_C32(0xa7580500), SPH_C32(0x25d10000), SPH_C32(0xf7600000), |
||||
SPH_C32(0x893178da), SPH_C32(0x1fd4f860), SPH_C32(0x4ed0a315), |
||||
SPH_C32(0xa123ff9f) }, |
||||
{ SPH_C32(0xfe220000), SPH_C32(0xa7580500), SPH_C32(0x25d10000), |
||||
SPH_C32(0xf7600000), SPH_C32(0x893178da), SPH_C32(0x1fd4f860), |
||||
SPH_C32(0x4ed0a315), SPH_C32(0xa123ff9f), SPH_C32(0xf2500000), |
||||
SPH_C32(0xeebd0a00), SPH_C32(0x67a80000), SPH_C32(0xab8a0000), |
||||
SPH_C32(0xba9b48c0), SPH_C32(0x0a56dd74), SPH_C32(0xdb73e86e), |
||||
SPH_C32(0x1568ff0f) }, |
||||
{ SPH_C32(0x45180000), SPH_C32(0xa5b51700), SPH_C32(0xf96a0000), |
||||
SPH_C32(0x3b480000), SPH_C32(0x1ecc142c), SPH_C32(0x231395d6), |
||||
SPH_C32(0x16bca6b0), SPH_C32(0xdf33f4df), SPH_C32(0xb83d0000), |
||||
SPH_C32(0x16710600), SPH_C32(0x379a0000), SPH_C32(0xf5b10000), |
||||
SPH_C32(0x228161ac), SPH_C32(0xae48f145), SPH_C32(0x66241616), |
||||
SPH_C32(0xc5c1eb3e) }, |
||||
{ SPH_C32(0xb83d0000), SPH_C32(0x16710600), SPH_C32(0x379a0000), |
||||
SPH_C32(0xf5b10000), SPH_C32(0x228161ac), SPH_C32(0xae48f145), |
||||
SPH_C32(0x66241616), SPH_C32(0xc5c1eb3e), SPH_C32(0xfd250000), |
||||
SPH_C32(0xb3c41100), SPH_C32(0xcef00000), SPH_C32(0xcef90000), |
||||
SPH_C32(0x3c4d7580), SPH_C32(0x8d5b6493), SPH_C32(0x7098b0a6), |
||||
SPH_C32(0x1af21fe1) }, |
||||
{ SPH_C32(0x75a40000), SPH_C32(0xc28b2700), SPH_C32(0x94a40000), |
||||
SPH_C32(0x90f50000), SPH_C32(0xfb7857e0), SPH_C32(0x49ce0bae), |
||||
SPH_C32(0x1767c483), SPH_C32(0xaedf667e), SPH_C32(0xd1660000), |
||||
SPH_C32(0x1bbc0300), SPH_C32(0x9eec0000), SPH_C32(0xf6940000), |
||||
SPH_C32(0x03024527), SPH_C32(0xcf70fcf2), SPH_C32(0xb4431b17), |
||||
SPH_C32(0x857f3c2b) }, |
||||
{ SPH_C32(0xd1660000), SPH_C32(0x1bbc0300), SPH_C32(0x9eec0000), |
||||
SPH_C32(0xf6940000), SPH_C32(0x03024527), SPH_C32(0xcf70fcf2), |
||||
SPH_C32(0xb4431b17), SPH_C32(0x857f3c2b), SPH_C32(0xa4c20000), |
||||
SPH_C32(0xd9372400), SPH_C32(0x0a480000), SPH_C32(0x66610000), |
||||
SPH_C32(0xf87a12c7), SPH_C32(0x86bef75c), SPH_C32(0xa324df94), |
||||
SPH_C32(0x2ba05a55) }, |
||||
{ SPH_C32(0x75c90003), SPH_C32(0x0e10c000), SPH_C32(0xd1200000), |
||||
SPH_C32(0xbaea0000), SPH_C32(0x8bc42f3e), SPH_C32(0x8758b757), |
||||
SPH_C32(0xbb28761d), SPH_C32(0x00b72e2b), SPH_C32(0xeecf0001), |
||||
SPH_C32(0x6f564000), SPH_C32(0xf33e0000), SPH_C32(0xa79e0000), |
||||
SPH_C32(0xbdb57219), SPH_C32(0xb711ebc5), SPH_C32(0x4a3b40ba), |
||||
SPH_C32(0xfeabf254) }, |
||||
{ SPH_C32(0xeecf0001), SPH_C32(0x6f564000), SPH_C32(0xf33e0000), |
||||
SPH_C32(0xa79e0000), SPH_C32(0xbdb57219), SPH_C32(0xb711ebc5), |
||||
SPH_C32(0x4a3b40ba), SPH_C32(0xfeabf254), SPH_C32(0x9b060002), |
||||
SPH_C32(0x61468000), SPH_C32(0x221e0000), SPH_C32(0x1d740000), |
||||
SPH_C32(0x36715d27), SPH_C32(0x30495c92), SPH_C32(0xf11336a7), |
||||
SPH_C32(0xfe1cdc7f) }, |
||||
{ SPH_C32(0x86790000), SPH_C32(0x3f390002), SPH_C32(0xe19ae000), |
||||
SPH_C32(0x98560000), SPH_C32(0x9565670e), SPH_C32(0x4e88c8ea), |
||||
SPH_C32(0xd3dd4944), SPH_C32(0x161ddab9), SPH_C32(0x30b70000), |
||||
SPH_C32(0xe5d00000), SPH_C32(0xf4f46000), SPH_C32(0x42c40000), |
||||
SPH_C32(0x63b83d6a), SPH_C32(0x78ba9460), SPH_C32(0x21afa1ea), |
||||
SPH_C32(0xb0a51834) }, |
||||
{ SPH_C32(0x30b70000), SPH_C32(0xe5d00000), SPH_C32(0xf4f46000), |
||||
SPH_C32(0x42c40000), SPH_C32(0x63b83d6a), SPH_C32(0x78ba9460), |
||||
SPH_C32(0x21afa1ea), SPH_C32(0xb0a51834), SPH_C32(0xb6ce0000), |
||||
SPH_C32(0xdae90002), SPH_C32(0x156e8000), SPH_C32(0xda920000), |
||||
SPH_C32(0xf6dd5a64), SPH_C32(0x36325c8a), SPH_C32(0xf272e8ae), |
||||
SPH_C32(0xa6b8c28d) }, |
||||
{ SPH_C32(0x14190000), SPH_C32(0x23ca003c), SPH_C32(0x50df0000), |
||||
SPH_C32(0x44b60000), SPH_C32(0x1b6c67b0), SPH_C32(0x3cf3ac75), |
||||
SPH_C32(0x61e610b0), SPH_C32(0xdbcadb80), SPH_C32(0xe3430000), |
||||
SPH_C32(0x3a4e0014), SPH_C32(0xf2c60000), SPH_C32(0xaa4e0000), |
||||
SPH_C32(0xdb1e42a6), SPH_C32(0x256bbe15), SPH_C32(0x123db156), |
||||
SPH_C32(0x3a4e99d7) }, |
||||
{ SPH_C32(0xe3430000), SPH_C32(0x3a4e0014), SPH_C32(0xf2c60000), |
||||
SPH_C32(0xaa4e0000), SPH_C32(0xdb1e42a6), SPH_C32(0x256bbe15), |
||||
SPH_C32(0x123db156), SPH_C32(0x3a4e99d7), SPH_C32(0xf75a0000), |
||||
SPH_C32(0x19840028), SPH_C32(0xa2190000), SPH_C32(0xeef80000), |
||||
SPH_C32(0xc0722516), SPH_C32(0x19981260), SPH_C32(0x73dba1e6), |
||||
SPH_C32(0xe1844257) }, |
||||
{ SPH_C32(0x54500000), SPH_C32(0x0671005c), SPH_C32(0x25ae0000), |
||||
SPH_C32(0x6a1e0000), SPH_C32(0x2ea54edf), SPH_C32(0x664e8512), |
||||
SPH_C32(0xbfba18c3), SPH_C32(0x7e715d17), SPH_C32(0xbc8d0000), |
||||
SPH_C32(0xfc3b0018), SPH_C32(0x19830000), SPH_C32(0xd10b0000), |
||||
SPH_C32(0xae1878c4), SPH_C32(0x42a69856), SPH_C32(0x0012da37), |
||||
SPH_C32(0x2c3b504e) }, |
||||
{ SPH_C32(0xbc8d0000), SPH_C32(0xfc3b0018), SPH_C32(0x19830000), |
||||
SPH_C32(0xd10b0000), SPH_C32(0xae1878c4), SPH_C32(0x42a69856), |
||||
SPH_C32(0x0012da37), SPH_C32(0x2c3b504e), SPH_C32(0xe8dd0000), |
||||
SPH_C32(0xfa4a0044), SPH_C32(0x3c2d0000), SPH_C32(0xbb150000), |
||||
SPH_C32(0x80bd361b), SPH_C32(0x24e81d44), SPH_C32(0xbfa8c2f4), |
||||
SPH_C32(0x524a0d59) }, |
||||
{ SPH_C32(0x69510000), SPH_C32(0xd4e1009c), SPH_C32(0xc3230000), |
||||
SPH_C32(0xac2f0000), SPH_C32(0xe4950bae), SPH_C32(0xcea415dc), |
||||
SPH_C32(0x87ec287c), SPH_C32(0xbce1a3ce), SPH_C32(0xc6730000), |
||||
SPH_C32(0xaf8d000c), SPH_C32(0xa4c10000), SPH_C32(0x218d0000), |
||||
SPH_C32(0x23111587), SPH_C32(0x7913512f), SPH_C32(0x1d28ac88), |
||||
SPH_C32(0x378dd173) }, |
||||
{ SPH_C32(0xc6730000), SPH_C32(0xaf8d000c), SPH_C32(0xa4c10000), |
||||
SPH_C32(0x218d0000), SPH_C32(0x23111587), SPH_C32(0x7913512f), |
||||
SPH_C32(0x1d28ac88), SPH_C32(0x378dd173), SPH_C32(0xaf220000), |
||||
SPH_C32(0x7b6c0090), SPH_C32(0x67e20000), SPH_C32(0x8da20000), |
||||
SPH_C32(0xc7841e29), SPH_C32(0xb7b744f3), SPH_C32(0x9ac484f4), |
||||
SPH_C32(0x8b6c72bd) }, |
||||
{ SPH_C32(0xcc140000), SPH_C32(0xa5630000), SPH_C32(0x5ab90780), |
||||
SPH_C32(0x3b500000), SPH_C32(0x4bd013ff), SPH_C32(0x879b3418), |
||||
SPH_C32(0x694348c1), SPH_C32(0xca5a87fe), SPH_C32(0x819e0000), |
||||
SPH_C32(0xec570000), SPH_C32(0x66320280), SPH_C32(0x95f30000), |
||||
SPH_C32(0x5da92802), SPH_C32(0x48f43cbc), SPH_C32(0xe65aa22d), |
||||
SPH_C32(0x8e67b7fa) }, |
||||
{ SPH_C32(0x819e0000), SPH_C32(0xec570000), SPH_C32(0x66320280), |
||||
SPH_C32(0x95f30000), SPH_C32(0x5da92802), SPH_C32(0x48f43cbc), |
||||
SPH_C32(0xe65aa22d), SPH_C32(0x8e67b7fa), SPH_C32(0x4d8a0000), |
||||
SPH_C32(0x49340000), SPH_C32(0x3c8b0500), SPH_C32(0xaea30000), |
||||
SPH_C32(0x16793bfd), SPH_C32(0xcf6f08a4), SPH_C32(0x8f19eaec), |
||||
SPH_C32(0x443d3004) }, |
||||
{ SPH_C32(0x78230000), SPH_C32(0x12fc0000), SPH_C32(0xa93a0b80), |
||||
SPH_C32(0x90a50000), SPH_C32(0x713e2879), SPH_C32(0x7ee98924), |
||||
SPH_C32(0xf08ca062), SPH_C32(0x636f8bab), SPH_C32(0x02af0000), |
||||
SPH_C32(0xb7280000), SPH_C32(0xba1c0300), SPH_C32(0x56980000), |
||||
SPH_C32(0xba8d45d3), SPH_C32(0x8048c667), SPH_C32(0xa95c149a), |
||||
SPH_C32(0xf4f6ea7b) }, |
||||
{ SPH_C32(0x02af0000), SPH_C32(0xb7280000), SPH_C32(0xba1c0300), |
||||
SPH_C32(0x56980000), SPH_C32(0xba8d45d3), SPH_C32(0x8048c667), |
||||
SPH_C32(0xa95c149a), SPH_C32(0xf4f6ea7b), SPH_C32(0x7a8c0000), |
||||
SPH_C32(0xa5d40000), SPH_C32(0x13260880), SPH_C32(0xc63d0000), |
||||
SPH_C32(0xcbb36daa), SPH_C32(0xfea14f43), SPH_C32(0x59d0b4f8), |
||||
SPH_C32(0x979961d0) }, |
||||
{ SPH_C32(0xac480000), SPH_C32(0x1ba60000), SPH_C32(0x45fb1380), |
||||
SPH_C32(0x03430000), SPH_C32(0x5a85316a), SPH_C32(0x1fb250b6), |
||||
SPH_C32(0xfe72c7fe), SPH_C32(0x91e478f6), SPH_C32(0x1e4e0000), |
||||
SPH_C32(0xdecf0000), SPH_C32(0x6df80180), SPH_C32(0x77240000), |
||||
SPH_C32(0xec47079e), SPH_C32(0xf4a0694e), SPH_C32(0xcda31812), |
||||
SPH_C32(0x98aa496e) }, |
||||
{ SPH_C32(0x1e4e0000), SPH_C32(0xdecf0000), SPH_C32(0x6df80180), |
||||
SPH_C32(0x77240000), SPH_C32(0xec47079e), SPH_C32(0xf4a0694e), |
||||
SPH_C32(0xcda31812), SPH_C32(0x98aa496e), SPH_C32(0xb2060000), |
||||
SPH_C32(0xc5690000), SPH_C32(0x28031200), SPH_C32(0x74670000), |
||||
SPH_C32(0xb6c236f4), SPH_C32(0xeb1239f8), SPH_C32(0x33d1dfec), |
||||
SPH_C32(0x094e3198) }, |
||||
{ SPH_C32(0xaec30000), SPH_C32(0x9c4f0001), SPH_C32(0x79d1e000), |
||||
SPH_C32(0x2c150000), SPH_C32(0x45cc75b3), SPH_C32(0x6650b736), |
||||
SPH_C32(0xab92f78f), SPH_C32(0xa312567b), SPH_C32(0xdb250000), |
||||
SPH_C32(0x09290000), SPH_C32(0x49aac000), SPH_C32(0x81e10000), |
||||
SPH_C32(0xcafe6b59), SPH_C32(0x42793431), SPH_C32(0x43566b76), |
||||
SPH_C32(0xe86cba2e) }, |
||||
{ SPH_C32(0xdb250000), SPH_C32(0x09290000), SPH_C32(0x49aac000), |
||||
SPH_C32(0x81e10000), SPH_C32(0xcafe6b59), SPH_C32(0x42793431), |
||||
SPH_C32(0x43566b76), SPH_C32(0xe86cba2e), SPH_C32(0x75e60000), |
||||
SPH_C32(0x95660001), SPH_C32(0x307b2000), SPH_C32(0xadf40000), |
||||
SPH_C32(0x8f321eea), SPH_C32(0x24298307), SPH_C32(0xe8c49cf9), |
||||
SPH_C32(0x4b7eec55) }, |
||||
{ SPH_C32(0x58430000), SPH_C32(0x807e0000), SPH_C32(0x78330001), |
||||
SPH_C32(0xc66b3800), SPH_C32(0xe7375cdc), SPH_C32(0x79ad3fdd), |
||||
SPH_C32(0xac73fe6f), SPH_C32(0x3a4479b1), SPH_C32(0x1d5a0000), |
||||
SPH_C32(0x2b720000), SPH_C32(0x488d0000), SPH_C32(0xaf611800), |
||||
SPH_C32(0x25cb2ec5), SPH_C32(0xc879bfd0), SPH_C32(0x81a20429), |
||||
SPH_C32(0x1e7536a6) }, |
||||
{ SPH_C32(0x1d5a0000), SPH_C32(0x2b720000), SPH_C32(0x488d0000), |
||||
SPH_C32(0xaf611800), SPH_C32(0x25cb2ec5), SPH_C32(0xc879bfd0), |
||||
SPH_C32(0x81a20429), SPH_C32(0x1e7536a6), SPH_C32(0x45190000), |
||||
SPH_C32(0xab0c0000), SPH_C32(0x30be0001), SPH_C32(0x690a2000), |
||||
SPH_C32(0xc2fc7219), SPH_C32(0xb1d4800d), SPH_C32(0x2dd1fa46), |
||||
SPH_C32(0x24314f17) }, |
||||
{ SPH_C32(0xa53b0000), SPH_C32(0x14260000), SPH_C32(0x4e30001e), |
||||
SPH_C32(0x7cae0000), SPH_C32(0x8f9e0dd5), SPH_C32(0x78dfaa3d), |
||||
SPH_C32(0xf73168d8), SPH_C32(0x0b1b4946), SPH_C32(0x07ed0000), |
||||
SPH_C32(0xb2500000), SPH_C32(0x8774000a), SPH_C32(0x970d0000), |
||||
SPH_C32(0x437223ae), SPH_C32(0x48c76ea4), SPH_C32(0xf4786222), |
||||
SPH_C32(0x9075b1ce) }, |
||||
{ SPH_C32(0x07ed0000), SPH_C32(0xb2500000), SPH_C32(0x8774000a), |
||||
SPH_C32(0x970d0000), SPH_C32(0x437223ae), SPH_C32(0x48c76ea4), |
||||
SPH_C32(0xf4786222), SPH_C32(0x9075b1ce), SPH_C32(0xa2d60000), |
||||
SPH_C32(0xa6760000), SPH_C32(0xc9440014), SPH_C32(0xeba30000), |
||||
SPH_C32(0xccec2e7b), SPH_C32(0x3018c499), SPH_C32(0x03490afa), |
||||
SPH_C32(0x9b6ef888) }, |
||||
{ SPH_C32(0x88980000), SPH_C32(0x1f940000), SPH_C32(0x7fcf002e), |
||||
SPH_C32(0xfb4e0000), SPH_C32(0xf158079a), SPH_C32(0x61ae9167), |
||||
SPH_C32(0xa895706c), SPH_C32(0xe6107494), SPH_C32(0x0bc20000), |
||||
SPH_C32(0xdb630000), SPH_C32(0x7e88000c), SPH_C32(0x15860000), |
||||
SPH_C32(0x91fd48f3), SPH_C32(0x7581bb43), SPH_C32(0xf460449e), |
||||
SPH_C32(0xd8b61463) }, |
||||
{ SPH_C32(0x0bc20000), SPH_C32(0xdb630000), SPH_C32(0x7e88000c), |
||||
SPH_C32(0x15860000), SPH_C32(0x91fd48f3), SPH_C32(0x7581bb43), |
||||
SPH_C32(0xf460449e), SPH_C32(0xd8b61463), SPH_C32(0x835a0000), |
||||
SPH_C32(0xc4f70000), SPH_C32(0x01470022), SPH_C32(0xeec80000), |
||||
SPH_C32(0x60a54f69), SPH_C32(0x142f2a24), SPH_C32(0x5cf534f2), |
||||
SPH_C32(0x3ea660f7) }, |
||||
{ SPH_C32(0x52500000), SPH_C32(0x29540000), SPH_C32(0x6a61004e), |
||||
SPH_C32(0xf0ff0000), SPH_C32(0x9a317eec), SPH_C32(0x452341ce), |
||||
SPH_C32(0xcf568fe5), SPH_C32(0x5303130f), SPH_C32(0x538d0000), |
||||
SPH_C32(0xa9fc0000), SPH_C32(0x9ef70006), SPH_C32(0x56ff0000), |
||||
SPH_C32(0x0ae4004e), SPH_C32(0x92c5cdf9), SPH_C32(0xa9444018), |
||||
SPH_C32(0x7f975691) }, |
||||
{ SPH_C32(0x538d0000), SPH_C32(0xa9fc0000), SPH_C32(0x9ef70006), |
||||
SPH_C32(0x56ff0000), SPH_C32(0x0ae4004e), SPH_C32(0x92c5cdf9), |
||||
SPH_C32(0xa9444018), SPH_C32(0x7f975691), SPH_C32(0x01dd0000), |
||||
SPH_C32(0x80a80000), SPH_C32(0xf4960048), SPH_C32(0xa6000000), |
||||
SPH_C32(0x90d57ea2), SPH_C32(0xd7e68c37), SPH_C32(0x6612cffd), |
||||
SPH_C32(0x2c94459e) }, |
||||
{ SPH_C32(0xe6280000), SPH_C32(0x4c4b0000), SPH_C32(0xa8550000), |
||||
SPH_C32(0xd3d002e0), SPH_C32(0xd86130b8), SPH_C32(0x98a7b0da), |
||||
SPH_C32(0x289506b4), SPH_C32(0xd75a4897), SPH_C32(0xf0c50000), |
||||
SPH_C32(0x59230000), SPH_C32(0x45820000), SPH_C32(0xe18d00c0), |
||||
SPH_C32(0x3b6d0631), SPH_C32(0xc2ed5699), SPH_C32(0xcbe0fe1c), |
||||
SPH_C32(0x56a7b19f) }, |
||||
{ SPH_C32(0xf0c50000), SPH_C32(0x59230000), SPH_C32(0x45820000), |
||||
SPH_C32(0xe18d00c0), SPH_C32(0x3b6d0631), SPH_C32(0xc2ed5699), |
||||
SPH_C32(0xcbe0fe1c), SPH_C32(0x56a7b19f), SPH_C32(0x16ed0000), |
||||
SPH_C32(0x15680000), SPH_C32(0xedd70000), SPH_C32(0x325d0220), |
||||
SPH_C32(0xe30c3689), SPH_C32(0x5a4ae643), SPH_C32(0xe375f8a8), |
||||
SPH_C32(0x81fdf908) }, |
||||
{ SPH_C32(0xb4310000), SPH_C32(0x77330000), SPH_C32(0xb15d0000), |
||||
SPH_C32(0x7fd004e0), SPH_C32(0x78a26138), SPH_C32(0xd116c35d), |
||||
SPH_C32(0xd256d489), SPH_C32(0x4e6f74de), SPH_C32(0xe3060000), |
||||
SPH_C32(0xbdc10000), SPH_C32(0x87130000), SPH_C32(0xbff20060), |
||||
SPH_C32(0x2eba0a1a), SPH_C32(0x8db53751), SPH_C32(0x73c5ab06), |
||||
SPH_C32(0x5bd61539) }, |
||||
{ SPH_C32(0xe3060000), SPH_C32(0xbdc10000), SPH_C32(0x87130000), |
||||
SPH_C32(0xbff20060), SPH_C32(0x2eba0a1a), SPH_C32(0x8db53751), |
||||
SPH_C32(0x73c5ab06), SPH_C32(0x5bd61539), SPH_C32(0x57370000), |
||||
SPH_C32(0xcaf20000), SPH_C32(0x364e0000), SPH_C32(0xc0220480), |
||||
SPH_C32(0x56186b22), SPH_C32(0x5ca3f40c), SPH_C32(0xa1937f8f), |
||||
SPH_C32(0x15b961e7) }, |
||||
{ SPH_C32(0x02f20000), SPH_C32(0xa2810000), SPH_C32(0x873f0000), |
||||
SPH_C32(0xe36c7800), SPH_C32(0x1e1d74ef), SPH_C32(0x073d2bd6), |
||||
SPH_C32(0xc4c23237), SPH_C32(0x7f32259e), SPH_C32(0xbadd0000), |
||||
SPH_C32(0x13ad0000), SPH_C32(0xb7e70000), SPH_C32(0xf7282800), |
||||
SPH_C32(0xdf45144d), SPH_C32(0x361ac33a), SPH_C32(0xea5a8d14), |
||||
SPH_C32(0x2a2c18f0) }, |
||||
{ SPH_C32(0xbadd0000), SPH_C32(0x13ad0000), SPH_C32(0xb7e70000), |
||||
SPH_C32(0xf7282800), SPH_C32(0xdf45144d), SPH_C32(0x361ac33a), |
||||
SPH_C32(0xea5a8d14), SPH_C32(0x2a2c18f0), SPH_C32(0xb82f0000), |
||||
SPH_C32(0xb12c0000), SPH_C32(0x30d80000), SPH_C32(0x14445000), |
||||
SPH_C32(0xc15860a2), SPH_C32(0x3127e8ec), SPH_C32(0x2e98bf23), |
||||
SPH_C32(0x551e3d6e) }, |
||||
{ SPH_C32(0x1e6c0000), SPH_C32(0xc4420000), SPH_C32(0x8a2e0000), |
||||
SPH_C32(0xbcb6b800), SPH_C32(0x2c4413b6), SPH_C32(0x8bfdd3da), |
||||
SPH_C32(0x6a0c1bc8), SPH_C32(0xb99dc2eb), SPH_C32(0x92560000), |
||||
SPH_C32(0x1eda0000), SPH_C32(0xea510000), SPH_C32(0xe8b13000), |
||||
SPH_C32(0xa93556a5), SPH_C32(0xebfb6199), SPH_C32(0xb15c2254), |
||||
SPH_C32(0x33c5244f) }, |
||||
{ SPH_C32(0x92560000), SPH_C32(0x1eda0000), SPH_C32(0xea510000), |
||||
SPH_C32(0xe8b13000), SPH_C32(0xa93556a5), SPH_C32(0xebfb6199), |
||||
SPH_C32(0xb15c2254), SPH_C32(0x33c5244f), SPH_C32(0x8c3a0000), |
||||
SPH_C32(0xda980000), SPH_C32(0x607f0000), SPH_C32(0x54078800), |
||||
SPH_C32(0x85714513), SPH_C32(0x6006b243), SPH_C32(0xdb50399c), |
||||
SPH_C32(0x8a58e6a4) }, |
||||
{ SPH_C32(0x033d0000), SPH_C32(0x08b30000), SPH_C32(0xf33a0000), |
||||
SPH_C32(0x3ac20007), SPH_C32(0x51298a50), SPH_C32(0x6b6e661f), |
||||
SPH_C32(0x0ea5cfe3), SPH_C32(0xe6da7ffe), SPH_C32(0xa8da0000), |
||||
SPH_C32(0x96be0000), SPH_C32(0x5c1d0000), SPH_C32(0x07da0002), |
||||
SPH_C32(0x7d669583), SPH_C32(0x1f98708a), SPH_C32(0xbb668808), |
||||
SPH_C32(0xda878000) }, |
||||
{ SPH_C32(0xa8da0000), SPH_C32(0x96be0000), SPH_C32(0x5c1d0000), |
||||
SPH_C32(0x07da0002), SPH_C32(0x7d669583), SPH_C32(0x1f98708a), |
||||
SPH_C32(0xbb668808), SPH_C32(0xda878000), SPH_C32(0xabe70000), |
||||
SPH_C32(0x9e0d0000), SPH_C32(0xaf270000), SPH_C32(0x3d180005), |
||||
SPH_C32(0x2c4f1fd3), SPH_C32(0x74f61695), SPH_C32(0xb5c347eb), |
||||
SPH_C32(0x3c5dfffe) }, |
||||
{ SPH_C32(0x01930000), SPH_C32(0xe7820000), SPH_C32(0xedfb0000), |
||||
SPH_C32(0xcf0c000b), SPH_C32(0x8dd08d58), SPH_C32(0xbca3b42e), |
||||
SPH_C32(0x063661e1), SPH_C32(0x536f9e7b), SPH_C32(0x92280000), |
||||
SPH_C32(0xdc850000), SPH_C32(0x57fa0000), SPH_C32(0x56dc0003), |
||||
SPH_C32(0xbae92316), SPH_C32(0x5aefa30c), SPH_C32(0x90cef752), |
||||
SPH_C32(0x7b1675d7) }, |
||||
{ SPH_C32(0x92280000), SPH_C32(0xdc850000), SPH_C32(0x57fa0000), |
||||
SPH_C32(0x56dc0003), SPH_C32(0xbae92316), SPH_C32(0x5aefa30c), |
||||
SPH_C32(0x90cef752), SPH_C32(0x7b1675d7), SPH_C32(0x93bb0000), |
||||
SPH_C32(0x3b070000), SPH_C32(0xba010000), SPH_C32(0x99d00008), |
||||
SPH_C32(0x3739ae4e), SPH_C32(0xe64c1722), SPH_C32(0x96f896b3), |
||||
SPH_C32(0x2879ebac) }, |
||||
{ SPH_C32(0x5fa80000), SPH_C32(0x56030000), SPH_C32(0x43ae0000), |
||||
SPH_C32(0x64f30013), SPH_C32(0x257e86bf), SPH_C32(0x1311944e), |
||||
SPH_C32(0x541e95bf), SPH_C32(0x8ea4db69), SPH_C32(0x00440000), |
||||
SPH_C32(0x7f480000), SPH_C32(0xda7c0000), SPH_C32(0x2a230001), |
||||
SPH_C32(0x3badc9cc), SPH_C32(0xa9b69c87), SPH_C32(0x030a9e60), |
||||
SPH_C32(0xbe0a679e) }, |
||||
{ SPH_C32(0x00440000), SPH_C32(0x7f480000), SPH_C32(0xda7c0000), |
||||
SPH_C32(0x2a230001), SPH_C32(0x3badc9cc), SPH_C32(0xa9b69c87), |
||||
SPH_C32(0x030a9e60), SPH_C32(0xbe0a679e), SPH_C32(0x5fec0000), |
||||
SPH_C32(0x294b0000), SPH_C32(0x99d20000), SPH_C32(0x4ed00012), |
||||
SPH_C32(0x1ed34f73), SPH_C32(0xbaa708c9), SPH_C32(0x57140bdf), |
||||
SPH_C32(0x30aebcf7) }, |
||||
{ SPH_C32(0xee930000), SPH_C32(0xd6070000), SPH_C32(0x92c10000), |
||||
SPH_C32(0x2b9801e0), SPH_C32(0x9451287c), SPH_C32(0x3b6cfb57), |
||||
SPH_C32(0x45312374), SPH_C32(0x201f6a64), SPH_C32(0x7b280000), |
||||
SPH_C32(0x57420000), SPH_C32(0xa9e50000), SPH_C32(0x634300a0), |
||||
SPH_C32(0x9edb442f), SPH_C32(0x6d9995bb), SPH_C32(0x27f83b03), |
||||
SPH_C32(0xc7ff60f0) }, |
||||
{ SPH_C32(0x7b280000), SPH_C32(0x57420000), SPH_C32(0xa9e50000), |
||||
SPH_C32(0x634300a0), SPH_C32(0x9edb442f), SPH_C32(0x6d9995bb), |
||||
SPH_C32(0x27f83b03), SPH_C32(0xc7ff60f0), SPH_C32(0x95bb0000), |
||||
SPH_C32(0x81450000), SPH_C32(0x3b240000), SPH_C32(0x48db0140), |
||||
SPH_C32(0x0a8a6c53), SPH_C32(0x56f56eec), SPH_C32(0x62c91877), |
||||
SPH_C32(0xe7e00a94) } |
||||
}; |
||||
|
||||
#define INPUT_BIG do { \ |
||||
__constant const sph_u32 *tp = &T512[0][0]; \ |
||||
unsigned u, v; \ |
||||
m0 = 0; \ |
||||
m1 = 0; \ |
||||
m2 = 0; \ |
||||
m3 = 0; \ |
||||
m4 = 0; \ |
||||
m5 = 0; \ |
||||
m6 = 0; \ |
||||
m7 = 0; \ |
||||
m8 = 0; \ |
||||
m9 = 0; \ |
||||
mA = 0; \ |
||||
mB = 0; \ |
||||
mC = 0; \ |
||||
mD = 0; \ |
||||
mE = 0; \ |
||||
mF = 0; \ |
||||
for (u = 0; u < 8; u ++) { \ |
||||
unsigned db = buf(u); \ |
||||
for (v = 0; v < 8; v ++, db >>= 1) { \ |
||||
sph_u32 dm = SPH_T32(-(sph_u32)(db & 1)); \ |
||||
m0 ^= dm & *tp ++; \ |
||||
m1 ^= dm & *tp ++; \ |
||||
m2 ^= dm & *tp ++; \ |
||||
m3 ^= dm & *tp ++; \ |
||||
m4 ^= dm & *tp ++; \ |
||||
m5 ^= dm & *tp ++; \ |
||||
m6 ^= dm & *tp ++; \ |
||||
m7 ^= dm & *tp ++; \ |
||||
m8 ^= dm & *tp ++; \ |
||||
m9 ^= dm & *tp ++; \ |
||||
mA ^= dm & *tp ++; \ |
||||
mB ^= dm & *tp ++; \ |
||||
mC ^= dm & *tp ++; \ |
||||
mD ^= dm & *tp ++; \ |
||||
mE ^= dm & *tp ++; \ |
||||
mF ^= dm & *tp ++; \ |
||||
} \ |
||||
} \ |
||||
} while (0) |
||||
|
||||
#define INPUT_BIG_LOCAL do { \ |
||||
__local sph_u32 *tp = &(T512_L[0]); \ |
||||
unsigned u, v; \ |
||||
m0 = 0; \ |
||||
m1 = 0; \ |
||||
m2 = 0; \ |
||||
m3 = 0; \ |
||||
m4 = 0; \ |
||||
m5 = 0; \ |
||||
m6 = 0; \ |
||||
m7 = 0; \ |
||||
m8 = 0; \ |
||||
m9 = 0; \ |
||||
mA = 0; \ |
||||
mB = 0; \ |
||||
mC = 0; \ |
||||
mD = 0; \ |
||||
mE = 0; \ |
||||
mF = 0; \ |
||||
for (u = 0; u < 8; u ++) { \ |
||||
unsigned db = buf(u); \ |
||||
for (v = 0; v < 8; v ++, db >>= 1) { \ |
||||
sph_u32 dm = SPH_T32(-(sph_u32)(db & 1)); \ |
||||
m0 ^= dm & *tp ++; \ |
||||
m1 ^= dm & *tp ++; \ |
||||
m2 ^= dm & *tp ++; \ |
||||
m3 ^= dm & *tp ++; \ |
||||
m4 ^= dm & *tp ++; \ |
||||
m5 ^= dm & *tp ++; \ |
||||
m6 ^= dm & *tp ++; \ |
||||
m7 ^= dm & *tp ++; \ |
||||
m8 ^= dm & *tp ++; \ |
||||
m9 ^= dm & *tp ++; \ |
||||
mA ^= dm & *tp ++; \ |
||||
mB ^= dm & *tp ++; \ |
||||
mC ^= dm & *tp ++; \ |
||||
mD ^= dm & *tp ++; \ |
||||
mE ^= dm & *tp ++; \ |
||||
mF ^= dm & *tp ++; \ |
||||
} \ |
||||
} \ |
||||
} while (0) |
||||
|
||||
#endif |
@ -0,0 +1,350 @@
@@ -0,0 +1,350 @@
|
||||
/* $Id: shabal.c 175 2010-05-07 16:03:20Z tp $ */ |
||||
/* |
||||
* Shabal implementation. |
||||
* |
||||
* ==========================(LICENSE BEGIN)============================ |
||||
* |
||||
* Copyright (c) 2007-2010 Projet RNRT SAPHIR |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining |
||||
* a copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sublicense, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice shall be |
||||
* included in all copies or substantial portions of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
* ===========================(LICENSE END)============================= |
||||
* |
||||
* @author Thomas Pornin <thomas.pornin@cryptolog.com> |
||||
*/ |
||||
|
||||
/* |
||||
* Part of this code was automatically generated (the part between |
||||
* the "BEGIN" and "END" markers). |
||||
*/ |
||||
|
||||
#define sM 16 |
||||
|
||||
#define C32 SPH_C32 |
||||
#define T32 SPH_T32 |
||||
|
||||
#define O1 13 |
||||
#define O2 9 |
||||
#define O3 6 |
||||
|
||||
/* |
||||
* We copy the state into local variables, so that the compiler knows |
||||
* that it can optimize them at will. |
||||
*/ |
||||
|
||||
/* BEGIN -- automatically generated code. */ |
||||
|
||||
#define INPUT_BLOCK_ADD do { \ |
||||
B0 = T32(B0 + M0); \ |
||||
B1 = T32(B1 + M1); \ |
||||
B2 = T32(B2 + M2); \ |
||||
B3 = T32(B3 + M3); \ |
||||
B4 = T32(B4 + M4); \ |
||||
B5 = T32(B5 + M5); \ |
||||
B6 = T32(B6 + M6); \ |
||||
B7 = T32(B7 + M7); \ |
||||
B8 = T32(B8 + M8); \ |
||||
B9 = T32(B9 + M9); \ |
||||
BA = T32(BA + MA); \ |
||||
BB = T32(BB + MB); \ |
||||
BC = T32(BC + MC); \ |
||||
BD = T32(BD + MD); \ |
||||
BE = T32(BE + ME); \ |
||||
BF = T32(BF + MF); \ |
||||
} while (0) |
||||
|
||||
#define INPUT_BLOCK_SUB do { \ |
||||
C0 = T32(C0 - M0); \ |
||||
C1 = T32(C1 - M1); \ |
||||
C2 = T32(C2 - M2); \ |
||||
C3 = T32(C3 - M3); \ |
||||
C4 = T32(C4 - M4); \ |
||||
C5 = T32(C5 - M5); \ |
||||
C6 = T32(C6 - M6); \ |
||||
C7 = T32(C7 - M7); \ |
||||
C8 = T32(C8 - M8); \ |
||||
C9 = T32(C9 - M9); \ |
||||
CA = T32(CA - MA); \ |
||||
CB = T32(CB - MB); \ |
||||
CC = T32(CC - MC); \ |
||||
CD = T32(CD - MD); \ |
||||
CE = T32(CE - ME); \ |
||||
CF = T32(CF - MF); \ |
||||
} while (0) |
||||
|
||||
#define XOR_W do { \ |
||||
A00 ^= Wlow; \ |
||||
A01 ^= Whigh; \ |
||||
} while (0) |
||||
|
||||
#define SWAP(v1, v2) do { \ |
||||
sph_u32 tmp = (v1); \ |
||||
(v1) = (v2); \ |
||||
(v2) = tmp; \ |
||||
} while (0) |
||||
|
||||
#define SWAP_BC do { \ |
||||
SWAP(B0, C0); \ |
||||
SWAP(B1, C1); \ |
||||
SWAP(B2, C2); \ |
||||
SWAP(B3, C3); \ |
||||
SWAP(B4, C4); \ |
||||
SWAP(B5, C5); \ |
||||
SWAP(B6, C6); \ |
||||
SWAP(B7, C7); \ |
||||
SWAP(B8, C8); \ |
||||
SWAP(B9, C9); \ |
||||
SWAP(BA, CA); \ |
||||
SWAP(BB, CB); \ |
||||
SWAP(BC, CC); \ |
||||
SWAP(BD, CD); \ |
||||
SWAP(BE, CE); \ |
||||
SWAP(BF, CF); \ |
||||
} while (0) |
||||
|
||||
#define PERM_ELT(xa0, xa1, xb0, xb1, xb2, xb3, xc, xm) do { \ |
||||
xa0 = T32((xa0 \ |
||||
^ (((xa1 << 15) | (xa1 >> 17)) * 5U) \ |
||||
^ xc) * 3U) \ |
||||
^ xb1 ^ (xb2 & ~xb3) ^ xm; \ |
||||
xb0 = T32(~(((xb0 << 1) | (xb0 >> 31)) ^ xa0)); \ |
||||
} while (0) |
||||
|
||||
#define PERM_STEP_0 do { \ |
||||
PERM_ELT(A00, A0B, B0, BD, B9, B6, C8, M0); \ |
||||
PERM_ELT(A01, A00, B1, BE, BA, B7, C7, M1); \ |
||||
PERM_ELT(A02, A01, B2, BF, BB, B8, C6, M2); \ |
||||
PERM_ELT(A03, A02, B3, B0, BC, B9, C5, M3); \ |
||||
PERM_ELT(A04, A03, B4, B1, BD, BA, C4, M4); \ |
||||
PERM_ELT(A05, A04, B5, B2, BE, BB, C3, M5); \ |
||||
PERM_ELT(A06, A05, B6, B3, BF, BC, C2, M6); \ |
||||
PERM_ELT(A07, A06, B7, B4, B0, BD, C1, M7); \ |
||||
PERM_ELT(A08, A07, B8, B5, B1, BE, C0, M8); \ |
||||
PERM_ELT(A09, A08, B9, B6, B2, BF, CF, M9); \ |
||||
PERM_ELT(A0A, A09, BA, B7, B3, B0, CE, MA); \ |
||||
PERM_ELT(A0B, A0A, BB, B8, B4, B1, CD, MB); \ |
||||
PERM_ELT(A00, A0B, BC, B9, B5, B2, CC, MC); \ |
||||
PERM_ELT(A01, A00, BD, BA, B6, B3, CB, MD); \ |
||||
PERM_ELT(A02, A01, BE, BB, B7, B4, CA, ME); \ |
||||
PERM_ELT(A03, A02, BF, BC, B8, B5, C9, MF); \ |
||||
} while (0) |
||||
|
||||
#define PERM_STEP_1 do { \ |
||||
PERM_ELT(A04, A03, B0, BD, B9, B6, C8, M0); \ |
||||
PERM_ELT(A05, A04, B1, BE, BA, B7, C7, M1); \ |
||||
PERM_ELT(A06, A05, B2, BF, BB, B8, C6, M2); \ |
||||
PERM_ELT(A07, A06, B3, B0, BC, B9, C5, M3); \ |
||||
PERM_ELT(A08, A07, B4, B1, BD, BA, C4, M4); \ |
||||
PERM_ELT(A09, A08, B5, B2, BE, BB, C3, M5); \ |
||||
PERM_ELT(A0A, A09, B6, B3, BF, BC, C2, M6); \ |
||||
PERM_ELT(A0B, A0A, B7, B4, B0, BD, C1, M7); \ |
||||
PERM_ELT(A00, A0B, B8, B5, B1, BE, C0, M8); \ |
||||
PERM_ELT(A01, A00, B9, B6, B2, BF, CF, M9); \ |
||||
PERM_ELT(A02, A01, BA, B7, B3, B0, CE, MA); \ |
||||
PERM_ELT(A03, A02, BB, B8, B4, B1, CD, MB); \ |
||||
PERM_ELT(A04, A03, BC, B9, B5, B2, CC, MC); \ |
||||
PERM_ELT(A05, A04, BD, BA, B6, B3, CB, MD); \ |
||||
PERM_ELT(A06, A05, BE, BB, B7, B4, CA, ME); \ |
||||
PERM_ELT(A07, A06, BF, BC, B8, B5, C9, MF); \ |
||||
} while (0) |
||||
|
||||
#define PERM_STEP_2 do { \ |
||||
PERM_ELT(A08, A07, B0, BD, B9, B6, C8, M0); \ |
||||
PERM_ELT(A09, A08, B1, BE, BA, B7, C7, M1); \ |
||||
PERM_ELT(A0A, A09, B2, BF, BB, B8, C6, M2); \ |
||||
PERM_ELT(A0B, A0A, B3, B0, BC, B9, C5, M3); \ |
||||
PERM_ELT(A00, A0B, B4, B1, BD, BA, C4, M4); \ |
||||
PERM_ELT(A01, A00, B5, B2, BE, BB, C3, M5); \ |
||||
PERM_ELT(A02, A01, B6, B3, BF, BC, C2, M6); \ |
||||
PERM_ELT(A03, A02, B7, B4, B0, BD, C1, M7); \ |
||||
PERM_ELT(A04, A03, B8, B5, B1, BE, C0, M8); \ |
||||
PERM_ELT(A05, A04, B9, B6, B2, BF, CF, M9); \ |
||||
PERM_ELT(A06, A05, BA, B7, B3, B0, CE, MA); \ |
||||
PERM_ELT(A07, A06, BB, B8, B4, B1, CD, MB); \ |
||||
PERM_ELT(A08, A07, BC, B9, B5, B2, CC, MC); \ |
||||
PERM_ELT(A09, A08, BD, BA, B6, B3, CB, MD); \ |
||||
PERM_ELT(A0A, A09, BE, BB, B7, B4, CA, ME); \ |
||||
PERM_ELT(A0B, A0A, BF, BC, B8, B5, C9, MF); \ |
||||
} while (0) |
||||
|
||||
#define APPLY_P do { \ |
||||
B0 = T32(B0 << 17) | (B0 >> 15); \ |
||||
B1 = T32(B1 << 17) | (B1 >> 15); \ |
||||
B2 = T32(B2 << 17) | (B2 >> 15); \ |
||||
B3 = T32(B3 << 17) | (B3 >> 15); \ |
||||
B4 = T32(B4 << 17) | (B4 >> 15); \ |
||||
B5 = T32(B5 << 17) | (B5 >> 15); \ |
||||
B6 = T32(B6 << 17) | (B6 >> 15); \ |
||||
B7 = T32(B7 << 17) | (B7 >> 15); \ |
||||
B8 = T32(B8 << 17) | (B8 >> 15); \ |
||||
B9 = T32(B9 << 17) | (B9 >> 15); \ |
||||
BA = T32(BA << 17) | (BA >> 15); \ |
||||
BB = T32(BB << 17) | (BB >> 15); \ |
||||
BC = T32(BC << 17) | (BC >> 15); \ |
||||
BD = T32(BD << 17) | (BD >> 15); \ |
||||
BE = T32(BE << 17) | (BE >> 15); \ |
||||
BF = T32(BF << 17) | (BF >> 15); \ |
||||
PERM_STEP_0; \ |
||||
PERM_STEP_1; \ |
||||
PERM_STEP_2; \ |
||||
A0B = T32(A0B + C6); \ |
||||
A0A = T32(A0A + C5); \ |
||||
A09 = T32(A09 + C4); \ |
||||
A08 = T32(A08 + C3); \ |
||||
A07 = T32(A07 + C2); \ |
||||
A06 = T32(A06 + C1); \ |
||||
A05 = T32(A05 + C0); \ |
||||
A04 = T32(A04 + CF); \ |
||||
A03 = T32(A03 + CE); \ |
||||
A02 = T32(A02 + CD); \ |
||||
A01 = T32(A01 + CC); \ |
||||
A00 = T32(A00 + CB); \ |
||||
A0B = T32(A0B + CA); \ |
||||
A0A = T32(A0A + C9); \ |
||||
A09 = T32(A09 + C8); \ |
||||
A08 = T32(A08 + C7); \ |
||||
A07 = T32(A07 + C6); \ |
||||
A06 = T32(A06 + C5); \ |
||||
A05 = T32(A05 + C4); \ |
||||
A04 = T32(A04 + C3); \ |
||||
A03 = T32(A03 + C2); \ |
||||
A02 = T32(A02 + C1); \ |
||||
A01 = T32(A01 + C0); \ |
||||
A00 = T32(A00 + CF); \ |
||||
A0B = T32(A0B + CE); \ |
||||
A0A = T32(A0A + CD); \ |
||||
A09 = T32(A09 + CC); \ |
||||
A08 = T32(A08 + CB); \ |
||||
A07 = T32(A07 + CA); \ |
||||
A06 = T32(A06 + C9); \ |
||||
A05 = T32(A05 + C8); \ |
||||
A04 = T32(A04 + C7); \ |
||||
A03 = T32(A03 + C6); \ |
||||
A02 = T32(A02 + C5); \ |
||||
A01 = T32(A01 + C4); \ |
||||
A00 = T32(A00 + C3); \ |
||||
} while (0) |
||||
|
||||
#define INCR_W do { \ |
||||
if ((Wlow = T32(Wlow + 1)) == 0) \ |
||||
Whigh = T32(Whigh + 1); \ |
||||
} while (0) |
||||
|
||||
__constant static const sph_u32 A_init_192[] = { |
||||
C32(0xFD749ED4), C32(0xB798E530), C32(0x33904B6F), C32(0x46BDA85E), |
||||
C32(0x076934B4), C32(0x454B4058), C32(0x77F74527), C32(0xFB4CF465), |
||||
C32(0x62931DA9), C32(0xE778C8DB), C32(0x22B3998E), C32(0xAC15CFB9) |
||||
}; |
||||
|
||||
__constant static const sph_u32 B_init_192[] = { |
||||
C32(0x58BCBAC4), C32(0xEC47A08E), C32(0xAEE933B2), C32(0xDFCBC824), |
||||
C32(0xA7944804), C32(0xBF65BDB0), C32(0x5A9D4502), C32(0x59979AF7), |
||||
C32(0xC5CEA54E), C32(0x4B6B8150), C32(0x16E71909), C32(0x7D632319), |
||||
C32(0x930573A0), C32(0xF34C63D1), C32(0xCAF914B4), C32(0xFDD6612C) |
||||
}; |
||||
|
||||
__constant static const sph_u32 C_init_192[] = { |
||||
C32(0x61550878), C32(0x89EF2B75), C32(0xA1660C46), C32(0x7EF3855B), |
||||
C32(0x7297B58C), C32(0x1BC67793), C32(0x7FB1C723), C32(0xB66FC640), |
||||
C32(0x1A48B71C), C32(0xF0976D17), C32(0x088CE80A), C32(0xA454EDF3), |
||||
C32(0x1C096BF4), C32(0xAC76224B), C32(0x5215781C), C32(0xCD5D2669) |
||||
}; |
||||
|
||||
__constant static const sph_u32 A_init_224[] = { |
||||
C32(0xA5201467), C32(0xA9B8D94A), C32(0xD4CED997), C32(0x68379D7B), |
||||
C32(0xA7FC73BA), C32(0xF1A2546B), C32(0x606782BF), C32(0xE0BCFD0F), |
||||
C32(0x2F25374E), C32(0x069A149F), C32(0x5E2DFF25), C32(0xFAECF061) |
||||
}; |
||||
|
||||
__constant static const sph_u32 B_init_224[] = { |
||||
C32(0xEC9905D8), C32(0xF21850CF), C32(0xC0A746C8), C32(0x21DAD498), |
||||
C32(0x35156EEB), C32(0x088C97F2), C32(0x26303E40), C32(0x8A2D4FB5), |
||||
C32(0xFEEE44B6), C32(0x8A1E9573), C32(0x7B81111A), C32(0xCBC139F0), |
||||
C32(0xA3513861), C32(0x1D2C362E), C32(0x918C580E), C32(0xB58E1B9C) |
||||
}; |
||||
|
||||
__constant static const sph_u32 C_init_224[] = { |
||||
C32(0xE4B573A1), C32(0x4C1A0880), C32(0x1E907C51), C32(0x04807EFD), |
||||
C32(0x3AD8CDE5), C32(0x16B21302), C32(0x02512C53), C32(0x2204CB18), |
||||
C32(0x99405F2D), C32(0xE5B648A1), C32(0x70AB1D43), C32(0xA10C25C2), |
||||
C32(0x16F1AC05), C32(0x38BBEB56), C32(0x9B01DC60), C32(0xB1096D83) |
||||
}; |
||||
|
||||
__constant static const sph_u32 A_init_256[] = { |
||||
C32(0x52F84552), C32(0xE54B7999), C32(0x2D8EE3EC), C32(0xB9645191), |
||||
C32(0xE0078B86), C32(0xBB7C44C9), C32(0xD2B5C1CA), C32(0xB0D2EB8C), |
||||
C32(0x14CE5A45), C32(0x22AF50DC), C32(0xEFFDBC6B), C32(0xEB21B74A) |
||||
}; |
||||
|
||||
__constant static const sph_u32 B_init_256[] = { |
||||
C32(0xB555C6EE), C32(0x3E710596), C32(0xA72A652F), C32(0x9301515F), |
||||
C32(0xDA28C1FA), C32(0x696FD868), C32(0x9CB6BF72), C32(0x0AFE4002), |
||||
C32(0xA6E03615), C32(0x5138C1D4), C32(0xBE216306), C32(0xB38B8890), |
||||
C32(0x3EA8B96B), C32(0x3299ACE4), C32(0x30924DD4), C32(0x55CB34A5) |
||||
}; |
||||
|
||||
__constant static const sph_u32 C_init_256[] = { |
||||
C32(0xB405F031), C32(0xC4233EBA), C32(0xB3733979), C32(0xC0DD9D55), |
||||
C32(0xC51C28AE), C32(0xA327B8E1), C32(0x56C56167), C32(0xED614433), |
||||
C32(0x88B59D60), C32(0x60E2CEBA), C32(0x758B4B8B), C32(0x83E82A7F), |
||||
C32(0xBC968828), C32(0xE6E00BF7), C32(0xBA839E55), C32(0x9B491C60) |
||||
}; |
||||
|
||||
__constant static const sph_u32 A_init_384[] = { |
||||
C32(0xC8FCA331), C32(0xE55C504E), C32(0x003EBF26), C32(0xBB6B8D83), |
||||
C32(0x7B0448C1), C32(0x41B82789), C32(0x0A7C9601), C32(0x8D659CFF), |
||||
C32(0xB6E2673E), C32(0xCA54C77B), C32(0x1460FD7E), C32(0x3FCB8F2D) |
||||
}; |
||||
|
||||
__constant static const sph_u32 B_init_384[] = { |
||||
C32(0x527291FC), C32(0x2A16455F), C32(0x78E627E5), C32(0x944F169F), |
||||
C32(0x1CA6F016), C32(0xA854EA25), C32(0x8DB98ABE), C32(0xF2C62641), |
||||
C32(0x30117DCB), C32(0xCF5C4309), C32(0x93711A25), C32(0xF9F671B8), |
||||
C32(0xB01D2116), C32(0x333F4B89), C32(0xB285D165), C32(0x86829B36) |
||||
}; |
||||
|
||||
__constant static const sph_u32 C_init_384[] = { |
||||
C32(0xF764B11A), C32(0x76172146), C32(0xCEF6934D), C32(0xC6D28399), |
||||
C32(0xFE095F61), C32(0x5E6018B4), C32(0x5048ECF5), C32(0x51353261), |
||||
C32(0x6E6E36DC), C32(0x63130DAD), C32(0xA9C69BD6), C32(0x1E90EA0C), |
||||
C32(0x7C35073B), C32(0x28D95E6D), C32(0xAA340E0D), C32(0xCB3DEE70) |
||||
}; |
||||
|
||||
__constant static const sph_u32 A_init_512[] = { |
||||
C32(0x20728DFD), C32(0x46C0BD53), C32(0xE782B699), C32(0x55304632), |
||||
C32(0x71B4EF90), C32(0x0EA9E82C), C32(0xDBB930F1), C32(0xFAD06B8B), |
||||
C32(0xBE0CAE40), C32(0x8BD14410), C32(0x76D2ADAC), C32(0x28ACAB7F) |
||||
}; |
||||
|
||||
__constant static const sph_u32 B_init_512[] = { |
||||
C32(0xC1099CB7), C32(0x07B385F3), C32(0xE7442C26), C32(0xCC8AD640), |
||||
C32(0xEB6F56C7), C32(0x1EA81AA9), C32(0x73B9D314), C32(0x1DE85D08), |
||||
C32(0x48910A5A), C32(0x893B22DB), C32(0xC5A0DF44), C32(0xBBC4324E), |
||||
C32(0x72D2F240), C32(0x75941D99), C32(0x6D8BDE82), C32(0xA1A7502B) |
||||
}; |
||||
|
||||
__constant static const sph_u32 C_init_512[] = { |
||||
C32(0xD9BF68D1), C32(0x58BAD750), C32(0x56028CB2), C32(0x8134F359), |
||||
C32(0xB5D469D8), C32(0x941A8CC2), C32(0x418B2A6E), C32(0x04052780), |
||||
C32(0x7F07D787), C32(0x5194358F), C32(0x3C60D665), C32(0xBE97D79A), |
||||
C32(0x950C3434), C32(0xAED9A06D), C32(0x2537DC8D), C32(0x7CDB5969) |
||||
}; |
||||
|
||||
/* END -- automatically generated code. */ |
@ -1,3 +1,3 @@
@@ -1,3 +1,3 @@
|
||||
noinst_LIBRARIES = libsph.a |
||||
|
||||
libsph_a_SOURCES = bmw.c echo.c jh.c luffa.c simd.c blake.c cubehash.c groestl.c keccak.c shavite.c skein.c sha2.c sha2big.c fugue.c hamsi.c panama.c |
||||
libsph_a_SOURCES = bmw.c echo.c jh.c luffa.c simd.c blake.c cubehash.c groestl.c keccak.c shavite.c skein.c sha2.c sha2big.c fugue.c hamsi.c panama.c shabal.c whirlpool.c |
||||
|
@ -0,0 +1,806 @@
@@ -0,0 +1,806 @@
|
||||
/* $Id: shabal.c 175 2010-05-07 16:03:20Z tp $ */ |
||||
/*
|
||||
* Shabal implementation. |
||||
* |
||||
* ==========================(LICENSE BEGIN)============================ |
||||
* |
||||
* Copyright (c) 2007-2010 Projet RNRT SAPHIR |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining |
||||
* a copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sublicense, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice shall be |
||||
* included in all copies or substantial portions of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
* ===========================(LICENSE END)============================= |
||||
* |
||||
* @author Thomas Pornin <thomas.pornin@cryptolog.com> |
||||
*/ |
||||
|
||||
#include <stddef.h> |
||||
#include <string.h> |
||||
|
||||
#include "sph_shabal.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C"{ |
||||
#endif |
||||
|
||||
#ifdef _MSC_VER |
||||
#pragma warning (disable: 4146) |
||||
#endif |
||||
|
||||
/*
|
||||
* Part of this code was automatically generated (the part between |
||||
* the "BEGIN" and "END" markers). |
||||
*/ |
||||
|
||||
#define sM 16 |
||||
|
||||
#define C32 SPH_C32 |
||||
#define T32 SPH_T32 |
||||
|
||||
#define O1 13 |
||||
#define O2 9 |
||||
#define O3 6 |
||||
|
||||
/*
|
||||
* We copy the state into local variables, so that the compiler knows |
||||
* that it can optimize them at will. |
||||
*/ |
||||
|
||||
/* BEGIN -- automatically generated code. */ |
||||
|
||||
#define DECL_STATE \ |
||||
sph_u32 A00, A01, A02, A03, A04, A05, A06, A07, \ |
||||
A08, A09, A0A, A0B; \ |
||||
sph_u32 B0, B1, B2, B3, B4, B5, B6, B7, \ |
||||
B8, B9, BA, BB, BC, BD, BE, BF; \ |
||||
sph_u32 C0, C1, C2, C3, C4, C5, C6, C7, \ |
||||
C8, C9, CA, CB, CC, CD, CE, CF; \ |
||||
sph_u32 M0, M1, M2, M3, M4, M5, M6, M7, \ |
||||
M8, M9, MA, MB, MC, MD, ME, MF; \ |
||||
sph_u32 Wlow, Whigh; |
||||
|
||||
#define READ_STATE(state) do { \ |
||||
A00 = (state)->A[0]; \ |
||||
A01 = (state)->A[1]; \ |
||||
A02 = (state)->A[2]; \ |
||||
A03 = (state)->A[3]; \ |
||||
A04 = (state)->A[4]; \ |
||||
A05 = (state)->A[5]; \ |
||||
A06 = (state)->A[6]; \ |
||||
A07 = (state)->A[7]; \ |
||||
A08 = (state)->A[8]; \ |
||||
A09 = (state)->A[9]; \ |
||||
A0A = (state)->A[10]; \ |
||||
A0B = (state)->A[11]; \ |
||||
B0 = (state)->B[0]; \ |
||||
B1 = (state)->B[1]; \ |
||||
B2 = (state)->B[2]; \ |
||||
B3 = (state)->B[3]; \ |
||||
B4 = (state)->B[4]; \ |
||||
B5 = (state)->B[5]; \ |
||||
B6 = (state)->B[6]; \ |
||||
B7 = (state)->B[7]; \ |
||||
B8 = (state)->B[8]; \ |
||||
B9 = (state)->B[9]; \ |
||||
BA = (state)->B[10]; \ |
||||
BB = (state)->B[11]; \ |
||||
BC = (state)->B[12]; \ |
||||
BD = (state)->B[13]; \ |
||||
BE = (state)->B[14]; \ |
||||
BF = (state)->B[15]; \ |
||||
C0 = (state)->C[0]; \ |
||||
C1 = (state)->C[1]; \ |
||||
C2 = (state)->C[2]; \ |
||||
C3 = (state)->C[3]; \ |
||||
C4 = (state)->C[4]; \ |
||||
C5 = (state)->C[5]; \ |
||||
C6 = (state)->C[6]; \ |
||||
C7 = (state)->C[7]; \ |
||||
C8 = (state)->C[8]; \ |
||||
C9 = (state)->C[9]; \ |
||||
CA = (state)->C[10]; \ |
||||
CB = (state)->C[11]; \ |
||||
CC = (state)->C[12]; \ |
||||
CD = (state)->C[13]; \ |
||||
CE = (state)->C[14]; \ |
||||
CF = (state)->C[15]; \ |
||||
Wlow = (state)->Wlow; \ |
||||
Whigh = (state)->Whigh; \ |
||||
} while (0) |
||||
|
||||
#define WRITE_STATE(state) do { \ |
||||
(state)->A[0] = A00; \ |
||||
(state)->A[1] = A01; \ |
||||
(state)->A[2] = A02; \ |
||||
(state)->A[3] = A03; \ |
||||
(state)->A[4] = A04; \ |
||||
(state)->A[5] = A05; \ |
||||
(state)->A[6] = A06; \ |
||||
(state)->A[7] = A07; \ |
||||
(state)->A[8] = A08; \ |
||||
(state)->A[9] = A09; \ |
||||
(state)->A[10] = A0A; \ |
||||
(state)->A[11] = A0B; \ |
||||
(state)->B[0] = B0; \ |
||||
(state)->B[1] = B1; \ |
||||
(state)->B[2] = B2; \ |
||||
(state)->B[3] = B3; \ |
||||
(state)->B[4] = B4; \ |
||||
(state)->B[5] = B5; \ |
||||
(state)->B[6] = B6; \ |
||||
(state)->B[7] = B7; \ |
||||
(state)->B[8] = B8; \ |
||||
(state)->B[9] = B9; \ |
||||
(state)->B[10] = BA; \ |
||||
(state)->B[11] = BB; \ |
||||
(state)->B[12] = BC; \ |
||||
(state)->B[13] = BD; \ |
||||
(state)->B[14] = BE; \ |
||||
(state)->B[15] = BF; \ |
||||
(state)->C[0] = C0; \ |
||||
(state)->C[1] = C1; \ |
||||
(state)->C[2] = C2; \ |
||||
(state)->C[3] = C3; \ |
||||
(state)->C[4] = C4; \ |
||||
(state)->C[5] = C5; \ |
||||
(state)->C[6] = C6; \ |
||||
(state)->C[7] = C7; \ |
||||
(state)->C[8] = C8; \ |
||||
(state)->C[9] = C9; \ |
||||
(state)->C[10] = CA; \ |
||||
(state)->C[11] = CB; \ |
||||
(state)->C[12] = CC; \ |
||||
(state)->C[13] = CD; \ |
||||
(state)->C[14] = CE; \ |
||||
(state)->C[15] = CF; \ |
||||
(state)->Wlow = Wlow; \ |
||||
(state)->Whigh = Whigh; \ |
||||
} while (0) |
||||
|
||||
#define DECODE_BLOCK do { \ |
||||
M0 = sph_dec32le_aligned(buf + 0); \ |
||||
M1 = sph_dec32le_aligned(buf + 4); \ |
||||
M2 = sph_dec32le_aligned(buf + 8); \ |
||||
M3 = sph_dec32le_aligned(buf + 12); \ |
||||
M4 = sph_dec32le_aligned(buf + 16); \ |
||||
M5 = sph_dec32le_aligned(buf + 20); \ |
||||
M6 = sph_dec32le_aligned(buf + 24); \ |
||||
M7 = sph_dec32le_aligned(buf + 28); \ |
||||
M8 = sph_dec32le_aligned(buf + 32); \ |
||||
M9 = sph_dec32le_aligned(buf + 36); \ |
||||
MA = sph_dec32le_aligned(buf + 40); \ |
||||
MB = sph_dec32le_aligned(buf + 44); \ |
||||
MC = sph_dec32le_aligned(buf + 48); \ |
||||
MD = sph_dec32le_aligned(buf + 52); \ |
||||
ME = sph_dec32le_aligned(buf + 56); \ |
||||
MF = sph_dec32le_aligned(buf + 60); \ |
||||
} while (0) |
||||
|
||||
#define INPUT_BLOCK_ADD do { \ |
||||
B0 = T32(B0 + M0); \ |
||||
B1 = T32(B1 + M1); \ |
||||
B2 = T32(B2 + M2); \ |
||||
B3 = T32(B3 + M3); \ |
||||
B4 = T32(B4 + M4); \ |
||||
B5 = T32(B5 + M5); \ |
||||
B6 = T32(B6 + M6); \ |
||||
B7 = T32(B7 + M7); \ |
||||
B8 = T32(B8 + M8); \ |
||||
B9 = T32(B9 + M9); \ |
||||
BA = T32(BA + MA); \ |
||||
BB = T32(BB + MB); \ |
||||
BC = T32(BC + MC); \ |
||||
BD = T32(BD + MD); \ |
||||
BE = T32(BE + ME); \ |
||||
BF = T32(BF + MF); \ |
||||
} while (0) |
||||
|
||||
#define INPUT_BLOCK_SUB do { \ |
||||
C0 = T32(C0 - M0); \ |
||||
C1 = T32(C1 - M1); \ |
||||
C2 = T32(C2 - M2); \ |
||||
C3 = T32(C3 - M3); \ |
||||
C4 = T32(C4 - M4); \ |
||||
C5 = T32(C5 - M5); \ |
||||
C6 = T32(C6 - M6); \ |
||||
C7 = T32(C7 - M7); \ |
||||
C8 = T32(C8 - M8); \ |
||||
C9 = T32(C9 - M9); \ |
||||
CA = T32(CA - MA); \ |
||||
CB = T32(CB - MB); \ |
||||
CC = T32(CC - MC); \ |
||||
CD = T32(CD - MD); \ |
||||
CE = T32(CE - ME); \ |
||||
CF = T32(CF - MF); \ |
||||
} while (0) |
||||
|
||||
#define XOR_W do { \ |
||||
A00 ^= Wlow; \ |
||||
A01 ^= Whigh; \ |
||||
} while (0) |
||||
|
||||
#define SWAP(v1, v2) do { \ |
||||
sph_u32 tmp = (v1); \ |
||||
(v1) = (v2); \ |
||||
(v2) = tmp; \ |
||||
} while (0) |
||||
|
||||
#define SWAP_BC do { \ |
||||
SWAP(B0, C0); \ |
||||
SWAP(B1, C1); \ |
||||
SWAP(B2, C2); \ |
||||
SWAP(B3, C3); \ |
||||
SWAP(B4, C4); \ |
||||
SWAP(B5, C5); \ |
||||
SWAP(B6, C6); \ |
||||
SWAP(B7, C7); \ |
||||
SWAP(B8, C8); \ |
||||
SWAP(B9, C9); \ |
||||
SWAP(BA, CA); \ |
||||
SWAP(BB, CB); \ |
||||
SWAP(BC, CC); \ |
||||
SWAP(BD, CD); \ |
||||
SWAP(BE, CE); \ |
||||
SWAP(BF, CF); \ |
||||
} while (0) |
||||
|
||||
#define PERM_ELT(xa0, xa1, xb0, xb1, xb2, xb3, xc, xm) do { \ |
||||
xa0 = T32((xa0 \ |
||||
^ (((xa1 << 15) | (xa1 >> 17)) * 5U) \ |
||||
^ xc) * 3U) \ |
||||
^ xb1 ^ (xb2 & ~xb3) ^ xm; \ |
||||
xb0 = T32(~(((xb0 << 1) | (xb0 >> 31)) ^ xa0)); \ |
||||
} while (0) |
||||
|
||||
#define PERM_STEP_0 do { \ |
||||
PERM_ELT(A00, A0B, B0, BD, B9, B6, C8, M0); \ |
||||
PERM_ELT(A01, A00, B1, BE, BA, B7, C7, M1); \ |
||||
PERM_ELT(A02, A01, B2, BF, BB, B8, C6, M2); \ |
||||
PERM_ELT(A03, A02, B3, B0, BC, B9, C5, M3); \ |
||||
PERM_ELT(A04, A03, B4, B1, BD, BA, C4, M4); \ |
||||
PERM_ELT(A05, A04, B5, B2, BE, BB, C3, M5); \ |
||||
PERM_ELT(A06, A05, B6, B3, BF, BC, C2, M6); \ |
||||
PERM_ELT(A07, A06, B7, B4, B0, BD, C1, M7); \ |
||||
PERM_ELT(A08, A07, B8, B5, B1, BE, C0, M8); \ |
||||
PERM_ELT(A09, A08, B9, B6, B2, BF, CF, M9); \ |
||||
PERM_ELT(A0A, A09, BA, B7, B3, B0, CE, MA); \ |
||||
PERM_ELT(A0B, A0A, BB, B8, B4, B1, CD, MB); \ |
||||
PERM_ELT(A00, A0B, BC, B9, B5, B2, CC, MC); \ |
||||
PERM_ELT(A01, A00, BD, BA, B6, B3, CB, MD); \ |
||||
PERM_ELT(A02, A01, BE, BB, B7, B4, CA, ME); \ |
||||
PERM_ELT(A03, A02, BF, BC, B8, B5, C9, MF); \ |
||||
} while (0) |
||||
|
||||
#define PERM_STEP_1 do { \ |
||||
PERM_ELT(A04, A03, B0, BD, B9, B6, C8, M0); \ |
||||
PERM_ELT(A05, A04, B1, BE, BA, B7, C7, M1); \ |
||||
PERM_ELT(A06, A05, B2, BF, BB, B8, C6, M2); \ |
||||
PERM_ELT(A07, A06, B3, B0, BC, B9, C5, M3); \ |
||||
PERM_ELT(A08, A07, B4, B1, BD, BA, C4, M4); \ |
||||
PERM_ELT(A09, A08, B5, B2, BE, BB, C3, M5); \ |
||||
PERM_ELT(A0A, A09, B6, B3, BF, BC, C2, M6); \ |
||||
PERM_ELT(A0B, A0A, B7, B4, B0, BD, C1, M7); \ |
||||
PERM_ELT(A00, A0B, B8, B5, B1, BE, C0, M8); \ |
||||
PERM_ELT(A01, A00, B9, B6, B2, BF, CF, M9); \ |
||||
PERM_ELT(A02, A01, BA, B7, B3, B0, CE, MA); \ |
||||
PERM_ELT(A03, A02, BB, B8, B4, B1, CD, MB); \ |
||||
PERM_ELT(A04, A03, BC, B9, B5, B2, CC, MC); \ |
||||
PERM_ELT(A05, A04, BD, BA, B6, B3, CB, MD); \ |
||||
PERM_ELT(A06, A05, BE, BB, B7, B4, CA, ME); \ |
||||
PERM_ELT(A07, A06, BF, BC, B8, B5, C9, MF); \ |
||||
} while (0) |
||||
|
||||
#define PERM_STEP_2 do { \ |
||||
PERM_ELT(A08, A07, B0, BD, B9, B6, C8, M0); \ |
||||
PERM_ELT(A09, A08, B1, BE, BA, B7, C7, M1); \ |
||||
PERM_ELT(A0A, A09, B2, BF, BB, B8, C6, M2); \ |
||||
PERM_ELT(A0B, A0A, B3, B0, BC, B9, C5, M3); \ |
||||
PERM_ELT(A00, A0B, B4, B1, BD, BA, C4, M4); \ |
||||
PERM_ELT(A01, A00, B5, B2, BE, BB, C3, M5); \ |
||||
PERM_ELT(A02, A01, B6, B3, BF, BC, C2, M6); \ |
||||
PERM_ELT(A03, A02, B7, B4, B0, BD, C1, M7); \ |
||||
PERM_ELT(A04, A03, B8, B5, B1, BE, C0, M8); \ |
||||
PERM_ELT(A05, A04, B9, B6, B2, BF, CF, M9); \ |
||||
PERM_ELT(A06, A05, BA, B7, B3, B0, CE, MA); \ |
||||
PERM_ELT(A07, A06, BB, B8, B4, B1, CD, MB); \ |
||||
PERM_ELT(A08, A07, BC, B9, B5, B2, CC, MC); \ |
||||
PERM_ELT(A09, A08, BD, BA, B6, B3, CB, MD); \ |
||||
PERM_ELT(A0A, A09, BE, BB, B7, B4, CA, ME); \ |
||||
PERM_ELT(A0B, A0A, BF, BC, B8, B5, C9, MF); \ |
||||
} while (0) |
||||
|
||||
#define APPLY_P do { \ |
||||
B0 = T32(B0 << 17) | (B0 >> 15); \ |
||||
B1 = T32(B1 << 17) | (B1 >> 15); \ |
||||
B2 = T32(B2 << 17) | (B2 >> 15); \ |
||||
B3 = T32(B3 << 17) | (B3 >> 15); \ |
||||
B4 = T32(B4 << 17) | (B4 >> 15); \ |
||||
B5 = T32(B5 << 17) | (B5 >> 15); \ |
||||
B6 = T32(B6 << 17) | (B6 >> 15); \ |
||||
B7 = T32(B7 << 17) | (B7 >> 15); \ |
||||
B8 = T32(B8 << 17) | (B8 >> 15); \ |
||||
B9 = T32(B9 << 17) | (B9 >> 15); \ |
||||
BA = T32(BA << 17) | (BA >> 15); \ |
||||
BB = T32(BB << 17) | (BB >> 15); \ |
||||
BC = T32(BC << 17) | (BC >> 15); \ |
||||
BD = T32(BD << 17) | (BD >> 15); \ |
||||
BE = T32(BE << 17) | (BE >> 15); \ |
||||
BF = T32(BF << 17) | (BF >> 15); \ |
||||
PERM_STEP_0; \ |
||||
PERM_STEP_1; \ |
||||
PERM_STEP_2; \ |
||||
A0B = T32(A0B + C6); \ |
||||
A0A = T32(A0A + C5); \ |
||||
A09 = T32(A09 + C4); \ |
||||
A08 = T32(A08 + C3); \ |
||||
A07 = T32(A07 + C2); \ |
||||
A06 = T32(A06 + C1); \ |
||||
A05 = T32(A05 + C0); \ |
||||
A04 = T32(A04 + CF); \ |
||||
A03 = T32(A03 + CE); \ |
||||
A02 = T32(A02 + CD); \ |
||||
A01 = T32(A01 + CC); \ |
||||
A00 = T32(A00 + CB); \ |
||||
A0B = T32(A0B + CA); \ |
||||
A0A = T32(A0A + C9); \ |
||||
A09 = T32(A09 + C8); \ |
||||
A08 = T32(A08 + C7); \ |
||||
A07 = T32(A07 + C6); \ |
||||
A06 = T32(A06 + C5); \ |
||||
A05 = T32(A05 + C4); \ |
||||
A04 = T32(A04 + C3); \ |
||||
A03 = T32(A03 + C2); \ |
||||
A02 = T32(A02 + C1); \ |
||||
A01 = T32(A01 + C0); \ |
||||
A00 = T32(A00 + CF); \ |
||||
A0B = T32(A0B + CE); \ |
||||
A0A = T32(A0A + CD); \ |
||||
A09 = T32(A09 + CC); \ |
||||
A08 = T32(A08 + CB); \ |
||||
A07 = T32(A07 + CA); \ |
||||
A06 = T32(A06 + C9); \ |
||||
A05 = T32(A05 + C8); \ |
||||
A04 = T32(A04 + C7); \ |
||||
A03 = T32(A03 + C6); \ |
||||
A02 = T32(A02 + C5); \ |
||||
A01 = T32(A01 + C4); \ |
||||
A00 = T32(A00 + C3); \ |
||||
} while (0) |
||||
|
||||
#define INCR_W do { \ |
||||
if ((Wlow = T32(Wlow + 1)) == 0) \ |
||||
Whigh = T32(Whigh + 1); \ |
||||
} while (0) |
||||
|
||||
static const sph_u32 A_init_192[] = { |
||||
C32(0xFD749ED4), C32(0xB798E530), C32(0x33904B6F), C32(0x46BDA85E), |
||||
C32(0x076934B4), C32(0x454B4058), C32(0x77F74527), C32(0xFB4CF465), |
||||
C32(0x62931DA9), C32(0xE778C8DB), C32(0x22B3998E), C32(0xAC15CFB9) |
||||
}; |
||||
|
||||
static const sph_u32 B_init_192[] = { |
||||
C32(0x58BCBAC4), C32(0xEC47A08E), C32(0xAEE933B2), C32(0xDFCBC824), |
||||
C32(0xA7944804), C32(0xBF65BDB0), C32(0x5A9D4502), C32(0x59979AF7), |
||||
C32(0xC5CEA54E), C32(0x4B6B8150), C32(0x16E71909), C32(0x7D632319), |
||||
C32(0x930573A0), C32(0xF34C63D1), C32(0xCAF914B4), C32(0xFDD6612C) |
||||
}; |
||||
|
||||
static const sph_u32 C_init_192[] = { |
||||
C32(0x61550878), C32(0x89EF2B75), C32(0xA1660C46), C32(0x7EF3855B), |
||||
C32(0x7297B58C), C32(0x1BC67793), C32(0x7FB1C723), C32(0xB66FC640), |
||||
C32(0x1A48B71C), C32(0xF0976D17), C32(0x088CE80A), C32(0xA454EDF3), |
||||
C32(0x1C096BF4), C32(0xAC76224B), C32(0x5215781C), C32(0xCD5D2669) |
||||
}; |
||||
|
||||
static const sph_u32 A_init_224[] = { |
||||
C32(0xA5201467), C32(0xA9B8D94A), C32(0xD4CED997), C32(0x68379D7B), |
||||
C32(0xA7FC73BA), C32(0xF1A2546B), C32(0x606782BF), C32(0xE0BCFD0F), |
||||
C32(0x2F25374E), C32(0x069A149F), C32(0x5E2DFF25), C32(0xFAECF061) |
||||
}; |
||||
|
||||
static const sph_u32 B_init_224[] = { |
||||
C32(0xEC9905D8), C32(0xF21850CF), C32(0xC0A746C8), C32(0x21DAD498), |
||||
C32(0x35156EEB), C32(0x088C97F2), C32(0x26303E40), C32(0x8A2D4FB5), |
||||
C32(0xFEEE44B6), C32(0x8A1E9573), C32(0x7B81111A), C32(0xCBC139F0), |
||||
C32(0xA3513861), C32(0x1D2C362E), C32(0x918C580E), C32(0xB58E1B9C) |
||||
}; |
||||
|
||||
static const sph_u32 C_init_224[] = { |
||||
C32(0xE4B573A1), C32(0x4C1A0880), C32(0x1E907C51), C32(0x04807EFD), |
||||
C32(0x3AD8CDE5), C32(0x16B21302), C32(0x02512C53), C32(0x2204CB18), |
||||
C32(0x99405F2D), C32(0xE5B648A1), C32(0x70AB1D43), C32(0xA10C25C2), |
||||
C32(0x16F1AC05), C32(0x38BBEB56), C32(0x9B01DC60), C32(0xB1096D83) |
||||
}; |
||||
|
||||
static const sph_u32 A_init_256[] = { |
||||
C32(0x52F84552), C32(0xE54B7999), C32(0x2D8EE3EC), C32(0xB9645191), |
||||
C32(0xE0078B86), C32(0xBB7C44C9), C32(0xD2B5C1CA), C32(0xB0D2EB8C), |
||||
C32(0x14CE5A45), C32(0x22AF50DC), C32(0xEFFDBC6B), C32(0xEB21B74A) |
||||
}; |
||||
|
||||
static const sph_u32 B_init_256[] = { |
||||
C32(0xB555C6EE), C32(0x3E710596), C32(0xA72A652F), C32(0x9301515F), |
||||
C32(0xDA28C1FA), C32(0x696FD868), C32(0x9CB6BF72), C32(0x0AFE4002), |
||||
C32(0xA6E03615), C32(0x5138C1D4), C32(0xBE216306), C32(0xB38B8890), |
||||
C32(0x3EA8B96B), C32(0x3299ACE4), C32(0x30924DD4), C32(0x55CB34A5) |
||||
}; |
||||
|
||||
static const sph_u32 C_init_256[] = { |
||||
C32(0xB405F031), C32(0xC4233EBA), C32(0xB3733979), C32(0xC0DD9D55), |
||||
C32(0xC51C28AE), C32(0xA327B8E1), C32(0x56C56167), C32(0xED614433), |
||||
C32(0x88B59D60), C32(0x60E2CEBA), C32(0x758B4B8B), C32(0x83E82A7F), |
||||
C32(0xBC968828), C32(0xE6E00BF7), C32(0xBA839E55), C32(0x9B491C60) |
||||
}; |
||||
|
||||
static const sph_u32 A_init_384[] = { |
||||
C32(0xC8FCA331), C32(0xE55C504E), C32(0x003EBF26), C32(0xBB6B8D83), |
||||
C32(0x7B0448C1), C32(0x41B82789), C32(0x0A7C9601), C32(0x8D659CFF), |
||||
C32(0xB6E2673E), C32(0xCA54C77B), C32(0x1460FD7E), C32(0x3FCB8F2D) |
||||
}; |
||||
|
||||
static const sph_u32 B_init_384[] = { |
||||
C32(0x527291FC), C32(0x2A16455F), C32(0x78E627E5), C32(0x944F169F), |
||||
C32(0x1CA6F016), C32(0xA854EA25), C32(0x8DB98ABE), C32(0xF2C62641), |
||||
C32(0x30117DCB), C32(0xCF5C4309), C32(0x93711A25), C32(0xF9F671B8), |
||||
C32(0xB01D2116), C32(0x333F4B89), C32(0xB285D165), C32(0x86829B36) |
||||
}; |
||||
|
||||
static const sph_u32 C_init_384[] = { |
||||
C32(0xF764B11A), C32(0x76172146), C32(0xCEF6934D), C32(0xC6D28399), |
||||
C32(0xFE095F61), C32(0x5E6018B4), C32(0x5048ECF5), C32(0x51353261), |
||||
C32(0x6E6E36DC), C32(0x63130DAD), C32(0xA9C69BD6), C32(0x1E90EA0C), |
||||
C32(0x7C35073B), C32(0x28D95E6D), C32(0xAA340E0D), C32(0xCB3DEE70) |
||||
}; |
||||
|
||||
static const sph_u32 A_init_512[] = { |
||||
C32(0x20728DFD), C32(0x46C0BD53), C32(0xE782B699), C32(0x55304632), |
||||
C32(0x71B4EF90), C32(0x0EA9E82C), C32(0xDBB930F1), C32(0xFAD06B8B), |
||||
C32(0xBE0CAE40), C32(0x8BD14410), C32(0x76D2ADAC), C32(0x28ACAB7F) |
||||
}; |
||||
|
||||
static const sph_u32 B_init_512[] = { |
||||
C32(0xC1099CB7), C32(0x07B385F3), C32(0xE7442C26), C32(0xCC8AD640), |
||||
C32(0xEB6F56C7), C32(0x1EA81AA9), C32(0x73B9D314), C32(0x1DE85D08), |
||||
C32(0x48910A5A), C32(0x893B22DB), C32(0xC5A0DF44), C32(0xBBC4324E), |
||||
C32(0x72D2F240), C32(0x75941D99), C32(0x6D8BDE82), C32(0xA1A7502B) |
||||
}; |
||||
|
||||
static const sph_u32 C_init_512[] = { |
||||
C32(0xD9BF68D1), C32(0x58BAD750), C32(0x56028CB2), C32(0x8134F359), |
||||
C32(0xB5D469D8), C32(0x941A8CC2), C32(0x418B2A6E), C32(0x04052780), |
||||
C32(0x7F07D787), C32(0x5194358F), C32(0x3C60D665), C32(0xBE97D79A), |
||||
C32(0x950C3434), C32(0xAED9A06D), C32(0x2537DC8D), C32(0x7CDB5969) |
||||
}; |
||||
|
||||
/* END -- automatically generated code. */ |
||||
|
||||
static void |
||||
shabal_init(void *cc, unsigned size) |
||||
{ |
||||
/*
|
||||
* We have precomputed initial states for all the supported |
||||
* output bit lengths. |
||||
*/ |
||||
const sph_u32 *A_init, *B_init, *C_init; |
||||
sph_shabal_context *sc; |
||||
|
||||
switch (size) { |
||||
case 192: |
||||
A_init = A_init_192; |
||||
B_init = B_init_192; |
||||
C_init = C_init_192; |
||||
break; |
||||
case 224: |
||||
A_init = A_init_224; |
||||
B_init = B_init_224; |
||||
C_init = C_init_224; |
||||
break; |
||||
case 256: |
||||
A_init = A_init_256; |
||||
B_init = B_init_256; |
||||
C_init = C_init_256; |
||||
break; |
||||
case 384: |
||||
A_init = A_init_384; |
||||
B_init = B_init_384; |
||||
C_init = C_init_384; |
||||
break; |
||||
case 512: |
||||
A_init = A_init_512; |
||||
B_init = B_init_512; |
||||
C_init = C_init_512; |
||||
break; |
||||
default: |
||||
return; |
||||
} |
||||
sc = (sph_shabal_context *)cc; |
||||
memcpy(sc->A, A_init, sizeof sc->A); |
||||
memcpy(sc->B, B_init, sizeof sc->B); |
||||
memcpy(sc->C, C_init, sizeof sc->C); |
||||
sc->Wlow = 1; |
||||
sc->Whigh = 0; |
||||
sc->ptr = 0; |
||||
} |
||||
|
||||
static void |
||||
shabal_core(void *cc, const unsigned char *data, size_t len) |
||||
{ |
||||
sph_shabal_context *sc; |
||||
unsigned char *buf; |
||||
size_t ptr; |
||||
DECL_STATE |
||||
|
||||
sc = (sph_shabal_context *)cc; |
||||
buf = sc->buf; |
||||
ptr = sc->ptr; |
||||
|
||||
/*
|
||||
* We do not want to copy the state to local variables if the |
||||
* amount of data is less than what is needed to complete the |
||||
* current block. Note that it is anyway suboptimal to call |
||||
* this method many times for small chunks of data. |
||||
*/ |
||||
if (len < (sizeof sc->buf) - ptr) { |
||||
memcpy(buf + ptr, data, len); |
||||
ptr += len; |
||||
sc->ptr = ptr; |
||||
return; |
||||
} |
||||
|
||||
READ_STATE(sc); |
||||
while (len > 0) { |
||||
size_t clen; |
||||
|
||||
clen = (sizeof sc->buf) - ptr; |
||||
if (clen > len) |
||||
clen = len; |
||||
memcpy(buf + ptr, data, clen); |
||||
ptr += clen; |
||||
data += clen; |
||||
len -= clen; |
||||
if (ptr == sizeof sc->buf) { |
||||
DECODE_BLOCK; |
||||
INPUT_BLOCK_ADD; |
||||
XOR_W; |
||||
APPLY_P; |
||||
INPUT_BLOCK_SUB; |
||||
SWAP_BC; |
||||
INCR_W; |
||||
ptr = 0; |
||||
} |
||||
} |
||||
WRITE_STATE(sc); |
||||
sc->ptr = ptr; |
||||
} |
||||
|
||||
static void |
||||
shabal_close(void *cc, unsigned ub, unsigned n, void *dst, unsigned size_words) |
||||
{ |
||||
sph_shabal_context *sc; |
||||
unsigned char *buf; |
||||
size_t ptr; |
||||
int i; |
||||
unsigned z; |
||||
union { |
||||
unsigned char tmp_out[64]; |
||||
sph_u32 dummy; |
||||
} u; |
||||
size_t out_len; |
||||
DECL_STATE |
||||
|
||||
sc = (sph_shabal_context *)cc; |
||||
buf = sc->buf; |
||||
ptr = sc->ptr; |
||||
z = 0x80 >> n; |
||||
buf[ptr] = ((ub & -z) | z) & 0xFF; |
||||
memset(buf + ptr + 1, 0, (sizeof sc->buf) - (ptr + 1)); |
||||
READ_STATE(sc); |
||||
DECODE_BLOCK; |
||||
INPUT_BLOCK_ADD; |
||||
XOR_W; |
||||
APPLY_P; |
||||
for (i = 0; i < 3; i ++) { |
||||
SWAP_BC; |
||||
XOR_W; |
||||
APPLY_P; |
||||
} |
||||
|
||||
/*
|
||||
* We just use our local variables; no need to go through |
||||
* the state structure. In order to share some code, we |
||||
* emit the relevant words into a temporary buffer, which |
||||
* we finally copy into the destination array. |
||||
*/ |
||||
switch (size_words) { |
||||
case 16: |
||||
sph_enc32le_aligned(u.tmp_out + 0, B0); |
||||
sph_enc32le_aligned(u.tmp_out + 4, B1); |
||||
sph_enc32le_aligned(u.tmp_out + 8, B2); |
||||
sph_enc32le_aligned(u.tmp_out + 12, B3); |
||||
/* fall through */ |
||||
case 12: |
||||
sph_enc32le_aligned(u.tmp_out + 16, B4); |
||||
sph_enc32le_aligned(u.tmp_out + 20, B5); |
||||
sph_enc32le_aligned(u.tmp_out + 24, B6); |
||||
sph_enc32le_aligned(u.tmp_out + 28, B7); |
||||
/* fall through */ |
||||
case 8: |
||||
sph_enc32le_aligned(u.tmp_out + 32, B8); |
||||
/* fall through */ |
||||
case 7: |
||||
sph_enc32le_aligned(u.tmp_out + 36, B9); |
||||
/* fall through */ |
||||
case 6: |
||||
sph_enc32le_aligned(u.tmp_out + 40, BA); |
||||
sph_enc32le_aligned(u.tmp_out + 44, BB); |
||||
sph_enc32le_aligned(u.tmp_out + 48, BC); |
||||
sph_enc32le_aligned(u.tmp_out + 52, BD); |
||||
sph_enc32le_aligned(u.tmp_out + 56, BE); |
||||
sph_enc32le_aligned(u.tmp_out + 60, BF); |
||||
break; |
||||
default: |
||||
return; |
||||
} |
||||
out_len = size_words << 2; |
||||
memcpy(dst, u.tmp_out + (sizeof u.tmp_out) - out_len, out_len); |
||||
shabal_init(sc, size_words << 5); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal192_init(void *cc) |
||||
{ |
||||
shabal_init(cc, 192); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal192(void *cc, const void *data, size_t len) |
||||
{ |
||||
shabal_core(cc, (const unsigned char*)data, len); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal192_close(void *cc, void *dst) |
||||
{ |
||||
shabal_close(cc, 0, 0, dst, 6); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal192_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) |
||||
{ |
||||
shabal_close(cc, ub, n, dst, 6); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal224_init(void *cc) |
||||
{ |
||||
shabal_init(cc, 224); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal224(void *cc, const void *data, size_t len) |
||||
{ |
||||
shabal_core(cc, (const unsigned char*)data, len); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal224_close(void *cc, void *dst) |
||||
{ |
||||
shabal_close(cc, 0, 0, dst, 7); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal224_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) |
||||
{ |
||||
shabal_close(cc, ub, n, dst, 7); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal256_init(void *cc) |
||||
{ |
||||
shabal_init(cc, 256); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal256(void *cc, const void *data, size_t len) |
||||
{ |
||||
shabal_core(cc, (const unsigned char*)data, len); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal256_close(void *cc, void *dst) |
||||
{ |
||||
shabal_close(cc, 0, 0, dst, 8); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal256_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) |
||||
{ |
||||
shabal_close(cc, ub, n, dst, 8); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal384_init(void *cc) |
||||
{ |
||||
shabal_init(cc, 384); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal384(void *cc, const void *data, size_t len) |
||||
{ |
||||
shabal_core(cc, (const unsigned char*)data, len); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal384_close(void *cc, void *dst) |
||||
{ |
||||
shabal_close(cc, 0, 0, dst, 12); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal384_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) |
||||
{ |
||||
shabal_close(cc, ub, n, dst, 12); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal512_init(void *cc) |
||||
{ |
||||
shabal_init(cc, 512); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal512(void *cc, const void *data, size_t len) |
||||
{ |
||||
shabal_core(cc, (const unsigned char*)data, len); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal512_close(void *cc, void *dst) |
||||
{ |
||||
shabal_close(cc, 0, 0, dst, 16); |
||||
} |
||||
|
||||
/* see sph_shabal.h */ |
||||
void |
||||
sph_shabal512_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst) |
||||
{ |
||||
shabal_close(cc, ub, n, dst, 16); |
||||
} |
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
@ -0,0 +1,344 @@
@@ -0,0 +1,344 @@
|
||||
/* $Id: sph_shabal.h 175 2010-05-07 16:03:20Z tp $ */ |
||||
/**
|
||||
* Shabal interface. Shabal is a family of functions which differ by |
||||
* their output size; this implementation defines Shabal for output |
||||
* sizes 192, 224, 256, 384 and 512 bits. |
||||
* |
||||
* ==========================(LICENSE BEGIN)============================ |
||||
* |
||||
* Copyright (c) 2007-2010 Projet RNRT SAPHIR |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining |
||||
* a copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sublicense, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice shall be |
||||
* included in all copies or substantial portions of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
* ===========================(LICENSE END)============================= |
||||
* |
||||
* @file sph_shabal.h |
||||
* @author Thomas Pornin <thomas.pornin@cryptolog.com> |
||||
*/ |
||||
|
||||
#ifndef SPH_SHABAL_H__ |
||||
#define SPH_SHABAL_H__ |
||||
|
||||
#include <stddef.h> |
||||
#include "sph_types.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C"{ |
||||
#endif |
||||
|
||||
/**
|
||||
* Output size (in bits) for Shabal-192. |
||||
*/ |
||||
#define SPH_SIZE_shabal192 192 |
||||
|
||||
/**
|
||||
* Output size (in bits) for Shabal-224. |
||||
*/ |
||||
#define SPH_SIZE_shabal224 224 |
||||
|
||||
/**
|
||||
* Output size (in bits) for Shabal-256. |
||||
*/ |
||||
#define SPH_SIZE_shabal256 256 |
||||
|
||||
/**
|
||||
* Output size (in bits) for Shabal-384. |
||||
*/ |
||||
#define SPH_SIZE_shabal384 384 |
||||
|
||||
/**
|
||||
* Output size (in bits) for Shabal-512. |
||||
*/ |
||||
#define SPH_SIZE_shabal512 512 |
||||
|
||||
/**
|
||||
* This structure is a context for Shabal computations: it contains the |
||||
* intermediate values and some data from the last entered block. Once |
||||
* a Shabal computation has been performed, the context can be reused for |
||||
* another computation. |
||||
* |
||||
* The contents of this structure are private. A running Shabal computation |
||||
* can be cloned by copying the context (e.g. with a simple |
||||
* <code>memcpy()</code>). |
||||
*/ |
||||
typedef struct { |
||||
#ifndef DOXYGEN_IGNORE |
||||
unsigned char buf[64]; /* first field, for alignment */ |
||||
size_t ptr; |
||||
sph_u32 A[12], B[16], C[16]; |
||||
sph_u32 Whigh, Wlow; |
||||
#endif |
||||
} sph_shabal_context; |
||||
|
||||
/**
|
||||
* Type for a Shabal-192 context (identical to the common context). |
||||
*/ |
||||
typedef sph_shabal_context sph_shabal192_context; |
||||
|
||||
/**
|
||||
* Type for a Shabal-224 context (identical to the common context). |
||||
*/ |
||||
typedef sph_shabal_context sph_shabal224_context; |
||||
|
||||
/**
|
||||
* Type for a Shabal-256 context (identical to the common context). |
||||
*/ |
||||
typedef sph_shabal_context sph_shabal256_context; |
||||
|
||||
/**
|
||||
* Type for a Shabal-384 context (identical to the common context). |
||||
*/ |
||||
typedef sph_shabal_context sph_shabal384_context; |
||||
|
||||
/**
|
||||
* Type for a Shabal-512 context (identical to the common context). |
||||
*/ |
||||
typedef sph_shabal_context sph_shabal512_context; |
||||
|
||||
/**
|
||||
* Initialize a Shabal-192 context. This process performs no memory allocation. |
||||
* |
||||
* @param cc the Shabal-192 context (pointer to a |
||||
* <code>sph_shabal192_context</code>) |
||||
*/ |
||||
void sph_shabal192_init(void *cc); |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). |
||||
* |
||||
* @param cc the Shabal-192 context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_shabal192(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current Shabal-192 computation and output the result into |
||||
* the provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (24 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the Shabal-192 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal192_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* Add a few additional bits (0 to 7) to the current computation, then |
||||
* terminate it and output the result in the provided buffer, which must |
||||
* be wide enough to accomodate the result (24 bytes). If bit number i |
||||
* in <code>ub</code> has value 2^i, then the extra bits are those |
||||
* numbered 7 downto 8-n (this is the big-endian convention at the byte |
||||
* level). The context is automatically reinitialized. |
||||
* |
||||
* @param cc the Shabal-192 context |
||||
* @param ub the extra bits |
||||
* @param n the number of extra bits (0 to 7) |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal192_addbits_and_close( |
||||
void *cc, unsigned ub, unsigned n, void *dst); |
||||
|
||||
/**
|
||||
* Initialize a Shabal-224 context. This process performs no memory allocation. |
||||
* |
||||
* @param cc the Shabal-224 context (pointer to a |
||||
* <code>sph_shabal224_context</code>) |
||||
*/ |
||||
void sph_shabal224_init(void *cc); |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). |
||||
* |
||||
* @param cc the Shabal-224 context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_shabal224(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current Shabal-224 computation and output the result into |
||||
* the provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (28 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the Shabal-224 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal224_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* Add a few additional bits (0 to 7) to the current computation, then |
||||
* terminate it and output the result in the provided buffer, which must |
||||
* be wide enough to accomodate the result (28 bytes). If bit number i |
||||
* in <code>ub</code> has value 2^i, then the extra bits are those |
||||
* numbered 7 downto 8-n (this is the big-endian convention at the byte |
||||
* level). The context is automatically reinitialized. |
||||
* |
||||
* @param cc the Shabal-224 context |
||||
* @param ub the extra bits |
||||
* @param n the number of extra bits (0 to 7) |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal224_addbits_and_close( |
||||
void *cc, unsigned ub, unsigned n, void *dst); |
||||
|
||||
/**
|
||||
* Initialize a Shabal-256 context. This process performs no memory allocation. |
||||
* |
||||
* @param cc the Shabal-256 context (pointer to a |
||||
* <code>sph_shabal256_context</code>) |
||||
*/ |
||||
void sph_shabal256_init(void *cc); |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). |
||||
* |
||||
* @param cc the Shabal-256 context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_shabal256(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current Shabal-256 computation and output the result into |
||||
* the provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (32 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the Shabal-256 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal256_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* Add a few additional bits (0 to 7) to the current computation, then |
||||
* terminate it and output the result in the provided buffer, which must |
||||
* be wide enough to accomodate the result (32 bytes). If bit number i |
||||
* in <code>ub</code> has value 2^i, then the extra bits are those |
||||
* numbered 7 downto 8-n (this is the big-endian convention at the byte |
||||
* level). The context is automatically reinitialized. |
||||
* |
||||
* @param cc the Shabal-256 context |
||||
* @param ub the extra bits |
||||
* @param n the number of extra bits (0 to 7) |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal256_addbits_and_close( |
||||
void *cc, unsigned ub, unsigned n, void *dst); |
||||
|
||||
/**
|
||||
* Initialize a Shabal-384 context. This process performs no memory allocation. |
||||
* |
||||
* @param cc the Shabal-384 context (pointer to a |
||||
* <code>sph_shabal384_context</code>) |
||||
*/ |
||||
void sph_shabal384_init(void *cc); |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). |
||||
* |
||||
* @param cc the Shabal-384 context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_shabal384(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current Shabal-384 computation and output the result into |
||||
* the provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (48 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the Shabal-384 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal384_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* Add a few additional bits (0 to 7) to the current computation, then |
||||
* terminate it and output the result in the provided buffer, which must |
||||
* be wide enough to accomodate the result (48 bytes). If bit number i |
||||
* in <code>ub</code> has value 2^i, then the extra bits are those |
||||
* numbered 7 downto 8-n (this is the big-endian convention at the byte |
||||
* level). The context is automatically reinitialized. |
||||
* |
||||
* @param cc the Shabal-384 context |
||||
* @param ub the extra bits |
||||
* @param n the number of extra bits (0 to 7) |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal384_addbits_and_close( |
||||
void *cc, unsigned ub, unsigned n, void *dst); |
||||
|
||||
/**
|
||||
* Initialize a Shabal-512 context. This process performs no memory allocation. |
||||
* |
||||
* @param cc the Shabal-512 context (pointer to a |
||||
* <code>sph_shabal512_context</code>) |
||||
*/ |
||||
void sph_shabal512_init(void *cc); |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). |
||||
* |
||||
* @param cc the Shabal-512 context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_shabal512(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current Shabal-512 computation and output the result into |
||||
* the provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (64 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the Shabal-512 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal512_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* Add a few additional bits (0 to 7) to the current computation, then |
||||
* terminate it and output the result in the provided buffer, which must |
||||
* be wide enough to accomodate the result (64 bytes). If bit number i |
||||
* in <code>ub</code> has value 2^i, then the extra bits are those |
||||
* numbered 7 downto 8-n (this is the big-endian convention at the byte |
||||
* level). The context is automatically reinitialized. |
||||
* |
||||
* @param cc the Shabal-512 context |
||||
* @param ub the extra bits |
||||
* @param n the number of extra bits (0 to 7) |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_shabal512_addbits_and_close( |
||||
void *cc, unsigned ub, unsigned n, void *dst); |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif |
@ -0,0 +1,218 @@
@@ -0,0 +1,218 @@
|
||||
/* $Id: sph_whirlpool.h 216 2010-06-08 09:46:57Z tp $ */ |
||||
/**
|
||||
* WHIRLPOOL interface. |
||||
* |
||||
* WHIRLPOOL knows three variants, dubbed "WHIRLPOOL-0" (original |
||||
* version, published in 2000, studied by NESSIE), "WHIRLPOOL-1" |
||||
* (first revision, 2001, with a new S-box) and "WHIRLPOOL" (current |
||||
* version, 2003, with a new diffusion matrix, also described as "plain |
||||
* WHIRLPOOL"). All three variants are implemented here. |
||||
* |
||||
* The original WHIRLPOOL (i.e. WHIRLPOOL-0) was published in: P. S. L. |
||||
* M. Barreto, V. Rijmen, "The Whirlpool Hashing Function", First open |
||||
* NESSIE Workshop, Leuven, Belgium, November 13--14, 2000. |
||||
* |
||||
* The current WHIRLPOOL specification and a reference implementation |
||||
* can be found on the WHIRLPOOL web page: |
||||
* http://paginas.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html
|
||||
* |
||||
* ==========================(LICENSE BEGIN)============================ |
||||
* |
||||
* Copyright (c) 2007-2010 Projet RNRT SAPHIR |
||||
* |
||||
* Permission is hereby granted, free of charge, to any person obtaining |
||||
* a copy of this software and associated documentation files (the |
||||
* "Software"), to deal in the Software without restriction, including |
||||
* without limitation the rights to use, copy, modify, merge, publish, |
||||
* distribute, sublicense, and/or sell copies of the Software, and to |
||||
* permit persons to whom the Software is furnished to do so, subject to |
||||
* the following conditions: |
||||
* |
||||
* The above copyright notice and this permission notice shall be |
||||
* included in all copies or substantial portions of the Software. |
||||
* |
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
* |
||||
* ===========================(LICENSE END)============================= |
||||
* |
||||
* @file sph_whirlpool.h |
||||
* @author Thomas Pornin <thomas.pornin@cryptolog.com> |
||||
*/ |
||||
|
||||
#ifndef SPH_WHIRLPOOL_H__ |
||||
#define SPH_WHIRLPOOL_H__ |
||||
|
||||
#include <stddef.h> |
||||
#include "sph_types.h" |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C"{ |
||||
#endif |
||||
|
||||
#if SPH_64 |
||||
|
||||
/**
|
||||
* Output size (in bits) for WHIRLPOOL. |
||||
*/ |
||||
#define SPH_SIZE_whirlpool 512 |
||||
|
||||
/**
|
||||
* Output size (in bits) for WHIRLPOOL-0. |
||||
*/ |
||||
#define SPH_SIZE_whirlpool0 512 |
||||
|
||||
/**
|
||||
* Output size (in bits) for WHIRLPOOL-1. |
||||
*/ |
||||
#define SPH_SIZE_whirlpool1 512 |
||||
|
||||
/**
|
||||
* This structure is a context for WHIRLPOOL computations: it contains the |
||||
* intermediate values and some data from the last entered block. Once |
||||
* a WHIRLPOOL computation has been performed, the context can be reused for |
||||
* another computation. |
||||
* |
||||
* The contents of this structure are private. A running WHIRLPOOL computation |
||||
* can be cloned by copying the context (e.g. with a simple |
||||
* <code>memcpy()</code>). |
||||
*/ |
||||
typedef struct { |
||||
#ifndef DOXYGEN_IGNORE |
||||
unsigned char buf[64]; /* first field, for alignment */ |
||||
sph_u64 state[8]; |
||||
#if SPH_64 |
||||
sph_u64 count; |
||||
#else |
||||
sph_u32 count_high, count_low; |
||||
#endif |
||||
#endif |
||||
} sph_whirlpool_context; |
||||
|
||||
/**
|
||||
* Initialize a WHIRLPOOL context. This process performs no memory allocation. |
||||
* |
||||
* @param cc the WHIRLPOOL context (pointer to a |
||||
* <code>sph_whirlpool_context</code>) |
||||
*/ |
||||
void sph_whirlpool_init(void *cc); |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). This function applies the |
||||
* plain WHIRLPOOL algorithm. |
||||
* |
||||
* @param cc the WHIRLPOOL context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_whirlpool(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current WHIRLPOOL computation and output the result into the |
||||
* provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (64 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the WHIRLPOOL context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_whirlpool_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* WHIRLPOOL-0 uses the same structure than plain WHIRLPOOL. |
||||
*/ |
||||
typedef sph_whirlpool_context sph_whirlpool0_context; |
||||
|
||||
#ifdef DOXYGEN_IGNORE |
||||
/**
|
||||
* Initialize a WHIRLPOOL-0 context. This function is identical to |
||||
* <code>sph_whirlpool_init()</code>. |
||||
* |
||||
* @param cc the WHIRLPOOL context (pointer to a |
||||
* <code>sph_whirlpool0_context</code>) |
||||
*/ |
||||
void sph_whirlpool0_init(void *cc); |
||||
#endif |
||||
|
||||
#ifndef DOXYGEN_IGNORE |
||||
#define sph_whirlpool0_init sph_whirlpool_init |
||||
#endif |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). This function applies the |
||||
* WHIRLPOOL-0 algorithm. |
||||
* |
||||
* @param cc the WHIRLPOOL context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_whirlpool0(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current WHIRLPOOL-0 computation and output the result into the |
||||
* provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (64 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the WHIRLPOOL-0 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_whirlpool0_close(void *cc, void *dst); |
||||
|
||||
/**
|
||||
* WHIRLPOOL-1 uses the same structure than plain WHIRLPOOL. |
||||
*/ |
||||
typedef sph_whirlpool_context sph_whirlpool1_context; |
||||
|
||||
#ifdef DOXYGEN_IGNORE |
||||
/**
|
||||
* Initialize a WHIRLPOOL-1 context. This function is identical to |
||||
* <code>sph_whirlpool_init()</code>. |
||||
* |
||||
* @param cc the WHIRLPOOL context (pointer to a |
||||
* <code>sph_whirlpool1_context</code>) |
||||
*/ |
||||
void sph_whirlpool1_init(void *cc); |
||||
#endif |
||||
|
||||
#ifndef DOXYGEN_IGNORE |
||||
#define sph_whirlpool1_init sph_whirlpool_init |
||||
#endif |
||||
|
||||
/**
|
||||
* Process some data bytes. It is acceptable that <code>len</code> is zero |
||||
* (in which case this function does nothing). This function applies the |
||||
* WHIRLPOOL-1 algorithm. |
||||
* |
||||
* @param cc the WHIRLPOOL context |
||||
* @param data the input data |
||||
* @param len the input data length (in bytes) |
||||
*/ |
||||
void sph_whirlpool1(void *cc, const void *data, size_t len); |
||||
|
||||
/**
|
||||
* Terminate the current WHIRLPOOL-1 computation and output the result into the |
||||
* provided buffer. The destination buffer must be wide enough to |
||||
* accomodate the result (64 bytes). The context is automatically |
||||
* reinitialized. |
||||
* |
||||
* @param cc the WHIRLPOOL-1 context |
||||
* @param dst the destination buffer |
||||
*/ |
||||
void sph_whirlpool1_close(void *cc, void *dst); |
||||
|
||||
#endif |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif |
||||
|
Loading…
Reference in new issue