1: /*
2: * BIRD Library -- Message Authentication Codes
3: *
4: * (c) 2016 Ondrej Zajicek <santiago@crfreenet.org>
5: * (c) 2016 CZ.NIC z.s.p.o.
6: *
7: * Can be freely distributed and used under the terms of the GNU GPL.
8: */
9:
10: #ifndef _BIRD_MAC_H_
11: #define _BIRD_MAC_H_
12:
13: #include "nest/bird.h"
14: #include "lib/sha512.h"
15:
16:
17: #define ALG_UNDEFINED 0
18: #define ALG_MD5 0x01
19: #define ALG_SHA1 0x02
20: #define ALG_SHA224 0x03
21: #define ALG_SHA256 0x04
22: #define ALG_SHA384 0x05
23: #define ALG_SHA512 0x06
24: #define ALG_HMAC 0x10
25: #define ALG_HMAC_MD5 0x11
26: #define ALG_HMAC_SHA1 0x12
27: #define ALG_HMAC_SHA224 0x13
28: #define ALG_HMAC_SHA256 0x14
29: #define ALG_HMAC_SHA384 0x15
30: #define ALG_HMAC_SHA512 0x16
31: #define ALG_MAX 0x17
32:
33: /* These are maximums for HASH/MAC lengths and required context space */
34: #define MAX_HASH_SIZE SHA512_SIZE
35: #define HASH_STORAGE sizeof(struct sha512_context)
36: #define MAC_STORAGE sizeof(struct hmac_context)
37:
38: /* This value is used by several IETF protocols for padding */
39: #define HMAC_MAGIC htonl(0x878FE1F3)
40:
41: /* Generic context used by hash functions */
42: struct hash_context
43: {
44: u8 data[HASH_STORAGE];
45: u64 align[0];
46: };
47:
48: /* Context for embedded hash (not-really-MAC hash) */
49: struct nrmh_context {
50: const struct mac_desc *type;
51: struct hash_context ictx;
52: };
53:
54: /* Context for hash based HMAC */
55: struct hmac_context {
56: const struct mac_desc *type;
57: struct hash_context ictx;
58: struct hash_context octx;
59: };
60:
61: /* Generic context used by MAC functions */
62: struct mac_context
63: {
64: const struct mac_desc *type;
65: u8 data[MAC_STORAGE - sizeof(void *)];
66: u64 align[0];
67: };
68:
69: /* Union to satisfy C aliasing rules */
70: union mac_context_union {
71: struct mac_context mac;
72: struct nrmh_context nrmh;
73: struct hmac_context hmac;
74: };
75:
76:
77: struct mac_desc {
78: const char *name; /* Name of MAC algorithm */
79: uint mac_length; /* Length of authentication code */
80: uint ctx_length; /* Length of algorithm context */
81: void (*init)(struct mac_context *ctx, const byte *key, uint keylen);
82: void (*update)(struct mac_context *ctx, const byte *data, uint datalen);
83: byte *(*final)(struct mac_context *ctx);
84:
85: uint hash_size; /* Hash length, for hash-based MACs */
86: uint block_size; /* Hash block size, for hash-based MACs */
87: void (*hash_init)(struct hash_context *ctx);
88: void (*hash_update)(struct hash_context *ctx, const byte *data, uint datalen);
89: byte *(*hash_final)(struct hash_context *ctx);
90: };
91:
92: extern const struct mac_desc mac_table[ALG_MAX];
93:
94: static inline const char *mac_type_name(uint id)
95: { return mac_table[id].name; }
96:
97: static inline uint mac_type_length(uint id)
98: { return mac_table[id].mac_length; }
99:
100: static inline const char *mac_get_name(struct mac_context *ctx)
101: { return ctx->type->name; }
102:
103: static inline uint mac_get_length(struct mac_context *ctx)
104: { return ctx->type->mac_length; }
105:
106: void mac_init(struct mac_context *ctx, uint id, const byte *key, uint keylen);
107:
108: static inline void mac_update(struct mac_context *ctx, const byte *data, uint datalen)
109: { ctx->type->update(ctx, data, datalen); }
110:
111: static inline byte *mac_final(struct mac_context *ctx)
112: { return ctx->type->final(ctx); }
113:
114: static inline void mac_cleanup(struct mac_context *ctx)
115: { memset(ctx, 0, ctx->type->ctx_length); }
116:
117: void mac_fill(uint id, const byte *key, uint keylen, const byte *data, uint datalen, byte *mac);
118: int mac_verify(uint id, const byte *key, uint keylen, const byte *data, uint datalen, const byte *mac);
119:
120:
121: #endif /* _BIRD_MAC_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>