sum_asm.mx raw

   1  // Copyright 2012 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 && (amd64 || loong64 || ppc64 || ppc64le)
   6  
   7  package poly1305
   8  
   9  //go:noescape
  10  func update(state *macState, msg []byte)
  11  
  12  // mac is a wrapper for macGeneric that redirects calls that would have gone to
  13  // updateGeneric to update.
  14  //
  15  // Its Write and Sum methods are otherwise identical to the macGeneric ones, but
  16  // using function pointers would carry a major performance cost.
  17  type mac struct{ macGeneric }
  18  
  19  func (h *mac) Write(p []byte) (int, error) {
  20  	nn := len(p)
  21  	if h.offset > 0 {
  22  		n := copy(h.buffer[h.offset:], p)
  23  		if h.offset+n < TagSize {
  24  			h.offset += n
  25  			return nn, nil
  26  		}
  27  		p = p[n:]
  28  		h.offset = 0
  29  		update(&h.macState, h.buffer[:])
  30  	}
  31  	if n := len(p) - (len(p) % TagSize); n > 0 {
  32  		update(&h.macState, p[:n])
  33  		p = p[n:]
  34  	}
  35  	if len(p) > 0 {
  36  		h.offset += copy(h.buffer[h.offset:], p)
  37  	}
  38  	return nn, nil
  39  }
  40  
  41  func (h *mac) Sum(out *[16]byte) {
  42  	state := h.macState
  43  	if h.offset > 0 {
  44  		update(&state, h.buffer[:h.offset])
  45  	}
  46  	finalize(out, &state.h, &state.s)
  47  }
  48