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>