From 8fa8f42cb37648a3c0754552c7397aeb3f36d921 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 7 Sep 2017 12:14:31 -0400 Subject: [PATCH] [dev.boringcrypto] crypto/internal/boring: allow hmac operations after Sum hmac.New returns a hash.Hash, which defines Sum as: // Sum appends the current hash to b and returns the resulting slice. // It does not change the underlying hash state. Sum(b []byte) []byte I've now seen two different pieces of code that make use of the assumption that Sum has no effect on the internal state, so make it so. Test in next CL in stack, so that it can be cherry-picked to master. Change-Id: Iad84ab3e2cc12dbecef25c3fc8f2662d157b0d0b Reviewed-on: https://go-review.googlesource.com/63910 Reviewed-by: Adam Langley --- src/crypto/internal/boring/goboringcrypto.h | 1 + .../boring/goboringcrypto_linux_amd64.syso | Bin 7576080 -> 7576096 bytes src/crypto/internal/boring/hmac.go | 36 ++++++------------ 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/src/crypto/internal/boring/goboringcrypto.h b/src/crypto/internal/boring/goboringcrypto.h index 2cc327f16c..f982ce83c2 100644 --- a/src/crypto/internal/boring/goboringcrypto.h +++ b/src/crypto/internal/boring/goboringcrypto.h @@ -90,6 +90,7 @@ int _goboringcrypto_HMAC_Init(GO_HMAC_CTX*, const void*, int, const GO_EVP_MD*); int _goboringcrypto_HMAC_Update(GO_HMAC_CTX*, const uint8_t*, size_t); int _goboringcrypto_HMAC_Final(GO_HMAC_CTX*, uint8_t*, unsigned int*); size_t _goboringcrypto_HMAC_size(const GO_HMAC_CTX*); +int _goboringcrypto_HMAC_CTX_copy_ex(GO_HMAC_CTX *dest, const GO_HMAC_CTX *src); // #include typedef struct GO_AES_KEY { char data[244]; } GO_AES_KEY; diff --git a/src/crypto/internal/boring/goboringcrypto_linux_amd64.syso b/src/crypto/internal/boring/goboringcrypto_linux_amd64.syso index 89c88e9953a7aec441ddba47afc79866b1e5c0ca..e439dc3cd455ee9949a6b75ba762582456d7a224 100644 GIT binary patch delta 37908 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 0 { + if len(p) > 0 { C._goboringcrypto_HMAC_Update(&h.ctx, (*C.uint8_t)(unsafe.Pointer(&p[0])), C.size_t(len(p))) } return len(p), nil @@ -137,25 +134,16 @@ func (h *boringHMAC) Sum(in []byte) []byte { if h.sum == nil { size := h.Size() h.sum = make([]byte, size) - C._goboringcrypto_HMAC_Final(&h.ctx, (*C.uint8_t)(unsafe.Pointer(&h.sum[0])), nil) - - // Clean up and disable finalizer since most of the time - // there is no Reset coming. If we do get a Reset, we will - // re-enable the finalizer. We have a saved copy of the key. - C._goboringcrypto_HMAC_CTX_cleanup(&h.ctx) - h.needCleanup = false - runtime.SetFinalizer(h, nil) - } else if &h.sum[0] == &badSum[0] { - // crypto/tls's tls10.MAC method calls Write after Sum, - // in an attempt to do more-like-constant-time checksums - // during TLS 1.0 SHA1-based MACs. We can't support that, - // so we ignore the Write in that case above, but we also - // poison h.sum so that future Sum calls panic, to avoid - // returning the pre-Write checksum. - // We expect no code actually does Sum, Write, Sum. - // Under FIPS restrictions, crypto/tls would not use - // any SHA1-based MACs anyway. - panic("boringcrypto: hmac used with Sum, Write, Sum") } + // Make copy of context because Go hash.Hash mandates + // that Sum has no effect on the underlying stream. + // In particular it is OK to Sum, then Write more, then Sum again, + // and the second Sum acts as if the first didn't happen. + C._goboringcrypto_HMAC_CTX_init(&h.ctx2) + if C._goboringcrypto_HMAC_CTX_copy_ex(&h.ctx2, &h.ctx) == 0 { + panic("boringcrypto: HMAC_CTX_copy_ex failed") + } + C._goboringcrypto_HMAC_Final(&h.ctx2, (*C.uint8_t)(unsafe.Pointer(&h.sum[0])), nil) + C._goboringcrypto_HMAC_CTX_cleanup(&h.ctx2) return append(in, h.sum...) } -- 2.50.0