1 #ifndef _IPXE_MD4_H 2 #define _IPXE_MD4_H 3 4 /** @file 5 * 6 * MD4 algorithm 7 * 8 */ 9 10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); 11 12 #include <stdint.h> 13 #include <ipxe/crypto.h> 14 15 /** An MD4 digest */ 16 struct md4_digest { 17 /** Hash output */ 18 uint32_t h[4]; 19 }; 20 21 /** An MD4 data block */ 22 union md4_block { 23 /** Raw bytes */ 24 uint8_t byte[64]; 25 /** Raw dwords */ 26 uint32_t dword[16]; 27 /** Final block structure */ 28 struct { 29 /** Padding */ 30 uint8_t pad[56]; 31 /** Length in bits */ 32 uint64_t len; 33 } final; 34 }; 35 36 /** MD4 digest and data block 37 * 38 * The order of fields within this structure is designed to minimise 39 * code size. 40 */ 41 struct md4_digest_data { 42 /** Digest of data already processed */ 43 struct md4_digest digest; 44 /** Accumulated data */ 45 union md4_block data; 46 } __attribute__ (( packed )); 47 48 /** MD4 digest and data block */ 49 union md4_digest_data_dwords { 50 /** Digest and data block */ 51 struct md4_digest_data dd; 52 /** Raw dwords */ 53 uint32_t dword[ sizeof ( struct md4_digest_data ) / 54 sizeof ( uint32_t ) ]; 55 }; 56 57 /** An MD4 context */ 58 struct md4_context { 59 /** Amount of accumulated data */ 60 size_t len; 61 /** Digest and accumulated data */ 62 union md4_digest_data_dwords ddd; 63 } __attribute__ (( packed )); 64 65 /** MD4 context size */ 66 #define MD4_CTX_SIZE sizeof ( struct md4_context ) 67 68 /** MD4 digest size */ 69 #define MD4_DIGEST_SIZE sizeof ( struct md4_digest ) 70 71 extern struct digest_algorithm md4_algorithm; 72 73 #endif /* _IPXE_MD4_H */ 74