blob: 0b24fc78b937b849378212a60ac223f3d9b71e98 [file] [log] [blame]
// Copyright 2012 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 !amd64,!arm gccgo appengine
package poly1305
// Based on original, public domain implementation from NaCl by D. J.
// Bernstein.
import "math"
const (
alpham80 = 0.00000000558793544769287109375
alpham48 = 24.0
alpham16 = 103079215104.0
alpha0 = 6755399441055744.0
alpha18 = 1770887431076116955136.0
alpha32 = 29014219670751100192948224.0
alpha50 = 7605903601369376408980219232256.0
alpha64 = 124615124604835863084731911901282304.0
alpha82 = 32667107224410092492483962313449748299776.0
alpha96 = 535217884764734955396857238543560676143529984.0
alpha112 = 35076039295941670036888435985190792471742381031424.0
alpha130 = 9194973245195333150150082162901855101712434733101613056.0
scale = 0.0000000000000000000000000000000000000036734198463196484624023016788195177431833298649127735047148490821200539357960224151611328125
offset0 = 6755408030990331.0
offset1 = 29014256564239239022116864.0
offset2 = 124615283061160854719918951570079744.0
offset3 = 535219245894202480694386063513315216128475136.0
)
// 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) {
r := key
s := key[16:]
var (
y7 float64
y6 float64
y1 float64
y0 float64
y5 float64
y4 float64
x7 float64
x6 float64
x1 float64
x0 float64
y3 float64
y2 float64
x5 float64
r3lowx0 float64
x4 float64
r0lowx6 float64
x3 float64
r3highx0 float64
x2 float64
r0highx6 float64
r0lowx0 float64
sr1lowx6 float64
r0highx0 float64
sr1highx6 float64
sr3low float64
r1lowx0 float64
sr2lowx6 float64
r1highx0 float64
sr2highx6 float64
r2lowx0 float64
sr3lowx6 float64
r2highx0 float64
sr3highx6 float64
r1highx4 float64
r1lowx4 float64
r0highx4 float64
r0lowx4 float64
sr3highx4 float64
sr3lowx4 float64
sr2highx4 float64
sr2lowx4 float64
r0lowx2 float64
r0highx2 float64
r1lowx2 float64
r1highx2 float64
r2lowx2 float64
r2highx2 float64
sr3lowx2 float64
sr3highx2 float64
z0 float64
z1 float64
z2 float64
z3 float64
m0 int64
m1 int64
m2 int64
m3 int64
m00 uint32
m01 uint32
m02 uint32
m03 uint32
m10 uint32
m11 uint32
m12 uint32
m13 uint32
m20 uint32
m21 uint32
m22 uint32
m23 uint32
m30 uint32
m31 uint32
m32 uint32
m33 uint64
lbelow2 int32
lbelow3 int32
lbelow4 int32
lbelow5 int32
lbelow6 int32
lbelow7 int32
lbelow8 int32
lbelow9 int32
lbelow10 int32
lbelow11 int32
lbelow12 int32
lbelow13 int32
lbelow14 int32
lbelow15 int32
s00 uint32
s01 uint32
s02 uint32
s03 uint32
s10 uint32
s11 uint32
s12 uint32
s13 uint32
s20 uint32
s21 uint32
s22 uint32
s23 uint32
s30 uint32
s31 uint32
s32 uint32
s33 uint32
bits32 uint64
f uint64
f0 uint64
f1 uint64
f2 uint64
f3 uint64
f4 uint64
g uint64
g0 uint64
g1 uint64
g2 uint64
g3 uint64
g4 uint64
)
var p int32
l := int32(len(m))
r00 := uint32(r[0])
r01 := uint32(r[1])
r02 := uint32(r[2])
r0 := int64(2151)
r03 := uint32(r[3])
r03 &= 15
r0 <<= 51
r10 := uint32(r[4])
r10 &= 252
r01 <<= 8
r0 += int64(r00)
r11 := uint32(r[5])
r02 <<= 16
r0 += int64(r01)
r12 := uint32(r[6])
r03 <<= 24
r0 += int64(r02)
r13 := uint32(r[7])
r13 &= 15
r1 := int64(2215)
r0 += int64(r03)
d0 := r0
r1 <<= 51
r2 := int64(2279)
r20 := uint32(r[8])
r20 &= 252
r11 <<= 8
r1 += int64(r10)
r21 := uint32(r[9])
r12 <<= 16
r1 += int64(r11)
r22 := uint32(r[10])
r13 <<= 24
r1 += int64(r12)
r23 := uint32(r[11])
r23 &= 15
r2 <<= 51
r1 += int64(r13)
d1 := r1
r21 <<= 8
r2 += int64(r20)
r30 := uint32(r[12])
r30 &= 252
r22 <<= 16
r2 += int64(r21)
r31 := uint32(r[13])
r23 <<= 24
r2 += int64(r22)
r32 := uint32(r[14])
r2 += int64(r23)
r3 := int64(2343)
d2 := r2
r3 <<= 51
r33 := uint32(r[15])
r33 &= 15
r31 <<= 8
r3 += int64(r30)
r32 <<= 16
r3 += int64(r31)
r33 <<= 24
r3 += int64(r32)
r3 += int64(r33)
h0 := alpha32 - alpha32
d3 := r3
h1 := alpha32 - alpha32
h2 := alpha32 - alpha32
h3 := alpha32 - alpha32
h4 := alpha32 - alpha32
r0low := math.Float64frombits(uint64(d0))
h5 := alpha32 - alpha32
r1low := math.Float64frombits(uint64(d1))
h6 := alpha32 - alpha32
r2low := math.Float64frombits(uint64(d2))
h7 := alpha32 - alpha32
r0low -= alpha0
r1low -= alpha32
r2low -= alpha64
r0high := r0low + alpha18
r3low := math.Float64frombits(uint64(d3))
r1high := r1low + alpha50
sr1low := scale * r1low
r2high := r2low + alpha82
sr2low := scale * r2low
r0high -= alpha18
r0high_stack := r0high
r3low -= alpha96
r1high -= alpha50
r1high_stack := r1high
sr1high := sr1low + alpham80
r0low -= r0high
r2high -= alpha82
sr3low = scale * r3low
sr2high := sr2low + alpham48
r1low -= r1high
r1low_stack := r1low
sr1high -= alpham80
sr1high_stack := sr1high
r2low -= r2high
r2low_stack := r2low
sr2high -= alpham48
sr2high_stack := sr2high
r3high := r3low + alpha112
r0low_stack := r0low
sr1low -= sr1high
sr1low_stack := sr1low
sr3high := sr3low + alpham16
r2high_stack := r2high
sr2low -= sr2high
sr2low_stack := sr2low
r3high -= alpha112
r3high_stack := r3high
sr3high -= alpham16
sr3high_stack := sr3high
r3low -= r3high
r3low_stack := r3low
sr3low -= sr3high
sr3low_stack := sr3low
if l < 16 {
goto addatmost15bytes
}
m00 = uint32(m[p+0])
m0 = 2151
m0 <<= 51
m1 = 2215
m01 = uint32(m[p+1])
m1 <<= 51
m2 = 2279
m02 = uint32(m[p+2])
m2 <<= 51
m3 = 2343
m03 = uint32(m[p+3])
m10 = uint32(m[p+4])
m01 <<= 8
m0 += int64(m00)
m11 = uint32(m[p+5])
m02 <<= 16
m0 += int64(m01)
m12 = uint32(m[p+6])
m03 <<= 24
m0 += int64(m02)
m13 = uint32(m[p+7])
m3 <<= 51
m0 += int64(m03)
m20 = uint32(m[p+8])
m11 <<= 8
m1 += int64(m10)
m21 = uint32(m[p+9])
m12 <<= 16
m1 += int64(m11)
m22 = uint32(m[p+10])
m13 <<= 24
m1 += int64(m12)
m23 = uint32(m[p+11])
m1 += int64(m13)
m30 = uint32(m[p+12])
m21 <<= 8
m2 += int64(m20)
m31 = uint32(m[p+13])
m22 <<= 16
m2 += int64(m21)
m32 = uint32(m[p+14])
m23 <<= 24
m2 += int64(m22)
m33 = uint64(m[p+15])
m2 += int64(m23)
d0 = m0
m31 <<= 8
m3 += int64(m30)
d1 = m1
m32 <<= 16
m3 += int64(m31)
d2 = m2
m33 += 256
m33 <<= 24
m3 += int64(m32)
m3 += int64(m33)
d3 = m3
p += 16
l -= 16
z0 = math.Float64frombits(uint64(d0))
z1 = math.Float64frombits(uint64(d1))
z2 = math.Float64frombits(uint64(d2))
z3 = math.Float64frombits(uint64(d3))
z0 -= alpha0
z1 -= alpha32
z2 -= alpha64
z3 -= alpha96
h0 += z0
h1 += z1
h3 += z2
h5 += z3
if l < 16 {
goto multiplyaddatmost15bytes
}
multiplyaddatleast16bytes:
m2 = 2279
m20 = uint32(m[p+8])
y7 = h7 + alpha130
m2 <<= 51
m3 = 2343
m21 = uint32(m[p+9])
y6 = h6 + alpha130
m3 <<= 51
m0 = 2151
m22 = uint32(m[p+10])
y1 = h1 + alpha32
m0 <<= 51
m1 = 2215
m23 = uint32(m[p+11])
y0 = h0 + alpha32
m1 <<= 51
m30 = uint32(m[p+12])
y7 -= alpha130
m21 <<= 8
m2 += int64(m20)
m31 = uint32(m[p+13])
y6 -= alpha130
m22 <<= 16
m2 += int64(m21)
m32 = uint32(m[p+14])
y1 -= alpha32
m23 <<= 24
m2 += int64(m22)
m33 = uint64(m[p+15])
y0 -= alpha32
m2 += int64(m23)
m00 = uint32(m[p+0])
y5 = h5 + alpha96
m31 <<= 8
m3 += int64(m30)
m01 = uint32(m[p+1])
y4 = h4 + alpha96
m32 <<= 16
m02 = uint32(m[p+2])
x7 = h7 - y7
y7 *= scale
m33 += 256
m03 = uint32(m[p+3])
x6 = h6 - y6
y6 *= scale
m33 <<= 24
m3 += int64(m31)
m10 = uint32(m[p+4])
x1 = h1 - y1
m01 <<= 8
m3 += int64(m32)
m11 = uint32(m[p+5])
x0 = h0 - y0
m3 += int64(m33)
m0 += int64(m00)
m12 = uint32(m[p+6])
y5 -= alpha96
m02 <<= 16
m0 += int64(m01)
m13 = uint32(m[p+7])
y4 -= alpha96
m03 <<= 24
m0 += int64(m02)
d2 = m2
x1 += y7
m0 += int64(m03)
d3 = m3
x0 += y6
m11 <<= 8
m1 += int64(m10)
d0 = m0
x7 += y5
m12 <<= 16
m1 += int64(m11)
x6 += y4
m13 <<= 24
m1 += int64(m12)
y3 = h3 + alpha64
m1 += int64(m13)
d1 = m1
y2 = h2 + alpha64
x0 += x1
x6 += x7
y3 -= alpha64
r3low = r3low_stack
y2 -= alpha64
r0low = r0low_stack
x5 = h5 - y5
r3lowx0 = r3low * x0
r3high = r3high_stack
x4 = h4 - y4
r0lowx6 = r0low * x6
r0high = r0high_stack
x3 = h3 - y3
r3highx0 = r3high * x0
sr1low = sr1low_stack
x2 = h2 - y2
r0highx6 = r0high * x6
sr1high = sr1high_stack
x5 += y3
r0lowx0 = r0low * x0
r1low = r1low_stack
h6 = r3lowx0 + r0lowx6
sr1lowx6 = sr1low * x6
r1high = r1high_stack
x4 += y2
r0highx0 = r0high * x0
sr2low = sr2low_stack
h7 = r3highx0 + r0highx6
sr1highx6 = sr1high * x6
sr2high = sr2high_stack
x3 += y1
r1lowx0 = r1low * x0
r2low = r2low_stack
h0 = r0lowx0 + sr1lowx6
sr2lowx6 = sr2low * x6
r2high = r2high_stack
x2 += y0
r1highx0 = r1high * x0
sr3low = sr3low_stack
h1 = r0highx0 + sr1highx6
sr2highx6 = sr2high * x6
sr3high = sr3high_stack
x4 += x5
r2lowx0 = r2low * x0
z2 = math.Float64frombits(uint64(d2))
h2 = r1lowx0 + sr2lowx6
sr3lowx6 = sr3low * x6
x2 += x3
r2highx0 = r2high * x0
z3 = math.Float64frombits(uint64(d3))
h3 = r1highx0 + sr2highx6
sr3highx6 = sr3high * x6
r1highx4 = r1high * x4
z2 -= alpha64
h4 = r2lowx0 + sr3lowx6
r1lowx4 = r1low * x4
r0highx4 = r0high * x4
z3 -= alpha96
h5 = r2highx0 + sr3highx6
r0lowx4 = r0low * x4
h7 += r1highx4
sr3highx4 = sr3high * x4
h6 += r1lowx4
sr3lowx4 = sr3low * x4
h5 += r0highx4
sr2highx4 = sr2high * x4
h4 += r0lowx4
sr2lowx4 = sr2low * x4
h3 += sr3highx4
r0lowx2 = r0low * x2
h2 += sr3lowx4
r0highx2 = r0high * x2
h1 += sr2highx4
r1lowx2 = r1low * x2
h0 += sr2lowx4
r1highx2 = r1high * x2
h2 += r0lowx2
r2lowx2 = r2low * x2
h3 += r0highx2
r2highx2 = r2high * x2
h4 += r1lowx2
sr3lowx2 = sr3low * x2
h5 += r1highx2
sr3highx2 = sr3high * x2
p += 16
l -= 16
h6 += r2lowx2
h7 += r2highx2
z1 = math.Float64frombits(uint64(d1))
h0 += sr3lowx2
z0 = math.Float64frombits(uint64(d0))
h1 += sr3highx2
z1 -= alpha32
z0 -= alpha0
h5 += z3
h3 += z2
h1 += z1
h0 += z0
if l >= 16 {
goto multiplyaddatleast16bytes
}
multiplyaddatmost15bytes:
y7 = h7 + alpha130
y6 = h6 + alpha130
y1 = h1 + alpha32
y0 = h0 + alpha32
y7 -= alpha130
y6 -= alpha130
y1 -= alpha32
y0 -= alpha32
y5 = h5 + alpha96
y4 = h4 + alpha96
x7 = h7 - y7
y7 *= scale
x6 = h6 - y6
y6 *= scale
x1 = h1 - y1
x0 = h0 - y0
y5 -= alpha96
y4 -= alpha96
x1 += y7
x0 += y6
x7 += y5
x6 += y4
y3 = h3 + alpha64
y2 = h2 + alpha64
x0 += x1
x6 += x7
y3 -= alpha64
r3low = r3low_stack
y2 -= alpha64
r0low = r0low_stack
x5 = h5 - y5
r3lowx0 = r3low * x0
r3high = r3high_stack
x4 = h4 - y4
r0lowx6 = r0low * x6
r0high = r0high_stack
x3 = h3 - y3
r3highx0 = r3high * x0
sr1low = sr1low_stack
x2 = h2 - y2
r0highx6 = r0high * x6
sr1high = sr1high_stack
x5 += y3
r0lowx0 = r0low * x0
r1low = r1low_stack
h6 = r3lowx0 + r0lowx6
sr1lowx6 = sr1low * x6
r1high = r1high_stack
x4 += y2
r0highx0 = r0high * x0
sr2low = sr2low_stack
h7 = r3highx0 + r0highx6
sr1highx6 = sr1high * x6
sr2high = sr2high_stack
x3 += y1
r1lowx0 = r1low * x0
r2low = r2low_stack
h0 = r0lowx0 + sr1lowx6
sr2lowx6 = sr2low * x6
r2high = r2high_stack
x2 += y0
r1highx0 = r1high * x0
sr3low = sr3low_stack
h1 = r0highx0 + sr1highx6
sr2highx6 = sr2high * x6
sr3high = sr3high_stack
x4 += x5
r2lowx0 = r2low * x0
h2 = r1lowx0 + sr2lowx6
sr3lowx6 = sr3low * x6
x2 += x3
r2highx0 = r2high * x0
h3 = r1highx0 + sr2highx6
sr3highx6 = sr3high * x6
r1highx4 = r1high * x4
h4 = r2lowx0 + sr3lowx6
r1lowx4 = r1low * x4
r0highx4 = r0high * x4
h5 = r2highx0 + sr3highx6
r0lowx4 = r0low * x4
h7 += r1highx4
sr3highx4 = sr3high * x4
h6 += r1lowx4
sr3lowx4 = sr3low * x4
h5 += r0highx4
sr2highx4 = sr2high * x4
h4 += r0lowx4
sr2lowx4 = sr2low * x4
h3 += sr3highx4
r0lowx2 = r0low * x2
h2 += sr3lowx4
r0highx2 = r0high * x2
h1 += sr2highx4
r1lowx2 = r1low * x2
h0 += sr2lowx4
r1highx2 = r1high * x2
h2 += r0lowx2
r2lowx2 = r2low * x2
h3 += r0highx2
r2highx2 = r2high * x2
h4 += r1lowx2
sr3lowx2 = sr3low * x2
h5 += r1highx2
sr3highx2 = sr3high * x2
h6 += r2lowx2
h7 += r2highx2
h0 += sr3lowx2
h1 += sr3highx2
addatmost15bytes:
if l == 0 {
goto nomorebytes
}
lbelow2 = l - 2
lbelow3 = l - 3
lbelow2 >>= 31
lbelow4 = l - 4
m00 = uint32(m[p+0])
lbelow3 >>= 31
p += lbelow2
m01 = uint32(m[p+1])
lbelow4 >>= 31
p += lbelow3
m02 = uint32(m[p+2])
p += lbelow4
m0 = 2151
m03 = uint32(m[p+3])
m0 <<= 51
m1 = 2215
m0 += int64(m00)
m01 &^= uint32(lbelow2)
m02 &^= uint32(lbelow3)
m01 -= uint32(lbelow2)
m01 <<= 8
m03 &^= uint32(lbelow4)
m0 += int64(m01)
lbelow2 -= lbelow3
m02 += uint32(lbelow2)
lbelow3 -= lbelow4
m02 <<= 16
m03 += uint32(lbelow3)
m03 <<= 24
m0 += int64(m02)
m0 += int64(m03)
lbelow5 = l - 5
lbelow6 = l - 6
lbelow7 = l - 7
lbelow5 >>= 31
lbelow8 = l - 8
lbelow6 >>= 31
p += lbelow5
m10 = uint32(m[p+4])
lbelow7 >>= 31
p += lbelow6
m11 = uint32(m[p+5])
lbelow8 >>= 31
p += lbelow7
m12 = uint32(m[p+6])
m1 <<= 51
p += lbelow8
m13 = uint32(m[p+7])
m10 &^= uint32(lbelow5)
lbelow4 -= lbelow5
m10 += uint32(lbelow4)
lbelow5 -= lbelow6
m11 &^= uint32(lbelow6)
m11 += uint32(lbelow5)
m11 <<= 8
m1 += int64(m10)
m1 += int64(m11)
m12 &^= uint32(lbelow7)
lbelow6 -= lbelow7
m13 &^= uint32(lbelow8)
m12 += uint32(lbelow6)
lbelow7 -= lbelow8
m12 <<= 16
m13 += uint32(lbelow7)
m13 <<= 24
m1 += int64(m12)
m1 += int64(m13)
m2 = 2279
lbelow9 = l - 9
m3 = 2343
lbelow10 = l - 10
lbelow11 = l - 11
lbelow9 >>= 31
lbelow12 = l - 12
lbelow10 >>= 31
p += lbelow9
m20 = uint32(m[p+8])
lbelow11 >>= 31
p += lbelow10
m21 = uint32(m[p+9])
lbelow12 >>= 31
p += lbelow11
m22 = uint32(m[p+10])
m2 <<= 51
p += lbelow12
m23 = uint32(m[p+11])
m20 &^= uint32(lbelow9)
lbelow8 -= lbelow9
m20 += uint32(lbelow8)
lbelow9 -= lbelow10
m21 &^= uint32(lbelow10)
m21 += uint32(lbelow9)
m21 <<= 8
m2 += int64(m20)
m2 += int64(m21)
m22 &^= uint32(lbelow11)
lbelow10 -= lbelow11
m23 &^= uint32(lbelow12)
m22 += uint32(lbelow10)
lbelow11 -= lbelow12
m22 <<= 16
m23 += uint32(lbelow11)
m23 <<= 24
m2 += int64(m22)
m3 <<= 51
lbelow13 = l - 13
lbelow13 >>= 31
lbelow14 = l - 14
lbelow14 >>= 31
p += lbelow13
lbelow15 = l - 15
m30 = uint32(m[p+12])
lbelow15 >>= 31
p += lbelow14
m31 = uint32(m[p+13])
p += lbelow15
m2 += int64(m23)
m32 = uint32(m[p+14])
m30 &^= uint32(lbelow13)
lbelow12 -= lbelow13
m30 += uint32(lbelow12)
lbelow13 -= lbelow14
m3 += int64(m30)
m31 &^= uint32(lbelow14)
m31 += uint32(lbelow13)
m32 &^= uint32(lbelow15)
m31 <<= 8
lbelow14 -= lbelow15
m3 += int64(m31)
m32 += uint32(lbelow14)
d0 = m0
m32 <<= 16
m33 = uint64(lbelow15 + 1)
d1 = m1
m33 <<= 24
m3 += int64(m32)
d2 = m2
m3 += int64(m33)
d3 = m3
z3 = math.Float64frombits(uint64(d3))
z2 = math.Float64frombits(uint64(d2))
z1 = math.Float64frombits(uint64(d1))
z0 = math.Float64frombits(uint64(d0))
z3 -= alpha96
z2 -= alpha64
z1 -= alpha32
z0 -= alpha0
h5 += z3
h3 += z2
h1 += z1
h0 += z0
y7 = h7 + alpha130
y6 = h6 + alpha130
y1 = h1 + alpha32
y0 = h0 + alpha32
y7 -= alpha130
y6 -= alpha130
y1 -= alpha32
y0 -= alpha32
y5 = h5 + alpha96
y4 = h4 + alpha96
x7 = h7 - y7
y7 *= scale
x6 = h6 - y6
y6 *= scale
x1 = h1 - y1
x0 = h0 - y0
y5 -= alpha96
y4 -= alpha96
x1 += y7
x0 += y6
x7 += y5
x6 += y4
y3 = h3 + alpha64
y2 = h2 + alpha64
x0 += x1
x6 += x7
y3 -= alpha64
r3low = r3low_stack
y2 -= alpha64
r0low = r0low_stack
x5 = h5 - y5
r3lowx0 = r3low * x0
r3high = r3high_stack
x4 = h4 - y4
r0lowx6 = r0low * x6
r0high = r0high_stack
x3 = h3 - y3
r3highx0 = r3high * x0
sr1low = sr1low_stack
x2 = h2 - y2
r0highx6 = r0high * x6
sr1high = sr1high_stack
x5 += y3
r0lowx0 = r0low * x0
r1low = r1low_stack
h6 = r3lowx0 + r0lowx6
sr1lowx6 = sr1low * x6
r1high = r1high_stack
x4 += y2
r0highx0 = r0high * x0
sr2low = sr2low_stack
h7 = r3highx0 + r0highx6
sr1highx6 = sr1high * x6
sr2high = sr2high_stack
x3 += y1
r1lowx0 = r1low * x0
r2low = r2low_stack
h0 = r0lowx0 + sr1lowx6
sr2lowx6 = sr2low * x6
r2high = r2high_stack
x2 += y0
r1highx0 = r1high * x0
sr3low = sr3low_stack
h1 = r0highx0 + sr1highx6
sr2highx6 = sr2high * x6
sr3high = sr3high_stack
x4 += x5
r2lowx0 = r2low * x0
h2 = r1lowx0 + sr2lowx6
sr3lowx6 = sr3low * x6
x2 += x3
r2highx0 = r2high * x0
h3 = r1highx0 + sr2highx6
sr3highx6 = sr3high * x6
r1highx4 = r1high * x4
h4 = r2lowx0 + sr3lowx6
r1lowx4 = r1low * x4
r0highx4 = r0high * x4
h5 = r2highx0 + sr3highx6
r0lowx4 = r0low * x4
h7 += r1highx4
sr3highx4 = sr3high * x4
h6 += r1lowx4
sr3lowx4 = sr3low * x4
h5 += r0highx4
sr2highx4 = sr2high * x4
h4 += r0lowx4
sr2lowx4 = sr2low * x4
h3 += sr3highx4
r0lowx2 = r0low * x2
h2 += sr3lowx4
r0highx2 = r0high * x2
h1 += sr2highx4
r1lowx2 = r1low * x2
h0 += sr2lowx4
r1highx2 = r1high * x2
h2 += r0lowx2
r2lowx2 = r2low * x2
h3 += r0highx2
r2highx2 = r2high * x2
h4 += r1lowx2
sr3lowx2 = sr3low * x2
h5 += r1highx2
sr3highx2 = sr3high * x2
h6 += r2lowx2
h7 += r2highx2
h0 += sr3lowx2
h1 += sr3highx2
nomorebytes:
y7 = h7 + alpha130
y0 = h0 + alpha32
y1 = h1 + alpha32
y2 = h2 + alpha64
y7 -= alpha130
y3 = h3 + alpha64
y4 = h4 + alpha96
y5 = h5 + alpha96
x7 = h7 - y7
y7 *= scale
y0 -= alpha32
y1 -= alpha32
y2 -= alpha64
h6 += x7
y3 -= alpha64
y4 -= alpha96
y5 -= alpha96
y6 = h6 + alpha130
x0 = h0 - y0
x1 = h1 - y1
x2 = h2 - y2
y6 -= alpha130
x0 += y7
x3 = h3 - y3
x4 = h4 - y4
x5 = h5 - y5
x6 = h6 - y6
y6 *= scale
x2 += y0
x3 += y1
x4 += y2
x0 += y6
x5 += y3
x6 += y4
x2 += x3
x0 += x1
x4 += x5
x6 += y5
x2 += offset1
d1 = int64(math.Float64bits(x2))
x0 += offset0
d0 = int64(math.Float64bits(x0))
x4 += offset2
d2 = int64(math.Float64bits(x4))
x6 += offset3
d3 = int64(math.Float64bits(x6))
f0 = uint64(d0)
f1 = uint64(d1)
bits32 = math.MaxUint64
f2 = uint64(d2)
bits32 >>= 32
f3 = uint64(d3)
f = f0 >> 32
f0 &= bits32
f &= 255
f1 += f
g0 = f0 + 5
g = g0 >> 32
g0 &= bits32
f = f1 >> 32
f1 &= bits32
f &= 255
g1 = f1 + g
g = g1 >> 32
f2 += f
f = f2 >> 32
g1 &= bits32
f2 &= bits32
f &= 255
f3 += f
g2 = f2 + g
g = g2 >> 32
g2 &= bits32
f4 = f3 >> 32
f3 &= bits32
f4 &= 255
g3 = f3 + g
g = g3 >> 32
g3 &= bits32
g4 = f4 + g
g4 = g4 - 4
s00 = uint32(s[0])
f = uint64(int64(g4) >> 63)
s01 = uint32(s[1])
f0 &= f
g0 &^= f
s02 = uint32(s[2])
f1 &= f
f0 |= g0
s03 = uint32(s[3])
g1 &^= f
f2 &= f
s10 = uint32(s[4])
f3 &= f
g2 &^= f
s11 = uint32(s[5])
g3 &^= f
f1 |= g1
s12 = uint32(s[6])
f2 |= g2
f3 |= g3
s13 = uint32(s[7])
s01 <<= 8
f0 += uint64(s00)
s20 = uint32(s[8])
s02 <<= 16
f0 += uint64(s01)
s21 = uint32(s[9])
s03 <<= 24
f0 += uint64(s02)
s22 = uint32(s[10])
s11 <<= 8
f1 += uint64(s10)
s23 = uint32(s[11])
s12 <<= 16
f1 += uint64(s11)
s30 = uint32(s[12])
s13 <<= 24
f1 += uint64(s12)
s31 = uint32(s[13])
f0 += uint64(s03)
f1 += uint64(s13)
s32 = uint32(s[14])
s21 <<= 8
f2 += uint64(s20)
s33 = uint32(s[15])
s22 <<= 16
f2 += uint64(s21)
s23 <<= 24
f2 += uint64(s22)
s31 <<= 8
f3 += uint64(s30)
s32 <<= 16
f3 += uint64(s31)
s33 <<= 24
f3 += uint64(s32)
f2 += uint64(s23)
f3 += uint64(s33)
out[0] = byte(f0)
f0 >>= 8
out[1] = byte(f0)
f0 >>= 8
out[2] = byte(f0)
f0 >>= 8
out[3] = byte(f0)
f0 >>= 8
f1 += f0
out[4] = byte(f1)
f1 >>= 8
out[5] = byte(f1)
f1 >>= 8
out[6] = byte(f1)
f1 >>= 8
out[7] = byte(f1)
f1 >>= 8
f2 += f1
out[8] = byte(f2)
f2 >>= 8
out[9] = byte(f2)
f2 >>= 8
out[10] = byte(f2)
f2 >>= 8
out[11] = byte(f2)
f2 >>= 8
f3 += f2
out[12] = byte(f3)
f3 >>= 8
out[13] = byte(f3)
f3 >>= 8
out[14] = byte(f3)
f3 >>= 8
out[15] = byte(f3)
}