summaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/des.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/ipxe/des.h')
-rw-r--r--src/include/ipxe/des.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/include/ipxe/des.h b/src/include/ipxe/des.h
new file mode 100644
index 00000000..755a90ea
--- /dev/null
+++ b/src/include/ipxe/des.h
@@ -0,0 +1,91 @@
+#ifndef _IPXE_DES_H
+#define _IPXE_DES_H
+
+/** @file
+ *
+ * DES algorithm
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <ipxe/crypto.h>
+
+/** A DES 32-bit dword value
+ *
+ * DES views data as 64-bit big-endian values, typically handled as a
+ * most-significant "left" half and a least-significant "right" half.
+ */
+union des_dword {
+ /** Raw bytes */
+ uint8_t byte[4];
+ /** 32-bit big-endian dword */
+ uint32_t dword;
+};
+
+/** A DES 64-bit block */
+union des_block {
+ /** Raw bytes */
+ uint8_t byte[8];
+ /** 32-bit big-endian dwords */
+ uint32_t dword[2];
+ /** Named left and right halves */
+ struct {
+ /** Left (most significant) half */
+ union des_dword left;
+ /** Right (least significant) half */
+ union des_dword right;
+ };
+ /** Named "C" and "D" halves */
+ struct {
+ /** "C" (most significant) half */
+ union des_dword c;
+ /** "D" (least significant) half */
+ union des_dword d;
+ };
+};
+
+/** DES blocksize */
+#define DES_BLOCKSIZE sizeof ( union des_block )
+
+/** A DES round key
+ *
+ * A DES round key is a 48-bit value, consumed as 8 groups of 6 bits.
+ * We store these as 8 separate bytes, for simplicity of consumption.
+ */
+union des_round_key {
+ /** Raw bytes */
+ uint8_t byte[8];
+ /** 32-bit big-endian dwords */
+ uint32_t dword[2];
+ /** 6-bit step key byte
+ *
+ * There are 8 steps within a DES round (one step per S-box).
+ * Each step requires six bits of the round key.
+ *
+ * As an optimisation, we store the least significant of the 6
+ * bits in the sign bit of a signed 8-bit value, and the
+ * remaining 5 bits in the least significant 5 bits of the
+ * 8-bit value. See the comments in des_sbox() for further
+ * details.
+ */
+ int8_t step[8];
+};
+
+/** Number of DES rounds */
+#define DES_ROUNDS 16
+
+/** DES context */
+struct des_context {
+ /** Round keys */
+ union des_round_key rkey[DES_ROUNDS];
+};
+
+/** DES context size */
+#define DES_CTX_SIZE sizeof ( struct des_context )
+
+extern struct cipher_algorithm des_algorithm;
+extern struct cipher_algorithm des_ecb_algorithm;
+extern struct cipher_algorithm des_cbc_algorithm;
+
+#endif /* _IPXE_DES_H */