| @@ -14,37 +14,35 @@ | | | @@ -14,37 +14,35 @@ |
14 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | | 14 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
15 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | 15 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
17 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | | 17 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | | 19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 20 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
21 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 21 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
22 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 22 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
23 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 23 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
24 | * SUCH DAMAGE. | | 24 | * SUCH DAMAGE. |
25 | */ | | 25 | */ |
26 | | | 26 | |
27 | #define _POSIX_C_SOURCE 200809L | | | |
28 | | | | |
29 | #include <assert.h> | | 27 | #include <assert.h> |
30 | #include <stdint.h> | | 28 | #include <stdint.h> |
31 | #include <string.h> | | 29 | #include <string.h> |
32 | | | 30 | |
33 | #include "blake2b.h" | | 31 | #include "blake2b.h" |
34 | | | 32 | |
35 | void *(*volatile blake2b_explicit_memset_impl)(void *, int, size_t) = &memset; | | 33 | void *(*volatile blake2b_explicit_memset_impl)(void *, int, size_t) = &memset; |
36 | static void * | | 34 | static void * |
37 | explicit_memset(void *buf, int c, size_t n) | | 35 | blake2b_explicit_memset(void *buf, int c, size_t n) |
38 | { | | 36 | { |
39 | | | 37 | |
40 | return (*blake2b_explicit_memset_impl)(buf, c, n); | | 38 | return (*blake2b_explicit_memset_impl)(buf, c, n); |
41 | } | | 39 | } |
42 | | | 40 | |
43 | static inline uint64_t | | 41 | static inline uint64_t |
44 | rotr64(uint64_t x, unsigned c) | | 42 | rotr64(uint64_t x, unsigned c) |
45 | { | | 43 | { |
46 | | | 44 | |
47 | return ((x >> c) | (x << (64 - c))); | | 45 | return ((x >> c) | (x << (64 - c))); |
48 | } | | 46 | } |
49 | | | 47 | |
50 | static inline uint64_t | | 48 | static inline uint64_t |
| @@ -159,27 +157,27 @@ blake2b_compress(uint64_t h[8], uint64_t | | | @@ -159,27 +157,27 @@ blake2b_compress(uint64_t h[8], uint64_t |
159 | BLAKE2B_G(v3, v4, v9, v14, m[sigma[14]], m[sigma[15]]); | | 157 | BLAKE2B_G(v3, v4, v9, v14, m[sigma[14]], m[sigma[15]]); |
160 | } | | 158 | } |
161 | | | 159 | |
162 | /* Update the state. */ | | 160 | /* Update the state. */ |
163 | h[0] ^= v0 ^ v8; | | 161 | h[0] ^= v0 ^ v8; |
164 | h[1] ^= v1 ^ v9; | | 162 | h[1] ^= v1 ^ v9; |
165 | h[2] ^= v2 ^ v10; | | 163 | h[2] ^= v2 ^ v10; |
166 | h[3] ^= v3 ^ v11; | | 164 | h[3] ^= v3 ^ v11; |
167 | h[4] ^= v4 ^ v12; | | 165 | h[4] ^= v4 ^ v12; |
168 | h[5] ^= v5 ^ v13; | | 166 | h[5] ^= v5 ^ v13; |
169 | h[6] ^= v6 ^ v14; | | 167 | h[6] ^= v6 ^ v14; |
170 | h[7] ^= v7 ^ v15; | | 168 | h[7] ^= v7 ^ v15; |
171 | | | 169 | |
172 | (void)explicit_memset(m, 0, sizeof m); | | 170 | (void)blake2b_explicit_memset(m, 0, sizeof m); |
173 | } | | 171 | } |
174 | | | 172 | |
175 | void | | 173 | void |
176 | blake2b_init(struct blake2b *B, size_t dlen, const void *key, size_t keylen) | | 174 | blake2b_init(struct blake2b *B, size_t dlen, const void *key, size_t keylen) |
177 | { | | 175 | { |
178 | uint64_t param0; | | 176 | uint64_t param0; |
179 | unsigned i; | | 177 | unsigned i; |
180 | | | 178 | |
181 | assert(0 < dlen); | | 179 | assert(0 < dlen); |
182 | assert(dlen <= 64); | | 180 | assert(dlen <= 64); |
183 | assert(keylen <= 64); | | 181 | assert(keylen <= 64); |
184 | | | 182 | |
185 | /* Record the digest length. */ | | 183 | /* Record the digest length. */ |
| @@ -271,27 +269,27 @@ blake2b_final(struct blake2b *B, void *d | | | @@ -271,27 +269,27 @@ blake2b_final(struct blake2b *B, void *d |
271 | dlen -= 8*i; | | 269 | dlen -= 8*i; |
272 | | | 270 | |
273 | /* If the caller wants a partial word, reveal that too. */ | | 271 | /* If the caller wants a partial word, reveal that too. */ |
274 | if (dlen) { | | 272 | if (dlen) { |
275 | uint64_t hi = B->h[i]; | | 273 | uint64_t hi = B->h[i]; |
276 | | | 274 | |
277 | do { | | 275 | do { |
278 | *d++ = hi; | | 276 | *d++ = hi; |
279 | hi >>= 8; | | 277 | hi >>= 8; |
280 | } while (--dlen); | | 278 | } while (--dlen); |
281 | } | | 279 | } |
282 | | | 280 | |
283 | /* Erase the state. */ | | 281 | /* Erase the state. */ |
284 | (void)explicit_memset(B, 0, sizeof B); | | 282 | (void)blake2b_explicit_memset(B, 0, sizeof B); |
285 | } | | 283 | } |
286 | | | 284 | |
287 | void | | 285 | void |
288 | blake2b(void *digest, size_t dlen, const void *key, size_t keylen, | | 286 | blake2b(void *digest, size_t dlen, const void *key, size_t keylen, |
289 | const void *in, size_t inlen) | | 287 | const void *in, size_t inlen) |
290 | { | | 288 | { |
291 | struct blake2b ctx; | | 289 | struct blake2b ctx; |
292 | | | 290 | |
293 | blake2b_init(&ctx, dlen, key, keylen); | | 291 | blake2b_init(&ctx, dlen, key, keylen); |
294 | blake2b_update(&ctx, in, inlen); | | 292 | blake2b_update(&ctx, in, inlen); |
295 | blake2b_final(&ctx, digest); | | 293 | blake2b_final(&ctx, digest); |
296 | } | | 294 | } |
297 | | | 295 | |