Add Poly1305 MAC
[libgcrypt.git] / cipher / poly1305-internal.h
1 /* poly1305-internal.h  -  Poly1305 internals
2  * Copyright (C) 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser general Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef G10_POLY1305_INTERNAL_H
21 #define G10_POLY1305_INTERNAL_H
22
23 #include <config.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include "types.h"
28 #include "g10lib.h"
29 #include "cipher.h"
30 #include "bufhelp.h"
31
32
33 #define POLY1305_TAGLEN 16
34 #define POLY1305_KEYLEN 32
35
36
37 /* Block-size used in default implementation. */
38 #define POLY1305_REF_BLOCKSIZE 16
39
40 /* State size of default implementation. */
41 #define POLY1305_REF_STATESIZE 64
42
43 /* State alignment for default implementation. */
44 #define POLY1305_REF_ALIGNMENT sizeof(void *)
45
46
47 /* Largest block-size used in any implementation (optimized implementations
48  * might use block-size multiple of 16). */
49 #define POLY1305_LARGEST_BLOCKSIZE POLY1305_REF_BLOCKSIZE
50
51 /* Largest state-size used in any implementation. */
52 #define POLY1305_LARGEST_STATESIZE POLY1305_REF_STATESIZE
53
54 /* Minimum alignment for state pointer passed to implementations. */
55 #define POLY1305_STATE_ALIGNMENT POLY1305_REF_ALIGNMENT
56
57
58 typedef struct poly1305_key_s
59 {
60   byte b[POLY1305_KEYLEN];
61 } poly1305_key_t;
62
63
64 typedef struct poly1305_ops_s
65 {
66   size_t block_size;
67   void (*init_ext) (void *ctx, const poly1305_key_t * key);
68   unsigned int (*blocks) (void *ctx, const byte * m, size_t bytes);
69   unsigned int (*finish_ext) (void *ctx, const byte * m, size_t remaining,
70                               byte mac[POLY1305_TAGLEN]);
71 } poly1305_ops_t;
72
73
74 typedef struct poly1305_context_s
75 {
76   byte state[POLY1305_LARGEST_STATESIZE + POLY1305_STATE_ALIGNMENT];
77   byte buffer[POLY1305_LARGEST_BLOCKSIZE];
78   const poly1305_ops_t *ops;
79   unsigned int leftover;
80 } poly1305_context_t;
81
82
83 gcry_err_code_t _gcry_poly1305_init (poly1305_context_t * ctx, const byte * key,
84                                      size_t keylen);
85
86 void _gcry_poly1305_finish (poly1305_context_t * ctx,
87                             byte mac[POLY1305_TAGLEN]);
88
89 void _gcry_poly1305_update (poly1305_context_t * ctx, const byte * buf,
90                             size_t buflen);
91
92
93 #endif /* G10_POLY1305_INTERNAL_H */