1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // 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.
- //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)
- }
|