// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !gccgo,!purego package poly1305 //go:noescape func update(state *macState, msg []byte) // mac is a wrapper for macGeneric that redirects calls that would have gone to // updateGeneric to update. // // Its Write and Sum methods are otherwise identical to the macGeneric ones, but // using function pointers would carry a major performance cost. type mac struct{ macGeneric } func (h *mac) Write(p []byte) (int, error) { nn := len(p) if h.offset > 0 { n := copy(h.buffer[h.offset:], p) if h.offset+n < TagSize { h.offset += n return nn, nil } p = p[n:] h.offset = 0 update(&h.macState, h.buffer[:]) } if n := len(p) - (len(p) % TagSize); n > 0 { update(&h.macState, p[:n]) p = p[n:] } if len(p) > 0 { h.offset += copy(h.buffer[h.offset:], p) } return nn, nil } func (h *mac) Sum(out *[16]byte) { state := h.macState if h.offset > 0 { update(&state, h.buffer[:h.offset]) } finalize(out, &state.h, &state.s) }