Hi, Linus,

On 06/05/2018 04:49 PM, Linus Walleij wrote:
This reads out the serial number of the crypto chip and prints it,
also toss this into the entropy pool as it is device-unique data.

Signed-off-by: Linus Walleij <linus.wall...@linaro.org>
---
  drivers/crypto/atmel-ecc.c | 56 ++++++++++++++++++++++++++++++++++++++
  1 file changed, 56 insertions(+)

diff --git a/drivers/crypto/atmel-ecc.c b/drivers/crypto/atmel-ecc.c
index 603e29bdcb97..fd8149313104 100644
--- a/drivers/crypto/atmel-ecc.c
+++ b/drivers/crypto/atmel-ecc.c
@@ -29,6 +29,7 @@
  #include <linux/scatterlist.h>
  #include <linux/slab.h>
  #include <linux/workqueue.h>
+#include <linux/random.h>

includes should be ordered alphabetically.

  #include <crypto/internal/kpp.h>
  #include <crypto/ecdh.h>
  #include <crypto/kpp.h>
@@ -616,6 +617,57 @@ static inline size_t atmel_ecc_wake_token_sz(u32 
bus_clk_rate)
        return DIV_ROUND_UP(no_of_bits, 8);
  }
+static int atmel_ecc_get_serial(struct i2c_client *client)
+{
+       struct atmel_ecc_cmd *cmd;
+       u8 serial[9];

int i, ret; before serial to avoid stack padding.

+       int ret;
+       int i;
+
+       cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
+       if (!cmd)
+               return -ENOMEM;
+
+       atmel_ecc_init_read_config_word(cmd, CONFIG_ZONE_SERIAL_0_3);
+       ret = atmel_ecc_send_receive(client, cmd);
+       if (ret) {

free(cmd);

+               dev_err(&client->dev,
+                       "failed to read serial byte 0-3\n");
+               return ret;
+       }
+       for (i = 0; i < 4; i++)
+               serial[0+i] = cmd->data[RSP_DATA_IDX + i];

serial[i]?

+
+       atmel_ecc_init_read_config_word(cmd, CONFIG_ZONE_SERIAL_4_7);

can't we read the serial_no once?

+       ret = atmel_ecc_send_receive(client, cmd);
+       if (ret) {
+               dev_err(&client->dev,
+                       "failed to read serial byte 4-7\n");
+               return ret;
+       }
+       for (i = 0; i < 4; i++)
+               serial[4+i] = cmd->data[RSP_DATA_IDX + i];

spaces preferred around that '+'

+
+
+       atmel_ecc_init_read_config_word(cmd, CONFIG_ZONE_SERIAL_8_I2CEN);
+       ret = atmel_ecc_send_receive(client, cmd);
+       if (ret) {
+               dev_err(&client->dev,
+                       "failed to read serial byte 8\n");
+               return ret;
+       }
+       serial[8] = cmd->data[RSP_DATA_IDX];
+
+       /* This is device-unique data so it goes into the entropy pool */
+       add_device_randomness(serial, sizeof(serial));
+
+       dev_info(&client->dev,
+                "serial number: %02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+                serial[0], serial[1], serial[2], serial[3], serial[4],
+                serial[5], serial[6], serial[7], serial[8]);

Why do you need the serial number printed out?

+       return 0;
+}
+
  static int device_sanity_check(struct i2c_client *client)
  {
        struct atmel_ecc_cmd *cmd;
@@ -700,6 +752,10 @@ static int atmel_ecc_probe(struct i2c_client *client,
        if (ret)
                return ret;
+ ret = atmel_ecc_get_serial(client);
+       if (ret)
+               return ret;
+
        spin_lock(&driver_data.i2c_list_lock);
        list_add_tail(&i2c_priv->i2c_client_list_node,
                      &driver_data.i2c_client_list);

Reply via email to