ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/spritz/spritz.h
Revision: 1.1
Committed: Fri Jan 9 09:11:16 2015 UTC (9 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
1 //#include "spritz.h"
2
3 #include <stdint.h>
4 #include <sys/types.h>
5
6 /*******************************************************************************/
7 /* spritz parameters/state type */
8
9 enum {
10 spritz_N = 256
11 };
12
13 typedef struct
14 {
15 uint8_t a, i, j, k, z, w;
16 uint8_t S[spritz_N];
17 } spritz_state;
18
19 /*******************************************************************************/
20 /* the spritz primitives */
21
22 void spritz_init (spritz_state *s);
23 void spritz_update (spritz_state *s);
24 void spritz_whip (spritz_state *s, uint_fast16_t r);
25 void spritz_crush (spritz_state *s);
26 void spritz_shuffle (spritz_state *s);
27 void spritz_absorb_nibble (spritz_state *s, uint8_t x);
28 void spritz_absorb (spritz_state *s, const void *I, size_t I_len);
29 void spritz_absorb_stop (spritz_state *s);
30 void spritz_absorb_and_stop (spritz_state *s, const void *I, size_t I_len); /* commonly used helper function */
31 uint8_t spritz_output (spritz_state *s);
32 void spritz_squeeze (spritz_state *s, void *P, size_t P_len);
33 uint8_t spritz_drip (spritz_state *s);
34
35 /*******************************************************************************/
36 /* the spritz-xor cipher */
37
38 /* no IV is used if IV_len == 0 */
39 void spritz_xor_init (spritz_state *s, const void *K, size_t K_len, const void *IV, size_t IV_len);
40
41 /* can be called multiple times/incrementally */
42 /* can work inplace */
43 /* works for both encryption and decryption */
44 void spritz_xor_crypt (spritz_state *s, const void *I, void *O, size_t len);
45
46 /*******************************************************************************/
47 /* the spritz hash */
48
49 static void spritz_hash_init (spritz_state *s);
50 static void spritz_hash_add (spritz_state *s, const void *M, size_t M_len); /* can be called multiple times/incrementally */
51 void spritz_hash_finish (spritz_state *s, void *H, size_t H_len); /* must be called at most once at the end */
52
53 /*******************************************************************************/
54 /* the spritz MAC */
55
56 void spritz_mac_init (spritz_state *s, const void *K, size_t K_len);
57 static void spritz_mac_add (spritz_state *s, const void *M, size_t M_len); /* can be called multiple times/incrementally */
58 static void spritz_mac_finish (spritz_state *s, void *H, size_t H_len); /* must be called at most once at the end */
59
60 /*******************************************************************************/
61 /* spritz authenticated encryption */
62
63 void spritz_aead_init (spritz_state *s, const void *K, size_t K_len);
64 static void spritz_aead_nonce (spritz_state *s, const void *N, size_t N_len); /* must be called after construction, before associated_data */
65 static void spritz_aead_associated_data (spritz_state *s, const void *D, size_t D_len); /* must be called after nonce, before crypt */
66 void spritz_aead_crypt (spritz_state *s, const void *I, void *O, size_t len);
67 /* must be called after associated_data, only once, before finish */
68 /* works for both encryption and decryption */
69 static void spritz_aead_finish (spritz_state *s, void *H, size_t H_len); /* must be called at most once at the end */
70
71 /*******************************************************************************/
72 /* the spritz drbg/csprng */
73
74 /* constructor takes a seed if S_len != 0, same add spritz_prng_put */
75 void spritz_prng_init (spritz_state *s, const void *S, size_t S_len);
76 static void spritz_prng_put (spritz_state *s, const void *S, size_t S_len); /* add additional entropy */
77 static void spritz_prng_get (spritz_state *s, void *R, size_t R_len); /* get random bytes */
78
79 /*******************************************************************************/
80 /* inline functions - some functions are so simple, they are defined inline */
81
82 /* the spritz hash inline functions */
83
84 static void
85 spritz_hash_init (spritz_state *s)
86 {
87 spritz_init (s);
88 }
89
90 static void
91 spritz_hash_add (spritz_state *s, const void *M, size_t M_len)
92 {
93 spritz_absorb (s, M, M_len);
94 }
95
96 /* the spritz MAC inline functions */
97
98 static void
99 spritz_mac_add (spritz_state *s, const void *M, size_t M_len)
100 {
101 spritz_hash_add (s, M, M_len);
102 }
103
104 static void
105 spritz_mac_finish (spritz_state *s, void *H, size_t H_len)
106 {
107 spritz_hash_finish (s, H, H_len);
108 }
109
110 /* spritz authenticated encryption inline functions */
111
112 static void
113 spritz_aead_nonce (spritz_state *s, const void *N, size_t N_len)
114 {
115 spritz_absorb_and_stop (s, N, N_len);
116 }
117
118 static void
119 spritz_aead_associated_data (spritz_state *s, const void *D, size_t D_len)
120 {
121 spritz_absorb_and_stop (s, D, D_len);
122 }
123
124 static void
125 spritz_aead_finish (spritz_state *s, void *H, size_t H_len)
126 {
127 spritz_mac_finish (s, H, H_len);
128 }
129
130 /* the spritz drbg/csprng inline functions */
131
132 static void
133 spritz_prng_put (spritz_state *s, const void *S, size_t S_len)
134 {
135 spritz_absorb (s, S, S_len);
136 }
137
138 /* get random bytes */
139 static void
140 spritz_prng_get (spritz_state *s, void *R, size_t R_len)
141 {
142 spritz_squeeze (s, R, R_len);
143 }
144