/*-------------------------------------------------------------------- * Check that a signature is good, leave state ready for append */ int smp_chk_sign(struct smp_signctx *ctx) { struct SHA256Context cx; unsigned char sign[SHA256_LEN]; int r = 0; if (strncmp(ctx->id, ctx->ss->ident, sizeof ctx->ss->ident)) r = 1; else if (ctx->unique != ctx->ss->unique) r = 2; else if ((uintptr_t)ctx->ss != ctx->ss->mapped) r = 3; else { SHA256_Init(&ctx->ctx); SHA256_Update(&ctx->ctx, ctx->ss, offsetof(struct smp_sign, length)); SHA256_Update(&ctx->ctx, SIGN_DATA(ctx), ctx->ss->length); cx = ctx->ctx; SHA256_Update(&cx, &ctx->ss->length, sizeof(ctx->ss->length)); SHA256_Final(sign, &cx); if (memcmp(sign, SIGN_END(ctx), sizeof sign)) r = 4; } if (r) { fprintf(stderr, "CHK(%p %s %p %s) = %d\n", ctx, ctx->id, ctx->ss, r > 1 ? ctx->ss->ident : "<invalid>", r); } return (r); }
/*-------------------------------------------------------------------- * Append data to a signature */ static void smp_append_sign(struct smp_signctx *ctx, const void *ptr, uint32_t len) { struct VSHA256Context cx; unsigned char sign[VSHA256_LEN]; if (len != 0) { VSHA256_Update(&ctx->ctx, ptr, len); ctx->ss->length += len; } cx = ctx->ctx; VSHA256_Update(&cx, &ctx->ss->length, sizeof(ctx->ss->length)); VSHA256_Final(sign, &cx); memcpy(SIGN_END(ctx), sign, sizeof sign); }