UNCLASSIFIED
Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
Ironbank Containers
fluxcd
source-controller
Commits
530cd297
Commit
530cd297
authored
May 27, 2021
by
sean.melissari
Browse files
v0.13.0
parent
baf57376
Pipeline
#281750
passed with stages
in 10 minutes and 31 seconds
Changes
172
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2192 additions
and
4 deletions
+2192
-4
Dockerfile
Dockerfile
+1
-1
hardening_manifest.yaml
hardening_manifest.yaml
+3
-3
vendor/github.com/ProtonMail/go-crypto/AUTHORS
vendor/github.com/ProtonMail/go-crypto/AUTHORS
+3
-0
vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS
vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS
+3
-0
vendor/github.com/ProtonMail/go-crypto/LICENSE
vendor/github.com/ProtonMail/go-crypto/LICENSE
+27
-0
vendor/github.com/ProtonMail/go-crypto/PATENTS
vendor/github.com/ProtonMail/go-crypto/PATENTS
+22
-0
vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go
vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go
+381
-0
vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go
...or/github.com/ProtonMail/go-crypto/brainpool/brainpool.go
+134
-0
vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go
vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go
+83
-0
vendor/github.com/ProtonMail/go-crypto/eax/eax.go
vendor/github.com/ProtonMail/go-crypto/eax/eax.go
+162
-0
vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go
...r/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go
+58
-0
vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go
vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go
+131
-0
vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go
...ub.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go
+92
-0
vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go
vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go
+317
-0
vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go
vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go
+136
-0
vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go
.../ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go
+78
-0
vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go
.../ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go
+24
-0
vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go
...b.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go
+153
-0
vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go
...or/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go
+224
-0
vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go
...r/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go
+160
-0
No files found.
Dockerfile
View file @
530cd297
ARG
BASE_REGISTRY=registry1.dso.mil
ARG
BASE_REGISTRY=registry1.dso.mil
ARG
BASE_IMAGE=ironbank/redhat/ubi/ubi8
ARG
BASE_IMAGE=ironbank/redhat/ubi/ubi8
ARG
BASE_TAG=8.
3
ARG
BASE_TAG=8.
4
FROM
${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as build
FROM
${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG} as build
...
...
hardening_manifest.yaml
View file @
530cd297
...
@@ -14,7 +14,7 @@ tags:
...
@@ -14,7 +14,7 @@ tags:
# Build args passed to Dockerfile ARGs
# Build args passed to Dockerfile ARGs
args
:
args
:
BASE_IMAGE
:
"
redhat/ubi/ubi8"
BASE_IMAGE
:
"
redhat/ubi/ubi8"
BASE_TAG
:
"
8.
3
"
BASE_TAG
:
"
8.
4
"
# Docker image labels
# Docker image labels
labels
:
labels
:
...
@@ -43,10 +43,10 @@ resources:
...
@@ -43,10 +43,10 @@ resources:
type
:
sha256
type
:
sha256
value
:
ad73f845965cfd528e70f654e428073121a3fa0dc23caac81a1b1300277d4dba
value
:
ad73f845965cfd528e70f654e428073121a3fa0dc23caac81a1b1300277d4dba
-
filename
:
source-controller.tar.gz
-
filename
:
source-controller.tar.gz
url
:
https://github.com/fluxcd/source-controller/archive/refs/tags/v0.1
2.2
.tar.gz
url
:
https://github.com/fluxcd/source-controller/archive/refs/tags/v0.1
3.0
.tar.gz
validation
:
validation
:
type
:
sha256
type
:
sha256
value
:
cb649af43d2f871816492cddbc5132ec3f308570ccb329aba87ea38581b97349
value
:
b43381cc9a8e3ef3f1546e92737673cdc99204c6d266fbc38822f4e3131733d3
-
filename
:
tini-amd64
-
filename
:
tini-amd64
url
:
https://github.com/krallin/tini/releases/download/v0.19.0/tini-amd64
url
:
https://github.com/krallin/tini/releases/download/v0.19.0/tini-amd64
validation
:
validation
:
...
...
vendor/github.com/ProtonMail/go-crypto/AUTHORS
0 → 100644
View file @
530cd297
# This source code refers to The Go Authors for copyright purposes.
# The master list of authors is in the main Go distribution,
# visible at https://tip.golang.org/AUTHORS.
vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS
0 → 100644
View file @
530cd297
# This source code was written by the Go contributors.
# The master list of contributors is in the main Go distribution,
# visible at https://tip.golang.org/CONTRIBUTORS.
vendor/github.com/ProtonMail/go-crypto/LICENSE
0 → 100644
View file @
530cd297
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
vendor/github.com/ProtonMail/go-crypto/PATENTS
0 → 100644
View file @
530cd297
Additional IP Rights Grant (Patents)
"This implementation" means the copyrightable works distributed by
Google as part of the Go project.
Google hereby grants to You a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable (except as stated in this section)
patent license to make, have made, use, offer to sell, sell, import,
transfer and otherwise run, modify and propagate the contents of this
implementation of Go, where such license applies only to those patent
claims, both currently owned or controlled by Google and acquired in
the future, licensable by Google that are necessarily infringed by this
implementation of Go. This grant does not include claims that would be
infringed only as a consequence of further modification of this
implementation. If you or your agent or exclusive licensee institute or
order or agree to the institution of patent litigation against any
entity (including a cross-claim or counterclaim in a lawsuit) alleging
that this implementation of Go or any code incorporated within this
implementation of Go constitutes direct or contributory patent
infringement, or inducement of patent infringement, then any patent
rights granted to you under this License for this implementation of Go
shall terminate as of the date such litigation is filed.
vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go
0 → 100644
View file @
530cd297
package
bitcurves
// Copyright 2010 The Go Authors. All rights reserved.
// Copyright 2011 ThePiachu. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package bitelliptic implements several Koblitz elliptic curves over prime
// fields.
// This package operates, internally, on Jacobian coordinates. For a given
// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1)
// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole
// calculation can be performed within the transform (as in ScalarMult and
// ScalarBaseMult). But even for Add and Double, it's faster to apply and
// reverse the transform than to operate in affine coordinates.
import
(
"crypto/elliptic"
"io"
"math/big"
"sync"
)
// A BitCurve represents a Koblitz Curve with a=0.
// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html
type
BitCurve
struct
{
Name
string
P
*
big
.
Int
// the order of the underlying field
N
*
big
.
Int
// the order of the base point
B
*
big
.
Int
// the constant of the BitCurve equation
Gx
,
Gy
*
big
.
Int
// (x,y) of the base point
BitSize
int
// the size of the underlying field
}
// Params returns the parameters of the given BitCurve (see BitCurve struct)
func
(
bitCurve
*
BitCurve
)
Params
()
(
cp
*
elliptic
.
CurveParams
)
{
cp
=
new
(
elliptic
.
CurveParams
)
cp
.
Name
=
bitCurve
.
Name
cp
.
P
=
bitCurve
.
P
cp
.
N
=
bitCurve
.
N
cp
.
Gx
=
bitCurve
.
Gx
cp
.
Gy
=
bitCurve
.
Gy
cp
.
BitSize
=
bitCurve
.
BitSize
return
cp
}
// IsOnCurve returns true if the given (x,y) lies on the BitCurve.
func
(
bitCurve
*
BitCurve
)
IsOnCurve
(
x
,
y
*
big
.
Int
)
bool
{
// y² = x³ + b
y2
:=
new
(
big
.
Int
)
.
Mul
(
y
,
y
)
//y²
y2
.
Mod
(
y2
,
bitCurve
.
P
)
//y²%P
x3
:=
new
(
big
.
Int
)
.
Mul
(
x
,
x
)
//x²
x3
.
Mul
(
x3
,
x
)
//x³
x3
.
Add
(
x3
,
bitCurve
.
B
)
//x³+B
x3
.
Mod
(
x3
,
bitCurve
.
P
)
//(x³+B)%P
return
x3
.
Cmp
(
y2
)
==
0
}
// affineFromJacobian reverses the Jacobian transform. See the comment at the
// top of the file.
func
(
bitCurve
*
BitCurve
)
affineFromJacobian
(
x
,
y
,
z
*
big
.
Int
)
(
xOut
,
yOut
*
big
.
Int
)
{
if
z
.
Cmp
(
big
.
NewInt
(
0
))
==
0
{
panic
(
"bitcurve: Can't convert to affine with Jacobian Z = 0"
)
}
// x = YZ^2 mod P
zinv
:=
new
(
big
.
Int
)
.
ModInverse
(
z
,
bitCurve
.
P
)
zinvsq
:=
new
(
big
.
Int
)
.
Mul
(
zinv
,
zinv
)
xOut
=
new
(
big
.
Int
)
.
Mul
(
x
,
zinvsq
)
xOut
.
Mod
(
xOut
,
bitCurve
.
P
)
// y = YZ^3 mod P
zinvsq
.
Mul
(
zinvsq
,
zinv
)
yOut
=
new
(
big
.
Int
)
.
Mul
(
y
,
zinvsq
)
yOut
.
Mod
(
yOut
,
bitCurve
.
P
)
return
xOut
,
yOut
}
// Add returns the sum of (x1,y1) and (x2,y2)
func
(
bitCurve
*
BitCurve
)
Add
(
x1
,
y1
,
x2
,
y2
*
big
.
Int
)
(
*
big
.
Int
,
*
big
.
Int
)
{
z
:=
new
(
big
.
Int
)
.
SetInt64
(
1
)
x
,
y
,
z
:=
bitCurve
.
addJacobian
(
x1
,
y1
,
z
,
x2
,
y2
,
z
)
return
bitCurve
.
affineFromJacobian
(
x
,
y
,
z
)
}
// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and
// (x2, y2, z2) and returns their sum, also in Jacobian form.
func
(
bitCurve
*
BitCurve
)
addJacobian
(
x1
,
y1
,
z1
,
x2
,
y2
,
z2
*
big
.
Int
)
(
*
big
.
Int
,
*
big
.
Int
,
*
big
.
Int
)
{
// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl
z1z1
:=
new
(
big
.
Int
)
.
Mul
(
z1
,
z1
)
z1z1
.
Mod
(
z1z1
,
bitCurve
.
P
)
z2z2
:=
new
(
big
.
Int
)
.
Mul
(
z2
,
z2
)
z2z2
.
Mod
(
z2z2
,
bitCurve
.
P
)
u1
:=
new
(
big
.
Int
)
.
Mul
(
x1
,
z2z2
)
u1
.
Mod
(
u1
,
bitCurve
.
P
)
u2
:=
new
(
big
.
Int
)
.
Mul
(
x2
,
z1z1
)
u2
.
Mod
(
u2
,
bitCurve
.
P
)
h
:=
new
(
big
.
Int
)
.
Sub
(
u2
,
u1
)
if
h
.
Sign
()
==
-
1
{
h
.
Add
(
h
,
bitCurve
.
P
)
}
i
:=
new
(
big
.
Int
)
.
Lsh
(
h
,
1
)
i
.
Mul
(
i
,
i
)
j
:=
new
(
big
.
Int
)
.
Mul
(
h
,
i
)
s1
:=
new
(
big
.
Int
)
.
Mul
(
y1
,
z2
)
s1
.
Mul
(
s1
,
z2z2
)
s1
.
Mod
(
s1
,
bitCurve
.
P
)
s2
:=
new
(
big
.
Int
)
.
Mul
(
y2
,
z1
)
s2
.
Mul
(
s2
,
z1z1
)
s2
.
Mod
(
s2
,
bitCurve
.
P
)
r
:=
new
(
big
.
Int
)
.
Sub
(
s2
,
s1
)
if
r
.
Sign
()
==
-
1
{
r
.
Add
(
r
,
bitCurve
.
P
)
}
r
.
Lsh
(
r
,
1
)
v
:=
new
(
big
.
Int
)
.
Mul
(
u1
,
i
)
x3
:=
new
(
big
.
Int
)
.
Set
(
r
)
x3
.
Mul
(
x3
,
x3
)
x3
.
Sub
(
x3
,
j
)
x3
.
Sub
(
x3
,
v
)
x3
.
Sub
(
x3
,
v
)
x3
.
Mod
(
x3
,
bitCurve
.
P
)
y3
:=
new
(
big
.
Int
)
.
Set
(
r
)
v
.
Sub
(
v
,
x3
)
y3
.
Mul
(
y3
,
v
)
s1
.
Mul
(
s1
,
j
)
s1
.
Lsh
(
s1
,
1
)
y3
.
Sub
(
y3
,
s1
)
y3
.
Mod
(
y3
,
bitCurve
.
P
)
z3
:=
new
(
big
.
Int
)
.
Add
(
z1
,
z2
)
z3
.
Mul
(
z3
,
z3
)
z3
.
Sub
(
z3
,
z1z1
)
if
z3
.
Sign
()
==
-
1
{
z3
.
Add
(
z3
,
bitCurve
.
P
)
}
z3
.
Sub
(
z3
,
z2z2
)
if
z3
.
Sign
()
==
-
1
{
z3
.
Add
(
z3
,
bitCurve
.
P
)
}
z3
.
Mul
(
z3
,
h
)
z3
.
Mod
(
z3
,
bitCurve
.
P
)
return
x3
,
y3
,
z3
}
// Double returns 2*(x,y)
func
(
bitCurve
*
BitCurve
)
Double
(
x1
,
y1
*
big
.
Int
)
(
*
big
.
Int
,
*
big
.
Int
)
{
z1
:=
new
(
big
.
Int
)
.
SetInt64
(
1
)
return
bitCurve
.
affineFromJacobian
(
bitCurve
.
doubleJacobian
(
x1
,
y1
,
z1
))
}
// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and
// returns its double, also in Jacobian form.
func
(
bitCurve
*
BitCurve
)
doubleJacobian
(
x
,
y
,
z
*
big
.
Int
)
(
*
big
.
Int
,
*
big
.
Int
,
*
big
.
Int
)
{
// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
a
:=
new
(
big
.
Int
)
.
Mul
(
x
,
x
)
//X1²
b
:=
new
(
big
.
Int
)
.
Mul
(
y
,
y
)
//Y1²
c
:=
new
(
big
.
Int
)
.
Mul
(
b
,
b
)
//B²
d
:=
new
(
big
.
Int
)
.
Add
(
x
,
b
)
//X1+B
d
.
Mul
(
d
,
d
)
//(X1+B)²
d
.
Sub
(
d
,
a
)
//(X1+B)²-A
d
.
Sub
(
d
,
c
)
//(X1+B)²-A-C
d
.
Mul
(
d
,
big
.
NewInt
(
2
))
//2*((X1+B)²-A-C)
e
:=
new
(
big
.
Int
)
.
Mul
(
big
.
NewInt
(
3
),
a
)
//3*A
f
:=
new
(
big
.
Int
)
.
Mul
(
e
,
e
)
//E²
x3
:=
new
(
big
.
Int
)
.
Mul
(
big
.
NewInt
(
2
),
d
)
//2*D
x3
.
Sub
(
f
,
x3
)
//F-2*D
x3
.
Mod
(
x3
,
bitCurve
.
P
)
y3
:=
new
(
big
.
Int
)
.
Sub
(
d
,
x3
)
//D-X3
y3
.
Mul
(
e
,
y3
)
//E*(D-X3)
y3
.
Sub
(
y3
,
new
(
big
.
Int
)
.
Mul
(
big
.
NewInt
(
8
),
c
))
//E*(D-X3)-8*C
y3
.
Mod
(
y3
,
bitCurve
.
P
)
z3
:=
new
(
big
.
Int
)
.
Mul
(
y
,
z
)
//Y1*Z1
z3
.
Mul
(
big
.
NewInt
(
2
),
z3
)
//3*Y1*Z1
z3
.
Mod
(
z3
,
bitCurve
.
P
)
return
x3
,
y3
,
z3
}
//TODO: double check if it is okay
// ScalarMult returns k*(Bx,By) where k is a number in big-endian form.
func
(
bitCurve
*
BitCurve
)
ScalarMult
(
Bx
,
By
*
big
.
Int
,
k
[]
byte
)
(
*
big
.
Int
,
*
big
.
Int
)
{
// We have a slight problem in that the identity of the group (the
// point at infinity) cannot be represented in (x, y) form on a finite
// machine. Thus the standard add/double algorithm has to be tweaked
// slightly: our initial state is not the identity, but x, and we
// ignore the first true bit in |k|. If we don't find any true bits in
// |k|, then we return nil, nil, because we cannot return the identity
// element.
Bz
:=
new
(
big
.
Int
)
.
SetInt64
(
1
)
x
:=
Bx
y
:=
By
z
:=
Bz
seenFirstTrue
:=
false
for
_
,
byte
:=
range
k
{
for
bitNum
:=
0
;
bitNum
<
8
;
bitNum
++
{
if
seenFirstTrue
{
x
,
y
,
z
=
bitCurve
.
doubleJacobian
(
x
,
y
,
z
)
}
if
byte
&
0x80
==
0x80
{
if
!
seenFirstTrue
{
seenFirstTrue
=
true
}
else
{
x
,
y
,
z
=
bitCurve
.
addJacobian
(
Bx
,
By
,
Bz
,
x
,
y
,
z
)
}
}
byte
<<=
1
}
}
if
!
seenFirstTrue
{
return
nil
,
nil
}
return
bitCurve
.
affineFromJacobian
(
x
,
y
,
z
)
}
// ScalarBaseMult returns k*G, where G is the base point of the group and k is
// an integer in big-endian form.
func
(
bitCurve
*
BitCurve
)
ScalarBaseMult
(
k
[]
byte
)
(
*
big
.
Int
,
*
big
.
Int
)
{
return
bitCurve
.
ScalarMult
(
bitCurve
.
Gx
,
bitCurve
.
Gy
,
k
)
}
var
mask
=
[]
byte
{
0xff
,
0x1
,
0x3
,
0x7
,
0xf
,
0x1f
,
0x3f
,
0x7f
}
//TODO: double check if it is okay
// GenerateKey returns a public/private key pair. The private key is generated
// using the given reader, which must return random data.
func
(
bitCurve
*
BitCurve
)
GenerateKey
(
rand
io
.
Reader
)
(
priv
[]
byte
,
x
,
y
*
big
.
Int
,
err
error
)
{
byteLen
:=
(
bitCurve
.
BitSize
+
7
)
>>
3
priv
=
make
([]
byte
,
byteLen
)
for
x
==
nil
{
_
,
err
=
io
.
ReadFull
(
rand
,
priv
)
if
err
!=
nil
{
return
}
// We have to mask off any excess bits in the case that the size of the
// underlying field is not a whole number of bytes.
priv
[
0
]
&=
mask
[
bitCurve
.
BitSize
%
8
]
// This is because, in tests, rand will return all zeros and we don't
// want to get the point at infinity and loop forever.
priv
[
1
]
^=
0x42
x
,
y
=
bitCurve
.
ScalarBaseMult
(
priv
)
}
return
}
// Marshal converts a point into the form specified in section 4.3.6 of ANSI
// X9.62.
func
(
bitCurve
*
BitCurve
)
Marshal
(
x
,
y
*
big
.
Int
)
[]
byte
{
byteLen
:=
(
bitCurve
.
BitSize
+
7
)
>>
3
ret
:=
make
([]
byte
,
1
+
2
*
byteLen
)
ret
[
0
]
=
4
// uncompressed point
xBytes
:=
x
.
Bytes
()
copy
(
ret
[
1
+
byteLen
-
len
(
xBytes
)
:
],
xBytes
)
yBytes
:=
y
.
Bytes
()
copy
(
ret
[
1
+
2
*
byteLen
-
len
(
yBytes
)
:
],
yBytes
)
return
ret
}
// Unmarshal converts a point, serialised by Marshal, into an x, y pair. On
// error, x = nil.
func
(
bitCurve
*
BitCurve
)
Unmarshal
(
data
[]
byte
)
(
x
,
y
*
big
.
Int
)
{
byteLen
:=
(
bitCurve
.
BitSize
+
7
)
>>
3
if
len
(
data
)
!=
1
+
2
*
byteLen
{
return
}
if
data
[
0
]
!=
4
{
// uncompressed form
return
}
x
=
new
(
big
.
Int
)
.
SetBytes
(
data
[
1
:
1
+
byteLen
])
y
=
new
(
big
.
Int
)
.
SetBytes
(
data
[
1
+
byteLen
:
])
return
}
//curve parameters taken from:
//http://www.secg.org/collateral/sec2_final.pdf
var
initonce
sync
.
Once
var
secp160k1
*
BitCurve
var
secp192k1
*
BitCurve
var
secp224k1
*
BitCurve
var
secp256k1
*
BitCurve
func
initAll
()
{
initS160
()
initS192
()
initS224
()
initS256
()
}
func
initS160
()
{
// See SEC 2 section 2.4.1
secp160k1
=
new
(
BitCurve
)
secp160k1
.
Name
=
"secp160k1"
secp160k1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"
,
16
)
secp160k1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"0100000000000000000001B8FA16DFAB9ACA16B6B3"
,
16
)
secp160k1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"0000000000000000000000000000000000000007"
,
16
)
secp160k1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"3B4C382CE37AA192A4019E763036F4F5DD4D7EBB"
,
16
)
secp160k1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"938CF935318FDCED6BC28286531733C3F03C4FEE"
,
16
)
secp160k1
.
BitSize
=
160
}
func
initS192
()
{
// See SEC 2 section 2.5.1
secp192k1
=
new
(
BitCurve
)
secp192k1
.
Name
=
"secp192k1"
secp192k1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"
,
16
)
secp192k1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"
,
16
)
secp192k1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"000000000000000000000000000000000000000000000003"
,
16
)
secp192k1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
,
16
)
secp192k1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"
,
16
)
secp192k1
.
BitSize
=
192
}
func
initS224
()
{
// See SEC 2 section 2.6.1
secp224k1
=
new
(
BitCurve
)
secp224k1
.
Name
=
"secp224k1"
secp224k1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D"
,
16
)
secp224k1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7"
,
16
)
secp224k1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"00000000000000000000000000000000000000000000000000000005"
,
16
)
secp224k1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C"
,
16
)
secp224k1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5"
,
16
)
secp224k1
.
BitSize
=
224
}
func
initS256
()
{
// See SEC 2 section 2.7.1
secp256k1
=
new
(
BitCurve
)
secp256k1
.
Name
=
"secp256k1"
secp256k1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"
,
16
)
secp256k1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"
,
16
)
secp256k1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"0000000000000000000000000000000000000000000000000000000000000007"
,
16
)
secp256k1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
,
16
)
secp256k1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"
,
16
)
secp256k1
.
BitSize
=
256
}
// S160 returns a BitCurve which implements secp160k1 (see SEC 2 section 2.4.1)
func
S160
()
*
BitCurve
{
initonce
.
Do
(
initAll
)
return
secp160k1
}
// S192 returns a BitCurve which implements secp192k1 (see SEC 2 section 2.5.1)
func
S192
()
*
BitCurve
{
initonce
.
Do
(
initAll
)
return
secp192k1
}
// S224 returns a BitCurve which implements secp224k1 (see SEC 2 section 2.6.1)
func
S224
()
*
BitCurve
{
initonce
.
Do
(
initAll
)
return
secp224k1
}
// S256 returns a BitCurve which implements bitcurves (see SEC 2 section 2.7.1)
func
S256
()
*
BitCurve
{
initonce
.
Do
(
initAll
)
return
secp256k1
}
vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go
0 → 100644
View file @
530cd297
// Package brainpool implements Brainpool elliptic curves.
// Implementation of rcurves is from github.com/ebfe/brainpool
// Note that these curves are implemented with naive, non-constant time operations
// and are likely not suitable for enviroments where timing attacks are a concern.
package
brainpool
import
(
"crypto/elliptic"
"math/big"
"sync"
)
var
(
once
sync
.
Once
p256t1
,
p384t1
,
p512t1
*
elliptic
.
CurveParams
p256r1
,
p384r1
,
p512r1
*
rcurve
)
func
initAll
()
{
initP256t1
()
initP384t1
()
initP512t1
()
initP256r1
()
initP384r1
()
initP512r1
()
}
func
initP256t1
()
{
p256t1
=
&
elliptic
.
CurveParams
{
Name
:
"brainpoolP256t1"
}
p256t1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377"
,
16
)
p256t1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"
,
16
)
p256t1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04"
,
16
)
p256t1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4"
,
16
)
p256t1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE"
,
16
)
p256t1
.
BitSize
=
256
}
func
initP256r1
()
{
twisted
:=
p256t1
params
:=
&
elliptic
.
CurveParams
{
Name
:
"brainpoolP256r1"
,
P
:
twisted
.
P
,
N
:
twisted
.
N
,
BitSize
:
twisted
.
BitSize
,
}
params
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262"
,
16
)
params
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997"
,
16
)
z
,
_
:=
new
(
big
.
Int
)
.
SetString
(
"3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0"
,
16
)
p256r1
=
newrcurve
(
twisted
,
params
,
z
)
}
func
initP384t1
()
{
p384t1
=
&
elliptic
.
CurveParams
{
Name
:
"brainpoolP384t1"
}
p384t1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53"
,
16
)
p384t1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565"
,
16
)
p384t1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE"
,
16
)
p384t1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC"
,
16
)
p384t1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928"
,
16
)
p384t1
.
BitSize
=
384
}
func
initP384r1
()
{
twisted
:=
p384t1
params
:=
&
elliptic
.
CurveParams
{
Name
:
"brainpoolP384r1"
,
P
:
twisted
.
P
,
N
:
twisted
.
N
,
BitSize
:
twisted
.
BitSize
,
}
params
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E"
,
16
)
params
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315"
,
16
)
z
,
_
:=
new
(
big
.
Int
)
.
SetString
(
"41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C"
,
16
)
p384r1
=
newrcurve
(
twisted
,
params
,
z
)
}
func
initP512t1
()
{
p512t1
=
&
elliptic
.
CurveParams
{
Name
:
"brainpoolP512t1"
}
p512t1
.
P
,
_
=
new
(
big
.
Int
)
.
SetString
(
"AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3"
,
16
)
p512t1
.
N
,
_
=
new
(
big
.
Int
)
.
SetString
(
"AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069"
,
16
)
p512t1
.
B
,
_
=
new
(
big
.
Int
)
.
SetString
(
"7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E"
,
16
)
p512t1
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA"
,
16
)
p512t1
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332"
,
16
)
p512t1
.
BitSize
=
512
}
func
initP512r1
()
{
twisted
:=
p512t1
params
:=
&
elliptic
.
CurveParams
{
Name
:
"brainpoolP512r1"
,
P
:
twisted
.
P
,
N
:
twisted
.
N
,
BitSize
:
twisted
.
BitSize
,
}
params
.
Gx
,
_
=
new
(
big
.
Int
)
.
SetString
(
"81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822"
,
16
)
params
.
Gy
,
_
=
new
(
big
.
Int
)
.
SetString
(
"7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892"
,
16
)
z
,
_
:=
new
(
big
.
Int
)
.
SetString
(
"12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB"
,
16
)
p512r1
=
newrcurve
(
twisted
,
params
,
z
)
}
// P256t1 returns a Curve which implements Brainpool P256t1 (see RFC 5639, section 3.4)
func
P256t1
()
elliptic
.
Curve
{
once
.
Do
(
initAll
)
return
p256t1
}
// P256r1 returns a Curve which implements Brainpool P256r1 (see RFC 5639, section 3.4)
func
P256r1
()
elliptic
.
Curve
{
once
.
Do
(
initAll
)
return
p256r1
}
// P384t1 returns a Curve which implements Brainpool P384t1 (see RFC 5639, section 3.6)
func
P384t1
()
elliptic
.
Curve
{
once
.
Do
(
initAll
)
return
p384t1
}
// P384r1 returns a Curve which implements Brainpool P384r1 (see RFC 5639, section 3.6)
func
P384r1
()
elliptic
.
Curve
{
once
.
Do
(
initAll
)
return
p384r1
}
// P512t1 returns a Curve which implements Brainpool P512t1 (see RFC 5639, section 3.7)
func
P512t1
()
elliptic
.
Curve
{
once
.
Do
(
initAll
)
return
p512t1
}
// P512r1 returns a Curve which implements Brainpool P512r1 (see RFC 5639, section 3.7)
func
P512r1
()
elliptic
.
Curve
{
once
.
Do
(
initAll
)
return
p512r1
}
vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go
0 → 100644
View file @
530cd297
package
brainpool
import
(
"crypto/elliptic"
"math/big"
)
var
_
elliptic
.
Curve
=
(
*
rcurve
)(
nil
)
type
rcurve
struct
{
twisted
elliptic
.
Curve
params
*
elliptic
.
CurveParams
z
*
big
.
Int
zinv
*
big
.
Int
z2
*
big
.
Int
z3
*
big
.
Int
zinv2
*
big
.
Int
zinv3
*
big
.
Int
}
var
(
two
=
big
.
NewInt
(
2
)
three
=
big
.
NewInt
(
3
)
)
func
newrcurve
(
twisted
elliptic
.
Curve
,
params
*
elliptic
.
CurveParams
,
z
*
big
.
Int
)
*
rcurve
{
zinv
:=
new
(
big
.
Int
)
.
ModInverse
(
z
,
params
.
P
)
return
&
rcurve
{
twisted
:
twisted
,
params
:
params
,
z
:
z
,
zinv
:
zinv
,
z2
:
new
(
big
.
Int
)
.
Exp
(
z
,
two
,
params
.
P
),
z3
:
new
(
big
.
Int
)
.
Exp
(
z
,
three
,
params
.
P
),
zinv2
:
new
(
big
.
Int
)
.
Exp
(
zinv
,
two
,
params
.
P
),
zinv3
:
new
(
big
.
Int
)
.
Exp
(
zinv
,
three
,
params
.
P
),
}
}
func
(
curve
*
rcurve
)
toTwisted
(
x
,
y
*
big
.
Int
)
(
*
big
.
Int
,
*
big
.
Int
)
{
var
tx
,
ty
big
.
Int
tx
.
Mul
(
x
,
curve
.
z2
)
tx
.
Mod
(
&
tx
,
curve
.
params
.
P
)
ty
.
Mul
(
y
,
curve
.
z3
)
ty
.
Mod
(
&
ty
,
curve
.
params
.
P
)
return
&
tx
,
&
ty
}
func
(
curve
*
rcurve
)
fromTwisted
(
tx
,
ty
*
big
.
Int
)
(
*
big
.
Int
,
*
big
.
Int
)
{
var
x
,
y
big
.
Int
x
.
Mul
(
tx
,
curve
.
zinv2
)
x
.
Mod
(
&
x
,
curve
.
params
.
P
)
y
.
Mul
(
ty
,
curve
.
zinv3
)
y
.
Mod
(
&
y
,
curve
.
params
.
P
)
return
&
x
,
&
y
}
func
(
curve
*
rcurve
)
Params
()
*
elliptic
.
CurveParams
{
return
curve
.
params
}
func
(
curve
*
rcurve
)
IsOnCurve
(
x
,
y
*
big
.
Int
)
bool
{
return
curve
.
twisted
.
IsOnCurve
(
curve
.
toTwisted
(
x
,
y
))
}
func
(
curve
*
rcurve
)
Add
(
x1
,
y1
,
x2
,
y2
*
big
.
Int
)
(
x
,
y
*
big
.
Int
)
{
tx1
,
ty1
:=
curve
.
toTwisted
(
x1
,
y1
)
tx2
,
ty2
:=
curve
.
toTwisted
(
x2
,
y2
)
return
curve
.
fromTwisted
(
curve
.
twisted
.
Add
(
tx1
,
ty1
,
tx2
,
ty2
))
}
func
(
curve
*
rcurve
)
Double
(
x1
,
y1
*
big
.
Int
)
(
x
,
y
*
big
.
Int
)
{
return
curve
.
fromTwisted
(
curve
.
twisted
.
Double
(
curve
.
toTwisted
(
x1
,
y1
)))
}
func
(
curve
*
rcurve
)
ScalarMult
(
x1
,
y1
*
big
.
Int
,
scalar
[]
byte
)
(
x
,
y
*
big
.
Int
)
{
tx1
,
ty1
:=
curve
.
toTwisted
(
x1
,
y1
)
return
curve
.
fromTwisted
(
curve
.
twisted
.
ScalarMult
(
tx1
,
ty1
,
scalar
))
}
func
(
curve
*
rcurve
)
ScalarBaseMult
(
scalar
[]
byte
)
(
x
,
y
*
big
.
Int
)
{
return
curve
.
fromTwisted
(
curve
.
twisted
.
ScalarBaseMult
(
scalar
))
}
\ No newline at end of file
vendor/github.com/ProtonMail/go-crypto/eax/eax.go
0 → 100644
View file @
530cd297
// Copyright (C) 2019 ProtonTech AG
// Package eax provides an implementation of the EAX
// (encrypt-authenticate-translate) mode of operation, as described in
// Bellare, Rogaway, and Wagner "THE EAX MODE OF OPERATION: A TWO-PASS
// AUTHENTICATED-ENCRYPTION SCHEME OPTIMIZED FOR SIMPLICITY AND EFFICIENCY."
// In FSE'04, volume 3017 of LNCS, 2004
package
eax
import
(
"crypto/cipher"
"crypto/subtle"
"errors"
"github.com/ProtonMail/go-crypto/internal/byteutil"
)
const
(
defaultTagSize
=
16
defaultNonceSize
=
16
)
type
eax
struct
{
block
cipher
.
Block
// Only AES-{128, 192, 256} supported
tagSize
int
// At least 12 bytes recommended
nonceSize
int
}
func
(
e
*
eax
)
NonceSize
()
int
{
return
e
.
nonceSize
}
func
(
e
*
eax
)
Overhead
()
int
{
return
e
.
tagSize
}
// NewEAX returns an EAX instance with AES-{KEYLENGTH} and default nonce and
// tag lengths. Supports {128, 192, 256}- bit key length.
func
NewEAX
(
block
cipher
.
Block
)
(
cipher
.
AEAD
,
error
)
{
return
NewEAXWithNonceAndTagSize
(
block
,
defaultNonceSize
,
defaultTagSize
)
}
// NewEAXWithNonceAndTagSize returns an EAX instance with AES-{keyLength} and
// given nonce and tag lengths in bytes. Panics on zero nonceSize and
// exceedingly long tags.
//
// It is recommended to use at least 12 bytes as tag length (see, for instance,
// NIST SP 800-38D).
//
// Only to be used for compatibility with existing cryptosystems with
// non-standard parameters. For all other cases, prefer NewEAX.
func
NewEAXWithNonceAndTagSize
(
block
cipher
.
Block
,
nonceSize
,
tagSize
int
)
(
cipher
.
AEAD
,
error
)
{
if
nonceSize
<
1
{
return
nil
,
eaxError
(
"Cannot initialize EAX with nonceSize = 0"
)
}
if
tagSize
>
block
.
BlockSize
()
{
return
nil
,
eaxError
(
"Custom tag length exceeds blocksize"
)
}
return
&
eax
{
block
:
block
,
tagSize
:
tagSize
,
nonceSize
:
nonceSize
,
},
nil
}
func
(
e
*
eax
)
Seal
(
dst
,
nonce
,
plaintext
,
adata
[]
byte
)
[]
byte
{
if
len
(
nonce
)
>
e
.
nonceSize
{
panic
(
"crypto/eax: Nonce too long for this instance"
)
}
ret
,
out
:=
byteutil
.
SliceForAppend
(
dst
,
len
(
plaintext
)
+
e
.
tagSize
)
omacNonce
:=
e
.
omacT
(
0
,
nonce
)
omacAdata
:=
e
.
omacT
(
1
,
adata
)
// Encrypt message using CTR mode and omacNonce as IV
ctr
:=
cipher
.
NewCTR
(
e
.
block
,
omacNonce
)
ciphertextData
:=
out
[
:
len
(
plaintext
)]
ctr
.
XORKeyStream
(
ciphertextData
,
plaintext
)
omacCiphertext
:=
e
.
omacT
(
2
,
ciphertextData
)
tag
:=
out
[
len
(
plaintext
)
:
]
for
i
:=
0
;
i
<
e
.
tagSize
;
i
++
{
tag
[
i
]
=
omacCiphertext
[
i
]
^
omacNonce
[
i
]
^
omacAdata
[
i
]
}
return
ret
}
func
(
e
*
eax
)
Open
(
dst
,
nonce
,
ciphertext
,
adata
[]
byte
)
([]
byte
,
error
)
{
if
len
(
nonce
)
>
e
.
nonceSize
{
panic
(
"crypto/eax: Nonce too long for this instance"
)
}
if
len
(
ciphertext
)
<
e
.
tagSize
{
return
nil
,
eaxError
(
"Ciphertext shorter than tag length"
)
}
sep
:=
len
(
ciphertext
)
-
e
.
tagSize
// Compute tag
omacNonce
:=
e
.
omacT
(
0
,
nonce
)
omacAdata
:=
e
.
omacT
(
1
,
adata
)
omacCiphertext
:=
e
.
omacT
(
2
,
ciphertext
[
:
sep
])
tag
:=
make
([]
byte
,
e
.
tagSize
)
for
i
:=
0
;
i
<
e
.
tagSize
;
i
++
{
tag
[
i
]
=
omacCiphertext
[
i
]
^
omacNonce
[
i
]
^
omacAdata
[
i
]
}
// Compare tags
if
subtle
.
ConstantTimeCompare
(
ciphertext
[
sep
:
],
tag
)
!=
1
{
return
nil
,
eaxError
(
"Tag authentication failed"
)
}
// Decrypt ciphertext
ret
,
out
:=
byteutil
.
SliceForAppend
(
dst
,
len
(
ciphertext
))
ctr
:=
cipher
.
NewCTR
(
e
.
block
,
omacNonce
)
ctr
.
XORKeyStream
(
out
,
ciphertext
[
:
sep
])
return
ret
[
:
sep
],
nil
}
// Tweakable OMAC - Calls OMAC_K([t]_n || plaintext)
func
(
e
*
eax
)
omacT
(
t
byte
,
plaintext
[]
byte
)
[]
byte
{
blockSize
:=
e
.
block
.
BlockSize
()
byteT
:=
make
([]
byte
,
blockSize
)
byteT
[
blockSize
-
1
]
=
t
concat
:=
append
(
byteT
,
plaintext
...
)
return
e
.
omac
(
concat
)
}
func
(
e
*
eax
)
omac
(
plaintext
[]
byte
)
[]
byte
{
blockSize
:=
e
.
block
.
BlockSize
()
// L ← E_K(0^n); B ← 2L; P ← 4L
L
:=
make
([]
byte
,
blockSize
)
e
.
block
.
Encrypt
(
L
,
L
)
B
:=
byteutil
.
GfnDouble
(
L
)
P
:=
byteutil
.
GfnDouble
(
B
)
// CBC with IV = 0
cbc
:=
cipher
.
NewCBCEncrypter
(
e
.
block
,
make
([]
byte
,
blockSize
))
padded
:=
e
.
pad
(
plaintext
,
B
,
P
)
cbcCiphertext
:=
make
([]
byte
,
len
(
padded
))
cbc
.
CryptBlocks
(
cbcCiphertext
,
padded
)
return
cbcCiphertext
[
len
(
cbcCiphertext
)
-
blockSize
:
]
}
func
(
e
*
eax
)
pad
(
plaintext
,
B
,
P
[]
byte
)
[]
byte
{
// if |M| in {n, 2n, 3n, ...}
blockSize
:=
e
.
block
.
BlockSize
()
if
len
(
plaintext
)
!=
0
&&
len
(
plaintext
)
%
blockSize
==
0
{
return
byteutil
.
RightXor
(
plaintext
,
B
)
}
// else return (M || 1 || 0^(n−1−(|M| % n))) xor→ P
ending
:=
make
([]
byte
,
blockSize
-
len
(
plaintext
)
%
blockSize
)
ending
[
0
]
=
0x80
padded
:=
append
(
plaintext
,
ending
...
)
return
byteutil
.
RightXor
(
padded
,
P
)
}
func
eaxError
(
err
string
)
error
{
return
errors
.
New
(
"crypto/eax: "
+
err
)
}
vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go
0 → 100644
View file @
530cd297
package
eax
// Test vectors from
// https://web.cs.ucdavis.edu/~rogaway/papers/eax.pdf
var
testVectors
=
[]
struct
{
msg
,
key
,
nonce
,
header
,
ciphertext
string
}{
{
""
,
"233952DEE4D5ED5F9B9C6D6FF80FF478"
,
"62EC67F9C3A4A407FCB2A8C49031A8B3"
,
"6BFB914FD07EAE6B"
,
"E037830E8389F27B025A2D6527E79D01"
},
{
"F7FB"
,
"91945D3F4DCBEE0BF45EF52255F095A4"
,
"BECAF043B0A23D843194BA972C66DEBD"
,
"FA3BFD4806EB53FA"
,
"19DD5C4C9331049D0BDAB0277408F67967E5"
},
{
"1A47CB4933"
,
"01F74AD64077F2E704C0F60ADA3DD523"
,
"70C3DB4F0D26368400A10ED05D2BFF5E"
,
"234A3463C1264AC6"
,
"D851D5BAE03A59F238A23E39199DC9266626C40F80"
},
{
"481C9E39B1"
,
"D07CF6CBB7F313BDDE66B727AFD3C5E8"
,
"8408DFFF3C1A2B1292DC199E46B7D617"
,
"33CCE2EABFF5A79D"
,
"632A9D131AD4C168A4225D8E1FF755939974A7BEDE"
},
{
"40D0C07DA5E4"
,
"35B6D0580005BBC12B0587124557D2C2"
,
"FDB6B06676EEDC5C61D74276E1F8E816"
,
"AEB96EAEBE2970E9"
,
"071DFE16C675CB0677E536F73AFE6A14B74EE49844DD"
},
{
"4DE3B35C3FC039245BD1FB7D"
,
"BD8E6E11475E60B268784C38C62FEB22"
,
"6EAC5C93072D8E8513F750935E46DA1B"
,
"D4482D1CA78DCE0F"
,
"835BB4F15D743E350E728414ABB8644FD6CCB86947C5E10590210A4F"
},
{
"8B0A79306C9CE7ED99DAE4F87F8DD61636"
,
"7C77D6E813BED5AC98BAA417477A2E7D"
,
"1A8C98DCD73D38393B2BF1569DEEFC19"
,
"65D2017990D62528"
,
"02083E3979DA014812F59F11D52630DA30137327D10649B0AA6E1C181DB617D7F2"
},
{
"1BDA122BCE8A8DBAF1877D962B8592DD2D56"
,
"5FFF20CAFAB119CA2FC73549E20F5B0D"
,
"DDE59B97D722156D4D9AFF2BC7559826"
,
"54B9F04E6A09189A"
,
"2EC47B2C4954A489AFC7BA4897EDCDAE8CC33B60450599BD02C96382902AEF7F832A"
},
{
"6CF36720872B8513F6EAB1A8A44438D5EF11"
,
"A4A4782BCFFD3EC5E7EF6D8C34A56123"
,
"B781FCF2F75FA5A8DE97A9CA48E522EC"
,
"899A175897561D7E"
,
"0DE18FD0FDD91E7AF19F1D8EE8733938B1E8E7F6D2231618102FDB7FE55FF1991700"
},
{
"CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7"
,
"8395FCF1E95BEBD697BD010BC766AAC3"
,
"22E7ADD93CFC6393C57EC0B3C17D6B44"
,
"126735FCC320D25A"
,
"CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC253B4652B1AF3795B124AB6E"
},
}
vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go
0 → 100644
View file @
530cd297
// These vectors include key length in {128, 192, 256}, tag size 128, and
// random nonce, header, and plaintext lengths.
// This file was automatically generated.
package
eax
var
randomVectors
=
[]
struct
{
key
,
nonce
,
header
,
plaintext
,
ciphertext
string
}{
{
"DFDE093F36B0356E5A81F609786982E3"
,
"1D8AC604419001816905BA72B14CED7E"
,
"152A1517A998D7A24163FCDD146DE81AC347C8B97088F502093C1ABB8F6E33D9A219C34D7603A18B1F5ABE02E56661B7D7F67E81EC08C1302EF38D80A859486D450E94A4F26AD9E68EEBBC0C857A0FC5CF9E641D63D565A7E361BC8908F5A8DC8FD6"
,
"1C8EAAB71077FE18B39730A3156ADE29C5EE824C7EE86ED2A253B775603FB237116E654F6FEC588DD27F523A0E01246FE73FE348491F2A8E9ABC6CA58D663F71CDBCF4AD798BE46C42AE6EE8B599DB44A1A48D7BBBBA0F7D2750181E1C5E66967F7D57CBD30AFBDA5727"
,
"79E7E150934BBEBF7013F61C60462A14D8B15AF7A248AFB8A344EF021C1500E16666891D6E973D8BB56B71A371F12CA34660C4410C016982B20F547E3762A58B7BF4F20236CADCF559E2BE7D783B13723B2741FC7CDC8997D839E39A3DDD2BADB96743DD7049F1BDB0516A262869915B3F70498AFB7B191BF960"
},
{
"F10619EF02E5D94D7550EB84ED364A21"
,
"8DC0D4F2F745BBAE835CC5574B942D20"
,
"FE561358F2E8DF7E1024FF1AE9A8D36EBD01352214505CB99D644777A8A1F6027FA2BDBFC529A9B91136D5F2416CFC5F0F4EC3A1AFD32BDDA23CA504C5A5CB451785FABF4DFE4CD50D817491991A60615B30286361C100A95D1712F2A45F8E374461F4CA2B"
,
"D7B5A971FC219631D30EFC3664AE3127D9CF3097DAD9C24AC7905D15E8D9B25B026B31D68CAE00975CDB81EB1FD96FD5E1A12E2BB83FA25F1B1D91363457657FC03875C27F2946C5"
,
"2F336ED42D3CC38FC61660C4CD60BA4BD438B05F5965D8B7B399D2E7167F5D34F792D318F94DB15D67463AC449E13D568CC09BFCE32A35EE3EE96A041927680AE329811811E27F2D1E8E657707AF99BA96D13A478D695D59"
},
{
"429F514EFC64D98A698A9247274CFF45"
,
"976AA5EB072F912D126ACEBC954FEC38"
,
"A71D89DC5B6CEDBB7451A27C3C2CAE09126DB4C421"
,
"5632FE62AB1DC549D54D3BC3FC868ACCEDEFD9ECF5E9F8"
,
"848AE4306CA8C7F416F8707625B7F55881C0AB430353A5C967CDA2DA787F581A70E34DBEBB2385"
},
{
"398138F309085F47F8457CDF53895A63"
,
"F8A8A7F2D28E5FFF7BBC2F24353F7A36"
,
"5D633C21BA7764B8855CAB586F3746E236AD486039C83C6B56EFA9C651D38A41D6B20DAEE3418BFEA44B8BD6"
,
"A3BBAA91920AF5E10659818B1B3B300AC79BFC129C8329E75251F73A66D3AE0128EB91D5031E0A65C329DB7D1E9C0493E268"
,
"D078097267606E5FB07CFB7E2B4B718172A82C6A4CEE65D549A4DFB9838003BD2FBF64A7A66988AC1A632FD88F9E9FBB57C5A78AD2E086EACBA3DB68511D81C2970A"
},
{
"7A4151EBD3901B42CBA45DAFB2E931BA"
,
"0FC88ACEE74DD538040321C330974EB8"
,
"250464FB04733BAB934C59E6AD2D6AE8D662CBCFEFBE61E5A308D4211E58C4C25935B72C69107722E946BFCBF416796600542D76AEB73F2B25BF53BAF97BDEB36ED3A7A51C31E7F170EB897457E7C17571D1BA0A908954E9"
,
"88C41F3EBEC23FAB8A362D969CAC810FAD4F7CA6A7F7D0D44F060F92E37E1183768DD4A8C733F71C96058D362A39876D183B86C103DE"
,
"74A25B2182C51096D48A870D80F18E1CE15867778E34FCBA6BD7BFB3739FDCD42AD0F2D9F4EBA29085285C6048C15BCE5E5166F1F962D3337AA88E6062F05523029D0A7F0BF9"
},
{
"BFB147E1CD5459424F8C0271FC0E0DC5"
,
"EABCC126442BF373969EA3015988CC45"
,
"4C0880E1D71AA2C7"
,
"BE1B5EC78FBF73E7A6682B21BA7E0E5D2D1C7ABE"
,
"5660D7C1380E2F306895B1402CB2D6C37876504276B414D120F4CF92FDDDBB293A238EA0"
},
{
"595DD6F52D18BC2CA8EB4EDAA18D9FA3"
,
"0F84B5D36CF4BC3B863313AF3B4D2E97"
,
"30AE6CC5F99580F12A779D98BD379A60948020C0B6FBD5746B30BA3A15C6CD33DAF376C70A9F15B6C0EB410A93161F7958AE23"
,
"8EF3687A1642B070970B0B91462229D1D76ABC154D18211F7152AA9FF368"
,
"317C1DDB11417E5A9CC4DDE7FDFF6659A5AC4B31DE025212580A05CDAC6024D3E4AE7C2966E52B9129E9ECDBED86"
},
{
"44E6F2DC8FDC778AD007137D11410F50"
,
"270A237AD977F7187AA6C158A0BAB24F"
,
"509B0F0EB12E2AA5C5BA2DE553C07FAF4CE0C9E926531AA709A3D6224FCB783ACCF1559E10B1123EBB7D52E8AB54E6B5352A9ED0D04124BF0E9D9BACFD7E32B817B2E625F5EE94A64EDE9E470DE7FE6886C19B294F9F828209FE257A78"
,
"8B3D7815DF25618A5D0C55A601711881483878F113A12EC36CF64900549A3199555528559DC118F789788A55FAFD944E6E99A9CA3F72F238CD3F4D88223F7A745992B3FAED1848"
,
"1CC00D79F7AD82FDA71B58D286E5F34D0CC4CEF30704E771CC1E50746BDF83E182B078DB27149A42BAE619DF0F85B0B1090AD55D3B4471B0D6F6ECCD09C8F876B30081F0E7537A9624F8AAF29DA85E324122EFB4D68A56"
},
{
"BB7BC352A03044B4428D8DBB4B0701FDEC4649FD17B81452"
,
"8B4BBE26CCD9859DCD84884159D6B0A4"
,
"2212BEB0E78E0F044A86944CF33C8D5C80D9DBE1034BF3BCF73611835C7D3A52F5BD2D81B68FD681B68540A496EE5DA16FD8AC8824E60E1EC2042BE28FB0BFAD4E4B03596446BDD8C37D936D9B3D5295BE19F19CF5ACE1D33A46C952CE4DE5C12F92C1DD051E04AEED"
,
"9037234CC44FFF828FABED3A7084AF40FA7ABFF8E0C0EFB57A1CC361E18FC4FAC1AB54F3ABFE9FF77263ACE16C3A"
,
"A9391B805CCD956081E0B63D282BEA46E7025126F1C1631239C33E92AA6F92CD56E5A4C56F00FF9658E93D48AF4EF0EF81628E34AD4DB0CDAEDCD2A17EE7"
},
{
"99C0AD703196D2F60A74E6B378B838B31F82EA861F06FC4E"
,
"92745C018AA708ECFEB1667E9F3F1B01"
,
"828C69F376C0C0EC651C67749C69577D589EE39E51404D80EBF70C8660A8F5FD375473F4A7C611D59CB546A605D67446CE2AA844135FCD78BB5FBC90222A00D42920BB1D7EEDFB0C4672554F583EF23184F89063CDECBE482367B5F9AF3ACBC3AF61392BD94CBCD9B64677"
,
"A879214658FD0A5B0E09836639BF82E05EC7A5EF71D4701934BDA228435C68AC3D5CEB54997878B06A655EEACEFB1345C15867E7FE6C6423660C8B88DF128EBD6BCD85118DBAE16E9252FFB204324E5C8F38CA97759BDBF3CB0083"
,
"51FE87996F194A2585E438B023B345439EA60D1AEBED4650CDAF48A4D4EEC4FC77DC71CC4B09D3BEEF8B7B7AF716CE2B4EFFB3AC9E6323C18AC35E0AA6E2BBBC8889490EB6226C896B0D105EAB42BFE7053CCF00ED66BA94C1BA09A792AA873F0C3B26C5C5F9A936E57B25"
},
{
"7086816D00D648FB8304AA8C9E552E1B69A9955FB59B25D1"
,
"0F45CF7F0BF31CCEB85D9DA10F4D749F"
,
"93F27C60A417D9F0669E86ACC784FC8917B502DAF30A6338F11B30B94D74FEFE2F8BE1BBE2EAD10FAB7EED3C6F72B7C3ECEE1937C32ED4970A6404E139209C05"
,
"877F046601F3CBE4FB1491943FA29487E738F94B99AF206262A1D6FF856C9AA0B8D4D08A54370C98F8E88FA3DCC2B14C1F76D71B2A4C7963AEE8AF960464C5BEC8357AD00DC8"
,
"FE96906B895CE6A8E72BC72344E2C8BB3C63113D70EAFA26C299BAFE77A8A6568172EB447FB3E86648A0AF3512DEB1AAC0819F3EC553903BF28A9FB0F43411237A774BF9EE03E445D280FBB9CD12B9BAAB6EF5E52691"
},
{
"062F65A896D5BF1401BADFF70E91B458E1F9BD4888CB2E4D"
,
"5B11EA1D6008EBB41CF892FCA5B943D1"
,
"BAF4FF5C8242"
,
"A8870E091238355984EB2F7D61A865B9170F440BFF999A5993DD41A10F4440D21FF948DDA2BF663B2E03AC3324492DC5E40262ECC6A65C07672353BE23E7FB3A9D79FF6AA38D97960905A38DECC312CB6A59E5467ECF06C311CD43ADC0B543EDF34FE8BE611F176460D5627CA51F8F8D9FED71F55C"
,
"B10E127A632172CF8AA7539B140D2C9C2590E6F28C3CB892FC498FCE56A34F732FBFF32E79C7B9747D9094E8635A0C084D6F0247F9768FB5FF83493799A9BEC6C39572120C40E9292C8C947AE8573462A9108C36D9D7112E6995AE5867E6C8BB387D1C5D4BEF524F391B9FD9F0A3B4BFA079E915BCD920185CFD38D114C558928BD7D47877"
},
{
"38A8E45D6D705A11AF58AED5A1344896998EACF359F2E26A"
,
"FD82B5B31804FF47D44199B533D0CF84"
,
"DE454D4E62FE879F2050EE3E25853623D3E9AC52EEC1A1779A48CFAF5ECA0BFDE44749391866D1"
,
"B804"
,
"164BB965C05EBE0931A1A63293EDF9C38C27"
},
{
"34C33C97C6D7A0850DA94D78A58DC61EC717CD7574833068"
,
"343BE00DA9483F05C14F2E9EB8EA6AE8"
,
"78312A43EFDE3CAE34A65796FF059A3FE15304EEA5CF1D9306949FE5BF3349D4977D4EBE76C040FE894C5949E4E4D6681153DA87FB9AC5062063CA2EA183566343362370944CE0362D25FC195E124FD60E8682E665D13F2229DDA3E4B2CB1DCA"
,
"CC11BB284B1153578E4A5ED9D937B869DAF00F5B1960C23455CA9CC43F486A3BE0B66254F1041F04FDF459C8640465B6E1D2CF899A381451E8E7FCB50CF87823BE77E24B132BBEEDC72E53369B275E1D8F49ECE59F4F215230AC4FE133FC80E4F634EE80BA4682B62C86"
,
"E7F703DC31A95E3A4919FF957836CB76C063D81702AEA4703E1C2BF30831E58C4609D626EC6810E12EAA5B930F049FF9EFC22C3E3F1EBD4A1FB285CB02A1AC5AD46B425199FC0A85670A5C4E3DAA9636C8F64C199F42F18AAC8EA7457FD377F322DD7752D7D01B946C8F0A97E6113F0D50106F319AFD291AAACE"
},
{
"C6ECF7F053573E403E61B83052A343D93CBCC179D1E835BE"
,
"E280E13D7367042E3AA09A80111B6184"
,
"21486C9D7A9647"
,
"5F2639AFA6F17931853791CD8C92382BBB677FD72D0AB1A080D0E49BFAA21810E963E4FACD422E92F65CBFAD5884A60CD94740DF31AF02F95AA57DA0C4401B0ED906"
,
"5C51DB20755302070C45F52E50128A67C8B2E4ED0EACB7E29998CCE2E8C289DD5655913EC1A51CC3AABE5CDC2402B2BE7D6D4BF6945F266FBD70BA9F37109067157AE7530678B45F64475D4EBFCB5FFF46A5"
},
{
"5EC6CF7401BC57B18EF154E8C38ACCA8959E57D2F3975FF5"
,
"656B41CB3F9CF8C08BAD7EBFC80BD225"
,
"6B817C2906E2AF425861A7EF59BA5801F143EE2A139EE72697CDE168B4"
,
"2C0E1DDC9B1E5389BA63845B18B1F8A1DB062037151BCC56EF7C21C0BB4DAE366636BBA975685D7CC5A94AFBE89C769016388C56FB7B57CE750A12B718A8BDCF70E80E8659A8330EFC8F86640F21735E8C80E23FE43ABF23507CE3F964AE4EC99D"
,
"ED780CF911E6D1AA8C979B889B0B9DC1ABE261832980BDBFB576901D9EF5AB8048998E31A15BE54B3E5845A4D136AD24D0BDA1C3006168DF2F8AC06729CB0818867398150020131D8F04EDF1923758C9EABB5F735DE5EA1758D4BC0ACFCA98AFD202E9839B8720253693B874C65586C6F0"
},
{
"C92F678EB2208662F5BCF3403EC05F5961E957908A3E79421E1D25FC19054153"
,
"DA0F3A40983D92F2D4C01FED33C7A192"
,
"2B6E9D26DB406A0FAB47608657AA10EFC2B4AA5F459B29FF85AC9A40BFFE7AEB04F77E9A11FAAA116D7F6D4DA417671A9AB02C588E0EF59CB1BFB4B1CC931B63A3B3A159FCEC97A04D1E6F0C7E6A9CEF6B0ABB04758A69F1FE754DF4C2610E8C46B6CF413BDB31351D55BEDCB7B4A13A1C98E10984475E0F2F957853"
,
"F37326A80E08"
,
"83519E53E321D334F7C10B568183775C0E9AAE55F806"
},
{
"6847E0491BE57E72995D186D50094B0B3593957A5146798FCE68B287B2FB37B5"
,
"3EE1182AEBB19A02B128F28E1D5F7F99"
,
"D9F35ABB16D776CE"
,
"DB7566ED8EA95BDF837F23DB277BAFBC5E70D1105ADFD0D9EF15475051B1EF94709C67DCA9F8D5"
,
"2CDCED0C9EBD6E2A508822A685F7DCD1CDD99E7A5FCA786C234E7F7F1D27EC49751AD5DCFA30C5EDA87C43CAE3B919B6BBCFE34C8EDA59"
},
{
"82B019673642C08388D3E42075A4D5D587558C229E4AB8F660E37650C4C41A0A"
,
"336F5D681E0410FAE7B607246092C6DC"
,
"D430CBD8FE435B64214E9E9CDC5DE99D31CFCFB8C10AA0587A49DF276611"
,
"998404153AD77003E1737EDE93ED79859EE6DCCA93CB40C4363AA817ABF2DBBD46E42A14A7183B6CC01E12A577888141363D0AE011EB6E8D28C0B235"
,
"9BEF69EEB60BD3D6065707B7557F25292A8872857CFBD24F2F3C088E4450995333088DA50FD9121221C504DF1D0CD5EFE6A12666C5D5BB12282CF4C19906E9CFAB97E9BDF7F49DC17CFC384B"
},
{
"747B2E269B1859F0622C15C8BAD6A725028B1F94B8DB7326948D1E6ED663A8BC"
,
"AB91F7245DDCE3F1C747872D47BE0A8A"
,
"3B03F786EF1DDD76E1D42646DA4CD2A5165DC5383CE86D1A0B5F13F910DC278A4E451EE0192CBA178E13B3BA27FDC7840DF73D2E104B"
,
"6B803F4701114F3E5FE21718845F8416F70F626303F545BE197189E0A2BA396F37CE06D389EB2658BC7D56D67868708F6D0D32"
,
"1570DDB0BCE75AA25D1957A287A2C36B1A5F2270186DA81BA6112B7F43B0F3D1D0ED072591DCF1F1C99BBB25621FC39B896FF9BD9413A2845363A9DCD310C32CF98E57"
},
{
"02E59853FB29AEDA0FE1C5F19180AD99A12FF2F144670BB2B8BADF09AD812E0A"
,
"C691294EF67CD04D1B9242AF83DD1421"
,
"879334DAE3"
,
"1E17F46A98FEF5CBB40759D95354"
,
"FED8C3FF27DDF6313AED444A2985B36CBA268AAD6AAC563C0BA28F6DB5DB"
},
{
"F6C1FB9B4188F2288FF03BD716023198C3582CF2A037FC2F29760916C2B7FCDB"
,
"4228DA0678CA3534588859E77DFF014C"
,
"D8153CAF35539A61DD8D05B3C9B44F01E564FB9348BCD09A1C23B84195171308861058F0A3CD2A55B912A3AAEE06FF4D356C77275828F2157C2FC7C115DA39E443210CCC56BEDB0CC99BBFB227ABD5CC454F4E7F547C7378A659EEB6A7E809101A84F866503CB18D4484E1FA09B3EC7FC75EB2E35270800AA7"
,
"23B660A779AD285704B12EC1C580387A47BEC7B00D452C6570"
,
"5AA642BBABA8E49849002A2FAF31DB8FC7773EFDD656E469CEC19B3206D4174C9A263D0A05484261F6"
},
{
"8FF6086F1FADB9A3FBE245EAC52640C43B39D43F89526BB5A6EBA47710931446"
,
"943188480C99437495958B0AE4831AA9"
,
"AD5CD0BDA426F6EBA23C8EB23DC73FF9FEC173355EDBD6C9344C4C4383F211888F7CE6B29899A6801DF6B38651A7C77150941A"
,
"80CD5EA8D7F81DDF5070B934937912E8F541A5301877528EB41AB60C020968D459960ED8FB73083329841A"
,
"ABAE8EB7F36FCA2362551E72DAC890BA1BB6794797E0FC3B67426EC9372726ED4725D379EA0AC9147E48DCD0005C502863C2C5358A38817C8264B5"
},
{
"A083B54E6B1FE01B65D42FCD248F97BB477A41462BBFE6FD591006C022C8FD84"
,
"B0490F5BD68A52459556B3749ACDF40E"
,
"8892E047DA5CFBBDF7F3CFCBD1BD21C6D4C80774B1826999234394BD3E513CC7C222BB40E1E3140A152F19B3802F0D036C24A590512AD0E8"
,
"D7B15752789DC94ED0F36778A5C7BBB207BEC32BAC66E702B39966F06E381E090C6757653C3D26A81EC6AD6C364D66867A334C91BB0B8A8A4B6EACDF0783D09010AEBA2DD2062308FE99CC1F"
,
"C071280A732ADC93DF272BF1E613B2BB7D46FC6665EF2DC1671F3E211D6BDE1D6ADDD28DF3AA2E47053FC8BB8AE9271EC8BC8B2CFFA320D225B451685B6D23ACEFDD241FE284F8ADC8DB07F456985B14330BBB66E0FB212213E05B3E"
},
}
vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go
0 → 100644
View file @
530cd297
// Copyright (C) 2019 ProtonTech AG
// This file contains necessary tools for the aex and ocb packages.
//
// These functions SHOULD NOT be used elsewhere, since they are optimized for
// specific input nature in the EAX and OCB modes of operation.
package
byteutil
// GfnDouble computes 2 * input in the field of 2^n elements.
// The irreducible polynomial in the finite field for n=128 is
// x^128 + x^7 + x^2 + x + 1 (equals 0x87)
// Constant-time execution in order to avoid side-channel attacks
func
GfnDouble
(
input
[]
byte
)
[]
byte
{
if
len
(
input
)
!=
16
{
panic
(
"Doubling in GFn only implemented for n = 128"
)
}
// If the first bit is zero, return 2L = L << 1
// Else return (L << 1) xor 0^120 10000111
shifted
:=
ShiftBytesLeft
(
input
)
shifted
[
15
]
^=
((
input
[
0
]
>>
7
)
*
0x87
)
return
shifted
}
// ShiftBytesLeft outputs the byte array corresponding to x << 1 in binary.
func
ShiftBytesLeft
(
x
[]
byte
)
[]
byte
{
l
:=
len
(
x
)
dst
:=
make
([]
byte
,
l
)
for
i
:=
0
;
i
<
l
-
1
;
i
++
{
dst
[
i
]
=
(
x
[
i
]
<<
1
)
|
(
x
[
i
+
1
]
>>
7
)
}
dst
[
l
-
1
]
=
x
[
l
-
1
]
<<
1
return
dst
}
// ShiftNBytesLeft puts in dst the byte array corresponding to x << n in binary.
func
ShiftNBytesLeft
(
dst
,
x
[]
byte
,
n
int
)
{
// Erase first n / 8 bytes
copy
(
dst
,
x
[
n
/
8
:
])
// Shift the remaining n % 8 bits
bits
:=
uint
(
n
%
8
)
l
:=
len
(
dst
)
for
i
:=
0
;
i
<
l
-
1
;
i
++
{
dst
[
i
]
=
(
dst
[
i
]
<<
bits
)
|
(
dst
[
i
+
1
]
>>
uint
(
8
-
bits
))
}
dst
[
l
-
1
]
=
dst
[
l
-
1
]
<<
bits
// Append trailing zeroes
dst
=
append
(
dst
,
make
([]
byte
,
n
/
8
)
...
)
}
// XorBytesMut assumes equal input length, replaces X with X XOR Y
func
XorBytesMut
(
X
,
Y
[]
byte
)
{
for
i
:=
0
;
i
<
len
(
X
);
i
++
{
X
[
i
]
^=
Y
[
i
]
}
}
// XorBytes assumes equal input length, puts X XOR Y into Z
func
XorBytes
(
Z
,
X
,
Y
[]
byte
)
{
for
i
:=
0
;
i
<
len
(
X
);
i
++
{
Z
[
i
]
=
X
[
i
]
^
Y
[
i
]
}
}
// RightXor XORs smaller input (assumed Y) at the right of the larger input (assumed X)
func
RightXor
(
X
,
Y
[]
byte
)
[]
byte
{
offset
:=
len
(
X
)
-
len
(
Y
)
xored
:=
make
([]
byte
,
len
(
X
));
copy
(
xored
,
X
)
for
i
:=
0
;
i
<
len
(
Y
);
i
++
{
xored
[
offset
+
i
]
^=
Y
[
i
]
}
return
xored
}
// SliceForAppend takes a slice and a requested number of bytes. It returns a
// slice with the contents of the given slice followed by that many bytes and a
// second slice that aliases into it and contains only the extra bytes. If the
// original slice has sufficient capacity then no allocation is performed.
func
SliceForAppend
(
in
[]
byte
,
n
int
)
(
head
,
tail
[]
byte
)
{
if
total
:=
len
(
in
)
+
n
;
cap
(
in
)
>=
total
{
head
=
in
[
:
total
]
}
else
{
head
=
make
([]
byte
,
total
)
copy
(
head
,
in
)
}
tail
=
head
[
len
(
in
)
:
]
return
}
vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go
0 → 100644
View file @
530cd297
// Copyright (C) 2019 ProtonTech AG
// Package ocb provides an implementation of the OCB (offset codebook) mode of
// operation, as described in RFC-7253 of the IRTF and in Rogaway, Bellare,
// Black and Krovetz - OCB: A BLOCK-CIPHER MODE OF OPERATION FOR EFFICIENT
// AUTHENTICATED ENCRYPTION (2003).
// Security considerations (from RFC-7253): A private key MUST NOT be used to
// encrypt more than 2^48 blocks. Tag length should be at least 12 bytes (a
// brute-force forging adversary succeeds after 2^{tag length} attempts). A
// single key SHOULD NOT be used to decrypt ciphertext with different tag
// lengths. Nonces need not be secret, but MUST NOT be reused.
// This package only supports underlying block ciphers with 128-bit blocks,
// such as AES-{128, 192, 256}, but may be extended to other sizes.
package
ocb
import
(
"bytes"
"crypto/cipher"
"crypto/subtle"
"errors"
"github.com/ProtonMail/go-crypto/internal/byteutil"
"math/bits"
)
type
ocb
struct
{
block
cipher
.
Block
tagSize
int
nonceSize
int
mask
mask
// Optimized en/decrypt: For each nonce N used to en/decrypt, the 'Ktop'
// internal variable can be reused for en/decrypting with nonces sharing
// all but the last 6 bits with N. The prefix of the first nonce used to
// compute the new Ktop, and the Ktop value itself, are stored in
// reusableKtop. If using incremental nonces, this saves one block cipher
// call every 63 out of 64 OCB encryptions, and stores one nonce and one
// output of the block cipher in memory only.
reusableKtop
reusableKtop
}
type
mask
struct
{
// L_*, L_$, (L_i)_{i ∈ N}
lAst
[]
byte
lDol
[]
byte
L
[][]
byte
}
type
reusableKtop
struct
{
noncePrefix
[]
byte
Ktop
[]
byte
}
const
(
defaultTagSize
=
16
defaultNonceSize
=
15
)
const
(
enc
=
iota
dec
)
func
(
o
*
ocb
)
NonceSize
()
int
{
return
o
.
nonceSize
}
func
(
o
*
ocb
)
Overhead
()
int
{
return
o
.
tagSize
}
// NewOCB returns an OCB instance with the given block cipher and default
// tag and nonce sizes.
func
NewOCB
(
block
cipher
.
Block
)
(
cipher
.
AEAD
,
error
)
{
return
NewOCBWithNonceAndTagSize
(
block
,
defaultNonceSize
,
defaultTagSize
)
}
// NewOCBWithNonceAndTagSize returns an OCB instance with the given block
// cipher, nonce length, and tag length. Panics on zero nonceSize and
// exceedingly long tag size.
//
// It is recommended to use at least 12 bytes as tag length.
func
NewOCBWithNonceAndTagSize
(
block
cipher
.
Block
,
nonceSize
,
tagSize
int
)
(
cipher
.
AEAD
,
error
)
{
if
block
.
BlockSize
()
!=
16
{
return
nil
,
ocbError
(
"Block cipher must have 128-bit blocks"
)
}
if
nonceSize
<
1
{
return
nil
,
ocbError
(
"Incorrect nonce length"
)
}
if
nonceSize
>=
block
.
BlockSize
()
{
return
nil
,
ocbError
(
"Nonce length exceeds blocksize - 1"
)
}
if
tagSize
>
block
.
BlockSize
()
{
return
nil
,
ocbError
(
"Custom tag length exceeds blocksize"
)
}
return
&
ocb
{
block
:
block
,
tagSize
:
tagSize
,
nonceSize
:
nonceSize
,
mask
:
initializeMaskTable
(
block
),
reusableKtop
:
reusableKtop
{
noncePrefix
:
nil
,
Ktop
:
nil
,
},
},
nil
}
func
(
o
*
ocb
)
Seal
(
dst
,
nonce
,
plaintext
,
adata
[]
byte
)
[]
byte
{
if
len
(
nonce
)
>
o
.
nonceSize
{
panic
(
"crypto/ocb: Incorrect nonce length given to OCB"
)
}
ret
,
out
:=
byteutil
.
SliceForAppend
(
dst
,
len
(
plaintext
)
+
o
.
tagSize
)
o
.
crypt
(
enc
,
out
,
nonce
,
adata
,
plaintext
)
return
ret
}
func
(
o
*
ocb
)
Open
(
dst
,
nonce
,
ciphertext
,
adata
[]
byte
)
([]
byte
,
error
)
{
if
len
(
nonce
)
>
o
.
nonceSize
{
panic
(
"Nonce too long for this instance"
)
}
if
len
(
ciphertext
)
<
o
.
tagSize
{
return
nil
,
ocbError
(
"Ciphertext shorter than tag length"
)
}
sep
:=
len
(
ciphertext
)
-
o
.
tagSize
ret
,
out
:=
byteutil
.
SliceForAppend
(
dst
,
len
(
ciphertext
))
ciphertextData
:=
ciphertext
[
:
sep
]
tag
:=
ciphertext
[
sep
:
]
o
.
crypt
(
dec
,
out
,
nonce
,
adata
,
ciphertextData
)
if
subtle
.
ConstantTimeCompare
(
ret
[
sep
:
],
tag
)
==
1
{
ret
=
ret
[
:
sep
]
return
ret
,
nil
}
for
i
:=
range
out
{
out
[
i
]
=
0
}
return
nil
,
ocbError
(
"Tag authentication failed"
)
}
// On instruction enc (resp. dec), crypt is the encrypt (resp. decrypt)
// function. It returns the resulting plain/ciphertext with the tag appended.
func
(
o
*
ocb
)
crypt
(
instruction
int
,
Y
,
nonce
,
adata
,
X
[]
byte
)
[]
byte
{
//
// Consider X as a sequence of 128-bit blocks
//
// Note: For encryption (resp. decryption), X is the plaintext (resp., the
// ciphertext without the tag).
blockSize
:=
o
.
block
.
BlockSize
()
//
// Nonce-dependent and per-encryption variables
//
// Zero out the last 6 bits of the nonce into truncatedNonce to see if Ktop
// is already computed.
truncatedNonce
:=
make
([]
byte
,
len
(
nonce
))
copy
(
truncatedNonce
,
nonce
)
truncatedNonce
[
len
(
truncatedNonce
)
-
1
]
&=
192
Ktop
:=
make
([]
byte
,
blockSize
)
if
bytes
.
Equal
(
truncatedNonce
,
o
.
reusableKtop
.
noncePrefix
)
{
Ktop
=
o
.
reusableKtop
.
Ktop
}
else
{
// Nonce = num2str(TAGLEN mod 128, 7) || zeros(120 - bitlen(N)) || 1 || N
paddedNonce
:=
append
(
make
([]
byte
,
blockSize
-
1
-
len
(
nonce
)),
1
)
paddedNonce
=
append
(
paddedNonce
,
truncatedNonce
...
)
paddedNonce
[
0
]
|=
byte
(((
8
*
o
.
tagSize
)
%
(
8
*
blockSize
))
<<
1
)
// Last 6 bits of paddedNonce are already zero. Encrypt into Ktop
paddedNonce
[
blockSize
-
1
]
&=
192
Ktop
=
paddedNonce
o
.
block
.
Encrypt
(
Ktop
,
Ktop
)
o
.
reusableKtop
.
noncePrefix
=
truncatedNonce
o
.
reusableKtop
.
Ktop
=
Ktop
}
// Stretch = Ktop || ((lower half of Ktop) XOR (lower half of Ktop << 8))
xorHalves
:=
make
([]
byte
,
blockSize
/
2
)
byteutil
.
XorBytes
(
xorHalves
,
Ktop
[
:
blockSize
/
2
],
Ktop
[
1
:
1
+
blockSize
/
2
])
stretch
:=
append
(
Ktop
,
xorHalves
...
)
bottom
:=
int
(
nonce
[
len
(
nonce
)
-
1
]
&
63
)
offset
:=
make
([]
byte
,
len
(
stretch
))
byteutil
.
ShiftNBytesLeft
(
offset
,
stretch
,
bottom
)
offset
=
offset
[
:
blockSize
]
//
// Process any whole blocks
//
// Note: For encryption Y is ciphertext || tag, for decryption Y is
// plaintext || tag.
checksum
:=
make
([]
byte
,
blockSize
)
m
:=
len
(
X
)
/
blockSize
for
i
:=
0
;
i
<
m
;
i
++
{
index
:=
bits
.
TrailingZeros
(
uint
(
i
+
1
))
if
len
(
o
.
mask
.
L
)
-
1
<
index
{
o
.
mask
.
extendTable
(
index
)
}
byteutil
.
XorBytesMut
(
offset
,
o
.
mask
.
L
[
bits
.
TrailingZeros
(
uint
(
i
+
1
))])
blockX
:=
X
[
i
*
blockSize
:
(
i
+
1
)
*
blockSize
]
blockY
:=
Y
[
i
*
blockSize
:
(
i
+
1
)
*
blockSize
]
byteutil
.
XorBytes
(
blockY
,
blockX
,
offset
)
switch
instruction
{
case
enc
:
o
.
block
.
Encrypt
(
blockY
,
blockY
)
byteutil
.
XorBytesMut
(
blockY
,
offset
)
byteutil
.
XorBytesMut
(
checksum
,
blockX
)
case
dec
:
o
.
block
.
Decrypt
(
blockY
,
blockY
)
byteutil
.
XorBytesMut
(
blockY
,
offset
)
byteutil
.
XorBytesMut
(
checksum
,
blockY
)
}
}
//
// Process any final partial block and compute raw tag
//
tag
:=
make
([]
byte
,
blockSize
)
if
len
(
X
)
%
blockSize
!=
0
{
byteutil
.
XorBytesMut
(
offset
,
o
.
mask
.
lAst
)
pad
:=
make
([]
byte
,
blockSize
)
o
.
block
.
Encrypt
(
pad
,
offset
)
chunkX
:=
X
[
blockSize
*
m
:
]
chunkY
:=
Y
[
blockSize
*
m
:
len
(
X
)]
byteutil
.
XorBytes
(
chunkY
,
chunkX
,
pad
[
:
len
(
chunkX
)])
// P_* || bit(1) || zeroes(127) - len(P_*)
switch
instruction
{
case
enc
:
paddedY
:=
append
(
chunkX
,
byte
(
128
))
paddedY
=
append
(
paddedY
,
make
([]
byte
,
blockSize
-
len
(
chunkX
)
-
1
)
...
)
byteutil
.
XorBytesMut
(
checksum
,
paddedY
)
case
dec
:
paddedX
:=
append
(
chunkY
,
byte
(
128
))
paddedX
=
append
(
paddedX
,
make
([]
byte
,
blockSize
-
len
(
chunkY
)
-
1
)
...
)
byteutil
.
XorBytesMut
(
checksum
,
paddedX
)
}
byteutil
.
XorBytes
(
tag
,
checksum
,
offset
)
byteutil
.
XorBytesMut
(
tag
,
o
.
mask
.
lDol
)
o
.
block
.
Encrypt
(
tag
,
tag
)
byteutil
.
XorBytesMut
(
tag
,
o
.
hash
(
adata
))
copy
(
Y
[
blockSize
*
m
+
len
(
chunkY
)
:
],
tag
[
:
o
.
tagSize
])
}
else
{
byteutil
.
XorBytes
(
tag
,
checksum
,
offset
)
byteutil
.
XorBytesMut
(
tag
,
o
.
mask
.
lDol
)
o
.
block
.
Encrypt
(
tag
,
tag
)
byteutil
.
XorBytesMut
(
tag
,
o
.
hash
(
adata
))
copy
(
Y
[
blockSize
*
m
:
],
tag
[
:
o
.
tagSize
])
}
return
Y
}
// This hash function is used to compute the tag. Per design, on empty input it
// returns a slice of zeros, of the same length as the underlying block cipher
// block size.
func
(
o
*
ocb
)
hash
(
adata
[]
byte
)
[]
byte
{
//
// Consider A as a sequence of 128-bit blocks
//
A
:=
make
([]
byte
,
len
(
adata
))
copy
(
A
,
adata
)
blockSize
:=
o
.
block
.
BlockSize
()
//
// Process any whole blocks
//
sum
:=
make
([]
byte
,
blockSize
)
offset
:=
make
([]
byte
,
blockSize
)
m
:=
len
(
A
)
/
blockSize
for
i
:=
0
;
i
<
m
;
i
++
{
chunk
:=
A
[
blockSize
*
i
:
blockSize
*
(
i
+
1
)]
index
:=
bits
.
TrailingZeros
(
uint
(
i
+
1
))
// If the mask table is too short
if
len
(
o
.
mask
.
L
)
-
1
<
index
{
o
.
mask
.
extendTable
(
index
)
}
byteutil
.
XorBytesMut
(
offset
,
o
.
mask
.
L
[
index
])
byteutil
.
XorBytesMut
(
chunk
,
offset
)
o
.
block
.
Encrypt
(
chunk
,
chunk
)
byteutil
.
XorBytesMut
(
sum
,
chunk
)
}
//
// Process any final partial block; compute final hash value
//
if
len
(
A
)
%
blockSize
!=
0
{
byteutil
.
XorBytesMut
(
offset
,
o
.
mask
.
lAst
)
// Pad block with 1 || 0 ^ 127 - bitlength(a)
ending
:=
make
([]
byte
,
blockSize
-
len
(
A
)
%
blockSize
)
ending
[
0
]
=
0x80
encrypted
:=
append
(
A
[
blockSize
*
m
:
],
ending
...
)
byteutil
.
XorBytesMut
(
encrypted
,
offset
)
o
.
block
.
Encrypt
(
encrypted
,
encrypted
)
byteutil
.
XorBytesMut
(
sum
,
encrypted
)
}
return
sum
}
func
initializeMaskTable
(
block
cipher
.
Block
)
mask
{
//
// Key-dependent variables
//
lAst
:=
make
([]
byte
,
block
.
BlockSize
())
block
.
Encrypt
(
lAst
,
lAst
)
lDol
:=
byteutil
.
GfnDouble
(
lAst
)
L
:=
make
([][]
byte
,
1
)
L
[
0
]
=
byteutil
.
GfnDouble
(
lDol
)
return
mask
{
lAst
:
lAst
,
lDol
:
lDol
,
L
:
L
,
}
}
// Extends the L array of mask m up to L[limit], with L[i] = GfnDouble(L[i-1])
func
(
m
*
mask
)
extendTable
(
limit
int
)
{
for
i
:=
len
(
m
.
L
);
i
<=
limit
;
i
++
{
m
.
L
=
append
(
m
.
L
,
byteutil
.
GfnDouble
(
m
.
L
[
i
-
1
]))
}
}
func
ocbError
(
err
string
)
error
{
return
errors
.
New
(
"crypto/ocb: "
+
err
)
}
vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go
0 → 100644
View file @
530cd297
// In the test vectors provided by RFC 7253, the "bottom"
// internal variable, which defines "offset" for the first time, does not
// exceed 15. However, it can attain values up to 63.
// These vectors include key length in {128, 192, 256}, tag size 128, and
// random nonce, header, and plaintext lengths.
// This file was automatically generated.
package
ocb
var
randomVectors
=
[]
struct
{
key
,
nonce
,
header
,
plaintext
,
ciphertext
string
}{
{
"9438C5D599308EAF13F800D2D31EA7F0"
,
"C38EE4801BEBFFA1CD8635BE"
,
"0E507B7DADD8A98CDFE272D3CB6B3E8332B56AE583FB049C0874D4200BED16BD1A044182434E9DA0E841F182DFD5B3016B34641CED0784F1745F63AB3D0DA22D3351C9EF9A658B8081E24498EBF61FCE40DA6D8E184536"
,
"962D227786FB8913A8BAD5DC3250"
,
"EEDEF5FFA5986D1E3BF86DDD33EF9ADC79DCA06E215FA772CCBA814F63AD"
},
{
"BA7DE631C7D6712167C6724F5B9A2B1D"
,
"35263EBDA05765DC0E71F1F5"
,
"0103257B4224507C0242FEFE821EA7FA42E0A82863E5F8B68F7D881B4B44FA428A2B6B21D2F591260802D8AB6D83"
,
"9D6D1FC93AE8A64E7889B7B2E3521EFA9B920A8DDB692E6F833DDC4A38AFA535E5E2A3ED82CB7E26404AB86C54D01C4668F28398C2DF33D5D561CBA1C8DCFA7A912F5048E545B59483C0E3221F54B14DAA2E4EB657B3BEF9554F34CAD69B2724AE962D3D8A"
,
"E93852D1985C5E775655E937FA79CE5BF28A585F2AF53A5018853B9634BE3C84499AC0081918FDCE0624494D60E25F76ACD6853AC7576E3C350F332249BFCABD4E73CEABC36BE4EDDA40914E598AE74174A0D7442149B26990899491BDDFE8FC54D6C18E83AE9E9A6FFBF5D376565633862EEAD88D"
},
{
"2E74B25289F6FD3E578C24866E9C72A5"
,
"FD912F15025AF8414642BA1D1D"
,
"FB5FB8C26F365EEDAB5FE260C6E3CCD27806729C8335F146063A7F9EA93290E56CF84576EB446350D22AD730547C267B1F0BBB97EB34E1E2C41A"
,
"6C092EBF78F76EE8C1C6E592277D9545BA16EDB67BC7D8480B9827702DC2F8A129E2B08A2CE710CA7E1DA45CE162BB6CD4B512E632116E2211D3C90871EFB06B8D4B902681C7FB"
,
"6AC0A77F26531BF4F354A1737F99E49BE32ECD909A7A71AD69352906F54B08A9CE9B8CA5D724CBFFC5673437F23F630697F3B84117A1431D6FA8CC13A974FB4AD360300522E09511B99E71065D5AC4BBCB1D791E864EF4"
},
{
"E7EC507C802528F790AFF5303A017B17"
,
"4B97A7A568940A9E3CE7A99E93031E"
,
"28349BDC5A09390C480F9B8AA3EDEA3DDB8B9D64BCA322C570B8225DF0E31190DAB25A4014BA39519E02ABFB12B89AA28BBFD29E486E7FB28734258C817B63CED9912DBAFEBB93E2798AB2890DE3B0ACFCFF906AB15563EF7823CE83D27CDB251195E22BD1337BCBDE65E7C2C427321C463C2777BFE5AEAA"
,
"9455B3EA706B74"
,
"7F33BA3EA848D48A96B9530E26888F43EBD4463C9399B6"
},
{
"6C928AA3224736F28EE7378DE0090191"
,
"8936138E2E4C6A13280017A1622D"
,
"6202717F2631565BDCDC57C6584543E72A7C8BD444D0D108ED35069819633C"
,
"DA0691439E5F035F3E455269D14FE5C201C8C9B0A3FE2D3F86BCC59387C868FE65733D388360B31E3CE28B4BF6A8BE636706B536D5720DB66B47CF1C7A5AFD6F61E0EF90F1726D6B0E169F9A768B2B7AE4EE00A17F630AC905FCAAA1B707FFF25B3A1AAE83B504837C64A5639B2A34002B300EC035C9B43654DA55"
,
"B8804D182AB0F0EEB464FA7BD1329AD6154F982013F3765FEDFE09E26DAC078C9C1439BFC1159D6C02A25E3FF83EF852570117B315852AD5EE20E0FA3AA0A626B0E43BC0CEA38B44579DD36803455FB46989B90E6D229F513FD727AF8372517E9488384C515D6067704119C931299A0982EDDFB9C2E86A90C450C077EB222511EC9CCABC9FCFDB19F70088"
},
{
"ECEA315CA4B3F425B0C9957A17805EA4"
,
"664CDAE18403F4F9BA13015A44FC"
,
"642AFB090D6C6DB46783F08B01A3EF2A8FEB5736B531EAC226E7888FCC8505F396818F83105065FACB3267485B9E5E4A0261F621041C08FCCB2A809A49AB5252A91D0971BCC620B9D614BD77E57A0EED2FA5"
,
"6852C31F8083E20E364CEA21BB7854D67CEE812FE1C9ED2425C0932A90D3780728D1BB"
,
"2ECEF962A9695A463ADABB275BDA9FF8B2BA57AEC2F52EFFB700CD9271A74D2A011C24AEA946051BD6291776429B7E681BA33E"
},
{
"4EE616C4A58AAA380878F71A373461F6"
,
"91B8C9C176D9C385E9C47E52"
,
"CDA440B7F9762C572A718AC754EDEECC119E5EE0CCB9FEA4FFB22EEE75087C032EBF3DA9CDD8A28CC010B99ED45143B41A4BA50EA2A005473F89639237838867A57F23B0F0ED3BF22490E4501DAC9C658A9B9F"
,
"D6E645FA9AE410D15B8123FD757FA356A8DBE9258DDB5BE88832E615910993F497EC"
,
"B70ED7BF959FB2AAED4F36174A2A99BFB16992C8CDF369C782C4DB9C73DE78C5DB8E0615F647243B97ACDB24503BC9CADC48"
},
{
"DCD475773136C830D5E3D0C5FE05B7FF"
,
"BB8E1FBB483BE7616A922C4A"
,
"36FEF2E1CB29E76A6EA663FC3AF66ECD7404F466382F7B040AABED62293302B56E8783EF7EBC21B4A16C3E78A7483A0A403F253A2CDC5BBF79DC3DAE6C73F39A961D8FBBE8D41B"
,
"441E886EA38322B2437ECA7DEB5282518865A66780A454E510878E61BFEC3106A3CD93D2A02052E6F9E1832F9791053E3B76BF4C07EFDD6D4106E3027FABB752E60C1AA425416A87D53938163817A1051EBA1D1DEEB4B9B25C7E97368B52E5911A31810B0EC5AF547559B6142D9F4C4A6EF24A4CF75271BF9D48F62B"
,
"1BE4DD2F4E25A6512C2CC71D24BBB07368589A94C2714962CD0ACE5605688F06342587521E75F0ACAFFD86212FB5C34327D238DB36CF2B787794B9A4412E7CD1410EA5DDD2450C265F29CF96013CD213FD2880657694D718558964BC189B4A84AFCF47EB012935483052399DBA5B088B0A0477F20DFE0E85DCB735E21F22A439FB837DD365A93116D063E607"
},
{
"3FBA2B3D30177FFE15C1C59ED2148BB2C091F5615FBA7C07"
,
"FACF804A4BEBF998505FF9DE"
,
"8213B9263B2971A5BDA18DBD02208EE1"
,
"15B323926993B326EA19F892D704439FC478828322AF72118748284A1FD8A6D814E641F70512FD706980337379F31DC63355974738D7FEA87AD2858C0C2EBBFBE74371C21450072373C7B651B334D7C4D43260B9D7CCD3AF9EDB"
,
"6D35DC1469B26E6AAB26272A41B46916397C24C485B61162E640A062D9275BC33DDCFD3D9E1A53B6C8F51AC89B66A41D59B3574197A40D9B6DCF8A4E2A001409C8112F16B9C389E0096179DB914E05D6D11ED0005AD17E1CE105A2F0BAB8F6B1540DEB968B7A5428FF44"
},
{
"53B52B8D4D748BCDF1DDE68857832FA46227FA6E2F32EFA1"
,
"0B0EF53D4606B28D1398355F"
,
"F23882436349094AF98BCACA8218E81581A043B19009E28EFBF2DE37883E04864148CC01D240552CA8844EC1456F42034653067DA67E80F87105FD06E14FF771246C9612867BE4D215F6D761"
,
"F15030679BD4088D42CAC9BF2E9606EAD4798782FA3ED8C57EBE7F84A53236F51B25967C6489D0CD20C9EEA752F9BC"
,
"67B96E2D67C3729C96DAEAEDF821D61C17E648643A2134C5621FEC621186915AD80864BFD1EB5B238BF526A679385E012A457F583AFA78134242E9D9C1B4E4"
},
{
"0272DD80F23399F49BFC320381A5CD8225867245A49A7D41"
,
"5C83F4896D0738E1366B1836"
,
"69B0337289B19F73A12BAEEA857CCAF396C11113715D9500CCCF48BA08CFF12BC8B4BADB3084E63B85719DB5058FA7C2C11DEB096D7943CFA7CAF5"
,
"C01AD10FC8B562CD17C7BC2FAB3E26CBDFF8D7F4DEA816794BBCC12336991712972F52816AABAB244EB43B0137E2BAC1DD413CE79531E78BEF782E6B439612BB3AEF154DE3502784F287958EBC159419F9EBA27916A28D6307324129F506B1DE80C1755A929F87"
,
"FEFE52DD7159C8DD6E8EC2D3D3C0F37AB6CB471A75A071D17EC4ACDD8F3AA4D7D4F7BB559F3C09099E3D9003E5E8AA1F556B79CECDE66F85B08FA5955E6976BF2695EA076388A62D2AD5BAB7CBF1A7F3F4C8D5CDF37CDE99BD3E30B685D9E5EEE48C7C89118EF4878EB89747F28271FA2CC45F8E9E7601"
},
{
"3EEAED04A455D6E5E5AB53CFD5AFD2F2BC625C7BF4BE49A5"
,
"36B88F63ADBB5668588181D774"
,
"D367E3CB3703E762D23C6533188EF7028EFF9D935A3977150361997EC9DEAF1E4794BDE26AA8B53C124980B1362EC86FCDDFC7A90073171C1BAEE351A53234B86C66E8AB92FAE99EC6967A6D3428892D80"
,
"573454C719A9A55E04437BF7CBAAF27563CCCD92ADD5E515CD63305DFF0687E5EEF790C5DCA5C0033E9AB129505E2775438D92B38F08F3B0356BA142C6F694"
,
"E9F79A5B432D9E682C9AAA5661CFC2E49A0FCB81A431E54B42EB73DD3BED3F377FEC556ABA81624BA64A5D739AD41467460088F8D4F442180A9382CA635745473794C382FCDDC49BA4EB6D8A44AE3C"
},
{
"B695C691538F8CBD60F039D0E28894E3693CC7C36D92D79D"
,
"BC099AEB637361BAC536B57618"
,
"BFFF1A65AE38D1DC142C71637319F5F6508E2CB33C9DCB94202B359ED5A5ED8042E7F4F09231D32A7242976677E6F4C549BF65FADC99E5AF43F7A46FD95E16C2"
,
"081DF3FD85B415D803F0BE5AC58CFF0023FDDED99788296C3731D8"
,
"E50C64E3614D94FE69C47092E46ACC9957C6FEA2CCBF96BC62FBABE7424753C75F9C147C42AE26FE171531"
},
{
"C9ACBD2718F0689A1BE9802A551B6B8D9CF5614DAF5E65ED"
,
"B1B0AAF373B8B026EB80422051D8"
,
"6648C0E61AC733C76119D23FB24548D637751387AA2EAE9D80E912B7BD486CAAD9EAF4D7A5FE2B54AAD481E8EC94BB4D558000896E2010462B70C9FED1E7273080D1"
,
"189F591F6CB6D59AFEDD14C341741A8F1037DC0DF00FC57CE65C30F49E860255CEA5DC6019380CC0FE8880BC1A9E685F41C239C38F36E3F2A1388865C5C311059C0A"
,
"922A5E949B61D03BE34AB5F4E58607D4504EA14017BB363DAE3C873059EA7A1C77A746FB78981671D26C2CF6D9F24952D510044CE02A10177E9DB42D0145211DFE6E84369C5E3BC2669EAB4147B2822895F9"
},
{
"7A832BD2CF5BF4919F353CE2A8C86A5E406DA2D52BE16A72"
,
"2F2F17CECF7E5A756D10785A3CB9DB"
,
"61DA05E3788CC2D8405DBA70C7A28E5AF699863C9F72E6C6770126929F5D6FA267F005EBCF49495CB46400958A3AE80D1289D1C671"
,
"44E91121195A41AF14E8CFDBD39A4B517BE0DF1A72977ED8A3EEF8EEDA1166B2EB6DB2C4AE2E74FA0F0C74537F659BFBD141E5DDEC67E64EDA85AABD3F52C85A785B9FB3CECD70E7DF"
,
"BEDF596EA21288D2B84901E188F6EE1468B14D5161D3802DBFE00D60203A24E2AB62714BF272A45551489838C3A7FEAADC177B591836E73684867CCF4E12901DCF2064058726BBA554E84ADC5136F507E961188D4AF06943D3"
},
{
"1508E8AE9079AA15F1CEC4F776B4D11BCCB061B58AA56C18"
,
"BCA625674F41D1E3AB47672DC0C3"
,
"8B12CF84F16360F0EAD2A41BC021530FFCEC7F3579CAE658E10E2D3D81870F65AFCED0C77C6C4C6E6BA424FF23088C796BA6195ABA35094BF1829E089662E7A95FC90750AE16D0C8AFA55DAC789D7735B970B58D4BE7CEC7341DA82A0179A01929C27A59C5063215B859EA43"
,
"E525422519ECE070E82C"
,
"B47BC07C3ED1C0A43BA52C43CBACBCDBB29CAF1001E09FDF7107"
},
{
"7550C2761644E911FE9ADD119BAC07376BEA442845FEAD876D7E7AC1B713E464"
,
"36D2EC25ADD33CDEDF495205BBC923"
,
"7FCFE81A3790DE97FFC3DE160C470847EA7E841177C2F759571CBD837EA004A6CA8C6F4AEBFF2E9FD552D73EB8A30705D58D70C0B67AEEA280CBBF0A477358ACEF1E7508F2735CD9A0E4F9AC92B8C008F575D3B6278F1C18BD01227E3502E5255F3AB1893632AD00C717C588EF652A51A43209E7EE90"
,
"2B1A62F8FDFAA3C16470A21AD307C9A7D03ADE8EF72C69B06F8D738CDE578D7AEFD0D40BD9C022FB9F580DF5394C998ACCCEFC5471A3996FB8F1045A81FDC6F32D13502EA65A211390C8D882B8E0BEFD8DD8CBEF51D1597B124E9F7F"
,
"C873E02A22DB89EB0787DB6A60B99F7E4A0A085D5C4232A81ADCE2D60AA36F92DDC33F93DD8640AC0E08416B187FB382B3EC3EE85A64B0E6EE41C1366A5AD2A282F66605E87031CCBA2FA7B2DA201D975994AADE3DD1EE122AE09604AD489B84BF0C1AB7129EE16C6934850E"
},
{
"A51300285E554FDBDE7F771A9A9A80955639DD87129FAEF74987C91FB9687C71"
,
"81691D5D20EC818FCFF24B33DECC"
,
"C948093218AA9EB2A8E44A87EEA73FC8B6B75A196819A14BD83709EA323E8DF8B491045220E1D88729A38DBCFFB60D3056DAD4564498FD6574F74512945DEB34B69329ACED9FFC05D5D59DFCD5B973E2ACAFE6AD1EF8BBBC49351A2DD12508ED89ED"
,
"EB861165DAF7625F827C6B574ED703F03215"
,
"C6CD1CE76D2B3679C1B5AA1CFD67CCB55444B6BFD3E22C81CBC9BB738796B83E54E3"
},
{
"8CE0156D26FAEB7E0B9B800BBB2E9D4075B5EAC5C62358B0E7F6FCE610223282"
,
"D2A7B94DD12CDACA909D3AD7"
,
"E021A78F374FC271389AB9A3E97077D755"
,
"7C26000B58929F5095E1CEE154F76C2A299248E299F9B5ADE6C403AA1FD4A67FD4E0232F214CE7B919EE7A1027D2B76C57475715CD078461"
,
"C556FB38DF069B56F337B5FF5775CE6EAA16824DFA754F20B78819028EA635C3BB7AA731DE8776B2DCB67DCA2D33EEDF3C7E52EA450013722A41755A0752433ED17BDD5991AAE77A"
},
{
"1E8000A2CE00A561C9920A30BF0D7B983FEF8A1014C8F04C35CA6970E6BA02BD"
,
"65ED3D63F79F90BBFD19775E"
,
"336A8C0B7243582A46B221AA677647FCAE91"
,
"134A8B34824A290E7B"
,
"914FBEF80D0E6E17F8BDBB6097EBF5FBB0554952DC2B9E5151"
},
{
"53D5607BBE690B6E8D8F6D97F3DF2BA853B682597A214B8AA0EA6E598650AF15"
,
"C391A856B9FE234E14BA1AC7BB40FF"
,
"479682BC21349C4BE1641D5E78FE2C79EC1B9CF5470936DCAD9967A4DCD7C4EFADA593BC9EDE71E6A08829B8580901B61E274227E9D918502DE3"
,
"EAD154DC09C5E26C5D26FF33ED148B27120C7F2C23225CC0D0631B03E1F6C6D96FEB88C1A4052ACB4CE746B884B6502931F407021126C6AAB8C514C077A5A38438AE88EE"
,
"938821286EBB671D999B87C032E1D6055392EB564E57970D55E545FC5E8BAB90E6E3E3C0913F6320995FC636D72CD9919657CC38BD51552F4A502D8D1FE56DB33EBAC5092630E69EBB986F0E15CEE9FC8C052501"
},
{
"294362FCC984F440CEA3E9F7D2C06AF20C53AAC1B3738CA2186C914A6E193ABB"
,
"B15B61C8BB39261A8F55AB178EC3"
,
"D0729B6B75BB"
,
"2BD089ADCE9F334BAE3B065996C7D616DD0C27DF4218DCEEA0FBCA0F968837CE26B0876083327E25681FDDD620A32EC0DA12F73FAE826CC94BFF2B90A54D2651"
,
"AC94B25E4E21DE2437B806966CCD5D9385EF0CD4A51AB9FA6DE675C7B8952D67802E9FEC1FDE9F5D1EAB06057498BC0EEA454804FC9D2068982A3E24182D9AC2E7AB9994DDC899A604264583F63D066B"
},
{
"959DBFEB039B1A5B8CE6A44649B602AAA5F98A906DB96143D202CD2024F749D9"
,
"01D7BDB1133E9C347486C1EFA6"
,
"F3843955BD741F379DD750585EDC55E2CDA05CCBA8C1F4622AC2FE35214BC3A019B8BD12C4CC42D9213D1E1556941E8D8450830287FFB3B763A13722DD4140ED9846FB5FFF745D7B0B967D810A068222E10B259AF1D392035B0D83DC1498A6830B11B2418A840212599171E0258A1C203B05362978"
,
"A21811232C950FA8B12237C2EBD6A7CD2C3A155905E9E0C7C120"
,
"63C1CE397B22F1A03F1FA549B43178BC405B152D3C95E977426D519B3DFCA28498823240592B6EEE7A14"
},
{
"096AE499F5294173F34FF2B375F0E5D5AB79D0D03B33B1A74D7D576826345DF4"
,
"0C52B3D11D636E5910A4DD76D32C"
,
"229E9ECA3053789E937447BC719467075B6138A142DA528DA8F0CF8DDF022FD9AF8E74779BA3AC306609"
,
"8B7A00038783E8BAF6EDEAE0C4EAB48FC8FD501A588C7E4A4DB71E3604F2155A97687D3D2FFF8569261375A513CF4398CE0F87CA1658A1050F6EF6C4EA3E25"
,
"C20B6CF8D3C8241825FD90B2EDAC7593600646E579A8D8DAAE9E2E40C3835FE801B2BE4379131452BC5182C90307B176DFBE2049544222FE7783147B690774F6D9D7CEF52A91E61E298E9AA15464AC"
},
}
vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go
0 → 100644
View file @
530cd297
package
ocb
import
(
"encoding/hex"
)
// Test vectors from https://tools.ietf.org/html/rfc7253. Note that key is
// shared accross tests.
var
testKey
,
_
=
hex
.
DecodeString
(
"000102030405060708090A0B0C0D0E0F"
)
var
rfc7253testVectors
=
[]
struct
{
nonce
,
header
,
plaintext
,
ciphertext
string
}{
{
"BBAA99887766554433221100"
,
""
,
""
,
"785407BFFFC8AD9EDCC5520AC9111EE6"
},
{
"BBAA99887766554433221101"
,
"0001020304050607"
,
"0001020304050607"
,
"6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009"
},
{
"BBAA99887766554433221102"
,
"0001020304050607"
,
""
,
"81017F8203F081277152FADE694A0A00"
},
{
"BBAA99887766554433221103"
,
""
,
"0001020304050607"
,
"45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9"
},
{
"BBAA99887766554433221104"
,
"000102030405060708090A0B0C0D0E0F"
,
"000102030405060708090A0B0C0D0E0F"
,
"571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358"
},
{
"BBAA99887766554433221105"
,
"000102030405060708090A0B0C0D0E0F"
,
""
,
"8CF761B6902EF764462AD86498CA6B97"
},
{
"BBAA99887766554433221106"
,
""
,
"000102030405060708090A0B0C0D0E0F"
,
"5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D"
},
{
"BBAA99887766554433221107"
,
"000102030405060708090A0B0C0D0E0F1011121314151617"
,
"000102030405060708090A0B0C0D0E0F1011121314151617"
,
"1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F"
},
{
"BBAA99887766554433221108"
,
"000102030405060708090A0B0C0D0E0F1011121314151617"
,
""
,
"6DC225A071FC1B9F7C69F93B0F1E10DE"
},
{
"BBAA99887766554433221109"
,
""
,
"000102030405060708090A0B0C0D0E0F1011121314151617"
,
"221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF"
},
{
"BBAA9988776655443322110A"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"
,
"BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240"
},
{
"BBAA9988776655443322110B"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"
,
""
,
"FE80690BEE8A485D11F32965BC9D2A32"
},
{
"BBAA9988776655443322110C"
,
""
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"
,
"2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF"
},
{
"BBAA9988776655443322110D"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"
,
"D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60"
},
{
"BBAA9988776655443322110E"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"
,
""
,
"C5CD9D1850C141E358649994EE701B68"
},
{
"BBAA9988776655443322110F"
,
""
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"
,
"4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479"
},
}
vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go
0 → 100644
View file @
530cd297
package
ocb
// Second set of test vectors from https://tools.ietf.org/html/rfc7253
var
rfc7253TestVectorTaglen96
=
struct
{
key
,
nonce
,
header
,
plaintext
,
ciphertext
string
}{
"0F0E0D0C0B0A09080706050403020100"
,
"BBAA9988776655443322110D"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"
,
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"
,
"1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA"
}
var
rfc7253AlgorithmTest
=
[]
struct
{
KEYLEN
,
TAGLEN
int
OUTPUT
string
}{
{
128
,
128
,
"67E944D23256C5E0B6C61FA22FDF1EA2"
},
{
192
,
128
,
"F673F2C3E7174AAE7BAE986CA9F29E17"
},
{
256
,
128
,
"D90EB8E9C977C88B79DD793D7FFA161C"
},
{
128
,
96
,
"77A3D8E73589158D25D01209"
},
{
192
,
96
,
"05D56EAD2752C86BE6932C5E"
},
{
256
,
96
,
"5458359AC23B0CBA9E6330DD"
},
{
128
,
64
,
"192C9B7BD90BA06A"
},
{
192
,
64
,
"0066BC6E0EF34E24"
},
{
256
,
64
,
"7D4EA5D445501CBE"
},
}
vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go
0 → 100644
View file @
530cd297
// Copyright 2014 Matthew Endsley
// All rights reserved
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted providing that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
// Package keywrap is an implementation of the RFC 3394 AES key wrapping
// algorithm. This is used in OpenPGP with elliptic curve keys.
package
keywrap
import
(
"crypto/aes"
"encoding/binary"
"errors"
)
var
(
// ErrWrapPlaintext is returned if the plaintext is not a multiple
// of 64 bits.
ErrWrapPlaintext
=
errors
.
New
(
"keywrap: plainText must be a multiple of 64 bits"
)
// ErrUnwrapCiphertext is returned if the ciphertext is not a
// multiple of 64 bits.
ErrUnwrapCiphertext
=
errors
.
New
(
"keywrap: cipherText must by a multiple of 64 bits"
)
// ErrUnwrapFailed is returned if unwrapping a key fails.
ErrUnwrapFailed
=
errors
.
New
(
"keywrap: failed to unwrap key"
)
// NB: the AES NewCipher call only fails if the key is an invalid length.
// ErrInvalidKey is returned when the AES key is invalid.
ErrInvalidKey
=
errors
.
New
(
"keywrap: invalid AES key"
)
)
// Wrap a key using the RFC 3394 AES Key Wrap Algorithm.
func
Wrap
(
key
,
plainText
[]
byte
)
([]
byte
,
error
)
{
if
len
(
plainText
)
%
8
!=
0
{
return
nil
,
ErrWrapPlaintext
}
c
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
ErrInvalidKey
}
nblocks
:=
len
(
plainText
)
/
8
// 1) Initialize variables.
var
block
[
aes
.
BlockSize
]
byte
// - Set A = IV, an initial value (see 2.2.3)
for
ii
:=
0
;
ii
<
8
;
ii
++
{
block
[
ii
]
=
0xA6
}
// - For i = 1 to n
// - Set R[i] = P[i]
intermediate
:=
make
([]
byte
,
len
(
plainText
))
copy
(
intermediate
,
plainText
)
// 2) Calculate intermediate values.
for
ii
:=
0
;
ii
<
6
;
ii
++
{
for
jj
:=
0
;
jj
<
nblocks
;
jj
++
{
// - B = AES(K, A | R[i])
copy
(
block
[
8
:
],
intermediate
[
jj
*
8
:
jj
*
8
+
8
])
c
.
Encrypt
(
block
[
:
],
block
[
:
])
// - A = MSB(64, B) ^ t where t = (n*j)+1
t
:=
uint64
(
ii
*
nblocks
+
jj
+
1
)
val
:=
binary
.
BigEndian
.
Uint64
(
block
[
:
8
])
^
t
binary
.
BigEndian
.
PutUint64
(
block
[
:
8
],
val
)
// - R[i] = LSB(64, B)
copy
(
intermediate
[
jj
*
8
:
jj
*
8
+
8
],
block
[
8
:
])
}
}
// 3) Output results.
// - Set C[0] = A
// - For i = 1 to n
// - C[i] = R[i]
return
append
(
block
[
:
8
],
intermediate
...
),
nil
}
// Unwrap a key using the RFC 3394 AES Key Wrap Algorithm.
func
Unwrap
(
key
,
cipherText
[]
byte
)
([]
byte
,
error
)
{
if
len
(
cipherText
)
%
8
!=
0
{
return
nil
,
ErrUnwrapCiphertext
}
c
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
ErrInvalidKey
}
nblocks
:=
len
(
cipherText
)
/
8
-
1
// 1) Initialize variables.
var
block
[
aes
.
BlockSize
]
byte
// - Set A = C[0]
copy
(
block
[
:
8
],
cipherText
[
:
8
])
// - For i = 1 to n
// - Set R[i] = C[i]
intermediate
:=
make
([]
byte
,
len
(
cipherText
)
-
8
)
copy
(
intermediate
,
cipherText
[
8
:
])
// 2) Compute intermediate values.
for
jj
:=
5
;
jj
>=
0
;
jj
--
{
for
ii
:=
nblocks
-
1
;
ii
>=
0
;
ii
--
{
// - B = AES-1(K, (A ^ t) | R[i]) where t = n*j+1
// - A = MSB(64, B)
t
:=
uint64
(
jj
*
nblocks
+
ii
+
1
)
val
:=
binary
.
BigEndian
.
Uint64
(
block
[
:
8
])
^
t
binary
.
BigEndian
.
PutUint64
(
block
[
:
8
],
val
)
copy
(
block
[
8
:
],
intermediate
[
ii
*
8
:
ii
*
8
+
8
])
c
.
Decrypt
(
block
[
:
],
block
[
:
])
// - R[i] = LSB(B, 64)
copy
(
intermediate
[
ii
*
8
:
ii
*
8
+
8
],
block
[
8
:
])
}
}
// 3) Output results.
// - If A is an appropriate initial value (see 2.2.3),
for
ii
:=
0
;
ii
<
8
;
ii
++
{
if
block
[
ii
]
!=
0xA6
{
return
nil
,
ErrUnwrapFailed
}
}
// - For i = 1 to n
// - P[i] = R[i]
return
intermediate
,
nil
}
vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go
0 → 100644
View file @
530cd297
// Copyright 2010 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.
// Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is
// very similar to PEM except that it has an additional CRC checksum.
package
armor
// import "github.com/ProtonMail/go-crypto/openpgp/armor"
import
(
"bufio"
"bytes"
"encoding/base64"
"github.com/ProtonMail/go-crypto/openpgp/errors"
"io"
)
// A Block represents an OpenPGP armored structure.
//
// The encoded form is:
// -----BEGIN Type-----
// Headers
//
// base64-encoded Bytes
// '=' base64 encoded checksum
// -----END Type-----
// where Headers is a possibly empty sequence of Key: Value lines.
//
// Since the armored data can be very large, this package presents a streaming
// interface.
type
Block
struct
{
Type
string
// The type, taken from the preamble (i.e. "PGP SIGNATURE").
Header
map
[
string
]
string
// Optional headers.
Body
io
.
Reader
// A Reader from which the contents can be read
lReader
lineReader
oReader
openpgpReader
}
var
ArmorCorrupt
error
=
errors
.
StructuralError
(
"armor invalid"
)
const
crc24Init
=
0xb704ce
const
crc24Poly
=
0x1864cfb
const
crc24Mask
=
0xffffff
// crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1
func
crc24
(
crc
uint32
,
d
[]
byte
)
uint32
{
for
_
,
b
:=
range
d
{
crc
^=
uint32
(
b
)
<<
16
for
i
:=
0
;
i
<
8
;
i
++
{
crc
<<=
1
if
crc
&
0x1000000
!=
0
{
crc
^=
crc24Poly
}
}
}
return
crc
}
var
armorStart
=
[]
byte
(
"-----BEGIN "
)
var
armorEnd
=
[]
byte
(
"-----END "
)
var
armorEndOfLine
=
[]
byte
(
"-----"
)
// lineReader wraps a line based reader. It watches for the end of an armor
// block and records the expected CRC value.
type
lineReader
struct
{
in
*
bufio
.
Reader
buf
[]
byte
eof
bool
crc
uint32
crcSet
bool
}
func
(
l
*
lineReader
)
Read
(
p
[]
byte
)
(
n
int
,
err
error
)
{
if
l
.
eof
{
return
0
,
io
.
EOF
}
if
len
(
l
.
buf
)
>
0
{
n
=
copy
(
p
,
l
.
buf
)
l
.
buf
=
l
.
buf
[
n
:
]
return
}
line
,
isPrefix
,
err
:=
l
.
in
.
ReadLine
()
if
err
!=
nil
{
return
}
if
isPrefix
{
return
0
,
ArmorCorrupt
}
if
bytes
.
HasPrefix
(
line
,
armorEnd
)
{
l
.
eof
=
true
return
0
,
io
.
EOF
}
if
len
(
line
)
==
5
&&
line
[
0
]
==
'='
{
// This is the checksum line
var
expectedBytes
[
3
]
byte
var
m
int
m
,
err
=
base64
.
StdEncoding
.
Decode
(
expectedBytes
[
0
:
],
line
[
1
:
])
if
m
!=
3
||
err
!=
nil
{
return
}
l
.
crc
=
uint32
(
expectedBytes
[
0
])
<<
16
|
uint32
(
expectedBytes
[
1
])
<<
8
|
uint32
(
expectedBytes
[
2
])
line
,
_
,
err
=
l
.
in
.
ReadLine
()
if
err
!=
nil
&&
err
!=
io
.
EOF
{
return
}
if
!
bytes
.
HasPrefix
(
line
,
armorEnd
)
{
return
0
,
ArmorCorrupt
}
l
.
eof
=
true
l
.
crcSet
=
true
return
0
,
io
.
EOF
}
if
len
(
line
)
>
96
{
return
0
,
ArmorCorrupt
}
n
=
copy
(
p
,
line
)
bytesToSave
:=
len
(
line
)
-
n
if
bytesToSave
>
0
{
if
cap
(
l
.
buf
)
<
bytesToSave
{
l
.
buf
=
make
([]
byte
,
0
,
bytesToSave
)
}
l
.
buf
=
l
.
buf
[
0
:
bytesToSave
]
copy
(
l
.
buf
,
line
[
n
:
])
}
return
}
// openpgpReader passes Read calls to the underlying base64 decoder, but keeps
// a running CRC of the resulting data and checks the CRC against the value
// found by the lineReader at EOF.
type
openpgpReader
struct
{
lReader
*
lineReader
b64Reader
io
.
Reader
currentCRC
uint32
}
func
(
r
*
openpgpReader
)
Read
(
p
[]
byte
)
(
n
int
,
err
error
)
{
n
,
err
=
r
.
b64Reader
.
Read
(
p
)
r
.
currentCRC
=
crc24
(
r
.
currentCRC
,
p
[
:
n
])
if
err
==
io
.
EOF
&&
r
.
lReader
.
crcSet
&&
r
.
lReader
.
crc
!=
uint32
(
r
.
currentCRC
&
crc24Mask
)
{
return
0
,
ArmorCorrupt
}
return
}
// Decode reads a PGP armored block from the given Reader. It will ignore
// leading garbage. If it doesn't find a block, it will return nil, io.EOF. The
// given Reader is not usable after calling this function: an arbitrary amount
// of data may have been read past the end of the block.
func
Decode
(
in
io
.
Reader
)
(
p
*
Block
,
err
error
)
{
r
:=
bufio
.
NewReaderSize
(
in
,
100
)
var
line
[]
byte
ignoreNext
:=
false
TryNextBlock
:
p
=
nil
// Skip leading garbage
for
{
ignoreThis
:=
ignoreNext
line
,
ignoreNext
,
err
=
r
.
ReadLine
()
if
err
!=
nil
{
return
}
if
ignoreNext
||
ignoreThis
{
continue
}
line
=
bytes
.
TrimSpace
(
line
)
if
len
(
line
)
>
len
(
armorStart
)
+
len
(
armorEndOfLine
)
&&
bytes
.
HasPrefix
(
line
,
armorStart
)
{
break
}
}
p
=
new
(
Block
)
p
.
Type
=
string
(
line
[
len
(
armorStart
)
:
len
(
line
)
-
len
(
armorEndOfLine
)])
p
.
Header
=
make
(
map
[
string
]
string
)
nextIsContinuation
:=
false
var
lastKey
string
// Read headers
for
{
isContinuation
:=
nextIsContinuation
line
,
nextIsContinuation
,
err
=
r
.
ReadLine
()
if
err
!=
nil
{
p
=
nil
return
}
if
isContinuation
{
p
.
Header
[
lastKey
]
+=
string
(
line
)
continue
}
line
=
bytes
.
TrimSpace
(
line
)
if
len
(
line
)
==
0
{
break
}
i
:=
bytes
.
Index
(
line
,
[]
byte
(
": "
))
if
i
==
-
1
{
goto
TryNextBlock
}
lastKey
=
string
(
line
[
:
i
])
p
.
Header
[
lastKey
]
=
string
(
line
[
i
+
2
:
])
}
p
.
lReader
.
in
=
r
p
.
oReader
.
currentCRC
=
crc24Init
p
.
oReader
.
lReader
=
&
p
.
lReader
p
.
oReader
.
b64Reader
=
base64
.
NewDecoder
(
base64
.
StdEncoding
,
&
p
.
lReader
)
p
.
Body
=
&
p
.
oReader
return
}
vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go
0 → 100644
View file @
530cd297
// Copyright 2010 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.
package
armor
import
(
"encoding/base64"
"io"
)
var
armorHeaderSep
=
[]
byte
(
": "
)
var
blockEnd
=
[]
byte
(
"
\n
="
)
var
newline
=
[]
byte
(
"
\n
"
)
var
armorEndOfLineOut
=
[]
byte
(
"-----
\n
"
)
// writeSlices writes its arguments to the given Writer.
func
writeSlices
(
out
io
.
Writer
,
slices
...
[]
byte
)
(
err
error
)
{
for
_
,
s
:=
range
slices
{
_
,
err
=
out
.
Write
(
s
)
if
err
!=
nil
{
return
err
}
}
return
}
// lineBreaker breaks data across several lines, all of the same byte length
// (except possibly the last). Lines are broken with a single '\n'.
type
lineBreaker
struct
{
lineLength
int
line
[]
byte
used
int
out
io
.
Writer
haveWritten
bool
}
func
newLineBreaker
(
out
io
.
Writer
,
lineLength
int
)
*
lineBreaker
{
return
&
lineBreaker
{
lineLength
:
lineLength
,
line
:
make
([]
byte
,
lineLength
),
used
:
0
,
out
:
out
,
}
}
func
(
l
*
lineBreaker
)
Write
(
b
[]
byte
)
(
n
int
,
err
error
)
{
n
=
len
(
b
)
if
n
==
0
{
return
}
if
l
.
used
==
0
&&
l
.
haveWritten
{
_
,
err
=
l
.
out
.
Write
([]
byte
{
'\n'
})
if
err
!=
nil
{
return
}
}
if
l
.
used
+
len
(
b
)
<
l
.
lineLength
{
l
.
used
+=
copy
(
l
.
line
[
l
.
used
:
],
b
)
return
}
l
.
haveWritten
=
true
_
,
err
=
l
.
out
.
Write
(
l
.
line
[
0
:
l
.
used
])
if
err
!=
nil
{
return
}
excess
:=
l
.
lineLength
-
l
.
used
l
.
used
=
0
_
,
err
=
l
.
out
.
Write
(
b
[
0
:
excess
])
if
err
!=
nil
{
return
}
_
,
err
=
l
.
Write
(
b
[
excess
:
])
return
}
func
(
l
*
lineBreaker
)
Close
()
(
err
error
)
{
if
l
.
used
>
0
{
_
,
err
=
l
.
out
.
Write
(
l
.
line
[
0
:
l
.
used
])
if
err
!=
nil
{
return
}
}
return
}
// encoding keeps track of a running CRC24 over the data which has been written
// to it and outputs a OpenPGP checksum when closed, followed by an armor
// trailer.
//
// It's built into a stack of io.Writers:
// encoding -> base64 encoder -> lineBreaker -> out
type
encoding
struct
{
out
io
.
Writer
breaker
*
lineBreaker
b64
io
.
WriteCloser
crc
uint32
blockType
[]
byte
}
func
(
e
*
encoding
)
Write
(
data
[]
byte
)
(
n
int
,
err
error
)
{
e
.
crc
=
crc24
(
e
.
crc
,
data
)
return
e
.
b64
.
Write
(
data
)
}
func
(
e
*
encoding
)
Close
()
(
err
error
)
{
err
=
e
.
b64
.
Close
()
if
err
!=
nil
{
return
}
e
.
breaker
.
Close
()
var
checksumBytes
[
3
]
byte
checksumBytes
[
0
]
=
byte
(
e
.
crc
>>
16
)
checksumBytes
[
1
]
=
byte
(
e
.
crc
>>
8
)
checksumBytes
[
2
]
=
byte
(
e
.
crc
)
var
b64ChecksumBytes
[
4
]
byte
base64
.
StdEncoding
.
Encode
(
b64ChecksumBytes
[
:
],
checksumBytes
[
:
])
return
writeSlices
(
e
.
out
,
blockEnd
,
b64ChecksumBytes
[
:
],
newline
,
armorEnd
,
e
.
blockType
,
armorEndOfLine
)
}
// Encode returns a WriteCloser which will encode the data written to it in
// OpenPGP armor.
func
Encode
(
out
io
.
Writer
,
blockType
string
,
headers
map
[
string
]
string
)
(
w
io
.
WriteCloser
,
err
error
)
{
bType
:=
[]
byte
(
blockType
)
err
=
writeSlices
(
out
,
armorStart
,
bType
,
armorEndOfLineOut
)
if
err
!=
nil
{
return
}
for
k
,
v
:=
range
headers
{
err
=
writeSlices
(
out
,
[]
byte
(
k
),
armorHeaderSep
,
[]
byte
(
v
),
newline
)
if
err
!=
nil
{
return
}
}
_
,
err
=
out
.
Write
(
newline
)
if
err
!=
nil
{
return
}
e
:=
&
encoding
{
out
:
out
,
breaker
:
newLineBreaker
(
out
,
64
),
crc
:
crc24Init
,
blockType
:
bType
,
}
e
.
b64
=
base64
.
NewEncoder
(
base64
.
StdEncoding
,
e
.
breaker
)
return
e
,
nil
}
Prev
1
2
3
4
5
…
9
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment