Hello Ilias,

On 11.11.25 10:47, Ilias Apalodimas wrote:
I think this would be easier to review/ack if you split the cmd
implementation from the actual hashing algo.

Okay, I will split it in v3 into 2 patches.


[...]

+void sm3_init(struct sm3_context *sctx)
+{
+       memset(sctx, 0, sizeof(struct sm3_context));

I usually prefer sizeof(*sctx), but up to you

Hmm.. I have no preference here ... so I change it.

+
+       /* Load initial values */
+       sctx->state[0] = SM3_IVA;
+       sctx->state[1] = SM3_IVB;
+       sctx->state[2] = SM3_IVC;
+       sctx->state[3] = SM3_IVD;
+       sctx->state[4] = SM3_IVE;
+       sctx->state[5] = SM3_IVF;
+       sctx->state[6] = SM3_IVG;
+       sctx->state[7] = SM3_IVH;
+       sctx->count = 0;
+}
+
+static inline void sm3_block(struct sm3_context *sctx,
+               u8 const *data, int blocks, u32 W[16])
+{
+       while (blocks--) {
+               sm3_transform(sctx, data, W);
+               data += SM3_BLOCK_SIZE;
+       }
+}
+
+void sm3_update(struct sm3_context *sctx, const uint8_t *input, size_t ilen)
+{
+       unsigned int partial = sctx->count % SM3_BLOCK_SIZE;
+       u32 W[16];
+
+       sctx->count += ilen;
+
+       if ((partial + ilen) >= SM3_BLOCK_SIZE) {
+               int blocks;
+
+               if (partial) {
+                       int p = SM3_BLOCK_SIZE - partial;
+
+                       memcpy(sctx->buffer + partial, input, p);
+                       input += p;
+                       ilen -= p;
+
+                       sm3_block(sctx, sctx->buffer, 1, W);
+               }
+
+               blocks = ilen / SM3_BLOCK_SIZE;
+               ilen %= SM3_BLOCK_SIZE;
+
+               if (blocks) {
+                       sm3_block(sctx, input, blocks, W);
+                       input += blocks * SM3_BLOCK_SIZE;
+               }
+
+               memset(W, 0, sizeof(W));
+
+               partial = 0;
+       }
+       if (ilen)
+               memcpy(sctx->buffer + partial, input, ilen);
+}
+
+void sm3_final(struct sm3_context *sctx, uint8_t output[SM3_DIGEST_SIZE])

I think it's more readable to just define this as output[]
[...]

okay, I also change it in sm3_hash()


+/**
+ * sm3_hash - Calculate SM3 hash of input data
+ * @input: Input data
+ * @ilen: Input data length in bytes
+ * @output: Output buffer for hash (32 bytes)
+ */
+void sm3_hash(const uint8_t *input, size_t ilen, uint8_t 
output[SM3_DIGEST_SIZE])
+{
+       struct sm3_context sctx;
+
+       sm3_init(&sctx);
+       sm3_update(&sctx, input, ilen);
+       sm3_final(&sctx, output);

Ah ignore my comment on patch #4
init, update, final is wrapped in this function

Yep, it saves in lib/tpm_tcg2.c tcg2_create_digest() another ifdef
in the variable declaration part.

bye,
Heiko

[...]

Thanks
/Ilias


--
Nabla Software Engineering
HRB 40522 Augsburg
Phone: +49 821 45592596
E-Mail: [email protected]
Geschäftsführer : Stefano Babic

Reply via email to