Code refactoring for bpa operator
[icn.git] / cmd / bpa-operator / vendor / golang.org / x / crypto / poly1305 / sum_amd64.go
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 // +build amd64,!gccgo,!appengine
6
7 package poly1305
8
9 //go:noescape
10 func initialize(state *[7]uint64, key *[32]byte)
11
12 //go:noescape
13 func update(state *[7]uint64, msg []byte)
14
15 //go:noescape
16 func finalize(tag *[TagSize]byte, state *[7]uint64)
17
18 // Sum generates an authenticator for m using a one-time key and puts the
19 // 16-byte result into out. Authenticating two different messages with the same
20 // key allows an attacker to forge messages at will.
21 func Sum(out *[16]byte, m []byte, key *[32]byte) {
22         h := newMAC(key)
23         h.Write(m)
24         h.Sum(out)
25 }
26
27 func newMAC(key *[32]byte) (h mac) {
28         initialize(&h.state, key)
29         return
30 }
31
32 type mac struct {
33         state [7]uint64 // := uint64{ h0, h1, h2, r0, r1, pad0, pad1 }
34
35         buffer [TagSize]byte
36         offset int
37 }
38
39 func (h *mac) Write(p []byte) (n int, err error) {
40         n = len(p)
41         if h.offset > 0 {
42                 remaining := TagSize - h.offset
43                 if n < remaining {
44                         h.offset += copy(h.buffer[h.offset:], p)
45                         return n, nil
46                 }
47                 copy(h.buffer[h.offset:], p[:remaining])
48                 p = p[remaining:]
49                 h.offset = 0
50                 update(&h.state, h.buffer[:])
51         }
52         if nn := len(p) - (len(p) % TagSize); nn > 0 {
53                 update(&h.state, p[:nn])
54                 p = p[nn:]
55         }
56         if len(p) > 0 {
57                 h.offset += copy(h.buffer[h.offset:], p)
58         }
59         return n, nil
60 }
61
62 func (h *mac) Sum(out *[16]byte) {
63         state := h.state
64         if h.offset > 0 {
65                 update(&state, h.buffer[:h.offset])
66         }
67         finalize(out, &state)
68 }