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