X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BearSSL;a=blobdiff_plain;f=src%2Faead%2Fgcm.c;h=ede5f0872dd9c3a8bab2a97770ad6c19e5058fa4;hp=9cf0f38e963599f459ffb668539f7f1db565b318;hb=946f5bad7683aa79a9f4fcab760206e2aad8c555;hpb=127fb4a31d24e58fa8e04a154c6e87a2cb28245b diff --git a/src/aead/gcm.c b/src/aead/gcm.c index 9cf0f38..ede5f08 100644 --- a/src/aead/gcm.c +++ b/src/aead/gcm.c @@ -56,6 +56,7 @@ br_gcm_init(br_gcm_context *ctx, const br_block_ctr_class **bctx, br_ghash gh) { unsigned char iv[12]; + ctx->vtable = &br_gcm_vtable; ctx->bctx = bctx; ctx->gh = gh; @@ -262,9 +263,19 @@ br_gcm_get_tag(br_gcm_context *ctx, void *tag) (*ctx->bctx)->run(ctx->bctx, ctx->j0_1, ctx->j0_2, tag, 16); } +/* see bearssl_aead.h */ +void +br_gcm_get_tag_trunc(br_gcm_context *ctx, void *tag, size_t len) +{ + unsigned char tmp[16]; + + br_gcm_get_tag(ctx, tmp); + memcpy(tag, tmp, len); +} + /* see bearssl_aead.h */ uint32_t -br_gcm_check_tag(br_gcm_context *ctx, const void *tag) +br_gcm_check_tag_trunc(br_gcm_context *ctx, const void *tag, size_t len) { unsigned char tmp[16]; size_t u; @@ -272,12 +283,19 @@ br_gcm_check_tag(br_gcm_context *ctx, const void *tag) br_gcm_get_tag(ctx, tmp); x = 0; - for (u = 0; u < sizeof tmp; u ++) { + for (u = 0; u < len; u ++) { x |= tmp[u] ^ ((const unsigned char *)tag)[u]; } return EQ0(x); } +/* see bearssl_aead.h */ +uint32_t +br_gcm_check_tag(br_gcm_context *ctx, const void *tag) +{ + return br_gcm_check_tag_trunc(ctx, tag, 16); +} + /* see bearssl_aead.h */ const br_aead_class br_gcm_vtable = { 16, @@ -292,5 +310,9 @@ const br_aead_class br_gcm_vtable = { (void (*)(const br_aead_class **, void *)) &br_gcm_get_tag, (uint32_t (*)(const br_aead_class **, const void *)) - &br_gcm_check_tag + &br_gcm_check_tag, + (void (*)(const br_aead_class **, void *, size_t)) + &br_gcm_get_tag_trunc, + (uint32_t (*)(const br_aead_class **, const void *, size_t)) + &br_gcm_check_tag_trunc };