mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	Bump buildkit to master and fix versions incompatible with go mod 1.13
Bump github.com/gogo/googleapis to v1.3.2 Bump github.com/docker/cli to master Signed-off-by: Silvin Lubecki <silvin.lubecki@docker.com>
This commit is contained in:
		
							
								
								
									
										39
									
								
								vendor/golang.org/x/crypto/poly1305/bits_compat.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								vendor/golang.org/x/crypto/poly1305/bits_compat.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
// 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.
 | 
			
		||||
 | 
			
		||||
// +build !go1.13
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
// Generic fallbacks for the math/bits intrinsics, copied from
 | 
			
		||||
// src/math/bits/bits.go. They were added in Go 1.12, but Add64 and Sum64 had
 | 
			
		||||
// variable time fallbacks until Go 1.13.
 | 
			
		||||
 | 
			
		||||
func bitsAdd64(x, y, carry uint64) (sum, carryOut uint64) {
 | 
			
		||||
	sum = x + y + carry
 | 
			
		||||
	carryOut = ((x & y) | ((x | y) &^ sum)) >> 63
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bitsSub64(x, y, borrow uint64) (diff, borrowOut uint64) {
 | 
			
		||||
	diff = x - y - borrow
 | 
			
		||||
	borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 63
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bitsMul64(x, y uint64) (hi, lo uint64) {
 | 
			
		||||
	const mask32 = 1<<32 - 1
 | 
			
		||||
	x0 := x & mask32
 | 
			
		||||
	x1 := x >> 32
 | 
			
		||||
	y0 := y & mask32
 | 
			
		||||
	y1 := y >> 32
 | 
			
		||||
	w0 := x0 * y0
 | 
			
		||||
	t := x1*y0 + w0>>32
 | 
			
		||||
	w1 := t & mask32
 | 
			
		||||
	w2 := t >> 32
 | 
			
		||||
	w1 += x0 * y1
 | 
			
		||||
	hi = x1*y1 + w2 + w1>>32
 | 
			
		||||
	lo = x * y
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/golang.org/x/crypto/poly1305/bits_go1.13.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/golang.org/x/crypto/poly1305/bits_go1.13.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
// 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.
 | 
			
		||||
 | 
			
		||||
// +build go1.13
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
import "math/bits"
 | 
			
		||||
 | 
			
		||||
func bitsAdd64(x, y, carry uint64) (sum, carryOut uint64) {
 | 
			
		||||
	return bits.Add64(x, y, carry)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bitsSub64(x, y, borrow uint64) (diff, borrowOut uint64) {
 | 
			
		||||
	return bits.Sub64(x, y, borrow)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bitsMul64(x, y uint64) (hi, lo uint64) {
 | 
			
		||||
	return bits.Mul64(x, y)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/poly1305/mac_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/poly1305/mac_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !amd64 gccgo appengine
 | 
			
		||||
// +build !amd64,!ppc64le gccgo purego
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/crypto/poly1305/poly1305.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/crypto/poly1305/poly1305.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,8 +22,14 @@ import "crypto/subtle"
 | 
			
		||||
// TagSize is the size, in bytes, of a poly1305 authenticator.
 | 
			
		||||
const TagSize = 16
 | 
			
		||||
 | 
			
		||||
// Verify returns true if mac is a valid authenticator for m with the given
 | 
			
		||||
// key.
 | 
			
		||||
// Sum generates an authenticator for msg using a one-time key and puts the
 | 
			
		||||
// 16-byte result into out. Authenticating two different messages with the same
 | 
			
		||||
// key allows an attacker to forge messages at will.
 | 
			
		||||
func Sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
	sum(out, m, key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Verify returns true if mac is a valid authenticator for m with the given key.
 | 
			
		||||
func Verify(mac *[16]byte, m []byte, key *[32]byte) bool {
 | 
			
		||||
	var tmp [16]byte
 | 
			
		||||
	Sum(&tmp, m, key)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										58
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,67 +2,57 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build amd64,!gccgo,!appengine
 | 
			
		||||
// +build !gccgo,!purego
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
//go:noescape
 | 
			
		||||
func initialize(state *[7]uint64, key *[32]byte)
 | 
			
		||||
func update(state *macState, msg []byte)
 | 
			
		||||
 | 
			
		||||
//go:noescape
 | 
			
		||||
func update(state *[7]uint64, msg []byte)
 | 
			
		||||
 | 
			
		||||
//go:noescape
 | 
			
		||||
func finalize(tag *[TagSize]byte, state *[7]uint64)
 | 
			
		||||
 | 
			
		||||
// Sum generates an authenticator for m using a one-time key and puts the
 | 
			
		||||
// 16-byte result into out. Authenticating two different messages with the same
 | 
			
		||||
// key allows an attacker to forge messages at will.
 | 
			
		||||
func Sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
func sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
	h := newMAC(key)
 | 
			
		||||
	h.Write(m)
 | 
			
		||||
	h.Sum(out)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newMAC(key *[32]byte) (h mac) {
 | 
			
		||||
	initialize(&h.state, key)
 | 
			
		||||
	initialize(key, &h.r, &h.s)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type mac struct {
 | 
			
		||||
	state [7]uint64 // := uint64{ h0, h1, h2, r0, r1, pad0, pad1 }
 | 
			
		||||
// 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 }
 | 
			
		||||
 | 
			
		||||
	buffer [TagSize]byte
 | 
			
		||||
	offset int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *mac) Write(p []byte) (n int, err error) {
 | 
			
		||||
	n = len(p)
 | 
			
		||||
func (h *mac) Write(p []byte) (int, error) {
 | 
			
		||||
	nn := len(p)
 | 
			
		||||
	if h.offset > 0 {
 | 
			
		||||
		remaining := TagSize - h.offset
 | 
			
		||||
		if n < remaining {
 | 
			
		||||
			h.offset += copy(h.buffer[h.offset:], p)
 | 
			
		||||
			return n, nil
 | 
			
		||||
		n := copy(h.buffer[h.offset:], p)
 | 
			
		||||
		if h.offset+n < TagSize {
 | 
			
		||||
			h.offset += n
 | 
			
		||||
			return nn, nil
 | 
			
		||||
		}
 | 
			
		||||
		copy(h.buffer[h.offset:], p[:remaining])
 | 
			
		||||
		p = p[remaining:]
 | 
			
		||||
		p = p[n:]
 | 
			
		||||
		h.offset = 0
 | 
			
		||||
		update(&h.state, h.buffer[:])
 | 
			
		||||
		update(&h.macState, h.buffer[:])
 | 
			
		||||
	}
 | 
			
		||||
	if nn := len(p) - (len(p) % TagSize); nn > 0 {
 | 
			
		||||
		update(&h.state, p[:nn])
 | 
			
		||||
		p = p[nn:]
 | 
			
		||||
	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 n, nil
 | 
			
		||||
	return nn, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *mac) Sum(out *[16]byte) {
 | 
			
		||||
	state := h.state
 | 
			
		||||
	state := h.macState
 | 
			
		||||
	if h.offset > 0 {
 | 
			
		||||
		update(&state, h.buffer[:h.offset])
 | 
			
		||||
	}
 | 
			
		||||
	finalize(out, &state)
 | 
			
		||||
	finalize(out, &state.h, &state.s)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build amd64,!gccgo,!appengine
 | 
			
		||||
// +build !gccgo,!purego
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
@@ -54,10 +54,6 @@
 | 
			
		||||
	ADCQ  t3, h1;                  \
 | 
			
		||||
	ADCQ  $0, h2
 | 
			
		||||
 | 
			
		||||
DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF
 | 
			
		||||
DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC
 | 
			
		||||
GLOBL ·poly1305Mask<>(SB), RODATA, $16
 | 
			
		||||
 | 
			
		||||
// func update(state *[7]uint64, msg []byte)
 | 
			
		||||
TEXT ·update(SB), $0-32
 | 
			
		||||
	MOVQ state+0(FP), DI
 | 
			
		||||
@@ -110,39 +106,3 @@ done:
 | 
			
		||||
	MOVQ R9, 8(DI)
 | 
			
		||||
	MOVQ R10, 16(DI)
 | 
			
		||||
	RET
 | 
			
		||||
 | 
			
		||||
// func initialize(state *[7]uint64, key *[32]byte)
 | 
			
		||||
TEXT ·initialize(SB), $0-16
 | 
			
		||||
	MOVQ state+0(FP), DI
 | 
			
		||||
	MOVQ key+8(FP), SI
 | 
			
		||||
 | 
			
		||||
	// state[0...7] is initialized with zero
 | 
			
		||||
	MOVOU 0(SI), X0
 | 
			
		||||
	MOVOU 16(SI), X1
 | 
			
		||||
	MOVOU ·poly1305Mask<>(SB), X2
 | 
			
		||||
	PAND  X2, X0
 | 
			
		||||
	MOVOU X0, 24(DI)
 | 
			
		||||
	MOVOU X1, 40(DI)
 | 
			
		||||
	RET
 | 
			
		||||
 | 
			
		||||
// func finalize(tag *[TagSize]byte, state *[7]uint64)
 | 
			
		||||
TEXT ·finalize(SB), $0-16
 | 
			
		||||
	MOVQ tag+0(FP), DI
 | 
			
		||||
	MOVQ state+8(FP), SI
 | 
			
		||||
 | 
			
		||||
	MOVQ    0(SI), AX
 | 
			
		||||
	MOVQ    8(SI), BX
 | 
			
		||||
	MOVQ    16(SI), CX
 | 
			
		||||
	MOVQ    AX, R8
 | 
			
		||||
	MOVQ    BX, R9
 | 
			
		||||
	SUBQ    $0xFFFFFFFFFFFFFFFB, AX
 | 
			
		||||
	SBBQ    $0xFFFFFFFFFFFFFFFF, BX
 | 
			
		||||
	SBBQ    $3, CX
 | 
			
		||||
	CMOVQCS R8, AX
 | 
			
		||||
	CMOVQCS R9, BX
 | 
			
		||||
	ADDQ    40(SI), AX
 | 
			
		||||
	ADCQ    48(SI), BX
 | 
			
		||||
 | 
			
		||||
	MOVQ AX, 0(DI)
 | 
			
		||||
	MOVQ BX, 8(DI)
 | 
			
		||||
	RET
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
// Copyright 2015 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 arm,!gccgo,!appengine,!nacl
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
// This function is implemented in sum_arm.s
 | 
			
		||||
//go:noescape
 | 
			
		||||
func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte)
 | 
			
		||||
 | 
			
		||||
// Sum generates an authenticator for m using a one-time key and puts the
 | 
			
		||||
// 16-byte result into out. Authenticating two different messages with the same
 | 
			
		||||
// key allows an attacker to forge messages at will.
 | 
			
		||||
func Sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
	var mPtr *byte
 | 
			
		||||
	if len(m) > 0 {
 | 
			
		||||
		mPtr = &m[0]
 | 
			
		||||
	}
 | 
			
		||||
	poly1305_auth_armv6(out, mPtr, uint32(len(m)), key)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										427
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										427
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,427 +0,0 @@
 | 
			
		||||
// Copyright 2015 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 arm,!gccgo,!appengine,!nacl
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
// This code was translated into a form compatible with 5a from the public
 | 
			
		||||
// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305.
 | 
			
		||||
 | 
			
		||||
DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff
 | 
			
		||||
DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03
 | 
			
		||||
DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff
 | 
			
		||||
DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff
 | 
			
		||||
DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff
 | 
			
		||||
GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20
 | 
			
		||||
 | 
			
		||||
// Warning: the linker may use R11 to synthesize certain instructions. Please
 | 
			
		||||
// take care and verify that no synthetic instructions use it.
 | 
			
		||||
 | 
			
		||||
TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0
 | 
			
		||||
	// Needs 16 bytes of stack and 64 bytes of space pointed to by R0.  (It
 | 
			
		||||
	// might look like it's only 60 bytes of space but the final four bytes
 | 
			
		||||
	// will be written by another function.) We need to skip over four
 | 
			
		||||
	// bytes of stack because that's saving the value of 'g'.
 | 
			
		||||
	ADD       $4, R13, R8
 | 
			
		||||
	MOVM.IB   [R4-R7], (R8)
 | 
			
		||||
	MOVM.IA.W (R1), [R2-R5]
 | 
			
		||||
	MOVW      $·poly1305_init_constants_armv6<>(SB), R7
 | 
			
		||||
	MOVW      R2, R8
 | 
			
		||||
	MOVW      R2>>26, R9
 | 
			
		||||
	MOVW      R3>>20, g
 | 
			
		||||
	MOVW      R4>>14, R11
 | 
			
		||||
	MOVW      R5>>8, R12
 | 
			
		||||
	ORR       R3<<6, R9, R9
 | 
			
		||||
	ORR       R4<<12, g, g
 | 
			
		||||
	ORR       R5<<18, R11, R11
 | 
			
		||||
	MOVM.IA   (R7), [R2-R6]
 | 
			
		||||
	AND       R8, R2, R2
 | 
			
		||||
	AND       R9, R3, R3
 | 
			
		||||
	AND       g, R4, R4
 | 
			
		||||
	AND       R11, R5, R5
 | 
			
		||||
	AND       R12, R6, R6
 | 
			
		||||
	MOVM.IA.W [R2-R6], (R0)
 | 
			
		||||
	EOR       R2, R2, R2
 | 
			
		||||
	EOR       R3, R3, R3
 | 
			
		||||
	EOR       R4, R4, R4
 | 
			
		||||
	EOR       R5, R5, R5
 | 
			
		||||
	EOR       R6, R6, R6
 | 
			
		||||
	MOVM.IA.W [R2-R6], (R0)
 | 
			
		||||
	MOVM.IA.W (R1), [R2-R5]
 | 
			
		||||
	MOVM.IA   [R2-R6], (R0)
 | 
			
		||||
	ADD       $20, R13, R0
 | 
			
		||||
	MOVM.DA   (R0), [R4-R7]
 | 
			
		||||
	RET
 | 
			
		||||
 | 
			
		||||
#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \
 | 
			
		||||
	MOVBU (offset+0)(Rsrc), Rtmp; \
 | 
			
		||||
	MOVBU Rtmp, (offset+0)(Rdst); \
 | 
			
		||||
	MOVBU (offset+1)(Rsrc), Rtmp; \
 | 
			
		||||
	MOVBU Rtmp, (offset+1)(Rdst); \
 | 
			
		||||
	MOVBU (offset+2)(Rsrc), Rtmp; \
 | 
			
		||||
	MOVBU Rtmp, (offset+2)(Rdst); \
 | 
			
		||||
	MOVBU (offset+3)(Rsrc), Rtmp; \
 | 
			
		||||
	MOVBU Rtmp, (offset+3)(Rdst)
 | 
			
		||||
 | 
			
		||||
TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0
 | 
			
		||||
	// Needs 24 bytes of stack for saved registers and then 88 bytes of
 | 
			
		||||
	// scratch space after that. We assume that 24 bytes at (R13) have
 | 
			
		||||
	// already been used: four bytes for the link register saved in the
 | 
			
		||||
	// prelude of poly1305_auth_armv6, four bytes for saving the value of g
 | 
			
		||||
	// in that function and 16 bytes of scratch space used around
 | 
			
		||||
	// poly1305_finish_ext_armv6_skip1.
 | 
			
		||||
	ADD     $24, R13, R12
 | 
			
		||||
	MOVM.IB [R4-R8, R14], (R12)
 | 
			
		||||
	MOVW    R0, 88(R13)
 | 
			
		||||
	MOVW    R1, 92(R13)
 | 
			
		||||
	MOVW    R2, 96(R13)
 | 
			
		||||
	MOVW    R1, R14
 | 
			
		||||
	MOVW    R2, R12
 | 
			
		||||
	MOVW    56(R0), R8
 | 
			
		||||
	WORD    $0xe1180008                // TST R8, R8 not working see issue 5921
 | 
			
		||||
	EOR     R6, R6, R6
 | 
			
		||||
	MOVW.EQ $(1<<24), R6
 | 
			
		||||
	MOVW    R6, 84(R13)
 | 
			
		||||
	ADD     $116, R13, g
 | 
			
		||||
	MOVM.IA (R0), [R0-R9]
 | 
			
		||||
	MOVM.IA [R0-R4], (g)
 | 
			
		||||
	CMP     $16, R12
 | 
			
		||||
	BLO     poly1305_blocks_armv6_done
 | 
			
		||||
 | 
			
		||||
poly1305_blocks_armv6_mainloop:
 | 
			
		||||
	WORD    $0xe31e0003                            // TST R14, #3 not working see issue 5921
 | 
			
		||||
	BEQ     poly1305_blocks_armv6_mainloop_aligned
 | 
			
		||||
	ADD     $100, R13, g
 | 
			
		||||
	MOVW_UNALIGNED(R14, g, R0, 0)
 | 
			
		||||
	MOVW_UNALIGNED(R14, g, R0, 4)
 | 
			
		||||
	MOVW_UNALIGNED(R14, g, R0, 8)
 | 
			
		||||
	MOVW_UNALIGNED(R14, g, R0, 12)
 | 
			
		||||
	MOVM.IA (g), [R0-R3]
 | 
			
		||||
	ADD     $16, R14
 | 
			
		||||
	B       poly1305_blocks_armv6_mainloop_loaded
 | 
			
		||||
 | 
			
		||||
poly1305_blocks_armv6_mainloop_aligned:
 | 
			
		||||
	MOVM.IA.W (R14), [R0-R3]
 | 
			
		||||
 | 
			
		||||
poly1305_blocks_armv6_mainloop_loaded:
 | 
			
		||||
	MOVW    R0>>26, g
 | 
			
		||||
	MOVW    R1>>20, R11
 | 
			
		||||
	MOVW    R2>>14, R12
 | 
			
		||||
	MOVW    R14, 92(R13)
 | 
			
		||||
	MOVW    R3>>8, R4
 | 
			
		||||
	ORR     R1<<6, g, g
 | 
			
		||||
	ORR     R2<<12, R11, R11
 | 
			
		||||
	ORR     R3<<18, R12, R12
 | 
			
		||||
	BIC     $0xfc000000, R0, R0
 | 
			
		||||
	BIC     $0xfc000000, g, g
 | 
			
		||||
	MOVW    84(R13), R3
 | 
			
		||||
	BIC     $0xfc000000, R11, R11
 | 
			
		||||
	BIC     $0xfc000000, R12, R12
 | 
			
		||||
	ADD     R0, R5, R5
 | 
			
		||||
	ADD     g, R6, R6
 | 
			
		||||
	ORR     R3, R4, R4
 | 
			
		||||
	ADD     R11, R7, R7
 | 
			
		||||
	ADD     $116, R13, R14
 | 
			
		||||
	ADD     R12, R8, R8
 | 
			
		||||
	ADD     R4, R9, R9
 | 
			
		||||
	MOVM.IA (R14), [R0-R4]
 | 
			
		||||
	MULLU   R4, R5, (R11, g)
 | 
			
		||||
	MULLU   R3, R5, (R14, R12)
 | 
			
		||||
	MULALU  R3, R6, (R11, g)
 | 
			
		||||
	MULALU  R2, R6, (R14, R12)
 | 
			
		||||
	MULALU  R2, R7, (R11, g)
 | 
			
		||||
	MULALU  R1, R7, (R14, R12)
 | 
			
		||||
	ADD     R4<<2, R4, R4
 | 
			
		||||
	ADD     R3<<2, R3, R3
 | 
			
		||||
	MULALU  R1, R8, (R11, g)
 | 
			
		||||
	MULALU  R0, R8, (R14, R12)
 | 
			
		||||
	MULALU  R0, R9, (R11, g)
 | 
			
		||||
	MULALU  R4, R9, (R14, R12)
 | 
			
		||||
	MOVW    g, 76(R13)
 | 
			
		||||
	MOVW    R11, 80(R13)
 | 
			
		||||
	MOVW    R12, 68(R13)
 | 
			
		||||
	MOVW    R14, 72(R13)
 | 
			
		||||
	MULLU   R2, R5, (R11, g)
 | 
			
		||||
	MULLU   R1, R5, (R14, R12)
 | 
			
		||||
	MULALU  R1, R6, (R11, g)
 | 
			
		||||
	MULALU  R0, R6, (R14, R12)
 | 
			
		||||
	MULALU  R0, R7, (R11, g)
 | 
			
		||||
	MULALU  R4, R7, (R14, R12)
 | 
			
		||||
	ADD     R2<<2, R2, R2
 | 
			
		||||
	ADD     R1<<2, R1, R1
 | 
			
		||||
	MULALU  R4, R8, (R11, g)
 | 
			
		||||
	MULALU  R3, R8, (R14, R12)
 | 
			
		||||
	MULALU  R3, R9, (R11, g)
 | 
			
		||||
	MULALU  R2, R9, (R14, R12)
 | 
			
		||||
	MOVW    g, 60(R13)
 | 
			
		||||
	MOVW    R11, 64(R13)
 | 
			
		||||
	MOVW    R12, 52(R13)
 | 
			
		||||
	MOVW    R14, 56(R13)
 | 
			
		||||
	MULLU   R0, R5, (R11, g)
 | 
			
		||||
	MULALU  R4, R6, (R11, g)
 | 
			
		||||
	MULALU  R3, R7, (R11, g)
 | 
			
		||||
	MULALU  R2, R8, (R11, g)
 | 
			
		||||
	MULALU  R1, R9, (R11, g)
 | 
			
		||||
	ADD     $52, R13, R0
 | 
			
		||||
	MOVM.IA (R0), [R0-R7]
 | 
			
		||||
	MOVW    g>>26, R12
 | 
			
		||||
	MOVW    R4>>26, R14
 | 
			
		||||
	ORR     R11<<6, R12, R12
 | 
			
		||||
	ORR     R5<<6, R14, R14
 | 
			
		||||
	BIC     $0xfc000000, g, g
 | 
			
		||||
	BIC     $0xfc000000, R4, R4
 | 
			
		||||
	ADD.S   R12, R0, R0
 | 
			
		||||
	ADC     $0, R1, R1
 | 
			
		||||
	ADD.S   R14, R6, R6
 | 
			
		||||
	ADC     $0, R7, R7
 | 
			
		||||
	MOVW    R0>>26, R12
 | 
			
		||||
	MOVW    R6>>26, R14
 | 
			
		||||
	ORR     R1<<6, R12, R12
 | 
			
		||||
	ORR     R7<<6, R14, R14
 | 
			
		||||
	BIC     $0xfc000000, R0, R0
 | 
			
		||||
	BIC     $0xfc000000, R6, R6
 | 
			
		||||
	ADD     R14<<2, R14, R14
 | 
			
		||||
	ADD.S   R12, R2, R2
 | 
			
		||||
	ADC     $0, R3, R3
 | 
			
		||||
	ADD     R14, g, g
 | 
			
		||||
	MOVW    R2>>26, R12
 | 
			
		||||
	MOVW    g>>26, R14
 | 
			
		||||
	ORR     R3<<6, R12, R12
 | 
			
		||||
	BIC     $0xfc000000, g, R5
 | 
			
		||||
	BIC     $0xfc000000, R2, R7
 | 
			
		||||
	ADD     R12, R4, R4
 | 
			
		||||
	ADD     R14, R0, R0
 | 
			
		||||
	MOVW    R4>>26, R12
 | 
			
		||||
	BIC     $0xfc000000, R4, R8
 | 
			
		||||
	ADD     R12, R6, R9
 | 
			
		||||
	MOVW    96(R13), R12
 | 
			
		||||
	MOVW    92(R13), R14
 | 
			
		||||
	MOVW    R0, R6
 | 
			
		||||
	CMP     $32, R12
 | 
			
		||||
	SUB     $16, R12, R12
 | 
			
		||||
	MOVW    R12, 96(R13)
 | 
			
		||||
	BHS     poly1305_blocks_armv6_mainloop
 | 
			
		||||
 | 
			
		||||
poly1305_blocks_armv6_done:
 | 
			
		||||
	MOVW    88(R13), R12
 | 
			
		||||
	MOVW    R5, 20(R12)
 | 
			
		||||
	MOVW    R6, 24(R12)
 | 
			
		||||
	MOVW    R7, 28(R12)
 | 
			
		||||
	MOVW    R8, 32(R12)
 | 
			
		||||
	MOVW    R9, 36(R12)
 | 
			
		||||
	ADD     $48, R13, R0
 | 
			
		||||
	MOVM.DA (R0), [R4-R8, R14]
 | 
			
		||||
	RET
 | 
			
		||||
 | 
			
		||||
#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \
 | 
			
		||||
	MOVBU.P 1(Rsrc), Rtmp; \
 | 
			
		||||
	MOVBU.P Rtmp, 1(Rdst); \
 | 
			
		||||
	MOVBU.P 1(Rsrc), Rtmp; \
 | 
			
		||||
	MOVBU.P Rtmp, 1(Rdst)
 | 
			
		||||
 | 
			
		||||
#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \
 | 
			
		||||
	MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \
 | 
			
		||||
	MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp)
 | 
			
		||||
 | 
			
		||||
// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key)
 | 
			
		||||
TEXT ·poly1305_auth_armv6(SB), $196-16
 | 
			
		||||
	// The value 196, just above, is the sum of 64 (the size of the context
 | 
			
		||||
	// structure) and 132 (the amount of stack needed).
 | 
			
		||||
	//
 | 
			
		||||
	// At this point, the stack pointer (R13) has been moved down. It
 | 
			
		||||
	// points to the saved link register and there's 196 bytes of free
 | 
			
		||||
	// space above it.
 | 
			
		||||
	//
 | 
			
		||||
	// The stack for this function looks like:
 | 
			
		||||
	//
 | 
			
		||||
	// +---------------------
 | 
			
		||||
	// |
 | 
			
		||||
	// | 64 bytes of context structure
 | 
			
		||||
	// |
 | 
			
		||||
	// +---------------------
 | 
			
		||||
	// |
 | 
			
		||||
	// | 112 bytes for poly1305_blocks_armv6
 | 
			
		||||
	// |
 | 
			
		||||
	// +---------------------
 | 
			
		||||
	// | 16 bytes of final block, constructed at
 | 
			
		||||
	// | poly1305_finish_ext_armv6_skip8
 | 
			
		||||
	// +---------------------
 | 
			
		||||
	// | four bytes of saved 'g'
 | 
			
		||||
	// +---------------------
 | 
			
		||||
	// | lr, saved by prelude    <- R13 points here
 | 
			
		||||
	// +---------------------
 | 
			
		||||
	MOVW g, 4(R13)
 | 
			
		||||
 | 
			
		||||
	MOVW out+0(FP), R4
 | 
			
		||||
	MOVW m+4(FP), R5
 | 
			
		||||
	MOVW mlen+8(FP), R6
 | 
			
		||||
	MOVW key+12(FP), R7
 | 
			
		||||
 | 
			
		||||
	ADD  $136, R13, R0 // 136 = 4 + 4 + 16 + 112
 | 
			
		||||
	MOVW R7, R1
 | 
			
		||||
 | 
			
		||||
	// poly1305_init_ext_armv6 will write to the stack from R13+4, but
 | 
			
		||||
	// that's ok because none of the other values have been written yet.
 | 
			
		||||
	BL    poly1305_init_ext_armv6<>(SB)
 | 
			
		||||
	BIC.S $15, R6, R2
 | 
			
		||||
	BEQ   poly1305_auth_armv6_noblocks
 | 
			
		||||
	ADD   $136, R13, R0
 | 
			
		||||
	MOVW  R5, R1
 | 
			
		||||
	ADD   R2, R5, R5
 | 
			
		||||
	SUB   R2, R6, R6
 | 
			
		||||
	BL    poly1305_blocks_armv6<>(SB)
 | 
			
		||||
 | 
			
		||||
poly1305_auth_armv6_noblocks:
 | 
			
		||||
	ADD  $136, R13, R0
 | 
			
		||||
	MOVW R5, R1
 | 
			
		||||
	MOVW R6, R2
 | 
			
		||||
	MOVW R4, R3
 | 
			
		||||
 | 
			
		||||
	MOVW  R0, R5
 | 
			
		||||
	MOVW  R1, R6
 | 
			
		||||
	MOVW  R2, R7
 | 
			
		||||
	MOVW  R3, R8
 | 
			
		||||
	AND.S R2, R2, R2
 | 
			
		||||
	BEQ   poly1305_finish_ext_armv6_noremaining
 | 
			
		||||
	EOR   R0, R0
 | 
			
		||||
	ADD   $8, R13, R9                           // 8 = offset to 16 byte scratch space
 | 
			
		||||
	MOVW  R0, (R9)
 | 
			
		||||
	MOVW  R0, 4(R9)
 | 
			
		||||
	MOVW  R0, 8(R9)
 | 
			
		||||
	MOVW  R0, 12(R9)
 | 
			
		||||
	WORD  $0xe3110003                           // TST R1, #3 not working see issue 5921
 | 
			
		||||
	BEQ   poly1305_finish_ext_armv6_aligned
 | 
			
		||||
	WORD  $0xe3120008                           // TST R2, #8 not working see issue 5921
 | 
			
		||||
	BEQ   poly1305_finish_ext_armv6_skip8
 | 
			
		||||
	MOVWP_UNALIGNED(R1, R9, g)
 | 
			
		||||
	MOVWP_UNALIGNED(R1, R9, g)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_skip8:
 | 
			
		||||
	WORD $0xe3120004                     // TST $4, R2 not working see issue 5921
 | 
			
		||||
	BEQ  poly1305_finish_ext_armv6_skip4
 | 
			
		||||
	MOVWP_UNALIGNED(R1, R9, g)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_skip4:
 | 
			
		||||
	WORD $0xe3120002                     // TST $2, R2 not working see issue 5921
 | 
			
		||||
	BEQ  poly1305_finish_ext_armv6_skip2
 | 
			
		||||
	MOVHUP_UNALIGNED(R1, R9, g)
 | 
			
		||||
	B    poly1305_finish_ext_armv6_skip2
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_aligned:
 | 
			
		||||
	WORD      $0xe3120008                             // TST R2, #8 not working see issue 5921
 | 
			
		||||
	BEQ       poly1305_finish_ext_armv6_skip8_aligned
 | 
			
		||||
	MOVM.IA.W (R1), [g-R11]
 | 
			
		||||
	MOVM.IA.W [g-R11], (R9)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_skip8_aligned:
 | 
			
		||||
	WORD   $0xe3120004                             // TST $4, R2 not working see issue 5921
 | 
			
		||||
	BEQ    poly1305_finish_ext_armv6_skip4_aligned
 | 
			
		||||
	MOVW.P 4(R1), g
 | 
			
		||||
	MOVW.P g, 4(R9)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_skip4_aligned:
 | 
			
		||||
	WORD    $0xe3120002                     // TST $2, R2 not working see issue 5921
 | 
			
		||||
	BEQ     poly1305_finish_ext_armv6_skip2
 | 
			
		||||
	MOVHU.P 2(R1), g
 | 
			
		||||
	MOVH.P  g, 2(R9)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_skip2:
 | 
			
		||||
	WORD    $0xe3120001                     // TST $1, R2 not working see issue 5921
 | 
			
		||||
	BEQ     poly1305_finish_ext_armv6_skip1
 | 
			
		||||
	MOVBU.P 1(R1), g
 | 
			
		||||
	MOVBU.P g, 1(R9)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_skip1:
 | 
			
		||||
	MOVW  $1, R11
 | 
			
		||||
	MOVBU R11, 0(R9)
 | 
			
		||||
	MOVW  R11, 56(R5)
 | 
			
		||||
	MOVW  R5, R0
 | 
			
		||||
	ADD   $8, R13, R1
 | 
			
		||||
	MOVW  $16, R2
 | 
			
		||||
	BL    poly1305_blocks_armv6<>(SB)
 | 
			
		||||
 | 
			
		||||
poly1305_finish_ext_armv6_noremaining:
 | 
			
		||||
	MOVW      20(R5), R0
 | 
			
		||||
	MOVW      24(R5), R1
 | 
			
		||||
	MOVW      28(R5), R2
 | 
			
		||||
	MOVW      32(R5), R3
 | 
			
		||||
	MOVW      36(R5), R4
 | 
			
		||||
	MOVW      R4>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R4, R4
 | 
			
		||||
	ADD       R12<<2, R12, R12
 | 
			
		||||
	ADD       R12, R0, R0
 | 
			
		||||
	MOVW      R0>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R0, R0
 | 
			
		||||
	ADD       R12, R1, R1
 | 
			
		||||
	MOVW      R1>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R1, R1
 | 
			
		||||
	ADD       R12, R2, R2
 | 
			
		||||
	MOVW      R2>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R2, R2
 | 
			
		||||
	ADD       R12, R3, R3
 | 
			
		||||
	MOVW      R3>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R3, R3
 | 
			
		||||
	ADD       R12, R4, R4
 | 
			
		||||
	ADD       $5, R0, R6
 | 
			
		||||
	MOVW      R6>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R6, R6
 | 
			
		||||
	ADD       R12, R1, R7
 | 
			
		||||
	MOVW      R7>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, R7, R7
 | 
			
		||||
	ADD       R12, R2, g
 | 
			
		||||
	MOVW      g>>26, R12
 | 
			
		||||
	BIC       $0xfc000000, g, g
 | 
			
		||||
	ADD       R12, R3, R11
 | 
			
		||||
	MOVW      $-(1<<26), R12
 | 
			
		||||
	ADD       R11>>26, R12, R12
 | 
			
		||||
	BIC       $0xfc000000, R11, R11
 | 
			
		||||
	ADD       R12, R4, R9
 | 
			
		||||
	MOVW      R9>>31, R12
 | 
			
		||||
	SUB       $1, R12
 | 
			
		||||
	AND       R12, R6, R6
 | 
			
		||||
	AND       R12, R7, R7
 | 
			
		||||
	AND       R12, g, g
 | 
			
		||||
	AND       R12, R11, R11
 | 
			
		||||
	AND       R12, R9, R9
 | 
			
		||||
	MVN       R12, R12
 | 
			
		||||
	AND       R12, R0, R0
 | 
			
		||||
	AND       R12, R1, R1
 | 
			
		||||
	AND       R12, R2, R2
 | 
			
		||||
	AND       R12, R3, R3
 | 
			
		||||
	AND       R12, R4, R4
 | 
			
		||||
	ORR       R6, R0, R0
 | 
			
		||||
	ORR       R7, R1, R1
 | 
			
		||||
	ORR       g, R2, R2
 | 
			
		||||
	ORR       R11, R3, R3
 | 
			
		||||
	ORR       R9, R4, R4
 | 
			
		||||
	ORR       R1<<26, R0, R0
 | 
			
		||||
	MOVW      R1>>6, R1
 | 
			
		||||
	ORR       R2<<20, R1, R1
 | 
			
		||||
	MOVW      R2>>12, R2
 | 
			
		||||
	ORR       R3<<14, R2, R2
 | 
			
		||||
	MOVW      R3>>18, R3
 | 
			
		||||
	ORR       R4<<8, R3, R3
 | 
			
		||||
	MOVW      40(R5), R6
 | 
			
		||||
	MOVW      44(R5), R7
 | 
			
		||||
	MOVW      48(R5), g
 | 
			
		||||
	MOVW      52(R5), R11
 | 
			
		||||
	ADD.S     R6, R0, R0
 | 
			
		||||
	ADC.S     R7, R1, R1
 | 
			
		||||
	ADC.S     g, R2, R2
 | 
			
		||||
	ADC.S     R11, R3, R3
 | 
			
		||||
	MOVM.IA   [R0-R3], (R8)
 | 
			
		||||
	MOVW      R5, R12
 | 
			
		||||
	EOR       R0, R0, R0
 | 
			
		||||
	EOR       R1, R1, R1
 | 
			
		||||
	EOR       R2, R2, R2
 | 
			
		||||
	EOR       R3, R3, R3
 | 
			
		||||
	EOR       R4, R4, R4
 | 
			
		||||
	EOR       R5, R5, R5
 | 
			
		||||
	EOR       R6, R6, R6
 | 
			
		||||
	EOR       R7, R7, R7
 | 
			
		||||
	MOVM.IA.W [R0-R7], (R12)
 | 
			
		||||
	MOVM.IA   [R0-R7], (R12)
 | 
			
		||||
	MOVW      4(R13), g
 | 
			
		||||
	RET
 | 
			
		||||
							
								
								
									
										369
									
								
								vendor/golang.org/x/crypto/poly1305/sum_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										369
									
								
								vendor/golang.org/x/crypto/poly1305/sum_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,18 +2,29 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// This file provides the generic implementation of Sum and MAC. Other files
 | 
			
		||||
// might provide optimized assembly implementations of some of this code.
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
import "encoding/binary"
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	msgBlock   = uint32(1 << 24)
 | 
			
		||||
	finalBlock = uint32(0)
 | 
			
		||||
)
 | 
			
		||||
// Poly1305 [RFC 7539] is a relatively simple algorithm: the authentication tag
 | 
			
		||||
// for a 64 bytes message is approximately
 | 
			
		||||
//
 | 
			
		||||
//     s + m[0:16] * r⁴ + m[16:32] * r³ + m[32:48] * r² + m[48:64] * r  mod  2¹³⁰ - 5
 | 
			
		||||
//
 | 
			
		||||
// for some secret r and s. It can be computed sequentially like
 | 
			
		||||
//
 | 
			
		||||
//     for len(msg) > 0:
 | 
			
		||||
//         h += read(msg, 16)
 | 
			
		||||
//         h *= r
 | 
			
		||||
//         h %= 2¹³⁰ - 5
 | 
			
		||||
//     return h + s
 | 
			
		||||
//
 | 
			
		||||
// All the complexity is about doing performant constant-time math on numbers
 | 
			
		||||
// larger than any available numeric type.
 | 
			
		||||
 | 
			
		||||
// sumGeneric generates an authenticator for msg using a one-time key and
 | 
			
		||||
// puts the 16-byte result into out. This is the generic implementation of
 | 
			
		||||
// Sum and should be called if no assembly implementation is available.
 | 
			
		||||
func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) {
 | 
			
		||||
	h := newMACGeneric(key)
 | 
			
		||||
	h.Write(msg)
 | 
			
		||||
@@ -21,152 +32,276 @@ func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newMACGeneric(key *[32]byte) (h macGeneric) {
 | 
			
		||||
	h.r[0] = binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff
 | 
			
		||||
	h.r[1] = (binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03
 | 
			
		||||
	h.r[2] = (binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff
 | 
			
		||||
	h.r[3] = (binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff
 | 
			
		||||
	h.r[4] = (binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff
 | 
			
		||||
 | 
			
		||||
	h.s[0] = binary.LittleEndian.Uint32(key[16:])
 | 
			
		||||
	h.s[1] = binary.LittleEndian.Uint32(key[20:])
 | 
			
		||||
	h.s[2] = binary.LittleEndian.Uint32(key[24:])
 | 
			
		||||
	h.s[3] = binary.LittleEndian.Uint32(key[28:])
 | 
			
		||||
	initialize(key, &h.r, &h.s)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// macState holds numbers in saturated 64-bit little-endian limbs. That is,
 | 
			
		||||
// the value of [x0, x1, x2] is x[0] + x[1] * 2⁶⁴ + x[2] * 2¹²⁸.
 | 
			
		||||
type macState struct {
 | 
			
		||||
	// h is the main accumulator. It is to be interpreted modulo 2¹³⁰ - 5, but
 | 
			
		||||
	// can grow larger during and after rounds.
 | 
			
		||||
	h [3]uint64
 | 
			
		||||
	// r and s are the private key components.
 | 
			
		||||
	r [2]uint64
 | 
			
		||||
	s [2]uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type macGeneric struct {
 | 
			
		||||
	h, r [5]uint32
 | 
			
		||||
	s    [4]uint32
 | 
			
		||||
	macState
 | 
			
		||||
 | 
			
		||||
	buffer [TagSize]byte
 | 
			
		||||
	offset int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *macGeneric) Write(p []byte) (n int, err error) {
 | 
			
		||||
	n = len(p)
 | 
			
		||||
// Write splits the incoming message into TagSize chunks, and passes them to
 | 
			
		||||
// update. It buffers incomplete chunks.
 | 
			
		||||
func (h *macGeneric) Write(p []byte) (int, error) {
 | 
			
		||||
	nn := len(p)
 | 
			
		||||
	if h.offset > 0 {
 | 
			
		||||
		remaining := TagSize - h.offset
 | 
			
		||||
		if n < remaining {
 | 
			
		||||
			h.offset += copy(h.buffer[h.offset:], p)
 | 
			
		||||
			return n, nil
 | 
			
		||||
		n := copy(h.buffer[h.offset:], p)
 | 
			
		||||
		if h.offset+n < TagSize {
 | 
			
		||||
			h.offset += n
 | 
			
		||||
			return nn, nil
 | 
			
		||||
		}
 | 
			
		||||
		copy(h.buffer[h.offset:], p[:remaining])
 | 
			
		||||
		p = p[remaining:]
 | 
			
		||||
		p = p[n:]
 | 
			
		||||
		h.offset = 0
 | 
			
		||||
		updateGeneric(h.buffer[:], msgBlock, &(h.h), &(h.r))
 | 
			
		||||
		updateGeneric(&h.macState, h.buffer[:])
 | 
			
		||||
	}
 | 
			
		||||
	if nn := len(p) - (len(p) % TagSize); nn > 0 {
 | 
			
		||||
		updateGeneric(p, msgBlock, &(h.h), &(h.r))
 | 
			
		||||
		p = p[nn:]
 | 
			
		||||
	if n := len(p) - (len(p) % TagSize); n > 0 {
 | 
			
		||||
		updateGeneric(&h.macState, p[:n])
 | 
			
		||||
		p = p[n:]
 | 
			
		||||
	}
 | 
			
		||||
	if len(p) > 0 {
 | 
			
		||||
		h.offset += copy(h.buffer[h.offset:], p)
 | 
			
		||||
	}
 | 
			
		||||
	return n, nil
 | 
			
		||||
	return nn, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *macGeneric) Sum(out *[16]byte) {
 | 
			
		||||
	H, R := h.h, h.r
 | 
			
		||||
// Sum flushes the last incomplete chunk from the buffer, if any, and generates
 | 
			
		||||
// the MAC output. It does not modify its state, in order to allow for multiple
 | 
			
		||||
// calls to Sum, even if no Write is allowed after Sum.
 | 
			
		||||
func (h *macGeneric) Sum(out *[TagSize]byte) {
 | 
			
		||||
	state := h.macState
 | 
			
		||||
	if h.offset > 0 {
 | 
			
		||||
		var buffer [TagSize]byte
 | 
			
		||||
		copy(buffer[:], h.buffer[:h.offset])
 | 
			
		||||
		buffer[h.offset] = 1 // invariant: h.offset < TagSize
 | 
			
		||||
		updateGeneric(buffer[:], finalBlock, &H, &R)
 | 
			
		||||
		updateGeneric(&state, h.buffer[:h.offset])
 | 
			
		||||
	}
 | 
			
		||||
	finalizeGeneric(out, &H, &(h.s))
 | 
			
		||||
	finalize(out, &state.h, &state.s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateGeneric(msg []byte, flag uint32, h, r *[5]uint32) {
 | 
			
		||||
	h0, h1, h2, h3, h4 := h[0], h[1], h[2], h[3], h[4]
 | 
			
		||||
	r0, r1, r2, r3, r4 := uint64(r[0]), uint64(r[1]), uint64(r[2]), uint64(r[3]), uint64(r[4])
 | 
			
		||||
	R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5
 | 
			
		||||
// [rMask0, rMask1] is the specified Poly1305 clamping mask in little-endian. It
 | 
			
		||||
// clears some bits of the secret coefficient to make it possible to implement
 | 
			
		||||
// multiplication more efficiently.
 | 
			
		||||
const (
 | 
			
		||||
	rMask0 = 0x0FFFFFFC0FFFFFFF
 | 
			
		||||
	rMask1 = 0x0FFFFFFC0FFFFFFC
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	for len(msg) >= TagSize {
 | 
			
		||||
		// h += msg
 | 
			
		||||
		h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff
 | 
			
		||||
		h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff
 | 
			
		||||
		h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff
 | 
			
		||||
		h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff
 | 
			
		||||
		h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | flag
 | 
			
		||||
func initialize(key *[32]byte, r, s *[2]uint64) {
 | 
			
		||||
	r[0] = binary.LittleEndian.Uint64(key[0:8]) & rMask0
 | 
			
		||||
	r[1] = binary.LittleEndian.Uint64(key[8:16]) & rMask1
 | 
			
		||||
	s[0] = binary.LittleEndian.Uint64(key[16:24])
 | 
			
		||||
	s[1] = binary.LittleEndian.Uint64(key[24:32])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		// h *= r
 | 
			
		||||
		d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1)
 | 
			
		||||
		d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2)
 | 
			
		||||
		d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3)
 | 
			
		||||
		d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4)
 | 
			
		||||
		d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0)
 | 
			
		||||
// uint128 holds a 128-bit number as two 64-bit limbs, for use with the
 | 
			
		||||
// bits.Mul64 and bits.Add64 intrinsics.
 | 
			
		||||
type uint128 struct {
 | 
			
		||||
	lo, hi uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		// h %= p
 | 
			
		||||
		h0 = uint32(d0) & 0x3ffffff
 | 
			
		||||
		h1 = uint32(d1) & 0x3ffffff
 | 
			
		||||
		h2 = uint32(d2) & 0x3ffffff
 | 
			
		||||
		h3 = uint32(d3) & 0x3ffffff
 | 
			
		||||
		h4 = uint32(d4) & 0x3ffffff
 | 
			
		||||
func mul64(a, b uint64) uint128 {
 | 
			
		||||
	hi, lo := bitsMul64(a, b)
 | 
			
		||||
	return uint128{lo, hi}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		h0 += uint32(d4>>26) * 5
 | 
			
		||||
		h1 += h0 >> 26
 | 
			
		||||
		h0 = h0 & 0x3ffffff
 | 
			
		||||
func add128(a, b uint128) uint128 {
 | 
			
		||||
	lo, c := bitsAdd64(a.lo, b.lo, 0)
 | 
			
		||||
	hi, c := bitsAdd64(a.hi, b.hi, c)
 | 
			
		||||
	if c != 0 {
 | 
			
		||||
		panic("poly1305: unexpected overflow")
 | 
			
		||||
	}
 | 
			
		||||
	return uint128{lo, hi}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		msg = msg[TagSize:]
 | 
			
		||||
func shiftRightBy2(a uint128) uint128 {
 | 
			
		||||
	a.lo = a.lo>>2 | (a.hi&3)<<62
 | 
			
		||||
	a.hi = a.hi >> 2
 | 
			
		||||
	return a
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// updateGeneric absorbs msg into the state.h accumulator. For each chunk m of
 | 
			
		||||
// 128 bits of message, it computes
 | 
			
		||||
//
 | 
			
		||||
//     h₊ = (h + m) * r  mod  2¹³⁰ - 5
 | 
			
		||||
//
 | 
			
		||||
// If the msg length is not a multiple of TagSize, it assumes the last
 | 
			
		||||
// incomplete chunk is the final one.
 | 
			
		||||
func updateGeneric(state *macState, msg []byte) {
 | 
			
		||||
	h0, h1, h2 := state.h[0], state.h[1], state.h[2]
 | 
			
		||||
	r0, r1 := state.r[0], state.r[1]
 | 
			
		||||
 | 
			
		||||
	for len(msg) > 0 {
 | 
			
		||||
		var c uint64
 | 
			
		||||
 | 
			
		||||
		// For the first step, h + m, we use a chain of bits.Add64 intrinsics.
 | 
			
		||||
		// The resulting value of h might exceed 2¹³⁰ - 5, but will be partially
 | 
			
		||||
		// reduced at the end of the multiplication below.
 | 
			
		||||
		//
 | 
			
		||||
		// The spec requires us to set a bit just above the message size, not to
 | 
			
		||||
		// hide leading zeroes. For full chunks, that's 1 << 128, so we can just
 | 
			
		||||
		// add 1 to the most significant (2¹²⁸) limb, h2.
 | 
			
		||||
		if len(msg) >= TagSize {
 | 
			
		||||
			h0, c = bitsAdd64(h0, binary.LittleEndian.Uint64(msg[0:8]), 0)
 | 
			
		||||
			h1, c = bitsAdd64(h1, binary.LittleEndian.Uint64(msg[8:16]), c)
 | 
			
		||||
			h2 += c + 1
 | 
			
		||||
 | 
			
		||||
			msg = msg[TagSize:]
 | 
			
		||||
		} else {
 | 
			
		||||
			var buf [TagSize]byte
 | 
			
		||||
			copy(buf[:], msg)
 | 
			
		||||
			buf[len(msg)] = 1
 | 
			
		||||
 | 
			
		||||
			h0, c = bitsAdd64(h0, binary.LittleEndian.Uint64(buf[0:8]), 0)
 | 
			
		||||
			h1, c = bitsAdd64(h1, binary.LittleEndian.Uint64(buf[8:16]), c)
 | 
			
		||||
			h2 += c
 | 
			
		||||
 | 
			
		||||
			msg = nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Multiplication of big number limbs is similar to elementary school
 | 
			
		||||
		// columnar multiplication. Instead of digits, there are 64-bit limbs.
 | 
			
		||||
		//
 | 
			
		||||
		// We are multiplying a 3 limbs number, h, by a 2 limbs number, r.
 | 
			
		||||
		//
 | 
			
		||||
		//                        h2    h1    h0  x
 | 
			
		||||
		//                              r1    r0  =
 | 
			
		||||
		//                       ----------------
 | 
			
		||||
		//                      h2r0  h1r0  h0r0     <-- individual 128-bit products
 | 
			
		||||
		//            +   h2r1  h1r1  h0r1
 | 
			
		||||
		//               ------------------------
 | 
			
		||||
		//                 m3    m2    m1    m0      <-- result in 128-bit overlapping limbs
 | 
			
		||||
		//               ------------------------
 | 
			
		||||
		//         m3.hi m2.hi m1.hi m0.hi           <-- carry propagation
 | 
			
		||||
		//     +         m3.lo m2.lo m1.lo m0.lo
 | 
			
		||||
		//        -------------------------------
 | 
			
		||||
		//           t4    t3    t2    t1    t0      <-- final result in 64-bit limbs
 | 
			
		||||
		//
 | 
			
		||||
		// The main difference from pen-and-paper multiplication is that we do
 | 
			
		||||
		// carry propagation in a separate step, as if we wrote two digit sums
 | 
			
		||||
		// at first (the 128-bit limbs), and then carried the tens all at once.
 | 
			
		||||
 | 
			
		||||
		h0r0 := mul64(h0, r0)
 | 
			
		||||
		h1r0 := mul64(h1, r0)
 | 
			
		||||
		h2r0 := mul64(h2, r0)
 | 
			
		||||
		h0r1 := mul64(h0, r1)
 | 
			
		||||
		h1r1 := mul64(h1, r1)
 | 
			
		||||
		h2r1 := mul64(h2, r1)
 | 
			
		||||
 | 
			
		||||
		// Since h2 is known to be at most 7 (5 + 1 + 1), and r0 and r1 have their
 | 
			
		||||
		// top 4 bits cleared by rMask{0,1}, we know that their product is not going
 | 
			
		||||
		// to overflow 64 bits, so we can ignore the high part of the products.
 | 
			
		||||
		//
 | 
			
		||||
		// This also means that the product doesn't have a fifth limb (t4).
 | 
			
		||||
		if h2r0.hi != 0 {
 | 
			
		||||
			panic("poly1305: unexpected overflow")
 | 
			
		||||
		}
 | 
			
		||||
		if h2r1.hi != 0 {
 | 
			
		||||
			panic("poly1305: unexpected overflow")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m0 := h0r0
 | 
			
		||||
		m1 := add128(h1r0, h0r1) // These two additions don't overflow thanks again
 | 
			
		||||
		m2 := add128(h2r0, h1r1) // to the 4 masked bits at the top of r0 and r1.
 | 
			
		||||
		m3 := h2r1
 | 
			
		||||
 | 
			
		||||
		t0 := m0.lo
 | 
			
		||||
		t1, c := bitsAdd64(m1.lo, m0.hi, 0)
 | 
			
		||||
		t2, c := bitsAdd64(m2.lo, m1.hi, c)
 | 
			
		||||
		t3, _ := bitsAdd64(m3.lo, m2.hi, c)
 | 
			
		||||
 | 
			
		||||
		// Now we have the result as 4 64-bit limbs, and we need to reduce it
 | 
			
		||||
		// modulo 2¹³⁰ - 5. The special shape of this Crandall prime lets us do
 | 
			
		||||
		// a cheap partial reduction according to the reduction identity
 | 
			
		||||
		//
 | 
			
		||||
		//     c * 2¹³⁰ + n  =  c * 5 + n  mod  2¹³⁰ - 5
 | 
			
		||||
		//
 | 
			
		||||
		// because 2¹³⁰ = 5 mod 2¹³⁰ - 5. Partial reduction since the result is
 | 
			
		||||
		// likely to be larger than 2¹³⁰ - 5, but still small enough to fit the
 | 
			
		||||
		// assumptions we make about h in the rest of the code.
 | 
			
		||||
		//
 | 
			
		||||
		// See also https://speakerdeck.com/gtank/engineering-prime-numbers?slide=23
 | 
			
		||||
 | 
			
		||||
		// We split the final result at the 2¹³⁰ mark into h and cc, the carry.
 | 
			
		||||
		// Note that the carry bits are effectively shifted left by 2, in other
 | 
			
		||||
		// words, cc = c * 4 for the c in the reduction identity.
 | 
			
		||||
		h0, h1, h2 = t0, t1, t2&maskLow2Bits
 | 
			
		||||
		cc := uint128{t2 & maskNotLow2Bits, t3}
 | 
			
		||||
 | 
			
		||||
		// To add c * 5 to h, we first add cc = c * 4, and then add (cc >> 2) = c.
 | 
			
		||||
 | 
			
		||||
		h0, c = bitsAdd64(h0, cc.lo, 0)
 | 
			
		||||
		h1, c = bitsAdd64(h1, cc.hi, c)
 | 
			
		||||
		h2 += c
 | 
			
		||||
 | 
			
		||||
		cc = shiftRightBy2(cc)
 | 
			
		||||
 | 
			
		||||
		h0, c = bitsAdd64(h0, cc.lo, 0)
 | 
			
		||||
		h1, c = bitsAdd64(h1, cc.hi, c)
 | 
			
		||||
		h2 += c
 | 
			
		||||
 | 
			
		||||
		// h2 is at most 3 + 1 + 1 = 5, making the whole of h at most
 | 
			
		||||
		//
 | 
			
		||||
		//     5 * 2¹²⁸ + (2¹²⁸ - 1) = 6 * 2¹²⁸ - 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	h[0], h[1], h[2], h[3], h[4] = h0, h1, h2, h3, h4
 | 
			
		||||
	state.h[0], state.h[1], state.h[2] = h0, h1, h2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func finalizeGeneric(out *[TagSize]byte, h *[5]uint32, s *[4]uint32) {
 | 
			
		||||
	h0, h1, h2, h3, h4 := h[0], h[1], h[2], h[3], h[4]
 | 
			
		||||
const (
 | 
			
		||||
	maskLow2Bits    uint64 = 0x0000000000000003
 | 
			
		||||
	maskNotLow2Bits uint64 = ^maskLow2Bits
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	// h %= p reduction
 | 
			
		||||
	h2 += h1 >> 26
 | 
			
		||||
	h1 &= 0x3ffffff
 | 
			
		||||
	h3 += h2 >> 26
 | 
			
		||||
	h2 &= 0x3ffffff
 | 
			
		||||
	h4 += h3 >> 26
 | 
			
		||||
	h3 &= 0x3ffffff
 | 
			
		||||
	h0 += 5 * (h4 >> 26)
 | 
			
		||||
	h4 &= 0x3ffffff
 | 
			
		||||
	h1 += h0 >> 26
 | 
			
		||||
	h0 &= 0x3ffffff
 | 
			
		||||
// select64 returns x if v == 1 and y if v == 0, in constant time.
 | 
			
		||||
func select64(v, x, y uint64) uint64 { return ^(v-1)&x | (v-1)&y }
 | 
			
		||||
 | 
			
		||||
	// h - p
 | 
			
		||||
	t0 := h0 + 5
 | 
			
		||||
	t1 := h1 + (t0 >> 26)
 | 
			
		||||
	t2 := h2 + (t1 >> 26)
 | 
			
		||||
	t3 := h3 + (t2 >> 26)
 | 
			
		||||
	t4 := h4 + (t3 >> 26) - (1 << 26)
 | 
			
		||||
	t0 &= 0x3ffffff
 | 
			
		||||
	t1 &= 0x3ffffff
 | 
			
		||||
	t2 &= 0x3ffffff
 | 
			
		||||
	t3 &= 0x3ffffff
 | 
			
		||||
// [p0, p1, p2] is 2¹³⁰ - 5 in little endian order.
 | 
			
		||||
const (
 | 
			
		||||
	p0 = 0xFFFFFFFFFFFFFFFB
 | 
			
		||||
	p1 = 0xFFFFFFFFFFFFFFFF
 | 
			
		||||
	p2 = 0x0000000000000003
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	// select h if h < p else h - p
 | 
			
		||||
	t_mask := (t4 >> 31) - 1
 | 
			
		||||
	h_mask := ^t_mask
 | 
			
		||||
	h0 = (h0 & h_mask) | (t0 & t_mask)
 | 
			
		||||
	h1 = (h1 & h_mask) | (t1 & t_mask)
 | 
			
		||||
	h2 = (h2 & h_mask) | (t2 & t_mask)
 | 
			
		||||
	h3 = (h3 & h_mask) | (t3 & t_mask)
 | 
			
		||||
	h4 = (h4 & h_mask) | (t4 & t_mask)
 | 
			
		||||
// finalize completes the modular reduction of h and computes
 | 
			
		||||
//
 | 
			
		||||
//     out = h + s  mod  2¹²⁸
 | 
			
		||||
//
 | 
			
		||||
func finalize(out *[TagSize]byte, h *[3]uint64, s *[2]uint64) {
 | 
			
		||||
	h0, h1, h2 := h[0], h[1], h[2]
 | 
			
		||||
 | 
			
		||||
	// h %= 2^128
 | 
			
		||||
	h0 |= h1 << 26
 | 
			
		||||
	h1 = ((h1 >> 6) | (h2 << 20))
 | 
			
		||||
	h2 = ((h2 >> 12) | (h3 << 14))
 | 
			
		||||
	h3 = ((h3 >> 18) | (h4 << 8))
 | 
			
		||||
	// After the partial reduction in updateGeneric, h might be more than
 | 
			
		||||
	// 2¹³⁰ - 5, but will be less than 2 * (2¹³⁰ - 5). To complete the reduction
 | 
			
		||||
	// in constant time, we compute t = h - (2¹³⁰ - 5), and select h as the
 | 
			
		||||
	// result if the subtraction underflows, and t otherwise.
 | 
			
		||||
 | 
			
		||||
	// s: the s part of the key
 | 
			
		||||
	// tag = (h + s) % (2^128)
 | 
			
		||||
	t := uint64(h0) + uint64(s[0])
 | 
			
		||||
	h0 = uint32(t)
 | 
			
		||||
	t = uint64(h1) + uint64(s[1]) + (t >> 32)
 | 
			
		||||
	h1 = uint32(t)
 | 
			
		||||
	t = uint64(h2) + uint64(s[2]) + (t >> 32)
 | 
			
		||||
	h2 = uint32(t)
 | 
			
		||||
	t = uint64(h3) + uint64(s[3]) + (t >> 32)
 | 
			
		||||
	h3 = uint32(t)
 | 
			
		||||
	hMinusP0, b := bitsSub64(h0, p0, 0)
 | 
			
		||||
	hMinusP1, b := bitsSub64(h1, p1, b)
 | 
			
		||||
	_, b = bitsSub64(h2, p2, b)
 | 
			
		||||
 | 
			
		||||
	binary.LittleEndian.PutUint32(out[0:], h0)
 | 
			
		||||
	binary.LittleEndian.PutUint32(out[4:], h1)
 | 
			
		||||
	binary.LittleEndian.PutUint32(out[8:], h2)
 | 
			
		||||
	binary.LittleEndian.PutUint32(out[12:], h3)
 | 
			
		||||
	// h = h if h < p else h - p
 | 
			
		||||
	h0 = select64(b, h0, hMinusP0)
 | 
			
		||||
	h1 = select64(b, h1, hMinusP1)
 | 
			
		||||
 | 
			
		||||
	// Finally, we compute the last Poly1305 step
 | 
			
		||||
	//
 | 
			
		||||
	//     tag = h + s  mod  2¹²⁸
 | 
			
		||||
	//
 | 
			
		||||
	// by just doing a wide addition with the 128 low bits of h and discarding
 | 
			
		||||
	// the overflow.
 | 
			
		||||
	h0, c := bitsAdd64(h0, s[0], 0)
 | 
			
		||||
	h1, _ = bitsAdd64(h1, s[1], c)
 | 
			
		||||
 | 
			
		||||
	binary.LittleEndian.PutUint64(out[0:8], h0)
 | 
			
		||||
	binary.LittleEndian.PutUint64(out[8:16], h1)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								vendor/golang.org/x/crypto/poly1305/sum_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/golang.org/x/crypto/poly1305/sum_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,14 +2,11 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl
 | 
			
		||||
// +build s390x,!go1.11 !amd64,!s390x,!ppc64le gccgo purego
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
// Sum generates an authenticator for msg using a one-time key and puts the
 | 
			
		||||
// 16-byte result into out. Authenticating two different messages with the same
 | 
			
		||||
// key allows an attacker to forge messages at will.
 | 
			
		||||
func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) {
 | 
			
		||||
func sum(out *[TagSize]byte, msg []byte, key *[32]byte) {
 | 
			
		||||
	h := newMAC(key)
 | 
			
		||||
	h.Write(msg)
 | 
			
		||||
	h.Sum(out)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										58
									
								
								vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
// 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.
 | 
			
		||||
 | 
			
		||||
// +build !gccgo,!purego
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
//go:noescape
 | 
			
		||||
func update(state *macState, msg []byte)
 | 
			
		||||
 | 
			
		||||
func sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
	h := newMAC(key)
 | 
			
		||||
	h.Write(m)
 | 
			
		||||
	h.Sum(out)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newMAC(key *[32]byte) (h mac) {
 | 
			
		||||
	initialize(key, &h.r, &h.s)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										181
									
								
								vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,181 @@
 | 
			
		||||
// 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.
 | 
			
		||||
 | 
			
		||||
// +build !gccgo,!purego
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
// This was ported from the amd64 implementation.
 | 
			
		||||
 | 
			
		||||
#define POLY1305_ADD(msg, h0, h1, h2, t0, t1, t2) \
 | 
			
		||||
	MOVD (msg), t0;  \
 | 
			
		||||
	MOVD 8(msg), t1; \
 | 
			
		||||
	MOVD $1, t2;     \
 | 
			
		||||
	ADDC t0, h0, h0; \
 | 
			
		||||
	ADDE t1, h1, h1; \
 | 
			
		||||
	ADDE t2, h2;     \
 | 
			
		||||
	ADD  $16, msg
 | 
			
		||||
 | 
			
		||||
#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3, t4, t5) \
 | 
			
		||||
	MULLD  r0, h0, t0;  \
 | 
			
		||||
	MULLD  r0, h1, t4;  \
 | 
			
		||||
	MULHDU r0, h0, t1;  \
 | 
			
		||||
	MULHDU r0, h1, t5;  \
 | 
			
		||||
	ADDC   t4, t1, t1;  \
 | 
			
		||||
	MULLD  r0, h2, t2;  \
 | 
			
		||||
	ADDZE  t5;          \
 | 
			
		||||
	MULHDU r1, h0, t4;  \
 | 
			
		||||
	MULLD  r1, h0, h0;  \
 | 
			
		||||
	ADD    t5, t2, t2;  \
 | 
			
		||||
	ADDC   h0, t1, t1;  \
 | 
			
		||||
	MULLD  h2, r1, t3;  \
 | 
			
		||||
	ADDZE  t4, h0;      \
 | 
			
		||||
	MULHDU r1, h1, t5;  \
 | 
			
		||||
	MULLD  r1, h1, t4;  \
 | 
			
		||||
	ADDC   t4, t2, t2;  \
 | 
			
		||||
	ADDE   t5, t3, t3;  \
 | 
			
		||||
	ADDC   h0, t2, t2;  \
 | 
			
		||||
	MOVD   $-4, t4;     \
 | 
			
		||||
	MOVD   t0, h0;      \
 | 
			
		||||
	MOVD   t1, h1;      \
 | 
			
		||||
	ADDZE  t3;          \
 | 
			
		||||
	ANDCC  $3, t2, h2;  \
 | 
			
		||||
	AND    t2, t4, t0;  \
 | 
			
		||||
	ADDC   t0, h0, h0;  \
 | 
			
		||||
	ADDE   t3, h1, h1;  \
 | 
			
		||||
	SLD    $62, t3, t4; \
 | 
			
		||||
	SRD    $2, t2;      \
 | 
			
		||||
	ADDZE  h2;          \
 | 
			
		||||
	OR     t4, t2, t2;  \
 | 
			
		||||
	SRD    $2, t3;      \
 | 
			
		||||
	ADDC   t2, h0, h0;  \
 | 
			
		||||
	ADDE   t3, h1, h1;  \
 | 
			
		||||
	ADDZE  h2
 | 
			
		||||
 | 
			
		||||
DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF
 | 
			
		||||
DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC
 | 
			
		||||
GLOBL ·poly1305Mask<>(SB), RODATA, $16
 | 
			
		||||
 | 
			
		||||
// func update(state *[7]uint64, msg []byte)
 | 
			
		||||
TEXT ·update(SB), $0-32
 | 
			
		||||
	MOVD state+0(FP), R3
 | 
			
		||||
	MOVD msg_base+8(FP), R4
 | 
			
		||||
	MOVD msg_len+16(FP), R5
 | 
			
		||||
 | 
			
		||||
	MOVD 0(R3), R8   // h0
 | 
			
		||||
	MOVD 8(R3), R9   // h1
 | 
			
		||||
	MOVD 16(R3), R10 // h2
 | 
			
		||||
	MOVD 24(R3), R11 // r0
 | 
			
		||||
	MOVD 32(R3), R12 // r1
 | 
			
		||||
 | 
			
		||||
	CMP R5, $16
 | 
			
		||||
	BLT bytes_between_0_and_15
 | 
			
		||||
 | 
			
		||||
loop:
 | 
			
		||||
	POLY1305_ADD(R4, R8, R9, R10, R20, R21, R22)
 | 
			
		||||
 | 
			
		||||
multiply:
 | 
			
		||||
	POLY1305_MUL(R8, R9, R10, R11, R12, R16, R17, R18, R14, R20, R21)
 | 
			
		||||
	ADD $-16, R5
 | 
			
		||||
	CMP R5, $16
 | 
			
		||||
	BGE loop
 | 
			
		||||
 | 
			
		||||
bytes_between_0_and_15:
 | 
			
		||||
	CMP  $0, R5
 | 
			
		||||
	BEQ  done
 | 
			
		||||
	MOVD $0, R16 // h0
 | 
			
		||||
	MOVD $0, R17 // h1
 | 
			
		||||
 | 
			
		||||
flush_buffer:
 | 
			
		||||
	CMP R5, $8
 | 
			
		||||
	BLE just1
 | 
			
		||||
 | 
			
		||||
	MOVD $8, R21
 | 
			
		||||
	SUB  R21, R5, R21
 | 
			
		||||
 | 
			
		||||
	// Greater than 8 -- load the rightmost remaining bytes in msg
 | 
			
		||||
	// and put into R17 (h1)
 | 
			
		||||
	MOVD (R4)(R21), R17
 | 
			
		||||
	MOVD $16, R22
 | 
			
		||||
 | 
			
		||||
	// Find the offset to those bytes
 | 
			
		||||
	SUB R5, R22, R22
 | 
			
		||||
	SLD $3, R22
 | 
			
		||||
 | 
			
		||||
	// Shift to get only the bytes in msg
 | 
			
		||||
	SRD R22, R17, R17
 | 
			
		||||
 | 
			
		||||
	// Put 1 at high end
 | 
			
		||||
	MOVD $1, R23
 | 
			
		||||
	SLD  $3, R21
 | 
			
		||||
	SLD  R21, R23, R23
 | 
			
		||||
	OR   R23, R17, R17
 | 
			
		||||
 | 
			
		||||
	// Remainder is 8
 | 
			
		||||
	MOVD $8, R5
 | 
			
		||||
 | 
			
		||||
just1:
 | 
			
		||||
	CMP R5, $8
 | 
			
		||||
	BLT less8
 | 
			
		||||
 | 
			
		||||
	// Exactly 8
 | 
			
		||||
	MOVD (R4), R16
 | 
			
		||||
 | 
			
		||||
	CMP $0, R17
 | 
			
		||||
 | 
			
		||||
	// Check if we've already set R17; if not
 | 
			
		||||
	// set 1 to indicate end of msg.
 | 
			
		||||
	BNE  carry
 | 
			
		||||
	MOVD $1, R17
 | 
			
		||||
	BR   carry
 | 
			
		||||
 | 
			
		||||
less8:
 | 
			
		||||
	MOVD  $0, R16   // h0
 | 
			
		||||
	MOVD  $0, R22   // shift count
 | 
			
		||||
	CMP   R5, $4
 | 
			
		||||
	BLT   less4
 | 
			
		||||
	MOVWZ (R4), R16
 | 
			
		||||
	ADD   $4, R4
 | 
			
		||||
	ADD   $-4, R5
 | 
			
		||||
	MOVD  $32, R22
 | 
			
		||||
 | 
			
		||||
less4:
 | 
			
		||||
	CMP   R5, $2
 | 
			
		||||
	BLT   less2
 | 
			
		||||
	MOVHZ (R4), R21
 | 
			
		||||
	SLD   R22, R21, R21
 | 
			
		||||
	OR    R16, R21, R16
 | 
			
		||||
	ADD   $16, R22
 | 
			
		||||
	ADD   $-2, R5
 | 
			
		||||
	ADD   $2, R4
 | 
			
		||||
 | 
			
		||||
less2:
 | 
			
		||||
	CMP   $0, R5
 | 
			
		||||
	BEQ   insert1
 | 
			
		||||
	MOVBZ (R4), R21
 | 
			
		||||
	SLD   R22, R21, R21
 | 
			
		||||
	OR    R16, R21, R16
 | 
			
		||||
	ADD   $8, R22
 | 
			
		||||
 | 
			
		||||
insert1:
 | 
			
		||||
	// Insert 1 at end of msg
 | 
			
		||||
	MOVD $1, R21
 | 
			
		||||
	SLD  R22, R21, R21
 | 
			
		||||
	OR   R16, R21, R16
 | 
			
		||||
 | 
			
		||||
carry:
 | 
			
		||||
	// Add new values to h0, h1, h2
 | 
			
		||||
	ADDC R16, R8
 | 
			
		||||
	ADDE R17, R9
 | 
			
		||||
	ADDE $0, R10
 | 
			
		||||
	MOVD $16, R5
 | 
			
		||||
	ADD  R5, R4
 | 
			
		||||
	BR   multiply
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	// Save h0, h1, h2 in state
 | 
			
		||||
	MOVD R8, 0(R3)
 | 
			
		||||
	MOVD R9, 8(R3)
 | 
			
		||||
	MOVD R10, 16(R3)
 | 
			
		||||
	RET
 | 
			
		||||
							
								
								
									
										7
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build s390x,go1.11,!gccgo,!appengine
 | 
			
		||||
// +build go1.11,!gccgo,!purego
 | 
			
		||||
 | 
			
		||||
package poly1305
 | 
			
		||||
 | 
			
		||||
@@ -22,10 +22,7 @@ func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
 | 
			
		||||
//go:noescape
 | 
			
		||||
func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
 | 
			
		||||
 | 
			
		||||
// Sum generates an authenticator for m using a one-time key and puts the
 | 
			
		||||
// 16-byte result into out. Authenticating two different messages with the same
 | 
			
		||||
// key allows an attacker to forge messages at will.
 | 
			
		||||
func Sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
func sum(out *[16]byte, m []byte, key *[32]byte) {
 | 
			
		||||
	if cpu.S390X.HasVX {
 | 
			
		||||
		var mPtr *byte
 | 
			
		||||
		if len(m) > 0 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build s390x,go1.11,!gccgo,!appengine
 | 
			
		||||
// +build go1.11,!gccgo,!purego
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build s390x,go1.11,!gccgo,!appengine
 | 
			
		||||
// +build go1.11,!gccgo,!purego
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user