Skip to content

Latest commit

 

History

History
222 lines (196 loc) · 6.92 KB

libopencm3-patch.md

File metadata and controls

222 lines (196 loc) · 6.92 KB

libopencm3 required the patch from

https://github.com/libopencm3/libopencm3/pull/794/commits/f95b6133c27b485523542c0993d914ac6d3f8a1b

to be applied.

The patch is below:

diff --git a/include/libopencm3/stm32/common/crypto_common_f24.h b/include/libopencm3/stm32/common/crypto_common_f24.h
index eb885c8f..946396b6 100644
--- a/include/libopencm3/stm32/common/crypto_common_f24.h
+++ b/include/libopencm3/stm32/common/crypto_common_f24.h
@@ -138,11 +138,12 @@ specific memorymap.h header before including this header file.*/
 #define CRYP_MISR		MMIO32(CRYP_BASE + 0x1C)
 
 /* CRYP Key registers (CRYP_KxLR) x=0..3 */
-#define CRYP_KR(i)		MMIO64(CRYP_BASE + 0x20 + (i) * 8)
+#define CRYP_KR(i)		MMIO32(CRYP_BASE + 0x20 + (i) * 4)
+#define CRYP_KR_COUNT   8
 
 /* CRYP Initialization Vector Registers (CRYP_IVxLR) x=0..1 */
-#define CRYP_IVR(i)		MMIO32(CRYP_BASE + 0x40 + (i) * 8)
-
+#define CRYP_IVR(i)		MMIO32(CRYP_BASE + 0x40 + (i) * 4)
+#define CRYP_IVR_COUNT  4
 /* --- CRYP_CR values ------------------------------------------------------ */
 
 /* ALGODIR: Algorithm direction */
@@ -150,7 +151,7 @@ specific memorymap.h header before including this header file.*/
 
 /* ALGOMODE: Algorithm mode */
 #define CRYP_CR_ALGOMODE_SHIFT		3
-#define CRYP_CR_ALGOMODE		(7 << CRYP_CR_ALGOMODE_SHIFT)
+#define CRYP_CR_ALGOMODE		    (7 << CRYP_CR_ALGOMODE_SHIFT)
 #define CRYP_CR_ALGOMODE_TDES_ECB	(0 << CRYP_CR_ALGOMODE_SHIFT)
 #define CRYP_CR_ALGOMODE_TDES_CBC	(1 << CRYP_CR_ALGOMODE_SHIFT)
 #define CRYP_CR_ALGOMODE_DES_ECB	(2 << CRYP_CR_ALGOMODE_SHIFT)
@@ -162,7 +163,7 @@ specific memorymap.h header before including this header file.*/
 
 /* DATATYPE: Data type selection */
 #define CRYP_CR_DATATYPE_SHIFT		6
-#define CRYP_CR_DATATYPE		(3 << CRYP_CR_DATATYPE_SHIFT)
+#define CRYP_CR_DATATYPE		   (3 << CRYP_CR_DATATYPE_SHIFT)
 #define CRYP_CR_DATATYPE_32		(0 << CRYP_CR_DATATYPE_SHIFT)
 #define CRYP_CR_DATATYPE_16		(1 << CRYP_CR_DATATYPE_SHIFT)
 #define CRYP_CR_DATATYPE_8		(2 << CRYP_CR_DATATYPE_SHIFT)
@@ -261,6 +262,12 @@ enum crypto_keysize {
 	CRYPTO_KEY_192BIT,
 	CRYPTO_KEY_256BIT,
 };
