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

# User Rev Content
1 root 1.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