[Cryptech-Commits] [sw/stm32] branch ksng updated: Use subsectors instead of sectors in keystore.

git at cryptech.is git at cryptech.is
Fri Sep 23 04:58:42 UTC 2016


This is an automated email from the git hooks/post-receive script.

sra at hactrn.net pushed a commit to branch ksng
in repository sw/stm32.

The following commit(s) were added to refs/heads/ksng by this push:
       new  2dc81c9   Use subsectors instead of sectors in keystore.
2dc81c9 is described below

commit 2dc81c98924db865be038476ecc8ce92c186efa7
Author: Rob Austein <sra at hactrn.net>
AuthorDate: Fri Sep 23 01:00:25 2016 -0400

    Use subsectors instead of sectors in keystore.
---
 projects/cli-test/cli-test.c | 20 ++++++++++++++++++++
 projects/hsm/hsm.c           |  8 ++++++++
 spiflash_n25q128.c           | 43 +++++++++++++++++++++++++++++++------------
 spiflash_n25q128.h           |  1 +
 stm-keystore.c               | 25 +++++++++++++++++++------
 stm-keystore.h               |  1 +
 6 files changed, 80 insertions(+), 18 deletions(-)

diff --git a/projects/cli-test/cli-test.c b/projects/cli-test/cli-test.c
index d04371b..17b85cd 100644
--- a/projects/cli-test/cli-test.c
+++ b/projects/cli-test/cli-test.c
@@ -67,3 +67,23 @@ main()
     /* NOT REACHED */
     Error_Handler();
 }
+
+
+/*
+ * Dummy to solve link problem.  Not obvious to me that a program
+ * called "cli-test" should be duplicating all of the HSM keystore
+ * logic, let alone that it should be doing it badly, but, whatever.
+ *
+ * We could just copy the sdram_malloc() code from hsm.c, but since
+ * one of the other commands linked into cli-test goes merrily stomping
+ * all over the entire SDRAM chip, that might not work out so well.
+ *
+ * Issue deferred until somebody cares.
+ */
+
+#warning hal_allocate_static_memory() stubbed out in cli-test, see source code
+
+void *hal_allocate_static_memory(const size_t size)
+{
+    return NULL;
+}
diff --git a/projects/hsm/hsm.c b/projects/hsm/hsm.c
index 862e718..ac0f23a 100644
--- a/projects/hsm/hsm.c
+++ b/projects/hsm/hsm.c
@@ -217,6 +217,14 @@ static uint8_t *sdram_malloc(size_t size)
     return p;
 }
 
+/* Implement static memory allocation for libhal over sdram_malloc().
+ * Once again, there's only alloc, not free. */
+
+void *hal_allocate_static_memory(const size_t size)
+{
+    return sdram_malloc(size);
+}
+
 #if NUM_RPC_TASK > 1
 /* Critical section start/end, currently used just for hal_core_alloc/_free.
  */
diff --git a/spiflash_n25q128.c b/spiflash_n25q128.c
index 03273a8..728db7e 100644
--- a/spiflash_n25q128.c
+++ b/spiflash_n25q128.c
@@ -43,6 +43,14 @@
 #define _n25q128_deselect(ctx)	HAL_GPIO_WritePin(ctx->cs_n_port, ctx->cs_n_pin, GPIO_PIN_SET);
 
 
+#define N25Q128_NUM_BYTES	(N25Q128_PAGE_SIZE * N25Q128_NUM_PAGES)
+
+#if N25Q128_SECTOR_SIZE    * N25Q128_NUM_SECTORS    != N25Q128_NUM_BYTES || \
+    N25Q128_SUBSECTOR_SIZE * N25Q128_NUM_SUBSECTORS != N25Q128_NUM_BYTES
+#error Inconsistant definitions for pages / sectors / subsectors
+#endif
+
+
 int _n25q128_get_wel_flag(struct spiflash_ctx *ctx);
 
 
@@ -209,17 +217,17 @@ int n25q128_get_wip_flag(struct spiflash_ctx *ctx)
 }
 
 
-int n25q128_erase_sector(struct spiflash_ctx *ctx, uint32_t sector_offset)
+static int n25q128_erase_something(struct spiflash_ctx *ctx, uint8_t command, uint32_t byte_offset)
 {
+    // check offset
+    if (byte_offset >= N25Q128_NUM_BYTES) return 0;
+
     // tx buffer
     uint8_t spi_tx[4];
 
     // result
     HAL_StatusTypeDef ok;
 
-    // check offset
-    if (sector_offset >= N25Q128_NUM_SECTORS) return 0;
-
     // enable writing
     spi_tx[0] = N25Q128_COMMAND_WRITE_ENABLE;
 
@@ -236,14 +244,11 @@ int n25q128_erase_sector(struct spiflash_ctx *ctx, uint32_t sector_offset)
     int wel = _n25q128_get_wel_flag(ctx);
     if (wel != 1) return 0;
 
-    // calculate byte address
-    sector_offset *= N25Q128_SECTOR_SIZE;
-
-    // send ERASE SUBSECTOR command
-    spi_tx[0] = N25Q128_COMMAND_ERASE_SECTOR;
-    spi_tx[1] = (uint8_t)(sector_offset >> 16);
-    spi_tx[2] = (uint8_t)(sector_offset >>  8);
-    spi_tx[3] = (uint8_t)(sector_offset >>  0);
+    // send command (ERASE SECTOR or ERASE SUBSECTOR)
+    spi_tx[0] = command;
+    spi_tx[1] = (uint8_t)(byte_offset >> 16);
+    spi_tx[2] = (uint8_t)(byte_offset >>  8);
+    spi_tx[3] = (uint8_t)(byte_offset >>  0);
 
     // activate, send command, deselect
     _n25q128_select(ctx);
@@ -259,6 +264,20 @@ int n25q128_erase_sector(struct spiflash_ctx *ctx, uint32_t sector_offset)
 }
 
 
