1 #ifndef _IPXE_MD5_H 2 #define _IPXE_MD5_H 3 4 /** @file 5 * 6 * MD5 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 MD5 digest */ 16 struct md5_digest { 17 /** Hash output */ 18 uint32_t h[4]; 19 }; 20 21 /** An MD5 data block */ 22 union md5_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 /** MD5 digest and data block 37 * 38 * The order of fields within this structure is designed to minimise 39 * code size. 40 */ 41 struct md5_digest_data { 42 /** Digest of data already processed */ 43 struct md5_digest digest; 44 /** Accumulated data */ 45 union md5_block data; 46 } __attribute__ (( packed )); 47 48 /** MD5 digest and data block */ 49 union md5_digest_data_dwords { 50 /** Digest and data block */ 51 struct md5_digest_data dd; 52 /** Raw dwords */ 53 uint32_t dword[ sizeof ( struct md5_digest_data ) / 54 sizeof ( uint32_t ) ]; 55 }; 56 57 /** An MD5 context */ 58 struct md5_context { 59 /** Amount of accumulated data */ 60 size_t len; 61 /** Digest and accumulated data */ 62 union md5_digest_data_dwords ddd; 63 } __attribute__ (( packed )); 64 65 /** MD5 context size */ 66 #define MD5_CTX_SIZE sizeof ( struct md5_context ) 67 68 /** MD5 digest size */ 69 #define MD5_DIGEST_SIZE sizeof ( struct md5_digest ) 70 71 extern struct digest_algorithm md5_algorithm; 72 73 #endif /* _IPXE_MD5_H */ 74