1b468a9ffSAllan Jude #ifndef _SKEIN_PORT_H_
2b468a9ffSAllan Jude #define _SKEIN_PORT_H_
3b468a9ffSAllan Jude /*******************************************************************
4b468a9ffSAllan Jude **
5b468a9ffSAllan Jude ** Platform-specific definitions for Skein hash function.
6b468a9ffSAllan Jude **
7b468a9ffSAllan Jude ** Source code author: Doug Whiting, 2008.
8b468a9ffSAllan Jude **
9b468a9ffSAllan Jude ** This algorithm and source code is released to the public domain.
10b468a9ffSAllan Jude **
11b468a9ffSAllan Jude ** Many thanks to Brian Gladman for his portable header files.
12b468a9ffSAllan Jude **
13b468a9ffSAllan Jude ** To port Skein to an "unsupported" platform, change the definitions
14b468a9ffSAllan Jude ** in this file appropriately.
15b468a9ffSAllan Jude **
16b468a9ffSAllan Jude ********************************************************************/
17b468a9ffSAllan Jude
18b468a9ffSAllan Jude #include <sys/endian.h>
19b468a9ffSAllan Jude #include <sys/types.h>
20b468a9ffSAllan Jude
21*414924d9SWarner Losh #ifndef _SPL_SYS_TYPES_H_ /* Avoid redefining this typedef */
22b468a9ffSAllan Jude typedef unsigned int uint_t; /* native unsigned integer */
230144ad3eSAllan Jude #endif
24d3d79e96SJohn Baldwin typedef uint8_t u08b_t; /* 8-bit unsigned integer */
25d3d79e96SJohn Baldwin typedef uint32_t uint_32t; /* 32-bit unsigned integer */
26d3d79e96SJohn Baldwin typedef uint64_t u64b_t; /* 64-bit unsigned integer */
27b468a9ffSAllan Jude
28b468a9ffSAllan Jude #ifndef RotL_64
29b468a9ffSAllan Jude #define RotL_64(x,N) (((x) << (N)) | ((x) >> (64-(N))))
30b468a9ffSAllan Jude #endif
31b468a9ffSAllan Jude
32b468a9ffSAllan Jude __BEGIN_DECLS
33b468a9ffSAllan Jude
34b468a9ffSAllan Jude /*
35b468a9ffSAllan Jude * Skein is "natively" little-endian (unlike SHA-xxx), for optimal
36b468a9ffSAllan Jude * performance on x86 CPUs. The Skein code requires the following
37b468a9ffSAllan Jude * definitions for dealing with endianness:
38b468a9ffSAllan Jude *
39b468a9ffSAllan Jude * SKEIN_NEED_SWAP: 0 for little-endian, 1 for big-endian
40b468a9ffSAllan Jude * Skein_Put64_LSB_First
41b468a9ffSAllan Jude * Skein_Get64_LSB_First
42b468a9ffSAllan Jude * Skein_Swap64
43b468a9ffSAllan Jude *
44b468a9ffSAllan Jude * If SKEIN_NEED_SWAP is defined at compile time, it is used here
45b468a9ffSAllan Jude * along with the portable versions of Put64/Get64/Swap64, which
46b468a9ffSAllan Jude * are slow in general.
47b468a9ffSAllan Jude *
48b468a9ffSAllan Jude * Otherwise, an "auto-detect" of endianness is attempted below.
49b468a9ffSAllan Jude * If the default handling doesn't work well, the user may insert
50b468a9ffSAllan Jude * platform-specific code instead (e.g., for big-endian CPUs).
51b468a9ffSAllan Jude *
52b468a9ffSAllan Jude */
53b468a9ffSAllan Jude #ifndef SKEIN_NEED_SWAP /* compile-time "override" for endianness? */
54b468a9ffSAllan Jude
55b468a9ffSAllan Jude #if BYTE_ORDER == BIG_ENDIAN
56b468a9ffSAllan Jude /* here for big-endian CPUs */
57b468a9ffSAllan Jude #define SKEIN_NEED_SWAP (1)
58b468a9ffSAllan Jude #ifdef SKEIN_PORT_CODE
59b468a9ffSAllan Jude void Skein_Put64_LSB_First(u08b_t *dst,const u64b_t *src,size_t bCnt);
60b468a9ffSAllan Jude void Skein_Get64_LSB_First(u64b_t *dst,const u08b_t *src,size_t wCnt);
61b468a9ffSAllan Jude #endif /* ifdef SKEIN_PORT_CODE */
62b468a9ffSAllan Jude #elif BYTE_ORDER == LITTLE_ENDIAN
63b468a9ffSAllan Jude /* here for x86 and x86-64 CPUs (and other detected little-endian CPUs) */
64b468a9ffSAllan Jude #define SKEIN_NEED_SWAP (0)
65b468a9ffSAllan Jude #define Skein_Put64_LSB_First(dst08,src64,bCnt) memcpy(dst08,src64,bCnt)
66b468a9ffSAllan Jude #define Skein_Get64_LSB_First(dst64,src08,wCnt) memcpy(dst64,src08,8*(wCnt))
67b468a9ffSAllan Jude #else
68b468a9ffSAllan Jude #error "Skein needs endianness setting!"
69b468a9ffSAllan Jude #endif
70b468a9ffSAllan Jude
71b468a9ffSAllan Jude #endif /* ifndef SKEIN_NEED_SWAP */
72b468a9ffSAllan Jude
73b468a9ffSAllan Jude /*
74b468a9ffSAllan Jude ******************************************************************
75b468a9ffSAllan Jude * Provide any definitions still needed.
76b468a9ffSAllan Jude ******************************************************************
77b468a9ffSAllan Jude */
78b468a9ffSAllan Jude #ifndef Skein_Swap64 /* swap for big-endian, nop for little-endian */
79b468a9ffSAllan Jude #if SKEIN_NEED_SWAP
80b468a9ffSAllan Jude #define Skein_Swap64(w64) bswap64(w64)
81b468a9ffSAllan Jude #else
82b468a9ffSAllan Jude #define Skein_Swap64(w64) (w64)
83b468a9ffSAllan Jude #endif
84b468a9ffSAllan Jude #endif /* ifndef Skein_Swap64 */
85b468a9ffSAllan Jude
86b468a9ffSAllan Jude
87b468a9ffSAllan Jude #ifndef Skein_Put64_LSB_First
Skein_Put64_LSB_First(u08b_t * dst,const u64b_t * src,size_t bCnt)88b468a9ffSAllan Jude void Skein_Put64_LSB_First(u08b_t *dst,const u64b_t *src,size_t bCnt)
89b468a9ffSAllan Jude #ifdef SKEIN_PORT_CODE /* instantiate the function code here? */
90b468a9ffSAllan Jude {
91b468a9ffSAllan Jude size_t n;
92b468a9ffSAllan Jude
93b468a9ffSAllan Jude for (n = 0; n < bCnt / 8; n++)
94b468a9ffSAllan Jude le64enc(dst + n * 8, src[n]);
95b468a9ffSAllan Jude }
96b468a9ffSAllan Jude #else
97b468a9ffSAllan Jude ; /* output only the function prototype */
98b468a9ffSAllan Jude #endif
99b468a9ffSAllan Jude #endif /* ifndef Skein_Put64_LSB_First */
100b468a9ffSAllan Jude
101b468a9ffSAllan Jude
102b468a9ffSAllan Jude #ifndef Skein_Get64_LSB_First
Skein_Get64_LSB_First(u64b_t * dst,const u08b_t * src,size_t wCnt)103b468a9ffSAllan Jude void Skein_Get64_LSB_First(u64b_t *dst,const u08b_t *src,size_t wCnt)
104b468a9ffSAllan Jude #ifdef SKEIN_PORT_CODE /* instantiate the function code here? */
105b468a9ffSAllan Jude {
106b468a9ffSAllan Jude size_t n;
107b468a9ffSAllan Jude
108b468a9ffSAllan Jude for (n = 0; n < wCnt; n++)
109b468a9ffSAllan Jude dst[n] = le64dec(src + n * 8);
110b468a9ffSAllan Jude }
111b468a9ffSAllan Jude #else
112b468a9ffSAllan Jude ; /* output only the function prototype */
113b468a9ffSAllan Jude #endif
114b468a9ffSAllan Jude #endif /* ifndef Skein_Get64_LSB_First */
115b468a9ffSAllan Jude
116b468a9ffSAllan Jude /* Start FreeBSD libmd shims */
117b468a9ffSAllan Jude
118b468a9ffSAllan Jude /* Ensure libmd symbols do not clash with libcrypto */
119b468a9ffSAllan Jude #ifndef SKEIN256_Init
120b468a9ffSAllan Jude #define SKEIN256_Init _libmd_SKEIN256_Init
121b468a9ffSAllan Jude #define SKEIN512_Init _libmd_SKEIN512_Init
122b468a9ffSAllan Jude #define SKEIN1024_Init _libmd_SKEIN1024_Init
123b468a9ffSAllan Jude #endif
124b468a9ffSAllan Jude #ifndef SKEIN256_Update
125b468a9ffSAllan Jude #define SKEIN256_Update _libmd_SKEIN256_Update
126b468a9ffSAllan Jude #define SKEIN512_Update _libmd_SKEIN512_Update
127b468a9ffSAllan Jude #define SKEIN1024_Update _libmd_SKEIN1024_Update
128b468a9ffSAllan Jude #endif
129b468a9ffSAllan Jude #ifndef SKEIN256_Final
130b468a9ffSAllan Jude #define SKEIN256_Final _libmd_SKEIN256_Final
131b468a9ffSAllan Jude #define SKEIN512_Final _libmd_SKEIN512_Final
132b468a9ffSAllan Jude #define SKEIN1024_Final _libmd_SKEIN1024_Final
133b468a9ffSAllan Jude #endif
134b468a9ffSAllan Jude #ifndef SKEIN256_End
135b468a9ffSAllan Jude #define SKEIN256_End _libmd_SKEIN256_End
136b468a9ffSAllan Jude #define SKEIN512_End _libmd_SKEIN512_End
137b468a9ffSAllan Jude #define SKEIN1024_End _libmd_SKEIN1024_End
138b468a9ffSAllan Jude #endif
139de13c242SEd Maste #ifndef SKEIN256_Fd
140de13c242SEd Maste #define SKEIN256_Fd _libmd_SKEIN256_Fd
141de13c242SEd Maste #define SKEIN512_Fd _libmd_SKEIN512_Fd
142de13c242SEd Maste #define SKEIN1024_Fd _libmd_SKEIN1024_Fd
143de13c242SEd Maste #endif
144de13c242SEd Maste #ifndef SKEIN256_FdChunk
145de13c242SEd Maste #define SKEIN256_FdChunk _libmd_SKEIN256_FdChunk
146de13c242SEd Maste #define SKEIN512_FdChunk _libmd_SKEIN512_FdChunk
147de13c242SEd Maste #define SKEIN1024_FdChunk _libmd_SKEIN1024_FdChunk
148de13c242SEd Maste #endif
149b468a9ffSAllan Jude #ifndef SKEIN256_File
150b468a9ffSAllan Jude #define SKEIN256_File _libmd_SKEIN256_File
151b468a9ffSAllan Jude #define SKEIN512_File _libmd_SKEIN512_File
152b468a9ffSAllan Jude #define SKEIN1024_File _libmd_SKEIN1024_File
153b468a9ffSAllan Jude #endif
154b468a9ffSAllan Jude #ifndef SKEIN256_FileChunk
155b468a9ffSAllan Jude #define SKEIN256_FileChunk _libmd_SKEIN256_FileChunk
156b468a9ffSAllan Jude #define SKEIN512_FileChunk _libmd_SKEIN512_FileChunk
157b468a9ffSAllan Jude #define SKEIN1024_FileChunk _libmd_SKEIN1024_FileChunk
158b468a9ffSAllan Jude #endif
159b468a9ffSAllan Jude #ifndef SKEIN256_Data
160b468a9ffSAllan Jude #define SKEIN256_Data _libmd_SKEIN256_Data
161b468a9ffSAllan Jude #define SKEIN512_Data _libmd_SKEIN512_Data
162b468a9ffSAllan Jude #define SKEIN1024_Data _libmd_SKEIN1024_Data
163b468a9ffSAllan Jude #endif
164b468a9ffSAllan Jude
165b468a9ffSAllan Jude __END_DECLS
166b468a9ffSAllan Jude
167b468a9ffSAllan Jude #endif /* ifndef _SKEIN_PORT_H_ */
168