• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2018 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// +build s390x,go1.11,!gccgo,!appengine
6
7package poly1305
8
9// hasVectorFacility reports whether the machine supports
10// the vector facility (vx).
11func hasVectorFacility() bool
12
13// hasVMSLFacility reports whether the machine supports
14// Vector Multiply Sum Logical (VMSL).
15func hasVMSLFacility() bool
16
17var hasVX = hasVectorFacility()
18var hasVMSL = hasVMSLFacility()
19
20// poly1305vx is an assembly implementation of Poly1305 that uses vector
21// instructions. It must only be called if the vector facility (vx) is
22// available.
23//go:noescape
24func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
25
26// poly1305vmsl is an assembly implementation of Poly1305 that uses vector
27// instructions, including VMSL. It must only be called if the vector facility (vx) is
28// available and if VMSL is supported.
29//go:noescape
30func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
31
32// Sum generates an authenticator for m using a one-time key and puts the
33// 16-byte result into out. Authenticating two different messages with the same
34// key allows an attacker to forge messages at will.
35func Sum(out *[16]byte, m []byte, key *[32]byte) {
36	if hasVX {
37		var mPtr *byte
38		if len(m) > 0 {
39			mPtr = &m[0]
40		}
41		if hasVMSL && len(m) > 256 {
42			poly1305vmsl(out, mPtr, uint64(len(m)), key)
43		} else {
44			poly1305vx(out, mPtr, uint64(len(m)), key)
45		}
46	} else {
47		sumGeneric(out, m, key)
48	}
49}
50