1 /* ----------------------------------------------------------------------- 2 * 3 * umac.h -- C Implementation UMAC Message Authentication 4 * 5 * Version 0.93a of rfc4418.txt -- 2006 July 14 6 * 7 * For a full description of UMAC message authentication see the UMAC 8 * world-wide-web page at http://www.cs.ucdavis.edu/~rogaway/umac 9 * Please report bugs and suggestions to the UMAC webpage. 10 * 11 * Copyright (c) 1999-2004 Ted Krovetz 12 * 13 * Permission to use, copy, modify, and distribute this software and 14 * its documentation for any purpose and with or without fee, is hereby 15 * granted provided that the above copyright notice appears in all copies 16 * and in supporting documentation, and that the name of the copyright 17 * holder not be used in advertising or publicity pertaining to 18 * distribution of the software without specific, written prior permission. 19 * 20 * Comments should be directed to Ted Krovetz (tdk@acm.org) 21 * 22 * ---------------------------------------------------------------------- */ 23 24 /* ////////////////////// IMPORTANT NOTES ///////////////////////////////// 25 * 26 * 1) This version does not work properly on messages larger than 16MB 27 * 28 * 2) If you set the switch to use SSE2, then all data must be 16-byte 29 * aligned 30 * 31 * 3) When calling the function umac(), it is assumed that msg is in 32 * a writable buffer of length divisible by 32 bytes. The message itself 33 * does not have to fill the entire buffer, but bytes beyond msg may be 34 * zeroed. 35 * 36 * 4) Two free AES implementations are supported by this implementation of 37 * UMAC. Paulo Barreto's version is in the public domain and can be found 38 * at http://www.esat.kuleuven.ac.be/~rijmen/rijndael/ (search for 39 * "Barreto"). The only two files needed are rijndael-alg-fst.c and 40 * rijndael-alg-fst.h. 41 * Brian Gladman's version is distributed with GNU Public License 42 * and can be found at http://fp.gladman.plus.com/AES/index.htm. It 43 * includes a fast IA-32 assembly version. 44 * 45 /////////////////////////////////////////////////////////////////////// */ 46 #ifndef HEADER_UMAC_H 47 #define HEADER_UMAC_H 48 49 #ifdef __cplusplus 50 extern "C" { 51 #endif 52 53 struct umac_ctx *umac_alloc(void); 54 /* Dynamically allocate a umac_ctx struct. */ 55 56 struct umac_ctx *umac_new(unsigned char key[]); 57 /* Dynamically allocate a umac_ctx struct, initialize variables, 58 * generate subkeys from key. 59 */ 60 61 void umac_init(struct umac_ctx *ctx, unsigned char key[]); 62 /* Initialize a previously allocated umac_ctx struct. */ 63 64 int umac_reset(struct umac_ctx *ctx); 65 /* Reset a umac_ctx to begin authenticating a new message */ 66 67 int umac_update(struct umac_ctx *ctx, unsigned char *input, long len); 68 /* Incorporate len bytes pointed to by input into context ctx */ 69 70 int umac_final(struct umac_ctx *ctx, unsigned char tag[], unsigned char nonce[8]); 71 /* Incorporate any pending data and the ctr value, and return tag. 72 * This function returns error code if ctr < 0. 73 */ 74 75 int umac_delete(struct umac_ctx *ctx); 76 /* Deallocate the context structure */ 77 78 /* ProFTPD Note: We reuse umac_ctx for the umac-128 implementation, as the 79 * structure is opaque. We simply recompile the umac.c file with different 80 * preprocessor macros to get the umac-128 implementation. 81 */ 82 struct umac_ctx *umac128_alloc(void); 83 struct umac_ctx *umac128_new(unsigned char key[]); 84 void umac128_init(struct umac_ctx *ctx, unsigned char key[]); 85 int umac128_reset(struct umac_ctx *ctx); 86 int umac128_update(struct umac_ctx *ctx, unsigned char *input, long len); 87 int umac128_final(struct umac_ctx *ctx, unsigned char tag[], unsigned char nonce[8]); 88 int umac128_delete(struct umac_ctx *ctx); 89 90 #ifdef __cplusplus 91 } 92 #endif 93 94 #endif /* HEADER_UMAC_H */ 95