github.com/Psiphon-Labs/psiphon-tunnel-core@v2.0.28+incompatible/psiphon/common/crypto/internal/poly1305/sum_ppc64le.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build gc && !purego 6 // +build gc,!purego 7 8 package poly1305 9 10 //go:noescape 11 func update(state *macState, msg []byte) 12 13 // mac is a wrapper for macGeneric that redirects calls that would have gone to 14 // updateGeneric to update. 15 // 16 // Its Write and Sum methods are otherwise identical to the macGeneric ones, but 17 // using function pointers would carry a major performance cost. 18 type mac struct{ macGeneric } 19 20 func (h *mac) Write(p []byte) (int, error) { 21 nn := len(p) 22 if h.offset > 0 { 23 n := copy(h.buffer[h.offset:], p) 24 if h.offset+n < TagSize { 25 h.offset += n 26 return nn, nil 27 } 28 p = p[n:] 29 h.offset = 0 30 update(&h.macState, h.buffer[:]) 31 } 32 if n := len(p) - (len(p) % TagSize); n > 0 { 33 update(&h.macState, p[:n]) 34 p = p[n:] 35 } 36 if len(p) > 0 { 37 h.offset += copy(h.buffer[h.offset:], p) 38 } 39 return nn, nil 40 } 41 42 func (h *mac) Sum(out *[16]byte) { 43 state := h.macState 44 if h.offset > 0 { 45 update(&state, h.buffer[:h.offset]) 46 } 47 finalize(out, &state.h, &state.s) 48 }