| // Copyright 2019 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. |
| |
| //go:build gc && !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) |
| } |