+int n25q128_erase_sector(struct spiflash_ctx *ctx, uint32_t sector_offset)
+{
+    return n25q128_erase_something(ctx, N25Q128_COMMAND_ERASE_SECTOR,
+				   sector_offset * N25Q128_SECTOR_SIZE);
+}
+
+
+int n25q128_erase_subsector(struct spiflash_ctx *ctx, uint32_t subsector_offset)
+{
+    return n25q128_erase_something(ctx, N25Q128_COMMAND_ERASE_SUBSECTOR,
+				   subsector_offset * N25Q128_SUBSECTOR_SIZE);
+}
+
+
 int _n25q128_get_wel_flag(struct spiflash_ctx *ctx)
 {
     // tx, rx buffers
diff --git a/spiflash_n25q128.h b/spiflash_n25q128.h
index d4c82d5..c696911 100644
--- a/spiflash_n25q128.h
+++ b/spiflash_n25q128.h
@@ -74,6 +74,7 @@ extern int n25q128_get_wip_flag(struct spiflash_ctx *ctx);
 extern int n25q128_read_page(struct spiflash_ctx *ctx, uint32_t page_offset, uint8_t *page_buffer);
 extern int n25q128_write_page(struct spiflash_ctx *ctx, uint32_t page_offset, const uint8_t *page_buffer);
 extern int n25q128_erase_sector(struct spiflash_ctx *ctx, uint32_t sector_offset);
+extern int n25q128_erase_subsector(struct spiflash_ctx *ctx, uint32_t subsector_offset);
 
 extern int n25q128_write_data(struct spiflash_ctx *ctx, uint32_t offset, const uint8_t *buf, const uint32_t len, const int auto_erase);
 extern int n25q128_read_data(struct spiflash_ctx *ctx, uint32_t offset, uint8_t *buf, const uint32_t len);
diff --git a/stm-keystore.c b/stm-keystore.c
index 57827cf..b9900cb 100644
--- a/stm-keystore.c
+++ b/stm-keystore.c
@@ -55,14 +55,15 @@ int keystore_write_data(uint32_t offset, const uint8_t *buf, const uint32_t len)
     return n25q128_write_data(&keystore_ctx, offset, buf, len, 0);
 }
 
-int keystore_erase_sectors(uint32_t start, uint32_t stop)
+static int keystore_erase_something(uint32_t start, uint32_t stop, uint32_t limit,
+				    int (*eraser)(uint32_t, uint32_t))
 {
-    uint32_t sector;
+    uint32_t someting;
 
-    if (start > N25Q128_NUM_SECTORS) return -2;
-    if (stop > N25Q128_NUM_SECTORS || stop < start) return -3;
+    if (start > limit) return -2;
+    if (stop > limit || stop < start) return -3;
 
-    for (sector = start; sector <= stop; sector++) {
+    for (someting = start; someting <= stop; someting++) {
 	int timeout = 200; /* times 10ms = 2 seconds timeout */
 	while (timeout--) {
 	    int i = n25q128_get_wip_flag(&keystore_ctx);
@@ -72,9 +73,21 @@ int keystore_erase_sectors(uint32_t start, uint32_t stop)
 	}
 	if (! timeout) return 0;
 
-	if (! n25q128_erase_sector(&keystore_ctx, sector)) {
+	if (! eraser(&keystore_ctx, someting)) {
             return -1;
         }
     }
     return 1;
 }
+
+int keystore_erase_sectors(uint32_t start, uint32_t stop)
+{
+    return keystore_erase_something(start, stop, N25Q128_NUM_SECTORS,
+				    n25q128_erase_sector);
+}
+
+int keystore_erase_subsectors(uint32_t start, uint32_t stop)
+{
+    return keystore_erase_something(start, stop, N25Q128_NUM_SUBSECTORS,
+				    n25q128_erase_subsector);
+}
diff --git a/stm-keystore.h b/stm-keystore.h
index 457dc05..9054db5 100644
--- a/stm-keystore.h
+++ b/stm-keystore.h
@@ -60,5 +60,6 @@ extern int keystore_check_id(void);
 extern int keystore_read_data(uint32_t offset, uint8_t *buf, const uint32_t len);
 extern int keystore_write_data(uint32_t offset, const uint8_t *buf, const uint32_t len);
 extern int keystore_erase_sectors(uint32_t start, uint32_t stop);
+extern int keystore_erase_subsectors(uint32_t start, uint32_t stop);
 
 #endif /* __STM32_KEYSTORE_H */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Commits mailing list