+enum key_offset
+{
+	KEY_128BIT_OFFSET = 4,
+	KEY_192BIT_OFFSET = 2,
+	KEY_256BIT_OFFSET = 0,
+};
 enum crypto_datatype {
 
 	CRYPTO_DATA_32BIT = 0,
@@ -271,13 +278,13 @@ enum crypto_datatype {
 
 BEGIN_DECLS
 void crypto_wait_busy(void);
-void crypto_set_key(enum crypto_keysize keysize, uint64_t key[]);
-void crypto_set_iv(uint64_t iv[]);
+void crypto_set_key(enum crypto_keysize keysize, const uint8_t *key);
+void crypto_set_iv(const uint8_t *iv);
 void crypto_set_datatype(enum crypto_datatype datatype);
 void crypto_set_algorithm(enum crypto_mode mode);
 void crypto_start(void);
 void crypto_stop(void);
-uint32_t crypto_process_block(uint32_t *inp, uint32_t *outp, uint32_t length);
+uint32_t crypto_process_block(const uint32_t *inp, uint32_t *outp, uint32_t length);
 END_DECLS
 /**@}*/
 /**@}*/
diff --git a/lib/stm32/common/crypto_common_f24.c b/lib/stm32/common/crypto_common_f24.c
index 22f329c6..c7b3e7fd 100644
--- a/lib/stm32/common/crypto_common_f24.c
+++ b/lib/stm32/common/crypto_common_f24.c
@@ -32,10 +32,10 @@
 
 /**@{*/
 
+#include <string.h>
+#include <libopencmsis/core_cm3.h>
 #include <libopencm3/stm32/crypto.h>
 
-#define CRYP_CR_ALGOMODE_MASK	((1 << 19) | CRYP_CR_ALGOMODE)
-
 /**
  * @brief Wait, if the Controller is busy
  */
@@ -47,37 +47,66 @@ void crypto_wait_busy(void)
 /**
  * @brief Set key value to the controller
  * @param[in] keysize enum crypto_keysize Specified size of the key.
- * @param[in] key uint64_t[] Key value (array of 4 items)
+ * @param[in] key uint8_t* Key value (array of 16 bytes (KEY_SIZE_128BIT) |
+ *                                    array of 24 bytes (KEY_SIZE_192BIT) |
+ *                                    array of 32 bytes (KEY_SIZE_256BIT))
  */
-void crypto_set_key(enum crypto_keysize keysize, uint64_t key[])
+void crypto_set_key(enum crypto_keysize keysize, const uint8_t *key)
 {
 	int i;
+	int j;
 
 	crypto_wait_busy();
 
-	CRYP_CR = (CRYP_CR & ~CRYP_CR_KEYSIZE) |
-		  (keysize << CRYP_CR_KEYSIZE_SHIFT);
+	CRYP_CR = (CRYP_CR & ~CRYP_CR_KEYSIZE) | (keysize << CRYP_CR_KEYSIZE_SHIFT);
+
+	uint32_t *key_32bit_pointer = (uint32_t*)key;
+
+	uint32_t swaped_key[CRYP_KR_COUNT];
+	memset(swaped_key, 0, sizeof(swaped_key));
+
+	switch(keysize)
+	{
+		case CRYPTO_KEY_128BIT:
+			for(i = KEY_128BIT_OFFSET, j = 0; i < CRYP_KR_COUNT; i++, j++) {
+				swaped_key[i] = __REV(key_32bit_pointer[j]);
+			}
+			break;
+		case CRYPTO_KEY_192BIT:
+			for(i = KEY_192BIT_OFFSET, j = 0; i < CRYP_KR_COUNT; i++, j++) {
+				swaped_key[i] = __REV(key_32bit_pointer[j]);
+			}
+			break;
+		case CRYPTO_KEY_256BIT:
+			for(i = KEY_256BIT_OFFSET, j = 0; i < CRYP_KR_COUNT; i++, j++) {
+				swaped_key[i] = __REV(key_32bit_pointer[j]);
+			}
+			break;
+	}
+
 
-	for (i = 0; i < 4; i++) {
-		CRYP_KR(i) = key[i];
+	for (i = 0; i < CRYP_KR_COUNT; i++) {
+		CRYP_KR(i) = swaped_key[i];
 	}
 }
 
 /**
  * @brief Set Initialization Vector
  *
- * @param[in] iv uint64_t[] Initialization vector (array of 4 items)
+ * @param[in] iv uint8_t* Initialization vector (array of 16 items)
 
  * @note Cryptographic controller must be in disabled state
  */
-void crypto_set_iv(uint64_t iv[])
+void crypto_set_iv(const uint8_t *iv)
 {
 	int i;
 
 	crypto_wait_busy();
 
-	for (i = 0; i < 4; i++) {
-		CRYP_IVR(i) = iv[i];
+	uint32_t *iv_32bit_pointer = (uint32_t*)iv;
+
+	for (i = 0; i < CRYP_IVR_COUNT; i++) {
+		CRYP_IVR(i) = __REV(iv_32bit_pointer[i]);
 	}
 }
 
@@ -88,8 +117,7 @@ void crypto_set_iv(uint64_t iv[])
  */
 void crypto_set_datatype(enum crypto_datatype datatype)
 {
-	CRYP_CR = (CRYP_CR & ~CRYP_CR_DATATYPE) |
-		  (datatype << CRYP_CR_DATATYPE_SHIFT);
+	CRYP_CR = (CRYP_CR & ~CRYP_CR_DATATYPE) | (datatype << CRYP_CR_DATATYPE_SHIFT);
 }
 
 /**
@@ -99,12 +127,10 @@ void crypto_set_datatype(enum crypto_datatype datatype)
  */
 void crypto_set_algorithm(enum crypto_mode mode)
 {
-	mode &= ~CRYP_CR_ALGOMODE_MASK;
-
 	if ((mode == DECRYPT_AES_ECB) || (mode == DECRYPT_AES_CBC)) {
 		/* Unroll keys for the AES encoder for the user automatically */
 
-		CRYP_CR = (CRYP_CR & ~CRYP_CR_ALGOMODE_MASK) |
+		CRYP_CR = (CRYP_CR & ~CRYP_CR_ALGOMODE) |
 		    CRYP_CR_ALGOMODE_AES_PREP;
 
 		crypto_start();
@@ -112,7 +138,8 @@ void crypto_set_algorithm(enum crypto_mode mode)
 		/* module switches to DISABLE automatically */
 	}
 	/* set algo mode */
-	CRYP_CR = (CRYP_CR & ~CRYP_CR_ALGOMODE_MASK) | mode;
+	CRYP_CR = (CRYP_CR & ~CRYP_CR_ALGODIR);
+	CRYP_CR = (CRYP_CR & ~CRYP_CR_ALGOMODE) | mode;
 
 	/* flush buffers */
 	CRYP_CR |= CRYP_CR_FFLUSH;
@@ -129,7 +156,6 @@ void crypto_start(void)
 /**
  * @brief Disable the cryptographic controller and stop processing
  */
-
 void crypto_stop(void)
 {
 	CRYP_CR &= ~CRYP_CR_CRYPEN;
@@ -149,7 +175,7 @@ void crypto_stop(void)
  *
  * @returns uint32_t Number of written words
  */
-uint32_t crypto_process_block(uint32_t *inp, uint32_t *outp, uint32_t length)
+uint32_t crypto_process_block(const uint32_t *inp, uint32_t *outp, uint32_t length)
 {
 	uint32_t rd = 0, wr = 0;