summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/crypto/skein/skein_port.h
blob: 7025a51673ffd28d6044e53f7904f6817754b38b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*	$FreeBSD$	*/
#ifndef _SKEIN_PORT_H_
#define _SKEIN_PORT_H_
/*******************************************************************
**
** Platform-specific definitions for Skein hash function.
**
** Source code author: Doug Whiting, 2008.
**
** This algorithm and source code is released to the public domain.
**
** Many thanks to Brian Gladman for his portable header files.
**
** To port Skein to an "unsupported" platform, change the definitions
** in this file appropriately.
** 
********************************************************************/

#include <sys/endian.h>
#include <sys/types.h>

#ifndef _OPENSOLARIS_SYS_TYPES_H_ /* Avoid redefining this typedef */
typedef unsigned int    uint_t;             /* native unsigned integer */
#endif
typedef u_int8_t        u08b_t;             /*  8-bit unsigned integer */
typedef u_int32_t       uint_32t;           /* 32-bit unsigned integer */
typedef u_int64_t       u64b_t;             /* 64-bit unsigned integer */

#ifndef RotL_64
#define RotL_64(x,N)    (((x) << (N)) | ((x) >> (64-(N))))
#endif

__BEGIN_DECLS

/*
 * Skein is "natively" little-endian (unlike SHA-xxx), for optimal
 * performance on x86 CPUs.  The Skein code requires the following
 * definitions for dealing with endianness:
 *
 *    SKEIN_NEED_SWAP:  0 for little-endian, 1 for big-endian
 *    Skein_Put64_LSB_First
 *    Skein_Get64_LSB_First
 *    Skein_Swap64
 *
 * If SKEIN_NEED_SWAP is defined at compile time, it is used here
 * along with the portable versions of Put64/Get64/Swap64, which 
 * are slow in general.
 *
 * Otherwise, an "auto-detect" of endianness is attempted below.
 * If the default handling doesn't work well, the user may insert
 * platform-specific code instead (e.g., for big-endian CPUs).
 *
 */
#ifndef SKEIN_NEED_SWAP /* compile-time "override" for endianness? */

#if BYTE_ORDER == BIG_ENDIAN
    /* here for big-endian CPUs */
#define SKEIN_NEED_SWAP   (1)
#ifdef  SKEIN_PORT_CODE
void    Skein_Put64_LSB_First(u08b_t *dst,const u64b_t *src,size_t bCnt);
void    Skein_Get64_LSB_First(u64b_t *dst,const u08b_t *src,size_t wCnt);
#endif /* ifdef SKEIN_PORT_CODE */
#elif BYTE_ORDER == LITTLE_ENDIAN
    /* here for x86 and x86-64 CPUs (and other detected little-endian CPUs) */
#define SKEIN_NEED_SWAP   (0)
#define Skein_Put64_LSB_First(dst08,src64,bCnt) memcpy(dst08,src64,bCnt)
#define Skein_Get64_LSB_First(dst64,src08,wCnt) memcpy(dst64,src08,8*(wCnt))
#else
#error "Skein needs endianness setting!"
#endif

#endif /* ifndef SKEIN_NEED_SWAP */

/*
 ******************************************************************
 *      Provide any definitions still needed.
 ******************************************************************
 */
#ifndef Skein_Swap64  /* swap for big-endian, nop for little-endian */
#if     SKEIN_NEED_SWAP
#define Skein_Swap64(w64)  bswap64(w64)
#else
#define Skein_Swap64(w64)  (w64)
#endif
#endif  /* ifndef Skein_Swap64 */


#ifndef Skein_Put64_LSB_First
void    Skein_Put64_LSB_First(u08b_t *dst,const u64b_t *src,size_t bCnt)
#ifdef  SKEIN_PORT_CODE /* instantiate the function code here? */
{
    size_t n;

    for (n = 0; n < bCnt / 8; n++)
        le64enc(dst + n * 8, src[n]);
}
#else
; /* output only the function prototype */
#endif
#endif   /* ifndef Skein_Put64_LSB_First */


#ifndef Skein_Get64_LSB_First
void    Skein_Get64_LSB_First(u64b_t *dst,const u08b_t *src,size_t wCnt)
#ifdef  SKEIN_PORT_CODE /* instantiate the function code here? */
{
    size_t n;

    for (n = 0; n < wCnt; n++)
        dst[n] = le64dec(src + n * 8);
}
#else
; /* output only the function prototype */
#endif
#endif   /* ifndef Skein_Get64_LSB_First */

/* Start FreeBSD libmd shims */

/* Ensure libmd symbols do not clash with libcrypto */
#ifndef SKEIN256_Init
#define SKEIN256_Init		_libmd_SKEIN256_Init
#define SKEIN512_Init		_libmd_SKEIN512_Init
#define SKEIN1024_Init		_libmd_SKEIN1024_Init
#endif
#ifndef SKEIN256_Update
#define SKEIN256_Update		_libmd_SKEIN256_Update
#define SKEIN512_Update		_libmd_SKEIN512_Update
#define SKEIN1024_Update	_libmd_SKEIN1024_Update
#endif
#ifndef SKEIN256_Final
#define SKEIN256_Final		_libmd_SKEIN256_Final
#define SKEIN512_Final		_libmd_SKEIN512_Final
#define SKEIN1024_Final		_libmd_SKEIN1024_Final
#endif
#ifndef SKEIN256_End
#define SKEIN256_End		_libmd_SKEIN256_End
#define SKEIN512_End		_libmd_SKEIN512_End
#define SKEIN1024_End		_libmd_SKEIN1024_End
#endif
#ifndef SKEIN256_File
#define SKEIN256_File		_libmd_SKEIN256_File
#define SKEIN512_File		_libmd_SKEIN512_File
#define SKEIN1024_File		_libmd_SKEIN1024_File
#endif
#ifndef SKEIN256_FileChunk
#define SKEIN256_FileChunk	_libmd_SKEIN256_FileChunk
#define SKEIN512_FileChunk	_libmd_SKEIN512_FileChunk
#define SKEIN1024_FileChunk	_libmd_SKEIN1024_FileChunk
#endif
#ifndef SKEIN256_Data
#define SKEIN256_Data		_libmd_SKEIN256_Data
#define SKEIN512_Data		_libmd_SKEIN512_Data
#define SKEIN1024_Data		_libmd_SKEIN1024_Data
#endif

__END_DECLS

#endif   /* ifndef _SKEIN_PORT_H_ */