Annotation of embedaddon/bird/lib/mac.h, revision 1.1
1.1 ! misho 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>