Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
D
dex
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
dex
Commits
316acbee
Unverified
Commit
316acbee
authored
Sep 18, 2018
by
Eric Chiang
Committed by
GitHub
Sep 18, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1299 from fajran/update-go-jose
Update go-jose to v2.1.8
parents
06241eae
a823c021
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
4575 additions
and
159 deletions
+4575
-159
glide.lock
glide.lock
+6
-3
glide.yaml
glide.yaml
+1
-1
ed25519.go
vendor/golang.org/x/crypto/ed25519/ed25519.go
+181
-0
const.go
...olang.org/x/crypto/ed25519/internal/edwards25519/const.go
+1422
-0
edwards25519.go
...rg/x/crypto/ed25519/internal/edwards25519/edwards25519.go
+1771
-0
pbkdf2.go
vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go
+77
-0
asymmetric.go
vendor/gopkg.in/square/go-jose.v2/asymmetric.go
+91
-19
ecdh_es.go
vendor/gopkg.in/square/go-jose.v2/cipher/ecdh_es.go
+1
-1
crypter.go
vendor/gopkg.in/square/go-jose.v2/crypter.go
+118
-18
doc.go
vendor/gopkg.in/square/go-jose.v2/doc.go
+5
-4
encoding.go
vendor/gopkg.in/square/go-jose.v2/encoding.go
+2
-1
jwe.go
vendor/gopkg.in/square/go-jose.v2/jwe.go
+22
-8
jwk.go
vendor/gopkg.in/square/go-jose.v2/jwk.go
+109
-10
jws.go
vendor/gopkg.in/square/go-jose.v2/jws.go
+55
-7
opaque.go
vendor/gopkg.in/square/go-jose.v2/opaque.go
+83
-0
shared.go
vendor/gopkg.in/square/go-jose.v2/shared.go
+321
-51
signing.go
vendor/gopkg.in/square/go-jose.v2/signing.go
+170
-29
symmetric.go
vendor/gopkg.in/square/go-jose.v2/symmetric.go
+140
-7
No files found.
glide.lock
View file @
316acbee
hash:
c41e5b1fbd68f04f14b6e9b2ebab8bf18b857b3dc3a5754e4adf7c1884981de7
updated: 2018-09-
05T08:40:39.486766558
+02:00
hash:
12d0ad2fc0df4ab221e45c1ba7821708b908033c82741e250cc46dcd445b67eb
updated: 2018-09-
18T23:51:30.787348994
+02:00
imports:
- name: github.com/beevik/etree
version: 4cd0dd976db869f817248477718071a28e978df0
...
...
@@ -108,6 +108,9 @@ imports:
subpackages:
- bcrypt
- blowfish
- ed25519
- ed25519/internal/edwards25519
- pbkdf2
- name: golang.org/x/net
version: 5602c733f70afc6dcec6766be0d5034d4c4f14de
subpackages:
...
...
@@ -168,7 +171,7 @@ imports:
- name: gopkg.in/ldap.v2
version: 0e7db8eb77695b5a952f0e5d78df9ab160050c73
- name: gopkg.in/square/go-jose.v2
version: 8
c5257b2f658f86d174ae68c6a592eaf6a9608d9
version: 8
254d6c783765f38c8675fae4427a1fe73fbd09d
subpackages:
- cipher
- json
...
...
glide.yaml
View file @
316acbee
...
...
@@ -25,7 +25,7 @@ import:
# Used for JOSE functionality (JWKs, JWTs, etc.).
-
package
:
gopkg.in/square/go-jose.v2
version
:
v2.
0.0
version
:
v2.
1.8
subpackages
:
-
cipher
-
json
...
...
vendor/golang.org/x/crypto/ed25519/ed25519.go
0 → 100644
View file @
316acbee
// Copyright 2016 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 ed25519 implements the Ed25519 signature algorithm. See
// http://ed25519.cr.yp.to/.
//
// These functions are also compatible with the “Ed25519” function defined in
// https://tools.ietf.org/html/draft-irtf-cfrg-eddsa-05.
package
ed25519
// This code is a port of the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
import
(
"crypto"
cryptorand
"crypto/rand"
"crypto/sha512"
"crypto/subtle"
"errors"
"io"
"strconv"
"golang.org/x/crypto/ed25519/internal/edwards25519"
)
const
(
// PublicKeySize is the size, in bytes, of public keys as used in this package.
PublicKeySize
=
32
// PrivateKeySize is the size, in bytes, of private keys as used in this package.
PrivateKeySize
=
64
// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
SignatureSize
=
64
)
// PublicKey is the type of Ed25519 public keys.
type
PublicKey
[]
byte
// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer.
type
PrivateKey
[]
byte
// Public returns the PublicKey corresponding to priv.
func
(
priv
PrivateKey
)
Public
()
crypto
.
PublicKey
{
publicKey
:=
make
([]
byte
,
PublicKeySize
)
copy
(
publicKey
,
priv
[
32
:
])
return
PublicKey
(
publicKey
)
}
// Sign signs the given message with priv.
// Ed25519 performs two passes over messages to be signed and therefore cannot
// handle pre-hashed messages. Thus opts.HashFunc() must return zero to
// indicate the message hasn't been hashed. This can be achieved by passing
// crypto.Hash(0) as the value for opts.
func
(
priv
PrivateKey
)
Sign
(
rand
io
.
Reader
,
message
[]
byte
,
opts
crypto
.
SignerOpts
)
(
signature
[]
byte
,
err
error
)
{
if
opts
.
HashFunc
()
!=
crypto
.
Hash
(
0
)
{
return
nil
,
errors
.
New
(
"ed25519: cannot sign hashed message"
)
}
return
Sign
(
priv
,
message
),
nil
}
// GenerateKey generates a public/private key pair using entropy from rand.
// If rand is nil, crypto/rand.Reader will be used.
func
GenerateKey
(
rand
io
.
Reader
)
(
publicKey
PublicKey
,
privateKey
PrivateKey
,
err
error
)
{
if
rand
==
nil
{
rand
=
cryptorand
.
Reader
}
privateKey
=
make
([]
byte
,
PrivateKeySize
)
publicKey
=
make
([]
byte
,
PublicKeySize
)
_
,
err
=
io
.
ReadFull
(
rand
,
privateKey
[
:
32
])
if
err
!=
nil
{
return
nil
,
nil
,
err
}
digest
:=
sha512
.
Sum512
(
privateKey
[
:
32
])
digest
[
0
]
&=
248
digest
[
31
]
&=
127
digest
[
31
]
|=
64
var
A
edwards25519
.
ExtendedGroupElement
var
hBytes
[
32
]
byte
copy
(
hBytes
[
:
],
digest
[
:
])
edwards25519
.
GeScalarMultBase
(
&
A
,
&
hBytes
)
var
publicKeyBytes
[
32
]
byte
A
.
ToBytes
(
&
publicKeyBytes
)
copy
(
privateKey
[
32
:
],
publicKeyBytes
[
:
])
copy
(
publicKey
,
publicKeyBytes
[
:
])
return
publicKey
,
privateKey
,
nil
}
// Sign signs the message with privateKey and returns a signature. It will
// panic if len(privateKey) is not PrivateKeySize.
func
Sign
(
privateKey
PrivateKey
,
message
[]
byte
)
[]
byte
{
if
l
:=
len
(
privateKey
);
l
!=
PrivateKeySize
{
panic
(
"ed25519: bad private key length: "
+
strconv
.
Itoa
(
l
))
}
h
:=
sha512
.
New
()
h
.
Write
(
privateKey
[
:
32
])
var
digest1
,
messageDigest
,
hramDigest
[
64
]
byte
var
expandedSecretKey
[
32
]
byte
h
.
Sum
(
digest1
[
:
0
])
copy
(
expandedSecretKey
[
:
],
digest1
[
:
])
expandedSecretKey
[
0
]
&=
248
expandedSecretKey
[
31
]
&=
63
expandedSecretKey
[
31
]
|=
64
h
.
Reset
()
h
.
Write
(
digest1
[
32
:
])
h
.
Write
(
message
)
h
.
Sum
(
messageDigest
[
:
0
])
var
messageDigestReduced
[
32
]
byte
edwards25519
.
ScReduce
(
&
messageDigestReduced
,
&
messageDigest
)
var
R
edwards25519
.
ExtendedGroupElement
edwards25519
.
GeScalarMultBase
(
&
R
,
&
messageDigestReduced
)
var
encodedR
[
32
]
byte
R
.
ToBytes
(
&
encodedR
)
h
.
Reset
()
h
.
Write
(
encodedR
[
:
])
h
.
Write
(
privateKey
[
32
:
])
h
.
Write
(
message
)
h
.
Sum
(
hramDigest
[
:
0
])
var
hramDigestReduced
[
32
]
byte
edwards25519
.
ScReduce
(
&
hramDigestReduced
,
&
hramDigest
)
var
s
[
32
]
byte
edwards25519
.
ScMulAdd
(
&
s
,
&
hramDigestReduced
,
&
expandedSecretKey
,
&
messageDigestReduced
)
signature
:=
make
([]
byte
,
SignatureSize
)
copy
(
signature
[
:
],
encodedR
[
:
])
copy
(
signature
[
32
:
],
s
[
:
])
return
signature
}
// Verify reports whether sig is a valid signature of message by publicKey. It
// will panic if len(publicKey) is not PublicKeySize.
func
Verify
(
publicKey
PublicKey
,
message
,
sig
[]
byte
)
bool
{
if
l
:=
len
(
publicKey
);
l
!=
PublicKeySize
{
panic
(
"ed25519: bad public key length: "
+
strconv
.
Itoa
(
l
))
}
if
len
(
sig
)
!=
SignatureSize
||
sig
[
63
]
&
224
!=
0
{
return
false
}
var
A
edwards25519
.
ExtendedGroupElement
var
publicKeyBytes
[
32
]
byte
copy
(
publicKeyBytes
[
:
],
publicKey
)
if
!
A
.
FromBytes
(
&
publicKeyBytes
)
{
return
false
}
edwards25519
.
FeNeg
(
&
A
.
X
,
&
A
.
X
)
edwards25519
.
FeNeg
(
&
A
.
T
,
&
A
.
T
)
h
:=
sha512
.
New
()
h
.
Write
(
sig
[
:
32
])
h
.
Write
(
publicKey
[
:
])
h
.
Write
(
message
)
var
digest
[
64
]
byte
h
.
Sum
(
digest
[
:
0
])
var
hReduced
[
32
]
byte
edwards25519
.
ScReduce
(
&
hReduced
,
&
digest
)
var
R
edwards25519
.
ProjectiveGroupElement
var
b
[
32
]
byte
copy
(
b
[
:
],
sig
[
32
:
])
edwards25519
.
GeDoubleScalarMultVartime
(
&
R
,
&
hReduced
,
&
A
,
&
b
)
var
checkR
[
32
]
byte
R
.
ToBytes
(
&
checkR
)
return
subtle
.
ConstantTimeCompare
(
sig
[
:
32
],
checkR
[
:
])
==
1
}
vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go
0 → 100644
View file @
316acbee
// Copyright 2016 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
edwards25519
// These values are from the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
// d is a constant in the Edwards curve equation.
var
d
=
FieldElement
{
-
10913610
,
13857413
,
-
15372611
,
6949391
,
114729
,
-
8787816
,
-
6275908
,
-
3247719
,
-
18696448
,
-
12055116
,
}
// d2 is 2*d.
var
d2
=
FieldElement
{
-
21827239
,
-
5839606
,
-
30745221
,
13898782
,
229458
,
15978800
,
-
12551817
,
-
6495438
,
29715968
,
9444199
,
}
// SqrtM1 is the square-root of -1 in the field.
var
SqrtM1
=
FieldElement
{
-
32595792
,
-
7943725
,
9377950
,
3500415
,
12389472
,
-
272473
,
-
25146209
,
-
2005654
,
326686
,
11406482
,
}
// A is a constant in the Montgomery-form of curve25519.
var
A
=
FieldElement
{
486662
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
}
// bi contains precomputed multiples of the base-point. See the Ed25519 paper
// for a discussion about how these values are used.
var
bi
=
[
8
]
PreComputedGroupElement
{
{
FieldElement
{
25967493
,
-
14356035
,
29566456
,
3660896
,
-
12694345
,
4014787
,
27544626
,
-
11754271
,
-
6079156
,
2047605
},
FieldElement
{
-
12545711
,
934262
,
-
2722910
,
3049990
,
-
727428
,
9406986
,
12720692
,
5043384
,
19500929
,
-
15469378
},
FieldElement
{
-
8738181
,
4489570
,
9688441
,
-
14785194
,
10184609
,
-
12363380
,
29287919
,
11864899
,
-
24514362
,
-
4438546
},
},
{
FieldElement
{
15636291
,
-
9688557
,
24204773
,
-
7912398
,
616977
,
-
16685262
,
27787600
,
-
14772189
,
28944400
,
-
1550024
},
FieldElement
{
16568933
,
4717097
,
-
11556148
,
-
1102322
,
15682896
,
-
11807043
,
16354577
,
-
11775962
,
7689662
,
11199574
},
FieldElement
{
30464156
,
-
5976125
,
-
11779434
,
-
15670865
,
23220365
,
15915852
,
7512774
,
10017326
,
-
17749093
,
-
9920357
},
},
{
FieldElement
{
10861363
,
11473154
,
27284546
,
1981175
,
-
30064349
,
12577861
,
32867885
,
14515107
,
-
15438304
,
10819380
},
FieldElement
{
4708026
,
6336745
,
20377586
,
9066809
,
-
11272109
,
6594696
,
-
25653668
,
12483688
,
-
12668491
,
5581306
},
FieldElement
{
19563160
,
16186464
,
-
29386857
,
4097519
,
10237984
,
-
4348115
,
28542350
,
13850243
,
-
23678021
,
-
15815942
},
},
{
FieldElement
{
5153746
,
9909285
,
1723747
,
-
2777874
,
30523605
,
5516873
,
19480852
,
5230134
,
-
23952439
,
-
15175766
},
FieldElement
{
-
30269007
,
-
3463509
,
7665486
,
10083793
,
28475525
,
1649722
,
20654025
,
16520125
,
30598449
,
7715701
},
FieldElement
{
28881845
,
14381568
,
9657904
,
3680757
,
-
20181635
,
7843316
,
-
31400660
,
1370708
,
29794553
,
-
1409300
},
},
{
FieldElement
{
-
22518993
,
-
6692182
,
14201702
,
-
8745502
,
-
23510406
,
8844726
,
18474211
,
-
1361450
,
-
13062696
,
13821877
},
FieldElement
{
-
6455177
,
-
7839871
,
3374702
,
-
4740862
,
-
27098617
,
-
10571707
,
31655028
,
-
7212327
,
18853322
,
-
14220951
},
FieldElement
{
4566830
,
-
12963868
,
-
28974889
,
-
12240689
,
-
7602672
,
-
2830569
,
-
8514358
,
-
10431137
,
2207753
,
-
3209784
},
},
{
FieldElement
{
-
25154831
,
-
4185821
,
29681144
,
7868801
,
-
6854661
,
-
9423865
,
-
12437364
,
-
663000
,
-
31111463
,
-
16132436
},
FieldElement
{
25576264
,
-
2703214
,
7349804
,
-
11814844
,
16472782
,
9300885
,
3844789
,
15725684
,
171356
,
6466918
},
FieldElement
{
23103977
,
13316479
,
9739013
,
-
16149481
,
817875
,
-
15038942
,
8965339
,
-
14088058
,
-
30714912
,
16193877
},
},
{
FieldElement
{
-
33521811
,
3180713
,
-
2394130
,
14003687
,
-
16903474
,
-
16270840
,
17238398
,
4729455
,
-
18074513
,
9256800
},
FieldElement
{
-
25182317
,
-
4174131
,
32336398
,
5036987
,
-
21236817
,
11360617
,
22616405
,
9761698
,
-
19827198
,
630305
},
FieldElement
{
-
13720693
,
2639453
,
-
24237460
,
-
7406481
,
9494427
,
-
5774029
,
-
6554551
,
-
15960994
,
-
2449256
,
-
14291300
},
},
{
FieldElement
{
-
3151181
,
-
5046075
,
9282714
,
6866145
,
-
31907062
,
-
863023
,
-
18940575
,
15033784
,
25105118
,
-
7894876
},
FieldElement
{
-
24326370
,
15950226
,
-
31801215
,
-
14592823
,
-
11662737
,
-
5090925
,
1573892
,
-
2625887
,
2198790
,
-
15804619
},
FieldElement
{
-
3099351
,
10324967
,
-
2241613
,
7453183
,
-
5446979
,
-
2735503
,
-
13812022
,
-
16236442
,
-
32461234
,
-
12290683
},
},
}
// base contains precomputed multiples of the base-point. See the Ed25519 paper
// for a discussion about how these values are used.
var
base
=
[
32
][
8
]
PreComputedGroupElement
{
{
{
FieldElement
{
25967493
,
-
14356035
,
29566456
,
3660896
,
-
12694345
,
4014787
,
27544626
,
-
11754271
,
-
6079156
,
2047605
},
FieldElement
{
-
12545711
,
934262
,
-
2722910
,
3049990
,
-
727428
,
9406986
,
12720692
,
5043384
,
19500929
,
-
15469378
},
FieldElement
{
-
8738181
,
4489570
,
9688441
,
-
14785194
,
10184609
,
-
12363380
,
29287919
,
11864899
,
-
24514362
,
-
4438546
},
},
{
FieldElement
{
-
12815894
,
-
12976347
,
-
21581243
,
11784320
,
-
25355658
,
-
2750717
,
-
11717903
,
-
3814571
,
-
358445
,
-
10211303
},
FieldElement
{
-
21703237
,
6903825
,
27185491
,
6451973
,
-
29577724
,
-
9554005
,
-
15616551
,
11189268
,
-
26829678
,
-
5319081
},
FieldElement
{
26966642
,
11152617
,
32442495
,
15396054
,
14353839
,
-
12752335
,
-
3128826
,
-
9541118
,
-
15472047
,
-
4166697
},
},
{
FieldElement
{
15636291
,
-
9688557
,
24204773
,
-
7912398
,
616977
,
-
16685262
,
27787600
,
-
14772189
,
28944400
,
-
1550024
},
FieldElement
{
16568933
,
4717097
,
-
11556148
,
-
1102322
,
15682896
,
-
11807043
,
16354577
,
-
11775962
,
7689662
,
11199574
},
FieldElement
{
30464156
,
-
5976125
,
-
11779434
,
-
15670865
,
23220365
,
15915852
,
7512774
,
10017326
,
-
17749093
,
-
9920357
},
},
{
FieldElement
{
-
17036878
,
13921892
,
10945806
,
-
6033431
,
27105052
,
-
16084379
,
-
28926210
,
15006023
,
3284568
,
-
6276540
},
FieldElement
{
23599295
,
-
8306047
,
-
11193664
,
-
7687416
,
13236774
,
10506355
,
7464579
,
9656445
,
13059162
,
10374397
},
FieldElement
{
7798556
,
16710257
,
3033922
,
2874086
,
28997861
,
2835604
,
32406664
,
-
3839045
,
-
641708
,
-
101325
},
},
{
FieldElement
{
10861363
,
11473154
,
27284546
,
1981175
,
-
30064349
,
12577861
,
32867885
,
14515107
,
-
15438304
,
10819380
},
FieldElement
{
4708026
,
6336745
,
20377586
,
9066809
,
-
11272109
,
6594696
,
-
25653668
,
12483688
,
-
12668491
,
5581306
},
FieldElement
{
19563160
,
16186464
,
-
29386857
,
4097519
,
10237984
,
-
4348115
,
28542350
,
13850243
,
-
23678021
,
-
15815942
},
},
{
FieldElement
{
-
15371964
,
-
12862754
,
32573250
,
4720197
,
-
26436522
,
5875511
,
-
19188627
,
-
15224819
,
-
9818940
,
-
12085777
},
FieldElement
{
-
8549212
,
109983
,
15149363
,
2178705
,
22900618
,
4543417
,
3044240
,
-
15689887
,
1762328
,
14866737
},
FieldElement
{
-
18199695
,
-
15951423
,
-
10473290
,
1707278
,
-
17185920
,
3916101
,
-
28236412
,
3959421
,
27914454
,
4383652
},
},
{
FieldElement
{
5153746
,
9909285
,
1723747
,
-
2777874
,
30523605
,
5516873
,
19480852
,
5230134
,
-
23952439
,
-
15175766
},
FieldElement
{
-
30269007
,
-
3463509
,
7665486
,
10083793
,
28475525
,
1649722
,
20654025
,
16520125
,
30598449
,
7715701
},
FieldElement
{
28881845
,
14381568
,
9657904
,
3680757
,
-
20181635
,
7843316
,
-
31400660
,
1370708
,
29794553
,
-
1409300
},
},
{
FieldElement
{
14499471
,
-
2729599
,
-
33191113
,
-
4254652
,
28494862
,
14271267
,
30290735
,
10876454
,
-
33154098
,
2381726
},
FieldElement
{
-
7195431
,
-
2655363
,
-
14730155
,
462251
,
-
27724326
,
3941372
,
-
6236617
,
3696005
,
-
32300832
,
15351955
},
FieldElement
{
27431194
,
8222322
,
16448760
,
-
3907995
,
-
18707002
,
11938355
,
-
32961401
,
-
2970515
,
29551813
,
10109425
},
},
},
{
{
FieldElement
{
-
13657040
,
-
13155431
,
-
31283750
,
11777098
,
21447386
,
6519384
,
-
2378284
,
-
1627556
,
10092783
,
-
4764171
},
FieldElement
{
27939166
,
14210322
,
4677035
,
16277044
,
-
22964462
,
-
12398139
,
-
32508754
,
12005538
,
-
17810127
,
12803510
},
FieldElement
{
17228999
,
-
15661624
,
-
1233527
,
300140
,
-
1224870
,
-
11714777
,
30364213
,
-
9038194
,
18016357
,
4397660
},
},
{
FieldElement
{
-
10958843
,
-
7690207
,
4776341
,
-
14954238
,
27850028
,
-
15602212
,
-
26619106
,
14544525
,
-
17477504
,
982639
},
FieldElement
{
29253598
,
15796703
,
-
2863982
,
-
9908884
,
10057023
,
3163536
,
7332899
,
-
4120128
,
-
21047696
,
9934963
},
FieldElement
{
5793303
,
16271923
,
-
24131614
,
-
10116404
,
29188560
,
1206517
,
-
14747930
,
4559895
,
-
30123922
,
-
10897950
},
},
{
FieldElement
{
-
27643952
,
-
11493006
,
16282657
,
-
11036493
,
28414021
,
-
15012264
,
24191034
,
4541697
,
-
13338309
,
5500568
},
FieldElement
{
12650548
,
-
1497113
,
9052871
,
11355358
,
-
17680037
,
-
8400164
,
-
17430592
,
12264343
,
10874051
,
13524335
},
FieldElement
{
25556948
,
-
3045990
,
714651
,
2510400
,
23394682
,
-
10415330
,
33119038
,
5080568
,
-
22528059
,
5376628
},
},
{
FieldElement
{
-
26088264
,
-
4011052
,
-
17013699
,
-
3537628
,
-
6726793
,
1920897
,
-
22321305
,
-
9447443
,
4535768
,
1569007
},
FieldElement
{
-
2255422
,
14606630
,
-
21692440
,
-
8039818
,
28430649
,
8775819
,
-
30494562
,
3044290
,
31848280
,
12543772
},
FieldElement
{
-
22028579
,
2943893
,
-
31857513
,
6777306
,
13784462
,
-
4292203
,
-
27377195
,
-
2062731
,
7718482
,
14474653
},
},
{
FieldElement
{
2385315
,
2454213
,
-
22631320
,
46603
,
-
4437935
,
-
15680415
,
656965
,
-
7236665
,
24316168
,
-
5253567
},
FieldElement
{
13741529
,
10911568
,
-
33233417
,
-
8603737
,
-
20177830
,
-
1033297
,
33040651
,
-
13424532
,
-
20729456
,
8321686
},
FieldElement
{
21060490
,
-
2212744
,
15712757
,
-
4336099
,
1639040
,
10656336
,
23845965
,
-
11874838
,
-
9984458
,
608372
},
},
{
FieldElement
{
-
13672732
,
-
15087586
,
-
10889693
,
-
7557059
,
-
6036909
,
11305547
,
1123968
,
-
6780577
,
27229399
,
23887
},
FieldElement
{
-
23244140
,
-
294205
,
-
11744728
,
14712571
,
-
29465699
,
-
2029617
,
12797024
,
-
6440308
,
-
1633405
,
16678954
},
FieldElement
{
-
29500620
,
4770662
,
-
16054387
,
14001338
,
7830047
,
9564805
,
-
1508144
,
-
4795045
,
-
17169265
,
4904953
},
},
{
FieldElement
{
24059557
,
14617003
,
19037157
,
-
15039908
,
19766093
,
-
14906429
,
5169211
,
16191880
,
2128236
,
-
4326833
},
FieldElement
{
-
16981152
,
4124966
,
-
8540610
,
-
10653797
,
30336522
,
-
14105247
,
-
29806336
,
916033
,
-
6882542
,
-
2986532
},
FieldElement
{
-
22630907
,
12419372
,
-
7134229
,
-
7473371
,
-
16478904
,
16739175
,
285431
,
2763829
,
15736322
,
4143876
},
},
{
FieldElement
{
2379352
,
11839345
,
-
4110402
,
-
5988665
,
11274298
,
794957
,
212801
,
-
14594663
,
23527084
,
-
16458268
},
FieldElement
{
33431127
,
-
11130478
,
-
17838966
,
-
15626900
,
8909499
,
8376530
,
-
32625340
,
4087881
,
-
15188911
,
-
14416214
},
FieldElement
{
1767683
,
7197987
,
-
13205226
,
-
2022635
,
-
13091350
,
448826
,
5799055
,
4357868
,
-
4774191
,
-
16323038
},
},
},
{
{
FieldElement
{
6721966
,
13833823
,
-
23523388
,
-
1551314
,
26354293
,
-
11863321
,
23365147
,
-
3949732
,
7390890
,
2759800
},
FieldElement
{
4409041
,
2052381
,
23373853
,
10530217
,
7676779
,
-
12885954
,
21302353
,
-
4264057
,
1244380
,
-
12919645
},
FieldElement
{
-
4421239
,
7169619
,
4982368
,
-
2957590
,
30256825
,
-
2777540
,
14086413
,
9208236
,
15886429
,
16489664
},
},
{
FieldElement
{
1996075
,
10375649
,
14346367
,
13311202
,
-
6874135
,
-
16438411
,
-
13693198
,
398369
,
-
30606455
,
-
712933
},
FieldElement
{
-
25307465
,
9795880
,
-
2777414
,
14878809
,
-
33531835
,
14780363
,
13348553
,
12076947
,
-
30836462
,
5113182
},
FieldElement
{
-
17770784
,
11797796
,
31950843
,
13929123
,
-
25888302
,
12288344
,
-
30341101
,
-
7336386
,
13847711
,
5387222
},
},
{
FieldElement
{
-
18582163
,
-
3416217
,
17824843
,
-
2340966
,
22744343
,
-
10442611
,
8763061
,
3617786
,
-
19600662
,
10370991
},
FieldElement
{
20246567
,
-
14369378
,
22358229
,
-
543712
,
18507283
,
-
10413996
,
14554437
,
-
8746092
,
32232924
,
16763880
},
FieldElement
{
9648505
,
10094563
,
26416693
,
14745928
,
-
30374318
,
-
6472621
,
11094161
,
15689506
,
3140038
,
-
16510092
},
},
{
FieldElement
{
-
16160072
,
5472695
,
31895588
,
4744994
,
8823515
,
10365685
,
-
27224800
,
9448613
,
-
28774454
,
366295
},
FieldElement
{
19153450
,
11523972
,
-
11096490
,
-
6503142
,
-
24647631
,
5420647
,
28344573
,
8041113
,
719605
,
11671788
},
FieldElement
{
8678025
,
2694440
,
-
6808014
,
2517372
,
4964326
,
11152271
,
-
15432916
,
-
15266516
,
27000813
,
-
10195553
},
},
{
FieldElement
{
-
15157904
,
7134312
,
8639287
,
-
2814877
,
-
7235688
,
10421742
,
564065
,
5336097
,
6750977
,
-
14521026
},
FieldElement
{
11836410
,
-
3979488
,
26297894
,
16080799
,
23455045
,
15735944
,
1695823
,
-
8819122
,
8169720
,
16220347
},
FieldElement
{
-
18115838
,
8653647
,
17578566
,
-
6092619
,
-
8025777
,
-
16012763
,
-
11144307
,
-
2627664
,
-
5990708
,
-
14166033
},
},
{
FieldElement
{
-
23308498
,
-
10968312
,
15213228
,
-
10081214
,
-
30853605
,
-
11050004
,
27884329
,
2847284
,
2655861
,
1738395
},
FieldElement
{
-
27537433
,
-
14253021
,
-
25336301
,
-
8002780
,
-
9370762
,
8129821
,
21651608
,
-
3239336
,
-
19087449
,
-
11005278
},
FieldElement
{
1533110
,
3437855
,
23735889
,
459276
,
29970501
,
11335377
,
26030092
,
5821408
,
10478196
,
8544890
},
},
{
FieldElement
{
32173121
,
-
16129311
,
24896207
,
3921497
,
22579056
,
-
3410854
,
19270449
,
12217473
,
17789017
,
-
3395995
},
FieldElement
{
-
30552961
,
-
2228401
,
-
15578829
,
-
10147201
,
13243889
,
517024
,
15479401
,
-
3853233
,
30460520
,
1052596
},
FieldElement
{
-
11614875
,
13323618
,
32618793
,
8175907
,
-
15230173
,
12596687
,
27491595
,
-
4612359
,
3179268
,
-
9478891
},
},
{
FieldElement
{
31947069
,
-
14366651
,
-
4640583
,
-
15339921
,
-
15125977
,
-
6039709
,
-
14756777
,
-
16411740
,
19072640
,
-
9511060
},
FieldElement
{
11685058
,
11822410
,
3158003
,
-
13952594
,
33402194
,
-
4165066
,
5977896
,
-
5215017
,
473099
,
5040608
},
FieldElement
{
-
20290863
,
8198642
,
-
27410132
,
11602123
,
1290375
,
-
2799760
,
28326862
,
1721092
,
-
19558642
,
-
3131606
},
},
},
{
{
FieldElement
{
7881532
,
10687937
,
7578723
,
7738378
,
-
18951012
,
-
2553952
,
21820786
,
8076149
,
-
27868496
,
11538389
},
FieldElement
{
-
19935666
,
3899861
,
18283497
,
-
6801568
,
-
15728660
,
-
11249211
,
8754525
,
7446702
,
-
5676054
,
5797016
},
FieldElement
{
-
11295600
,
-
3793569
,
-
15782110
,
-
7964573
,
12708869
,
-
8456199
,
2014099
,
-
9050574
,
-
2369172
,
-
5877341
},
},
{
FieldElement
{
-
22472376
,
-
11568741
,
-
27682020
,
1146375
,
18956691
,
16640559
,
1192730
,
-
3714199
,
15123619
,
10811505
},
FieldElement
{
14352098
,
-
3419715
,
-
18942044
,
10822655
,
32750596
,
4699007
,
-
70363
,
15776356
,
-
28886779
,
-
11974553
},
FieldElement
{
-
28241164
,
-
8072475
,
-
4978962
,
-
5315317
,
29416931
,
1847569
,
-
20654173
,
-
16484855
,
4714547
,
-
9600655
},
},
{
FieldElement
{
15200332
,
8368572
,
19679101
,
15970074
,
-
31872674
,
1959451
,
24611599
,
-
4543832
,
-
11745876
,
12340220
},
FieldElement
{
12876937
,
-
10480056
,
33134381
,
6590940
,
-
6307776
,
14872440
,
9613953
,
8241152
,
15370987
,
9608631
},
FieldElement
{
-
4143277
,
-
12014408
,
8446281
,
-
391603
,
4407738
,
13629032
,
-
7724868
,
15866074
,
-
28210621
,
-
8814099
},
},
{
FieldElement
{
26660628
,
-
15677655
,
8393734
,
358047
,
-
7401291
,
992988
,
-
23904233
,
858697
,
20571223
,
8420556
},
FieldElement
{
14620715
,
13067227
,
-
15447274
,
8264467
,
14106269
,
15080814
,
33531827
,
12516406
,
-
21574435
,
-
12476749
},
FieldElement
{
236881
,
10476226
,
57258
,
-
14677024
,
6472998
,
2466984
,
17258519
,
7256740
,
8791136
,
15069930
},
},
{
FieldElement
{
1276410
,
-
9371918
,
22949635
,
-
16322807
,
-
23493039
,
-
5702186
,
14711875
,
4874229
,
-
30663140
,
-
2331391
},
FieldElement
{
5855666
,
4990204
,
-
13711848
,
7294284
,
-
7804282
,
1924647
,
-
1423175
,
-
7912378
,
-
33069337
,
9234253
},
FieldElement
{
20590503
,
-
9018988
,
31529744
,
-
7352666
,
-
2706834
,
10650548
,
31559055
,
-
11609587
,
18979186
,
13396066
},
},
{
FieldElement
{
24474287
,
4968103
,
22267082
,
4407354
,
24063882
,
-
8325180
,
-
18816887
,
13594782
,
33514650
,
7021958
},
FieldElement
{
-
11566906
,
-
6565505
,
-
21365085
,
15928892
,
-
26158305
,
4315421
,
-
25948728
,
-
3916677
,
-
21480480
,
12868082
},
FieldElement
{
-
28635013
,
13504661
,
19988037
,
-
2132761
,
21078225
,
6443208
,
-
21446107
,
2244500
,
-
12455797
,
-
8089383
},
},
{
FieldElement
{
-
30595528
,
13793479
,
-
5852820
,
319136
,
-
25723172
,
-
6263899
,
33086546
,
8957937
,
-
15233648
,
5540521
},
FieldElement
{
-
11630176
,
-
11503902
,
-
8119500
,
-
7643073
,
2620056
,
1022908
,
-
23710744
,
-
1568984
,
-
16128528
,
-
14962807
},
FieldElement
{
23152971
,
775386
,
27395463
,
14006635
,
-
9701118
,
4649512
,
1689819
,
892185
,
-
11513277
,
-
15205948
},
},
{
FieldElement
{
9770129
,
9586738
,
26496094
,
4324120
,
1556511
,
-
3550024
,
27453819
,
4763127
,
-
19179614
,
5867134
},
FieldElement
{
-
32765025
,
1927590
,
31726409
,
-
4753295
,
23962434
,
-
16019500
,
27846559
,
5931263
,
-
29749703
,
-
16108455
},
FieldElement
{
27461885
,
-
2977536
,
22380810
,
1815854
,
-
23033753
,
-
3031938
,
7283490
,
-
15148073
,
-
19526700
,
7734629
},
},
},
{
{
FieldElement
{
-
8010264
,
-
9590817
,
-
11120403
,
6196038
,
29344158
,
-
13430885
,
7585295
,
-
3176626
,
18549497
,
15302069
},
FieldElement
{
-
32658337
,
-
6171222
,
-
7672793
,
-
11051681
,
6258878
,
13504381
,
10458790
,
-
6418461
,
-
8872242
,
8424746
},
FieldElement
{
24687205
,
8613276
,
-
30667046
,
-
3233545
,
1863892
,
-
1830544
,
19206234
,
7134917
,
-
11284482
,
-
828919
},
},
{
FieldElement
{
11334899
,
-
9218022
,
8025293
,
12707519
,
17523892
,
-
10476071
,
10243738
,
-
14685461
,
-
5066034
,
16498837
},
FieldElement
{
8911542
,
6887158
,
-
9584260
,
-
6958590
,
11145641
,
-
9543680
,
17303925
,
-
14124238
,
6536641
,
10543906
},
FieldElement
{
-
28946384
,
15479763
,
-
17466835
,
568876
,
-
1497683
,
11223454
,
-
2669190
,
-
16625574
,
-
27235709
,
8876771
},
},
{
FieldElement
{
-
25742899
,
-
12566864
,
-
15649966
,
-
846607
,
-
33026686
,
-
796288
,
-
33481822
,
15824474
,
-
604426
,
-
9039817
},
FieldElement
{
10330056
,
70051
,
7957388
,
-
9002667
,
9764902
,
15609756
,
27698697
,
-
4890037
,
1657394
,
3084098
},
FieldElement
{
10477963
,
-
7470260
,
12119566
,
-
13250805
,
29016247
,
-
5365589
,
31280319
,
14396151
,
-
30233575
,
15272409
},
},
{
FieldElement
{
-
12288309
,
3169463
,
28813183
,
16658753
,
25116432
,
-
5630466
,
-
25173957
,
-
12636138
,
-
25014757
,
1950504
},
FieldElement
{
-
26180358
,
9489187
,
11053416
,
-
14746161
,
-
31053720
,
5825630
,
-
8384306
,
-
8767532
,
15341279
,
8373727
},
FieldElement
{
28685821
,
7759505
,
-
14378516
,
-
12002860
,
-
31971820
,
4079242
,
298136
,
-
10232602
,
-
2878207
,
15190420
},
},
{
FieldElement
{
-
32932876
,
13806336
,
-
14337485
,
-
15794431
,
-
24004620
,
10940928
,
8669718
,
2742393
,
-
26033313
,
-
6875003
},
FieldElement
{
-
1580388
,
-
11729417
,
-
25979658
,
-
11445023
,
-
17411874
,
-
10912854
,
9291594
,
-
16247779
,
-
12154742
,
6048605
},
FieldElement
{
-
30305315
,
14843444
,
1539301
,
11864366
,
20201677
,
1900163
,
13934231
,
5128323
,
11213262
,
9168384
},
},
{
FieldElement
{
-
26280513
,
11007847
,
19408960
,
-
940758
,
-
18592965
,
-
4328580
,
-
5088060
,
-
11105150
,
20470157
,
-
16398701
},
FieldElement
{
-
23136053
,
9282192
,
14855179
,
-
15390078
,
-
7362815
,
-
14408560
,
-
22783952
,
14461608
,
14042978
,
5230683
},
FieldElement
{
29969567
,
-
2741594
,
-
16711867
,
-
8552442
,
9175486
,
-
2468974
,
21556951
,
3506042
,
-
5933891
,
-
12449708
},
},
{
FieldElement
{
-
3144746
,
8744661
,
19704003
,
4581278
,
-
20430686
,
6830683
,
-
21284170
,
8971513
,
-
28539189
,
15326563
},
FieldElement
{
-
19464629
,
10110288
,
-
17262528
,
-
3503892
,
-
23500387
,
1355669
,
-
15523050
,
15300988
,
-
20514118
,
9168260
},
FieldElement
{
-
5353335
,
4488613
,
-
23803248
,
16314347
,
7780487
,
-
15638939
,
-
28948358
,
9601605
,
33087103
,
-
9011387
},
},
{
FieldElement
{
-
19443170
,
-
15512900
,
-
20797467
,
-
12445323
,
-
29824447
,
10229461
,
-
27444329
,
-
15000531
,
-
5996870
,
15664672
},
FieldElement
{
23294591
,
-
16632613
,
-
22650781
,
-
8470978
,
27844204
,
11461195
,
13099750
,
-
2460356
,
18151676
,
13417686
},
FieldElement
{
-
24722913
,
-
4176517
,
-
31150679
,
5988919
,
-
26858785
,
6685065
,
1661597
,
-
12551441
,
15271676
,
-
15452665
},
},
},
{
{
FieldElement
{
11433042
,
-
13228665
,
8239631
,
-
5279517
,
-
1985436
,
-
725718
,
-
18698764
,
2167544
,
-
6921301
,
-
13440182
},
FieldElement
{
-
31436171
,
15575146
,
30436815
,
12192228
,
-
22463353
,
9395379
,
-
9917708
,
-
8638997
,
12215110
,
12028277
},
FieldElement
{
14098400
,
6555944
,
23007258
,
5757252
,
-
15427832
,
-
12950502
,
30123440
,
4617780
,
-
16900089
,
-
655628
},
},
{
FieldElement
{
-
4026201
,
-
15240835
,
11893168
,
13718664
,
-
14809462
,
1847385
,
-
15819999
,
10154009
,
23973261
,
-
12684474
},
FieldElement
{
-
26531820
,
-
3695990
,
-
1908898
,
2534301
,
-
31870557
,
-
16550355
,
18341390
,
-
11419951
,
32013174
,
-
10103539
},
FieldElement
{
-
25479301
,
10876443
,
-
11771086
,
-
14625140
,
-
12369567
,
1838104
,
21911214
,
6354752
,
4425632
,
-
837822
},
},
{
FieldElement
{
-
10433389
,
-
14612966
,
22229858
,
-
3091047
,
-
13191166
,
776729
,
-
17415375
,
-
12020462
,
4725005
,
14044970
},
FieldElement
{
19268650
,
-
7304421
,
1555349
,
8692754
,
-
21474059
,
-
9910664
,
6347390
,
-
1411784
,
-
19522291
,
-
16109756
},
FieldElement
{
-
24864089
,
12986008
,
-
10898878
,
-
5558584
,
-
11312371
,
-
148526
,
19541418
,
8180106
,
9282262
,
10282508
},
},
{
FieldElement
{
-
26205082
,
4428547
,
-
8661196
,
-
13194263
,
4098402
,
-
14165257
,
15522535
,
8372215
,
5542595
,
-
10702683
},
FieldElement
{
-
10562541
,
14895633
,
26814552
,
-
16673850
,
-
17480754
,
-
2489360
,
-
2781891
,
6993761
,
-
18093885
,
10114655
},
FieldElement
{
-
20107055
,
-
929418
,
31422704
,
10427861
,
-
7110749
,
6150669
,
-
29091755
,
-
11529146
,
25953725
,
-
106158
},
},
{
FieldElement
{
-
4234397
,
-
8039292
,
-
9119125
,
3046000
,
2101609
,
-
12607294
,
19390020
,
6094296
,
-
3315279
,
12831125
},
FieldElement
{
-
15998678
,
7578152
,
5310217
,
14408357
,
-
33548620
,
-
224739
,
31575954
,
6326196
,
7381791
,
-
2421839
},
FieldElement
{
-
20902779
,
3296811
,
24736065
,
-
16328389
,
18374254
,
7318640
,
6295303
,
8082724
,
-
15362489
,
12339664
},
},
{
FieldElement
{
27724736
,
2291157
,
6088201
,
-
14184798
,
1792727
,
5857634
,
13848414
,
15768922
,
25091167
,
14856294
},
FieldElement
{
-
18866652
,
8331043
,
24373479
,
8541013
,
-
701998
,
-
9269457
,
12927300
,
-
12695493
,
-
22182473
,
-
9012899
},
FieldElement
{
-
11423429
,
-
5421590
,
11632845
,
3405020
,
30536730
,
-
11674039
,
-
27260765
,
13866390
,
30146206
,
9142070
},
},
{
FieldElement
{
3924129
,
-
15307516
,
-
13817122
,
-
10054960
,
12291820
,
-
668366
,
-
27702774
,
9326384
,
-
8237858
,
4171294
},
FieldElement
{
-
15921940
,
16037937
,
6713787
,
16606682
,
-
21612135
,
2790944
,
26396185
,
3731949
,
345228
,
-
5462949
},
FieldElement
{
-
21327538
,
13448259
,
25284571
,
1143661
,
20614966
,
-
8849387
,
2031539
,
-
12391231
,
-
16253183
,
-
13582083
},
},
{
FieldElement
{
31016211
,
-
16722429
,
26371392
,
-
14451233
,
-
5027349
,
14854137
,
17477601
,
3842657
,
28012650
,
-
16405420
},
FieldElement
{
-
5075835
,
9368966
,
-
8562079
,
-
4600902
,
-
15249953
,
6970560
,
-
9189873
,
16292057
,
-
8867157
,
3507940
},
FieldElement
{
29439664
,
3537914
,
23333589
,
6997794
,
-
17555561
,
-
11018068
,
-
15209202
,
-
15051267
,
-
9164929
,
6580396
},
},
},
{
{
FieldElement
{
-
12185861
,
-
7679788
,
16438269
,
10826160
,
-
8696817
,
-
6235611
,
17860444
,
-
9273846
,
-
2095802
,
9304567
},
FieldElement
{
20714564
,
-
4336911
,
29088195
,
7406487
,
11426967
,
-
5095705
,
14792667
,
-
14608617
,
5289421
,
-
477127
},
FieldElement
{
-
16665533
,
-
10650790
,
-
6160345
,
-
13305760
,
9192020
,
-
1802462
,
17271490
,
12349094
,
26939669
,
-
3752294
},
},
{
FieldElement
{
-
12889898
,
9373458
,
31595848
,
16374215
,
21471720
,
13221525
,
-
27283495
,
-
12348559
,
-
3698806
,
117887
},
FieldElement
{
22263325
,
-
6560050
,
3984570
,
-
11174646
,
-
15114008
,
-
566785
,
28311253
,
5358056
,
-
23319780
,
541964
},
FieldElement
{
16259219
,
3261970
,
2309254
,
-
15534474
,
-
16885711
,
-
4581916
,
24134070
,
-
16705829
,
-
13337066
,
-
13552195
},
},
{
FieldElement
{
9378160
,
-
13140186
,
-
22845982
,
-
12745264
,
28198281
,
-
7244098
,
-
2399684
,
-
717351
,
690426
,
14876244
},
FieldElement
{
24977353
,
-
314384
,
-
8223969
,
-
13465086
,
28432343
,
-
1176353
,
-
13068804
,
-
12297348
,
-
22380984
,
6618999
},
FieldElement
{
-
1538174
,
11685646
,
12944378
,
13682314
,
-
24389511
,
-
14413193
,
8044829
,
-
13817328
,
32239829
,
-
5652762
},
},
{
FieldElement
{
-
18603066
,
4762990
,
-
926250
,
8885304
,
-
28412480
,
-
3187315
,
9781647
,
-
10350059
,
32779359
,
5095274
},
FieldElement
{
-
33008130
,
-
5214506
,
-
32264887
,
-
3685216
,
9460461
,
-
9327423
,
-
24601656
,
14506724
,
21639561
,
-
2630236
},
FieldElement
{
-
16400943
,
-
13112215
,
25239338
,
15531969
,
3987758
,
-
4499318
,
-
1289502
,
-
6863535
,
17874574
,
558605
},
},
{
FieldElement
{
-
13600129
,
10240081
,
9171883
,
16131053
,
-
20869254
,
9599700
,
33499487
,
5080151
,
2085892
,
5119761
},
FieldElement
{
-
22205145
,
-
2519528
,
-
16381601
,
414691
,
-
25019550
,
2170430
,
30634760
,
-
8363614
,
-
31999993
,
-
5759884
},
FieldElement
{
-
6845704
,
15791202
,
8550074
,
-
1312654
,
29928809
,
-
12092256
,
27534430
,
-
7192145
,
-
22351378
,
12961482
},
},
{
FieldElement
{
-
24492060
,
-
9570771
,
10368194
,
11582341
,
-
23397293
,
-
2245287
,
16533930
,
8206996
,
-
30194652
,
-
5159638
},
FieldElement
{
-
11121496
,
-
3382234
,
2307366
,
6362031
,
-
135455
,
8868177
,
-
16835630
,
7031275
,
7589640
,
8945490
},
FieldElement
{
-
32152748
,
8917967
,
6661220
,
-
11677616
,
-
1192060
,
-
15793393
,
7251489
,
-
11182180
,
24099109
,
-
14456170
},
},
{
FieldElement
{
5019558
,
-
7907470
,
4244127
,
-
14714356
,
-
26933272
,
6453165
,
-
19118182
,
-
13289025
,
-
6231896
,
-
10280736
},
FieldElement
{
10853594
,
10721687
,
26480089
,
5861829
,
-
22995819
,
1972175
,
-
1866647
,
-
10557898
,
-
3363451
,
-
6441124
},
FieldElement
{
-
17002408
,
5906790
,
221599
,
-
6563147
,
7828208
,
-
13248918
,
24362661
,
-
2008168
,
-
13866408
,
7421392
},
},
{
FieldElement
{
8139927
,
-
6546497
,
32257646
,
-
5890546
,
30375719
,
1886181
,
-
21175108
,
15441252
,
28826358
,
-
4123029
},
FieldElement
{
6267086
,
9695052
,
7709135
,
-
16603597
,
-
32869068
,
-
1886135
,
14795160
,
-
7840124
,
13746021
,
-
1742048
},
FieldElement
{
28584902
,
7787108
,
-
6732942
,
-
15050729
,
22846041
,
-
7571236
,
-
3181936
,
-
363524
,
4771362
,
-
8419958
},
},
},
{
{
FieldElement
{
24949256
,
6376279
,
-
27466481
,
-
8174608
,
-
18646154
,
-
9930606
,
33543569
,
-
12141695
,
3569627
,
11342593
},
FieldElement
{
26514989
,
4740088
,
27912651
,
3697550
,
19331575
,
-
11472339
,
6809886
,
4608608
,
7325975
,
-
14801071
},
FieldElement
{
-
11618399
,
-
14554430
,
-
24321212
,
7655128
,
-
1369274
,
5214312
,
-
27400540
,
10258390
,
-
17646694
,
-
8186692
},
},
{
FieldElement
{
11431204
,
15823007
,
26570245
,
14329124
,
18029990
,
4796082
,
-
31446179
,
15580664
,
9280358
,
-
3973687
},
FieldElement
{
-
160783
,
-
10326257
,
-
22855316
,
-
4304997
,
-
20861367
,
-
13621002
,
-
32810901
,
-
11181622
,
-
15545091
,
4387441
},
FieldElement
{
-
20799378
,
12194512
,
3937617
,
-
5805892
,
-
27154820
,
9340370
,
-
24513992
,
8548137
,
20617071
,
-
7482001
},
},
{
FieldElement
{
-
938825
,
-
3930586
,
-
8714311
,
16124718
,
24603125
,
-
6225393
,
-
13775352
,
-
11875822
,
24345683
,
10325460
},
FieldElement
{
-
19855277
,
-
1568885
,
-
22202708
,
8714034
,
14007766
,
6928528
,
16318175
,
-
1010689
,
4766743
,
3552007
},
FieldElement
{
-
21751364
,
-
16730916
,
1351763
,
-
803421
,
-
4009670
,
3950935
,
3217514
,
14481909
,
10988822
,
-
3994762
},
},
{
FieldElement
{
15564307
,
-
14311570
,
3101243
,
5684148
,
30446780
,
-
8051356
,
12677127
,
-
6505343
,
-
8295852
,
13296005
},
FieldElement
{
-
9442290
,
6624296
,
-
30298964
,
-
11913677
,
-
4670981
,
-
2057379
,
31521204
,
9614054
,
-
30000824
,
12074674
},
FieldElement
{
4771191
,
-
135239
,
14290749
,
-
13089852
,
27992298
,
14998318
,
-
1413936
,
-
1556716
,
29832613
,
-
16391035
},
},
{
FieldElement
{
7064884
,
-
7541174
,
-
19161962
,
-
5067537
,
-
18891269
,
-
2912736
,
25825242
,
5293297
,
-
27122660
,
13101590
},
FieldElement
{
-
2298563
,
2439670
,
-
7466610
,
1719965
,
-
27267541
,
-
16328445
,
32512469
,
-
5317593
,
-
30356070
,
-
4190957
},
FieldElement
{
-
30006540
,
10162316
,
-
33180176
,
3981723
,
-
16482138
,
-
13070044
,
14413974
,
9515896
,
19568978
,
9628812
},
},
{
FieldElement
{
33053803
,
199357
,
15894591
,
1583059
,
27380243
,
-
4580435
,
-
17838894
,
-
6106839
,
-
6291786
,
3437740
},
FieldElement
{
-
18978877
,
3884493
,
19469877
,
12726490
,
15913552
,
13614290
,
-
22961733
,
70104
,
7463304
,
4176122
},
FieldElement
{
-
27124001
,
10659917
,
11482427
,
-
16070381
,
12771467
,
-
6635117
,
-
32719404
,
-
5322751
,
24216882
,
5944158
},
},
{
FieldElement
{
8894125
,
7450974
,
-
2664149
,
-
9765752
,
-
28080517
,
-
12389115
,
19345746
,
14680796
,
11632993
,
5847885
},
FieldElement
{
26942781
,
-
2315317
,
9129564
,
-
4906607
,
26024105
,
11769399
,
-
11518837
,
6367194
,
-
9727230
,
4782140
},
FieldElement
{
19916461
,
-
4828410
,
-
22910704
,
-
11414391
,
25606324
,
-
5972441
,
33253853
,
8220911
,
6358847
,
-
1873857
},
},
{
FieldElement
{
801428
,
-
2081702
,
16569428
,
11065167
,
29875704
,
96627
,
7908388
,
-
4480480
,
-
13538503
,
1387155
},
FieldElement
{
19646058
,
5720633
,
-
11416706
,
12814209
,
11607948
,
12749789
,
14147075
,
15156355
,
-
21866831
,
11835260
},
FieldElement
{
19299512
,
1155910
,
28703737
,
14890794
,
2925026
,
7269399
,
26121523
,
15467869
,
-
26560550
,
5052483
},
},
},
{
{
FieldElement
{
-
3017432
,
10058206
,
1980837
,
3964243
,
22160966
,
12322533
,
-
6431123
,
-
12618185
,
12228557
,
-
7003677
},
FieldElement
{
32944382
,
14922211
,
-
22844894
,
5188528
,
21913450
,
-
8719943
,
4001465
,
13238564
,
-
6114803
,
8653815
},
FieldElement
{
22865569
,
-
4652735
,
27603668
,
-
12545395
,
14348958
,
8234005
,
24808405
,
5719875
,
28483275
,
2841751
},
},
{
FieldElement
{
-
16420968
,
-
1113305
,
-
327719
,
-
12107856
,
21886282
,
-
15552774
,
-
1887966
,
-
315658
,
19932058
,
-
12739203
},
FieldElement
{
-
11656086
,
10087521
,
-
8864888
,
-
5536143
,
-
19278573
,
-
3055912
,
3999228
,
13239134
,
-
4777469
,
-
13910208
},
FieldElement
{
1382174
,
-
11694719
,
17266790
,
9194690
,
-
13324356
,
9720081
,
20403944
,
11284705
,
-
14013818
,
3093230
},
},
{
FieldElement
{
16650921
,
-
11037932
,
-
1064178
,
1570629
,
-
8329746
,
7352753
,
-
302424
,
16271225
,
-
24049421
,
-
6691850
},
FieldElement
{
-
21911077
,
-
5927941
,
-
4611316
,
-
5560156
,
-
31744103
,
-
10785293
,
24123614
,
15193618
,
-
21652117
,
-
16739389
},
FieldElement
{
-
9935934
,
-
4289447
,
-
25279823
,
4372842
,
2087473
,
10399484
,
31870908
,
14690798
,
17361620
,
11864968
},
},
{
FieldElement
{
-
11307610
,
6210372
,
13206574
,
5806320
,
-
29017692
,
-
13967200
,
-
12331205
,
-
7486601
,
-
25578460
,
-
16240689
},
FieldElement
{
14668462
,
-
12270235
,
26039039
,
15305210
,
25515617
,
4542480
,
10453892
,
6577524
,
9145645
,
-
6443880
},
FieldElement
{
5974874
,
3053895
,
-
9433049
,
-
10385191
,
-
31865124
,
3225009
,
-
7972642
,
3936128
,
-
5652273
,
-
3050304
},
},
{
FieldElement
{
30625386
,
-
4729400
,
-
25555961
,
-
12792866
,
-
20484575
,
7695099
,
17097188
,
-
16303496
,
-
27999779
,
1803632
},
FieldElement
{
-
3553091
,
9865099
,
-
5228566
,
4272701
,
-
5673832
,
-
16689700
,
14911344
,
12196514
,
-
21405489
,
7047412
},
FieldElement
{
20093277
,
9920966
,
-
11138194
,
-
5343857
,
13161587
,
12044805
,
-
32856851
,
4124601
,
-
32343828
,
-
10257566
},
},
{
FieldElement
{
-
20788824
,
14084654
,
-
13531713
,
7842147
,
19119038
,
-
13822605
,
4752377
,
-
8714640
,
-
21679658
,
2288038
},
FieldElement
{
-
26819236
,
-
3283715
,
29965059
,
3039786
,
-
14473765
,
2540457
,
29457502
,
14625692
,
-
24819617
,
12570232
},
FieldElement
{
-
1063558
,
-
11551823
,
16920318
,
12494842
,
1278292
,
-
5869109
,
-
21159943
,
-
3498680
,
-
11974704
,
4724943
},
},
{
FieldElement
{
17960970
,
-
11775534
,
-
4140968
,
-
9702530
,
-
8876562
,
-
1410617
,
-
12907383
,
-
8659932
,
-
29576300
,
1903856
},
FieldElement
{
23134274
,
-
14279132
,
-
10681997
,
-
1611936
,
20684485
,
15770816
,
-
12989750
,
3190296
,
26955097
,
14109738
},
FieldElement
{
15308788
,
5320727
,
-
30113809
,
-
14318877
,
22902008
,
7767164
,
29425325
,
-
11277562
,
31960942
,
11934971
},
},
{
FieldElement
{
-
27395711
,
8435796
,
4109644
,
12222639
,
-
24627868
,
14818669
,
20638173
,
4875028
,
10491392
,
1379718
},
FieldElement
{
-
13159415
,
9197841
,
3875503
,
-
8936108
,
-
1383712
,
-
5879801
,
33518459
,
16176658
,
21432314
,
12180697
},
FieldElement
{
-
11787308
,
11500838
,
13787581
,
-
13832590
,
-
22430679
,
10140205
,
1465425
,
12689540
,
-
10301319
,
-
13872883
},
},
},
{
{
FieldElement
{
5414091
,
-
15386041
,
-
21007664
,
9643570
,
12834970
,
1186149
,
-
2622916
,
-
1342231
,
26128231
,
6032912
},
FieldElement
{
-
26337395
,
-
13766162
,
32496025
,
-
13653919
,
17847801
,
-
12669156
,
3604025
,
8316894
,
-
25875034
,
-
10437358
},
FieldElement
{
3296484
,
6223048
,
24680646
,
-
12246460
,
-
23052020
,
5903205
,
-
8862297
,
-
4639164
,
12376617
,
3188849
},
},
{
FieldElement
{
29190488
,
-
14659046
,
27549113
,
-
1183516
,
3520066
,
-
10697301
,
32049515
,
-
7309113
,
-
16109234
,
-
9852307
},
FieldElement
{
-
14744486
,
-
9309156
,
735818
,
-
598978
,
-
20407687
,
-
5057904
,
25246078
,
-
15795669
,
18640741
,
-
960977
},
FieldElement
{
-
6928835
,
-
16430795
,
10361374
,
5642961
,
4910474
,
12345252
,
-
31638386
,
-
494430
,
10530747
,
1053335
},
},
{
FieldElement
{
-
29265967
,
-
14186805
,
-
13538216
,
-
12117373
,
-
19457059
,
-
10655384
,
-
31462369
,
-
2948985
,
24018831
,
15026644
},
FieldElement
{
-
22592535
,
-
3145277
,
-
2289276
,
5953843
,
-
13440189
,
9425631
,
25310643
,
13003497
,
-
2314791
,
-
15145616
},
FieldElement
{
-
27419985
,
-
603321
,
-
8043984
,
-
1669117
,
-
26092265
,
13987819
,
-
27297622
,
187899
,
-
23166419
,
-
2531735
},
},
{
FieldElement
{
-
21744398
,
-
13810475
,
1844840
,
5021428
,
-
10434399
,
-
15911473
,
9716667
,
16266922
,
-
5070217
,
726099
},
FieldElement
{
29370922
,
-
6053998
,
7334071
,
-
15342259
,
9385287
,
2247707
,
-
13661962
,
-
4839461
,
30007388
,
-
15823341
},
FieldElement
{
-
936379
,
16086691
,
23751945
,
-
543318
,
-
1167538
,
-
5189036
,
9137109
,
730663
,
9835848
,
4555336
},
},
{
FieldElement
{
-
23376435
,
1410446
,
-
22253753
,
-
12899614
,
30867635
,
15826977
,
17693930
,
544696
,
-
11985298
,
12422646
},
FieldElement
{
31117226
,
-
12215734
,
-
13502838
,
6561947
,
-
9876867
,
-
12757670
,
-
5118685
,
-
4096706
,
29120153
,
13924425
},
FieldElement
{
-
17400879
,
-
14233209
,
19675799
,
-
2734756
,
-
11006962
,
-
5858820
,
-
9383939
,
-
11317700
,
7240931
,
-
237388
},
},
{
FieldElement
{
-
31361739
,
-
11346780
,
-
15007447
,
-
5856218
,
-
22453340
,
-
12152771
,
1222336
,
4389483
,
3293637
,
-
15551743
},
FieldElement
{
-
16684801
,
-
14444245
,
11038544
,
11054958
,
-
13801175
,
-
3338533
,
-
24319580
,
7733547
,
12796905
,
-
6335822
},
FieldElement
{
-
8759414
,
-
10817836
,
-
25418864
,
10783769
,
-
30615557
,
-
9746811
,
-
28253339
,
3647836
,
3222231
,
-
11160462
},
},
{
FieldElement
{
18606113
,
1693100
,
-
25448386
,
-
15170272
,
4112353
,
10045021
,
23603893
,
-
2048234
,
-
7550776
,
2484985
},
FieldElement
{
9255317
,
-
3131197
,
-
12156162
,
-
1004256
,
13098013
,
-
9214866
,
16377220
,
-
2102812
,
-
19802075
,
-
3034702
},
FieldElement
{
-
22729289
,
7496160
,
-
5742199
,
11329249
,
19991973
,
-
3347502
,
-
31718148
,
9936966
,
-
30097688
,
-
10618797
},
},
{
FieldElement
{
21878590
,
-
5001297
,
4338336
,
13643897
,
-
3036865
,
13160960
,
19708896
,
5415497
,
-
7360503
,
-
4109293
},
FieldElement
{
27736861
,
10103576
,
12500508
,
8502413
,
-
3413016
,
-
9633558
,
10436918
,
-
1550276
,
-
23659143
,
-
8132100
},
FieldElement
{
19492550
,
-
12104365
,
-
29681976
,
-
852630
,
-
3208171
,
12403437
,
30066266
,
8367329
,
13243957
,
8709688
},
},
},
{
{
FieldElement
{
12015105
,
2801261
,
28198131
,
10151021
,
24818120
,
-
4743133
,
-
11194191
,
-
5645734
,
5150968
,
7274186
},
FieldElement
{
2831366
,
-
12492146
,
1478975
,
6122054
,
23825128
,
-
12733586
,
31097299
,
6083058
,
31021603
,
-
9793610
},
FieldElement
{
-
2529932
,
-
2229646
,
445613
,
10720828
,
-
13849527
,
-
11505937
,
-
23507731
,
16354465
,
15067285
,
-
14147707
},
},
{
FieldElement
{
7840942
,
14037873
,
-
33364863
,
15934016
,
-
728213
,
-
3642706
,
21403988
,
1057586
,
-
19379462
,
-
12403220
},
FieldElement
{
915865
,
-
16469274
,
15608285
,
-
8789130
,
-
24357026
,
6060030
,
-
17371319
,
8410997
,
-
7220461
,
16527025
},
FieldElement
{
32922597
,
-
556987
,
20336074
,
-
16184568
,
10903705
,
-
5384487
,
16957574
,
52992
,
23834301
,
6588044
},
},
{
FieldElement
{
32752030
,
11232950
,
3381995
,
-
8714866
,
22652988
,
-
10744103
,
17159699
,
16689107
,
-
20314580
,
-
1305992
},
FieldElement
{
-
4689649
,
9166776
,
-
25710296
,
-
10847306
,
11576752
,
12733943
,
7924251
,
-
2752281
,
1976123
,
-
7249027
},
FieldElement
{
21251222
,
16309901
,
-
2983015
,
-
6783122
,
30810597
,
12967303
,
156041
,
-
3371252
,
12331345
,
-
8237197
},
},
{
FieldElement
{
8651614
,
-
4477032
,
-
16085636
,
-
4996994
,
13002507
,
2950805
,
29054427
,
-
5106970
,
10008136
,
-
4667901
},
FieldElement
{
31486080
,
15114593
,
-
14261250
,
12951354
,
14369431
,
-
7387845
,
16347321
,
-
13662089
,
8684155
,
-
10532952
},
FieldElement
{
19443825
,
11385320
,
24468943
,
-
9659068
,
-
23919258
,
2187569
,
-
26263207
,
-
6086921
,
31316348
,
14219878
},
},
{
FieldElement
{
-
28594490
,
1193785
,
32245219
,
11392485
,
31092169
,
15722801
,
27146014
,
6992409
,
29126555
,
9207390
},
FieldElement
{
32382935
,
1110093
,
18477781
,
11028262
,
-
27411763
,
-
7548111
,
-
4980517
,
10843782
,
-
7957600
,
-
14435730
},
FieldElement
{
2814918
,
7836403
,
27519878
,
-
7868156
,
-
20894015
,
-
11553689
,
-
21494559
,
8550130
,
28346258
,
1994730
},
},
{
FieldElement
{
-
19578299
,
8085545
,
-
14000519
,
-
3948622
,
2785838
,
-
16231307
,
-
19516951
,
7174894
,
22628102
,
8115180
},
FieldElement
{
-
30405132
,
955511
,
-
11133838
,
-
15078069
,
-
32447087
,
-
13278079
,
-
25651578
,
3317160
,
-
9943017
,
930272
},
FieldElement
{
-
15303681
,
-
6833769
,
28856490
,
1357446
,
23421993
,
1057177
,
24091212
,
-
1388970
,
-
22765376
,
-
10650715
},
},
{
FieldElement
{
-
22751231
,
-
5303997
,
-
12907607
,
-
12768866
,
-
15811511
,
-
7797053
,
-
14839018
,
-
16554220
,
-
1867018
,
8398970
},
FieldElement
{
-
31969310
,
2106403
,
-
4736360
,
1362501
,
12813763
,
16200670
,
22981545
,
-
6291273
,
18009408
,
-
15772772
},
FieldElement
{
-
17220923
,
-
9545221
,
-
27784654
,
14166835
,
29815394
,
7444469
,
29551787
,
-
3727419
,
19288549
,
1325865
},
},
{
FieldElement
{
15100157
,
-
15835752
,
-
23923978
,
-
1005098
,
-
26450192
,
15509408
,
12376730
,
-
3479146
,
33166107
,
-
8042750
},
FieldElement
{
20909231
,
13023121
,
-
9209752
,
16251778
,
-
5778415
,
-
8094914
,
12412151
,
10018715
,
2213263
,
-
13878373
},
FieldElement
{
32529814
,
-
11074689
,
30361439
,
-
16689753
,
-
9135940
,
1513226
,
22922121
,
6382134
,
-
5766928
,
8371348
},
},
},
{
{
FieldElement
{
9923462
,
11271500
,
12616794
,
3544722
,
-
29998368
,
-
1721626
,
12891687
,
-
8193132
,
-
26442943
,
10486144
},
FieldElement
{
-
22597207
,
-
7012665
,
8587003
,
-
8257861
,
4084309
,
-
12970062
,
361726
,
2610596
,
-
23921530
,
-
11455195
},
FieldElement
{
5408411
,
-
1136691
,
-
4969122
,
10561668
,
24145918
,
14240566
,
31319731
,
-
4235541
,
19985175
,
-
3436086
},
},
{
FieldElement
{
-
13994457
,
16616821
,
14549246
,
3341099
,
32155958
,
13648976
,
-
17577068
,
8849297
,
65030
,
8370684
},
FieldElement
{
-
8320926
,
-
12049626
,
31204563
,
5839400
,
-
20627288
,
-
1057277
,
-
19442942
,
6922164
,
12743482
,
-
9800518
},
FieldElement
{
-
2361371
,
12678785
,
28815050
,
4759974
,
-
23893047
,
4884717
,
23783145
,
11038569
,
18800704
,
255233
},
},
{
FieldElement
{
-
5269658
,
-
1773886
,
13957886
,
7990715
,
23132995
,
728773
,
13393847
,
9066957
,
19258688
,
-
14753793
},
FieldElement
{
-
2936654
,
-
10827535
,
-
10432089
,
14516793
,
-
3640786
,
4372541
,
-
31934921
,
2209390
,
-
1524053
,
2055794
},
FieldElement
{
580882
,
16705327
,
5468415
,
-
2683018
,
-
30926419
,
-
14696000
,
-
7203346
,
-
8994389
,
-
30021019
,
7394435
},
},
{
FieldElement
{
23838809
,
1822728
,
-
15738443
,
15242727
,
8318092
,
-
3733104
,
-
21672180
,
-
3492205
,
-
4821741
,
14799921
},
FieldElement
{
13345610
,
9759151
,
3371034
,
-
16137791
,
16353039
,
8577942
,
31129804
,
13496856
,
-
9056018
,
7402518
},
FieldElement
{
2286874
,
-
4435931
,
-
20042458
,
-
2008336
,
-
13696227
,
5038122
,
11006906
,
-
15760352
,
8205061
,
1607563
},
},
{
FieldElement
{
14414086
,
-
8002132
,
3331830
,
-
3208217
,
22249151
,
-
5594188
,
18364661
,
-
2906958
,
30019587
,
-
9029278
},
FieldElement
{
-
27688051
,
1585953
,
-
10775053
,
931069
,
-
29120221
,
-
11002319
,
-
14410829
,
12029093
,
9944378
,
8024
},
FieldElement
{
4368715
,
-
3709630
,
29874200
,
-
15022983
,
-
20230386
,
-
11410704
,
-
16114594
,
-
999085
,
-
8142388
,
5640030
},
},
{
FieldElement
{
10299610
,
13746483
,
11661824
,
16234854
,
7630238
,
5998374
,
9809887
,
-
16694564
,
15219798
,
-
14327783
},
FieldElement
{
27425505
,
-
5719081
,
3055006
,
10660664
,
23458024
,
595578
,
-
15398605
,
-
1173195
,
-
18342183
,
9742717
},
FieldElement
{
6744077
,
2427284
,
26042789
,
2720740
,
-
847906
,
1118974
,
32324614
,
7406442
,
12420155
,
1994844
},
},
{
FieldElement
{
14012521
,
-
5024720
,
-
18384453
,
-
9578469
,
-
26485342
,
-
3936439
,
-
13033478
,
-
10909803
,
24319929
,
-
6446333
},
FieldElement
{
16412690
,
-
4507367
,
10772641
,
15929391
,
-
17068788
,
-
4658621
,
10555945
,
-
10484049
,
-
30102368
,
-
4739048
},
FieldElement
{
22397382
,
-
7767684
,
-
9293161
,
-
12792868
,
17166287
,
-
9755136
,
-
27333065
,
6199366
,
21880021
,
-
12250760
},
},
{
FieldElement
{
-
4283307
,
5368523
,
-
31117018
,
8163389
,
-
30323063
,
3209128
,
16557151
,
8890729
,
8840445
,
4957760
},
FieldElement
{
-
15447727
,
709327
,
-
6919446
,
-
10870178
,
-
29777922
,
6522332
,
-
21720181
,
12130072
,
-
14796503
,
5005757
},
FieldElement
{
-
2114751
,
-
14308128
,
23019042
,
15765735
,
-
25269683
,
6002752
,
10183197
,
-
13239326
,
-
16395286
,
-
2176112
},
},
},
{
{
FieldElement
{
-
19025756
,
1632005
,
13466291
,
-
7995100
,
-
23640451
,
16573537
,
-
32013908
,
-
3057104
,
22208662
,
2000468
},
FieldElement
{
3065073
,
-
1412761
,
-
25598674
,
-
361432
,
-
17683065
,
-
5703415
,
-
8164212
,
11248527
,
-
3691214
,
-
7414184
},
FieldElement
{
10379208
,
-
6045554
,
8877319
,
1473647
,
-
29291284
,
-
12507580
,
16690915
,
2553332
,
-
3132688
,
16400289
},
},
{
FieldElement
{
15716668
,
1254266
,
-
18472690
,
7446274
,
-
8448918
,
6344164
,
-
22097271
,
-
7285580
,
26894937
,
9132066
},
FieldElement
{
24158887
,
12938817
,
11085297
,
-
8177598
,
-
28063478
,
-
4457083
,
-
30576463
,
64452
,
-
6817084
,
-
2692882
},
FieldElement
{
13488534
,
7794716
,
22236231
,
5989356
,
25426474
,
-
12578208
,
2350710
,
-
3418511
,
-
4688006
,
2364226
},
},
{
FieldElement
{
16335052
,
9132434
,
25640582
,
6678888
,
1725628
,
8517937
,
-
11807024
,
-
11697457
,
15445875
,
-
7798101
},
FieldElement
{
29004207
,
-
7867081
,
28661402
,
-
640412
,
-
12794003
,
-
7943086
,
31863255
,
-
4135540
,
-
278050
,
-
15759279
},
FieldElement
{
-
6122061
,
-
14866665
,
-
28614905
,
14569919
,
-
10857999
,
-
3591829
,
10343412
,
-
6976290
,
-
29828287
,
-
10815811
},
},
{
FieldElement
{
27081650
,
3463984
,
14099042
,
-
4517604
,
1616303
,
-
6205604
,
29542636
,
15372179
,
17293797
,
960709
},
FieldElement
{
20263915
,
11434237
,
-
5765435
,
11236810
,
13505955
,
-
10857102
,
-
16111345
,
6493122
,
-
19384511
,
7639714
},
FieldElement
{
-
2830798
,
-
14839232
,
25403038
,
-
8215196
,
-
8317012
,
-
16173699
,
18006287
,
-
16043750
,
29994677
,
-
15808121
},
},
{
FieldElement
{
9769828
,
5202651
,
-
24157398
,
-
13631392
,
-
28051003
,
-
11561624
,
-
24613141
,
-
13860782
,
-
31184575
,
709464
},
FieldElement
{
12286395
,
13076066
,
-
21775189
,
-
1176622
,
-
25003198
,
4057652
,
-
32018128
,
-
8890874
,
16102007
,
13205847
},
FieldElement
{
13733362
,
5599946
,
10557076
,
3195751
,
-
5557991
,
8536970
,
-
25540170
,
8525972
,
10151379
,
10394400
},
},
{
FieldElement
{
4024660
,
-
16137551
,
22436262
,
12276534
,
-
9099015
,
-
2686099
,
19698229
,
11743039
,
-
33302334
,
8934414
},
FieldElement
{
-
15879800
,
-
4525240
,
-
8580747
,
-
2934061
,
14634845
,
-
698278
,
-
9449077
,
3137094
,
-
11536886
,
11721158
},
FieldElement
{
17555939
,
-
5013938
,
8268606
,
2331751
,
-
22738815
,
9761013
,
9319229
,
8835153
,
-
9205489
,
-
1280045
},
},
{
FieldElement
{
-
461409
,
-
7830014
,
20614118
,
16688288
,
-
7514766
,
-
4807119
,
22300304
,
505429
,
6108462
,
-
6183415
},
FieldElement
{
-
5070281
,
12367917
,
-
30663534
,
3234473
,
32617080
,
-
8422642
,
29880583
,
-
13483331
,
-
26898490
,
-
7867459
},
FieldElement
{
-
31975283
,
5726539
,
26934134
,
10237677
,
-
3173717
,
-
605053
,
24199304
,
3795095
,
7592688
,
-
14992079
},
},
{
FieldElement
{
21594432
,
-
14964228
,
17466408
,
-
4077222
,
32537084
,
2739898
,
6407723
,
12018833
,
-
28256052
,
4298412
},
FieldElement
{
-
20650503
,
-
11961496
,
-
27236275
,
570498
,
3767144
,
-
1717540
,
13891942
,
-
1569194
,
13717174
,
10805743
},
FieldElement
{
-
14676630
,
-
15644296
,
15287174
,
11927123
,
24177847
,
-
8175568
,
-
796431
,
14860609
,
-
26938930
,
-
5863836
},
},
},
{
{
FieldElement
{
12962541
,
5311799
,
-
10060768
,
11658280
,
18855286
,
-
7954201
,
13286263
,
-
12808704
,
-
4381056
,
9882022
},
FieldElement
{
18512079
,
11319350
,
-
20123124
,
15090309
,
18818594
,
5271736
,
-
22727904
,
3666879
,
-
23967430
,
-
3299429
},
FieldElement
{
-
6789020
,
-
3146043
,
16192429
,
13241070
,
15898607
,
-
14206114
,
-
10084880
,
-
6661110
,
-
2403099
,
5276065
},
},
{
FieldElement
{
30169808
,
-
5317648
,
26306206
,
-
11750859
,
27814964
,
7069267
,
7152851
,
3684982
,
1449224
,
13082861
},
FieldElement
{
10342826
,
3098505
,
2119311
,
193222
,
25702612
,
12233820
,
23697382
,
15056736
,
-
21016438
,
-
8202000
},
FieldElement
{
-
33150110
,
3261608
,
22745853
,
7948688
,
19370557
,
-
15177665
,
-
26171976
,
6482814
,
-
10300080
,
-
11060101
},
},
{
FieldElement
{
32869458
,
-
5408545
,
25609743
,
15678670
,
-
10687769
,
-
15471071
,
26112421
,
2521008
,
-
22664288
,
6904815
},
FieldElement
{
29506923
,
4457497
,
3377935
,
-
9796444
,
-
30510046
,
12935080
,
1561737
,
3841096
,
-
29003639
,
-
6657642
},
FieldElement
{
10340844
,
-
6630377
,
-
18656632
,
-
2278430
,
12621151
,
-
13339055
,
30878497
,
-
11824370
,
-
25584551
,
5181966
},
},
{
FieldElement
{
25940115
,
-
12658025
,
17324188
,
-
10307374
,
-
8671468
,
15029094
,
24396252
,
-
16450922
,
-
2322852
,
-
12388574
},
FieldElement
{
-
21765684
,
9916823
,
-
1300409
,
4079498
,
-
1028346
,
11909559
,
1782390
,
12641087
,
20603771
,
-
6561742
},
FieldElement
{
-
18882287
,
-
11673380
,
24849422
,
11501709
,
13161720
,
-
4768874
,
1925523
,
11914390
,
4662781
,
7820689
},
},
{
FieldElement
{
12241050
,
-
425982
,
8132691
,
9393934
,
32846760
,
-
1599620
,
29749456
,
12172924
,
16136752
,
15264020
},
FieldElement
{
-
10349955
,
-
14680563
,
-
8211979
,
2330220
,
-
17662549
,
-
14545780
,
10658213
,
6671822
,
19012087
,
3772772
},
FieldElement
{
3753511
,
-
3421066
,
10617074
,
2028709
,
14841030
,
-
6721664
,
28718732
,
-
15762884
,
20527771
,
12988982
},
},
{
FieldElement
{
-
14822485
,
-
5797269
,
-
3707987
,
12689773
,
-
898983
,
-
10914866
,
-
24183046
,
-
10564943
,
3299665
,
-
12424953
},
FieldElement
{
-
16777703
,
-
15253301
,
-
9642417
,
4978983
,
3308785
,
8755439
,
6943197
,
6461331
,
-
25583147
,
8991218
},
FieldElement
{
-
17226263
,
1816362
,
-
1673288
,
-
6086439
,
31783888
,
-
8175991
,
-
32948145
,
7417950
,
-
30242287
,
1507265
},
},
{
FieldElement
{
29692663
,
6829891
,
-
10498800
,
4334896
,
20945975
,
-
11906496
,
-
28887608
,
8209391
,
14606362
,
-
10647073
},
FieldElement
{
-
3481570
,
8707081
,
32188102
,
5672294
,
22096700
,
1711240
,
-
33020695
,
9761487
,
4170404
,
-
2085325
},
FieldElement
{
-
11587470
,
14855945
,
-
4127778
,
-
1531857
,
-
26649089
,
15084046
,
22186522
,
16002000
,
-
14276837
,
-
8400798
},
},
{
FieldElement
{
-
4811456
,
13761029
,
-
31703877
,
-
2483919
,
-
3312471
,
7869047
,
-
7113572
,
-
9620092
,
13240845
,
10965870
},
FieldElement
{
-
7742563
,
-
8256762
,
-
14768334
,
-
13656260
,
-
23232383
,
12387166
,
4498947
,
14147411
,
29514390
,
4302863
},
FieldElement
{
-
13413405
,
-
12407859
,
20757302
,
-
13801832
,
14785143
,
8976368
,
-
5061276
,
-
2144373
,
17846988
,
-
13971927
},
},
},
{
{
FieldElement
{
-
2244452
,
-
754728
,
-
4597030
,
-
1066309
,
-
6247172
,
1455299
,
-
21647728
,
-
9214789
,
-
5222701
,
12650267
},
FieldElement
{
-
9906797
,
-
16070310
,
21134160
,
12198166
,
-
27064575
,
708126
,
387813
,
13770293
,
-
19134326
,
10958663
},
FieldElement
{
22470984
,
12369526
,
23446014
,
-
5441109
,
-
21520802
,
-
9698723
,
-
11772496
,
-
11574455
,
-
25083830
,
4271862
},
},
{
FieldElement
{
-
25169565
,
-
10053642
,
-
19909332
,
15361595
,
-
5984358
,
2159192
,
75375
,
-
4278529
,
-
32526221
,
8469673
},
FieldElement
{
15854970
,
4148314
,
-
8893890
,
7259002
,
11666551
,
13824734
,
-
30531198
,
2697372
,
24154791
,
-
9460943
},
FieldElement
{
15446137
,
-
15806644
,
29759747
,
14019369
,
30811221
,
-
9610191
,
-
31582008
,
12840104
,
24913809
,
9815020
},
},
{
FieldElement
{
-
4709286
,
-
5614269
,
-
31841498
,
-
12288893
,
-
14443537
,
10799414
,
-
9103676
,
13438769
,
18735128
,
9466238
},
FieldElement
{
11933045
,
9281483
,
5081055
,
-
5183824
,
-
2628162
,
-
4905629
,
-
7727821
,
-
10896103
,
-
22728655
,
16199064
},
FieldElement
{
14576810
,
379472
,
-
26786533
,
-
8317236
,
-
29426508
,
-
10812974
,
-
102766
,
1876699
,
30801119
,
2164795
},
},
{
FieldElement
{
15995086
,
3199873
,
13672555
,
13712240
,
-
19378835
,
-
4647646
,
-
13081610
,
-
15496269
,
-
13492807
,
1268052
},
FieldElement
{
-
10290614
,
-
3659039
,
-
3286592
,
10948818
,
23037027
,
3794475
,
-
3470338
,
-
12600221
,
-
17055369
,
3565904
},
FieldElement
{
29210088
,
-
9419337
,
-
5919792
,
-
4952785
,
10834811
,
-
13327726
,
-
16512102
,
-
10820713
,
-
27162222
,
-
14030531
},
},
{
FieldElement
{
-
13161890
,
15508588
,
16663704
,
-
8156150
,
-
28349942
,
9019123
,
-
29183421
,
-
3769423
,
2244111
,
-
14001979
},
FieldElement
{
-
5152875
,
-
3800936
,
-
9306475
,
-
6071583
,
16243069
,
14684434
,
-
25673088
,
-
16180800
,
13491506
,
4641841
},
FieldElement
{
10813417
,
643330
,
-
19188515
,
-
728916
,
30292062
,
-
16600078
,
27548447
,
-
7721242
,
14476989
,
-
12767431
},
},
{
FieldElement
{
10292079
,
9984945
,
6481436
,
8279905
,
-
7251514
,
7032743
,
27282937
,
-
1644259
,
-
27912810
,
12651324
},
FieldElement
{
-
31185513
,
-
813383
,
22271204
,
11835308
,
10201545
,
15351028
,
17099662
,
3988035
,
21721536
,
-
3148940
},
FieldElement
{
10202177
,
-
6545839
,
-
31373232
,
-
9574638
,
-
32150642
,
-
8119683
,
-
12906320
,
3852694
,
13216206
,
14842320
},
},
{
FieldElement
{
-
15815640
,
-
10601066
,
-
6538952
,
-
7258995
,
-
6984659
,
-
6581778
,
-
31500847
,
13765824
,
-
27434397
,
9900184
},
FieldElement
{
14465505
,
-
13833331
,
-
32133984
,
-
14738873
,
-
27443187
,
12990492
,
33046193
,
15796406
,
-
7051866
,
-
8040114
},
FieldElement
{
30924417
,
-
8279620
,
6359016
,
-
12816335
,
16508377
,
9071735
,
-
25488601
,
15413635
,
9524356
,
-
7018878
},
},
{
FieldElement
{
12274201
,
-
13175547
,
32627641
,
-
1785326
,
6736625
,
13267305
,
5237659
,
-
5109483
,
15663516
,
4035784
},
FieldElement
{
-
2951309
,
8903985
,
17349946
,
601635
,
-
16432815
,
-
4612556
,
-
13732739
,
-
15889334
,
-
22258478
,
4659091
},
FieldElement
{
-
16916263
,
-
4952973
,
-
30393711
,
-
15158821
,
20774812
,
15897498
,
5736189
,
15026997
,
-
2178256
,
-
13455585
},
},
},
{
{
FieldElement
{
-
8858980
,
-
2219056
,
28571666
,
-
10155518
,
-
474467
,
-
10105698
,
-
3801496
,
278095
,
23440562
,
-
290208
},
FieldElement
{
10226241
,
-
5928702
,
15139956
,
120818
,
-
14867693
,
5218603
,
32937275
,
11551483
,
-
16571960
,
-
7442864
},
FieldElement
{
17932739
,
-
12437276
,
-
24039557
,
10749060
,
11316803
,
7535897
,
22503767
,
5561594
,
-
3646624
,
3898661
},
},
{
FieldElement
{
7749907
,
-
969567
,
-
16339731
,
-
16464
,
-
25018111
,
15122143
,
-
1573531
,
7152530
,
21831162
,
1245233
},
FieldElement
{
26958459
,
-
14658026
,
4314586
,
8346991
,
-
5677764
,
11960072
,
-
32589295
,
-
620035
,
-
30402091
,
-
16716212
},
FieldElement
{
-
12165896
,
9166947
,
33491384
,
13673479
,
29787085
,
13096535
,
6280834
,
14587357
,
-
22338025
,
13987525
},
},
{
FieldElement
{
-
24349909
,
7778775
,
21116000
,
15572597
,
-
4833266
,
-
5357778
,
-
4300898
,
-
5124639
,
-
7469781
,
-
2858068
},
FieldElement
{
9681908
,
-
6737123
,
-
31951644
,
13591838
,
-
6883821
,
386950
,
31622781
,
6439245
,
-
14581012
,
4091397
},
FieldElement
{
-
8426427
,
1470727
,
-
28109679
,
-
1596990
,
3978627
,
-
5123623
,
-
19622683
,
12092163
,
29077877
,
-
14741988
},
},
{
FieldElement
{
5269168
,
-
6859726
,
-
13230211
,
-
8020715
,
25932563
,
1763552
,
-
5606110
,
-
5505881
,
-
20017847
,
2357889
},
FieldElement
{
32264008
,
-
15407652
,
-
5387735
,
-
1160093
,
-
2091322
,
-
3946900
,
23104804
,
-
12869908
,
5727338
,
189038
},
FieldElement
{
14609123
,
-
8954470
,
-
6000566
,
-
16622781
,
-
14577387
,
-
7743898
,
-
26745169
,
10942115
,
-
25888931
,
-
14884697
},
},
{
FieldElement
{
20513500
,
5557931
,
-
15604613
,
7829531
,
26413943
,
-
2019404
,
-
21378968
,
7471781
,
13913677
,
-
5137875
},
FieldElement
{
-
25574376
,
11967826
,
29233242
,
12948236
,
-
6754465
,
4713227
,
-
8940970
,
14059180
,
12878652
,
8511905
},
FieldElement
{
-
25656801
,
3393631
,
-
2955415
,
-
7075526
,
-
2250709
,
9366908
,
-
30223418
,
6812974
,
5568676
,
-
3127656
},
},
{
FieldElement
{
11630004
,
12144454
,
2116339
,
13606037
,
27378885
,
15676917
,
-
17408753
,
-
13504373
,
-
14395196
,
8070818
},
FieldElement
{
27117696
,
-
10007378
,
-
31282771
,
-
5570088
,
1127282
,
12772488
,
-
29845906
,
10483306
,
-
11552749
,
-
1028714
},
FieldElement
{
10637467
,
-
5688064
,
5674781
,
1072708
,
-
26343588
,
-
6982302
,
-
1683975
,
9177853
,
-
27493162
,
15431203
},
},
{
FieldElement
{
20525145
,
10892566
,
-
12742472
,
12779443
,
-
29493034
,
16150075
,
-
28240519
,
14943142
,
-
15056790
,
-
7935931
},
FieldElement
{
-
30024462
,
5626926
,
-
551567
,
-
9981087
,
753598
,
11981191
,
25244767
,
-
3239766
,
-
3356550
,
9594024
},
FieldElement
{
-
23752644
,
2636870
,
-
5163910
,
-
10103818
,
585134
,
7877383
,
11345683
,
-
6492290
,
13352335
,
-
10977084
},
},
{
FieldElement
{
-
1931799
,
-
5407458
,
3304649
,
-
12884869
,
17015806
,
-
4877091
,
-
29783850
,
-
7752482
,
-
13215537
,
-
319204
},
FieldElement
{
20239939
,
6607058
,
6203985
,
3483793
,
-
18386976
,
-
779229
,
-
20723742
,
15077870
,
-
22750759
,
14523817
},
FieldElement
{
27406042
,
-
6041657
,
27423596
,
-
4497394
,
4996214
,
10002360
,
-
28842031
,
-
4545494
,
-
30172742
,
-
4805667
},
},
},
{
{
FieldElement
{
11374242
,
12660715
,
17861383
,
-
12540833
,
10935568
,
1099227
,
-
13886076
,
-
9091740
,
-
27727044
,
11358504
},
FieldElement
{
-
12730809
,
10311867
,
1510375
,
10778093
,
-
2119455
,
-
9145702
,
32676003
,
11149336
,
-
26123651
,
4985768
},
FieldElement
{
-
19096303
,
341147
,
-
6197485
,
-
239033
,
15756973
,
-
8796662
,
-
983043
,
13794114
,
-
19414307
,
-
15621255
},
},
{
FieldElement
{
6490081
,
11940286
,
25495923
,
-
7726360
,
8668373
,
-
8751316
,
3367603
,
6970005
,
-
1691065
,
-
9004790
},
FieldElement
{
1656497
,
13457317
,
15370807
,
6364910
,
13605745
,
8362338
,
-
19174622
,
-
5475723
,
-
16796596
,
-
5031438
},
FieldElement
{
-
22273315
,
-
13524424
,
-
64685
,
-
4334223
,
-
18605636
,
-
10921968
,
-
20571065
,
-
7007978
,
-
99853
,
-
10237333
},
},
{
FieldElement
{
17747465
,
10039260
,
19368299
,
-
4050591
,
-
20630635
,
-
16041286
,
31992683
,
-
15857976
,
-
29260363
,
-
5511971
},
FieldElement
{
31932027
,
-
4986141
,
-
19612382
,
16366580
,
22023614
,
88450
,
11371999
,
-
3744247
,
4882242
,
-
10626905
},
FieldElement
{
29796507
,
37186
,
19818052
,
10115756
,
-
11829032
,
3352736
,
18551198
,
3272828
,
-
5190932
,
-
4162409
},
},
{
FieldElement
{
12501286
,
4044383
,
-
8612957
,
-
13392385
,
-
32430052
,
5136599
,
-
19230378
,
-
3529697
,
330070
,
-
3659409
},
FieldElement
{
6384877
,
2899513
,
17807477
,
7663917
,
-
2358888
,
12363165
,
25366522
,
-
8573892
,
-
271295
,
12071499
},
FieldElement
{
-
8365515
,
-
4042521
,
25133448
,
-
4517355
,
-
6211027
,
2265927
,
-
32769618
,
1936675
,
-
5159697
,
3829363
},
},
{
FieldElement
{
28425966
,
-
5835433
,
-
577090
,
-
4697198
,
-
14217555
,
6870930
,
7921550
,
-
6567787
,
26333140
,
14267664
},
FieldElement
{
-
11067219
,
11871231
,
27385719
,
-
10559544
,
-
4585914
,
-
11189312
,
10004786
,
-
8709488
,
-
21761224
,
8930324
},
FieldElement
{
-
21197785
,
-
16396035
,
25654216
,
-
1725397
,
12282012
,
11008919
,
1541940
,
4757911
,
-
26491501
,
-
16408940
},
},
{
FieldElement
{
13537262
,
-
7759490
,
-
20604840
,
10961927
,
-
5922820
,
-
13218065
,
-
13156584
,
6217254
,
-
15943699
,
13814990
},
FieldElement
{
-
17422573
,
15157790
,
18705543
,
29619
,
24409717
,
-
260476
,
27361681
,
9257833
,
-
1956526
,
-
1776914
},
FieldElement
{
-
25045300
,
-
10191966
,
15366585
,
15166509
,
-
13105086
,
8423556
,
-
29171540
,
12361135
,
-
18685978
,
4578290
},
},
{
FieldElement
{
24579768
,
3711570
,
1342322
,
-
11180126
,
-
27005135
,
14124956
,
-
22544529
,
14074919
,
21964432
,
8235257
},
FieldElement
{
-
6528613
,
-
2411497
,
9442966
,
-
5925588
,
12025640
,
-
1487420
,
-
2981514
,
-
1669206
,
13006806
,
2355433
},
FieldElement
{
-
16304899
,
-
13605259
,
-
6632427
,
-
5142349
,
16974359
,
-
10911083
,
27202044
,
1719366
,
1141648
,
-
12796236
},
},
{
FieldElement
{
-
12863944
,
-
13219986
,
-
8318266
,
-
11018091
,
-
6810145
,
-
4843894
,
13475066
,
-
3133972
,
32674895
,
13715045
},
FieldElement
{
11423335
,
-
5468059
,
32344216
,
8962751
,
24989809
,
9241752
,
-
13265253
,
16086212
,
-
28740881
,
-
15642093
},
FieldElement
{
-
1409668
,
12530728
,
-
6368726
,
10847387
,
19531186
,
-
14132160
,
-
11709148
,
7791794
,
-
27245943
,
4383347
},
},
},
{
{
FieldElement
{
-
28970898
,
5271447
,
-
1266009
,
-
9736989
,
-
12455236
,
16732599
,
-
4862407
,
-
4906449
,
27193557
,
6245191
},
FieldElement
{
-
15193956
,
5362278
,
-
1783893
,
2695834
,
4960227
,
12840725
,
23061898
,
3260492
,
22510453
,
8577507
},
FieldElement
{
-
12632451
,
11257346
,
-
32692994
,
13548177
,
-
721004
,
10879011
,
31168030
,
13952092
,
-
29571492
,
-
3635906
},
},
{
FieldElement
{
3877321
,
-
9572739
,
32416692
,
5405324
,
-
11004407
,
-
13656635
,
3759769
,
11935320
,
5611860
,
8164018
},
FieldElement
{
-
16275802
,
14667797
,
15906460
,
12155291
,
-
22111149
,
-
9039718
,
32003002
,
-
8832289
,
5773085
,
-
8422109
},
FieldElement
{
-
23788118
,
-
8254300
,
1950875
,
8937633
,
18686727
,
16459170
,
-
905725
,
12376320
,
31632953
,
190926
},
},
{
FieldElement
{
-
24593607
,
-
16138885
,
-
8423991
,
13378746
,
14162407
,
6901328
,
-
8288749
,
4508564
,
-
25341555
,
-
3627528
},
FieldElement
{
8884438
,
-
5884009
,
6023974
,
10104341
,
-
6881569
,
-
4941533
,
18722941
,
-
14786005
,
-
1672488
,
827625
},
FieldElement
{
-
32720583
,
-
16289296
,
-
32503547
,
7101210
,
13354605
,
2659080
,
-
1800575
,
-
14108036
,
-
24878478
,
1541286
},
},
{
FieldElement
{
2901347
,
-
1117687
,
3880376
,
-
10059388
,
-
17620940
,
-
3612781
,
-
21802117
,
-
3567481
,
20456845
,
-
1885033
},
FieldElement
{
27019610
,
12299467
,
-
13658288
,
-
1603234
,
-
12861660
,
-
4861471
,
-
19540150
,
-
5016058
,
29439641
,
15138866
},
FieldElement
{
21536104
,
-
6626420
,
-
32447818
,
-
10690208
,
-
22408077
,
5175814
,
-
5420040
,
-
16361163
,
7779328
,
109896
},
},
{
FieldElement
{
30279744
,
14648750
,
-
8044871
,
6425558
,
13639621
,
-
743509
,
28698390
,
12180118
,
23177719
,
-
554075
},
FieldElement
{
26572847
,
3405927
,
-
31701700
,
12890905
,
-
19265668
,
5335866
,
-
6493768
,
2378492
,
4439158
,
-
13279347
},
FieldElement
{
-
22716706
,
3489070
,
-
9225266
,
-
332753
,
18875722
,
-
1140095
,
14819434
,
-
12731527
,
-
17717757
,
-
5461437
},
},
{
FieldElement
{
-
5056483
,
16566551
,
15953661
,
3767752
,
-
10436499
,
15627060
,
-
820954
,
2177225
,
8550082
,
-
15114165
},
FieldElement
{
-
18473302
,
16596775
,
-
381660
,
15663611
,
22860960
,
15585581
,
-
27844109
,
-
3582739
,
-
23260460
,
-
8428588
},
FieldElement
{
-
32480551
,
15707275
,
-
8205912
,
-
5652081
,
29464558
,
2713815
,
-
22725137
,
15860482
,
-
21902570
,
1494193
},
},
{
FieldElement
{
-
19562091
,
-
14087393
,
-
25583872
,
-
9299552
,
13127842
,
759709
,
21923482
,
16529112
,
8742704
,
12967017
},
FieldElement
{
-
28464899
,
1553205
,
32536856
,
-
10473729
,
-
24691605
,
-
406174
,
-
8914625
,
-
2933896
,
-
29903758
,
15553883
},
FieldElement
{
21877909
,
3230008
,
9881174
,
10539357
,
-
4797115
,
2841332
,
11543572
,
14513274
,
19375923
,
-
12647961
},
},
{
FieldElement
{
8832269
,
-
14495485
,
13253511
,
5137575
,
5037871
,
4078777
,
24880818
,
-
6222716
,
2862653
,
9455043
},
FieldElement
{
29306751
,
5123106
,
20245049
,
-
14149889
,
9592566
,
8447059
,
-
2077124
,
-
2990080
,
15511449
,
4789663
},
FieldElement
{
-
20679756
,
7004547
,
8824831
,
-
9434977
,
-
4045704
,
-
3750736
,
-
5754762
,
108893
,
23513200
,
16652362
},
},
},
{
{
FieldElement
{
-
33256173
,
4144782
,
-
4476029
,
-
6579123
,
10770039
,
-
7155542
,
-
6650416
,
-
12936300
,
-
18319198
,
10212860
},
FieldElement
{
2756081
,
8598110
,
7383731
,
-
6859892
,
22312759
,
-
1105012
,
21179801
,
2600940
,
-
9988298
,
-
12506466
},
FieldElement
{
-
24645692
,
13317462
,
-
30449259
,
-
15653928
,
21365574
,
-
10869657
,
11344424
,
864440
,
-
2499677
,
-
16710063
},
},
{
FieldElement
{
-
26432803
,
6148329
,
-
17184412
,
-
14474154
,
18782929
,
-
275997
,
-
22561534
,
211300
,
2719757
,
4940997
},
FieldElement
{
-
1323882
,
3911313
,
-
6948744
,
14759765
,
-
30027150
,
7851207
,
21690126
,
8518463
,
26699843
,
5276295
},
FieldElement
{
-
13149873
,
-
6429067
,
9396249
,
365013
,
24703301
,
-
10488939
,
1321586
,
149635
,
-
15452774
,
7159369
},
},
{
FieldElement
{
9987780
,
-
3404759
,
17507962
,
9505530
,
9731535
,
-
2165514
,
22356009
,
8312176
,
22477218
,
-
8403385
},
FieldElement
{
18155857
,
-
16504990
,
19744716
,
9006923
,
15154154
,
-
10538976
,
24256460
,
-
4864995
,
-
22548173
,
9334109
},
FieldElement
{
2986088
,
-
4911893
,
10776628
,
-
3473844
,
10620590
,
-
7083203
,
-
21413845
,
14253545
,
-
22587149
,
536906
},
},
{
FieldElement
{
4377756
,
8115836
,
24567078
,
15495314
,
11625074
,
13064599
,
7390551
,
10589625
,
10838060
,
-
15420424
},
FieldElement
{
-
19342404
,
867880
,
9277171
,
-
3218459
,
-
14431572
,
-
1986443
,
19295826
,
-
15796950
,
6378260
,
699185
},
FieldElement
{
7895026
,
4057113
,
-
7081772
,
-
13077756
,
-
17886831
,
-
323126
,
-
716039
,
15693155
,
-
5045064
,
-
13373962
},
},
{
FieldElement
{
-
7737563
,
-
5869402
,
-
14566319
,
-
7406919
,
11385654
,
13201616
,
31730678
,
-
10962840
,
-
3918636
,
-
9669325
},
FieldElement
{
10188286
,
-
15770834
,
-
7336361
,
13427543
,
22223443
,
14896287
,
30743455
,
7116568
,
-
21786507
,
5427593
},
FieldElement
{
696102
,
13206899
,
27047647
,
-
10632082
,
15285305
,
-
9853179
,
10798490
,
-
4578720
,
19236243
,
12477404
},
},
{
FieldElement
{
-
11229439
,
11243796
,
-
17054270
,
-
8040865
,
-
788228
,
-
8167967
,
-
3897669
,
11180504
,
-
23169516
,
7733644
},
FieldElement
{
17800790
,
-
14036179
,
-
27000429
,
-
11766671
,
23887827
,
3149671
,
23466177
,
-
10538171
,
10322027
,
15313801
},
FieldElement
{
26246234
,
11968874
,
32263343
,
-
5468728
,
6830755
,
-
13323031
,
-
15794704
,
-
101982
,
-
24449242
,
10890804
},
},
{
FieldElement
{
-
31365647
,
10271363
,
-
12660625
,
-
6267268
,
16690207
,
-
13062544
,
-
14982212
,
16484931
,
25180797
,
-
5334884
},
FieldElement
{
-
586574
,
10376444
,
-
32586414
,
-
11286356
,
19801893
,
10997610
,
2276632
,
9482883
,
316878
,
13820577
},
FieldElement
{
-
9882808
,
-
4510367
,
-
2115506
,
16457136
,
-
11100081
,
11674996
,
30756178
,
-
7515054
,
30696930
,
-
3712849
},
},
{
FieldElement
{
32988917
,
-
9603412
,
12499366
,
7910787
,
-
10617257
,
-
11931514
,
-
7342816
,
-
9985397
,
-
32349517
,
7392473
},
FieldElement
{
-
8855661
,
15927861
,
9866406
,
-
3649411
,
-
2396914
,
-
16655781
,
-
30409476
,
-
9134995
,
25112947
,
-
2926644
},
FieldElement
{
-
2504044
,
-
436966
,
25621774
,
-
5678772
,
15085042
,
-
5479877
,
-
24884878
,
-
13526194
,
5537438
,
-
13914319
},
},
},
{
{
FieldElement
{
-
11225584
,
2320285
,
-
9584280
,
10149187
,
-
33444663
,
5808648
,
-
14876251
,
-
1729667
,
31234590
,
6090599
},
FieldElement
{
-
9633316
,
116426
,
26083934
,
2897444
,
-
6364437
,
-
2688086
,
609721
,
15878753
,
-
6970405
,
-
9034768
},
FieldElement
{
-
27757857
,
247744
,
-
15194774
,
-
9002551
,
23288161
,
-
10011936
,
-
23869595
,
6503646
,
20650474
,
1804084
},
},
{
FieldElement
{
-
27589786
,
15456424
,
8972517
,
8469608
,
15640622
,
4439847
,
3121995
,
-
10329713
,
27842616
,
-
202328
},
FieldElement
{
-
15306973
,
2839644
,
22530074
,
10026331
,
4602058
,
5048462
,
28248656
,
5031932
,
-
11375082
,
12714369
},
FieldElement
{
20807691
,
-
7270825
,
29286141
,
11421711
,
-
27876523
,
-
13868230
,
-
21227475
,
1035546
,
-
19733229
,
12796920
},
},
{
FieldElement
{
12076899
,
-
14301286
,
-
8785001
,
-
11848922
,
-
25012791
,
16400684
,
-
17591495
,
-
12899438
,
3480665
,
-
15182815
},
FieldElement
{
-
32361549
,
5457597
,
28548107
,
7833186
,
7303070
,
-
11953545
,
-
24363064
,
-
15921875
,
-
33374054
,
2771025
},
FieldElement
{
-
21389266
,
421932
,
26597266
,
6860826
,
22486084
,
-
6737172
,
-
17137485
,
-
4210226
,
-
24552282
,
15673397
},
},
{
FieldElement
{
-
20184622
,
2338216
,
19788685
,
-
9620956
,
-
4001265
,
-
8740893
,
-
20271184
,
4733254
,
3727144
,
-
12934448
},
FieldElement
{
6120119
,
814863
,
-
11794402
,
-
622716
,
6812205
,
-
15747771
,
2019594
,
7975683
,
31123697
,
-
10958981
},
FieldElement
{
30069250
,
-
11435332
,
30434654
,
2958439
,
18399564
,
-
976289
,
12296869
,
9204260
,
-
16432438
,
9648165
},
},
{
FieldElement
{
32705432
,
-
1550977
,
30705658
,
7451065
,
-
11805606
,
9631813
,
3305266
,
5248604
,
-
26008332
,
-
11377501
},
FieldElement
{
17219865
,
2375039
,
-
31570947
,
-
5575615
,
-
19459679
,
9219903
,
294711
,
15298639
,
2662509
,
-
16297073
},
FieldElement
{
-
1172927
,
-
7558695
,
-
4366770
,
-
4287744
,
-
21346413
,
-
8434326
,
32087529
,
-
1222777
,
32247248
,
-
14389861
},
},
{
FieldElement
{
14312628
,
1221556
,
17395390
,
-
8700143
,
-
4945741
,
-
8684635
,
-
28197744
,
-
9637817
,
-
16027623
,
-
13378845
},
FieldElement
{
-
1428825
,
-
9678990
,
-
9235681
,
6549687
,
-
7383069
,
-
468664
,
23046502
,
9803137
,
17597934
,
2346211
},
FieldElement
{
18510800
,
15337574
,
26171504
,
981392
,
-
22241552
,
7827556
,
-
23491134
,
-
11323352
,
3059833
,
-
11782870
},
},
{
FieldElement
{
10141598
,
6082907
,
17829293
,
-
1947643
,
9830092
,
13613136
,
-
25556636
,
-
5544586
,
-
33502212
,
3592096
},
FieldElement
{
33114168
,
-
15889352
,
-
26525686
,
-
13343397
,
33076705
,
8716171
,
1151462
,
1521897
,
-
982665
,
-
6837803
},
FieldElement
{
-
32939165
,
-
4255815
,
23947181
,
-
324178
,
-
33072974
,
-
12305637
,
-
16637686
,
3891704
,
26353178
,
693168
},
},
{
FieldElement
{
30374239
,
1595580
,
-
16884039
,
13186931
,
4600344
,
406904
,
9585294
,
-
400668
,
31375464
,
14369965
},
FieldElement
{
-
14370654
,
-
7772529
,
1510301
,
6434173
,
-
18784789
,
-
6262728
,
32732230
,
-
13108839
,
17901441
,
16011505
},
FieldElement
{
18171223
,
-
11934626
,
-
12500402
,
15197122
,
-
11038147
,
-
15230035
,
-
19172240
,
-
16046376
,
8764035
,
12309598
},
},
},
{
{
FieldElement
{
5975908
,
-
5243188
,
-
19459362
,
-
9681747
,
-
11541277
,
14015782
,
-
23665757
,
1228319
,
17544096
,
-
10593782
},
FieldElement
{
5811932
,
-
1715293
,
3442887
,
-
2269310
,
-
18367348
,
-
8359541
,
-
18044043
,
-
15410127
,
-
5565381
,
12348900
},
FieldElement
{
-
31399660
,
11407555
,
25755363
,
6891399
,
-
3256938
,
14872274
,
-
24849353
,
8141295
,
-
10632534
,
-
585479
},
},
{
FieldElement
{
-
12675304
,
694026
,
-
5076145
,
13300344
,
14015258
,
-
14451394
,
-
9698672
,
-
11329050
,
30944593
,
1130208
},
FieldElement
{
8247766
,
-
6710942
,
-
26562381
,
-
7709309
,
-
14401939
,
-
14648910
,
4652152
,
2488540
,
23550156
,
-
271232
},
FieldElement
{
17294316
,
-
3788438
,
7026748
,
15626851
,
22990044
,
113481
,
2267737
,
-
5908146
,
-
408818
,
-
137719
},
},
{
FieldElement
{
16091085
,
-
16253926
,
18599252
,
7340678
,
2137637
,
-
1221657
,
-
3364161
,
14550936
,
3260525
,
-
7166271
},
FieldElement
{
-
4910104
,
-
13332887
,
18550887
,
10864893
,
-
16459325
,
-
7291596
,
-
23028869
,
-
13204905
,
-
12748722
,
2701326
},
FieldElement
{
-
8574695
,
16099415
,
4629974
,
-
16340524
,
-
20786213
,
-
6005432
,
-
10018363
,
9276971
,
11329923
,
1862132
},
},
{
FieldElement
{
14763076
,
-
15903608
,
-
30918270
,
3689867
,
3511892
,
10313526
,
-
21951088
,
12219231
,
-
9037963
,
-
940300
},
FieldElement
{
8894987
,
-
3446094
,
6150753
,
3013931
,
301220
,
15693451
,
-
31981216
,
-
2909717
,
-
15438168
,
11595570
},
FieldElement
{
15214962
,
3537601
,
-
26238722
,
-
14058872
,
4418657
,
-
15230761
,
13947276
,
10730794
,
-
13489462
,
-
4363670
},
},
{
FieldElement
{
-
2538306
,
7682793
,
32759013
,
263109
,
-
29984731
,
-
7955452
,
-
22332124
,
-
10188635
,
977108
,
699994
},
FieldElement
{
-
12466472
,
4195084
,
-
9211532
,
550904
,
-
15565337
,
12917920
,
19118110
,
-
439841
,
-
30534533
,
-
14337913
},
FieldElement
{
31788461
,
-
14507657
,
4799989
,
7372237
,
8808585
,
-
14747943
,
9408237
,
-
10051775
,
12493932
,
-
5409317
},
},
{
FieldElement
{
-
25680606
,
5260744
,
-
19235809
,
-
6284470
,
-
3695942
,
16566087
,
27218280
,
2607121
,
29375955
,
6024730
},
FieldElement
{
842132
,
-
2794693
,
-
4763381
,
-
8722815
,
26332018
,
-
12405641
,
11831880
,
6985184
,
-
9940361
,
2854096
},
FieldElement
{
-
4847262
,
-
7969331
,
2516242
,
-
5847713
,
9695691
,
-
7221186
,
16512645
,
960770
,
12121869
,
16648078
},
},
{
FieldElement
{
-
15218652
,
14667096
,
-
13336229
,
2013717
,
30598287
,
-
464137
,
-
31504922
,
-
7882064
,
20237806
,
2838411
},
FieldElement
{
-
19288047
,
4453152
,
15298546
,
-
16178388
,
22115043
,
-
15972604
,
12544294
,
-
13470457
,
1068881
,
-
12499905
},
FieldElement
{
-
9558883
,
-
16518835
,
33238498
,
13506958
,
30505848
,
-
1114596
,
-
8486907
,
-
2630053
,
12521378
,
4845654
},
},
{
FieldElement
{
-
28198521
,
10744108
,
-
2958380
,
10199664
,
7759311
,
-
13088600
,
3409348
,
-
873400
,
-
6482306
,
-
12885870
},
FieldElement
{
-
23561822
,
6230156
,
-
20382013
,
10655314
,
-
24040585
,
-
11621172
,
10477734
,
-
1240216
,
-
3113227
,
13974498
},
FieldElement
{
12966261
,
15550616
,
-
32038948
,
-
1615346
,
21025980
,
-
629444
,
5642325
,
7188737
,
18895762
,
12629579
},
},
},
{
{
FieldElement
{
14741879
,
-
14946887
,
22177208
,
-
11721237
,
1279741
,
8058600
,
11758140
,
789443
,
32195181
,
3895677
},
FieldElement
{
10758205
,
15755439
,
-
4509950
,
9243698
,
-
4879422
,
6879879
,
-
2204575
,
-
3566119
,
-
8982069
,
4429647
},
FieldElement
{
-
2453894
,
15725973
,
-
20436342
,
-
10410672
,
-
5803908
,
-
11040220
,
-
7135870
,
-
11642895
,
18047436
,
-
15281743
},
},
{
FieldElement
{
-
25173001
,
-
11307165
,
29759956
,
11776784
,
-
22262383
,
-
15820455
,
10993114
,
-
12850837
,
-
17620701
,
-
9408468
},
FieldElement
{
21987233
,
700364
,
-
24505048
,
14972008
,
-
7774265
,
-
5718395
,
32155026
,
2581431
,
-
29958985
,
8773375
},
FieldElement
{
-
25568350
,
454463
,
-
13211935
,
16126715
,
25240068
,
8594567
,
20656846
,
12017935
,
-
7874389
,
-
13920155
},
},
{
FieldElement
{
6028182
,
6263078
,
-
31011806
,
-
11301710
,
-
818919
,
2461772
,
-
31841174
,
-
5468042
,
-
1721788
,
-
2776725
},
FieldElement
{
-
12278994
,
16624277
,
987579
,
-
5922598
,
32908203
,
1248608
,
7719845
,
-
4166698
,
28408820
,
6816612
},
FieldElement
{
-
10358094
,
-
8237829
,
19549651
,
-
12169222
,
22082623
,
16147817
,
20613181
,
13982702
,
-
10339570
,
5067943
},
},
{
FieldElement
{
-
30505967
,
-
3821767
,
12074681
,
13582412
,
-
19877972
,
2443951
,
-
19719286
,
12746132
,
5331210
,
-
10105944
},
FieldElement
{
30528811
,
3601899
,
-
1957090
,
4619785
,
-
27361822
,
-
15436388
,
24180793
,
-
12570394
,
27679908
,
-
1648928
},
FieldElement
{
9402404
,
-
13957065
,
32834043
,
10838634
,
-
26580150
,
-
13237195
,
26653274
,
-
8685565
,
22611444
,
-
12715406
},
},
{
FieldElement
{
22190590
,
1118029
,
22736441
,
15130463
,
-
30460692
,
-
5991321
,
19189625
,
-
4648942
,
4854859
,
6622139
},
FieldElement
{
-
8310738
,
-
2953450
,
-
8262579
,
-
3388049
,
-
10401731
,
-
271929
,
13424426
,
-
3567227
,
26404409
,
13001963
},
FieldElement
{
-
31241838
,
-
15415700
,
-
2994250
,
8939346
,
11562230
,
-
12840670
,
-
26064365
,
-
11621720
,
-
15405155
,
11020693
},
},
{
FieldElement
{
1866042
,
-
7949489
,
-
7898649
,
-
10301010
,
12483315
,
13477547
,
3175636
,
-
12424163
,
28761762
,
1406734
},
FieldElement
{
-
448555
,
-
1777666
,
13018551
,
3194501
,
-
9580420
,
-
11161737
,
24760585
,
-
4347088
,
25577411
,
-
13378680
},
FieldElement
{
-
24290378
,
4759345
,
-
690653
,
-
1852816
,
2066747
,
10693769
,
-
29595790
,
9884936
,
-
9368926
,
4745410
},
},
{
FieldElement
{
-
9141284
,
6049714
,
-
19531061
,
-
4341411
,
-
31260798
,
9944276
,
-
15462008
,
-
11311852
,
10931924
,
-
11931931
},
FieldElement
{
-
16561513
,
14112680
,
-
8012645
,
4817318
,
-
8040464
,
-
11414606
,
-
22853429
,
10856641
,
-
20470770
,
13434654
},
FieldElement
{
22759489
,
-
10073434
,
-
16766264
,
-
1871422
,
13637442
,
-
10168091
,
1765144
,
-
12654326
,
28445307
,
-
5364710
},
},
{
FieldElement
{
29875063
,
12493613
,
2795536
,
-
3786330
,
1710620
,
15181182
,
-
10195717
,
-
8788675
,
9074234
,
1167180
},
FieldElement
{
-
26205683
,
11014233
,
-
9842651
,
-
2635485
,
-
26908120
,
7532294
,
-
18716888
,
-
9535498
,
3843903
,
9367684
},
FieldElement
{
-
10969595
,
-
6403711
,
9591134
,
9582310
,
11349256
,
108879
,
16235123
,
8601684
,
-
139197
,
4242895
},
},
},
{
{
FieldElement
{
22092954
,
-
13191123
,
-
2042793
,
-
11968512
,
32186753
,
-
11517388
,
-
6574341
,
2470660
,
-
27417366
,
16625501
},
FieldElement
{
-
11057722
,
3042016
,
13770083
,
-
9257922
,
584236
,
-
544855
,
-
7770857
,
2602725
,
-
27351616
,
14247413
},
FieldElement
{
6314175
,
-
10264892
,
-
32772502
,
15957557
,
-
10157730
,
168750
,
-
8618807
,
14290061
,
27108877
,
-
1180880
},
},
{
FieldElement
{
-
8586597
,
-
7170966
,
13241782
,
10960156
,
-
32991015
,
-
13794596
,
33547976
,
-
11058889
,
-
27148451
,
981874
},
FieldElement
{
22833440
,
9293594
,
-
32649448
,
-
13618667
,
-
9136966
,
14756819
,
-
22928859
,
-
13970780
,
-
10479804
,
-
16197962
},
FieldElement
{
-
7768587
,
3326786
,
-
28111797
,
10783824
,
19178761
,
14905060
,
22680049
,
13906969
,
-
15933690
,
3797899
},
},
{
FieldElement
{
21721356
,
-
4212746
,
-
12206123
,
9310182
,
-
3882239
,
-
13653110
,
23740224
,
-
2709232
,
20491983
,
-
8042152
},
FieldElement
{
9209270
,
-
15135055
,
-
13256557
,
-
6167798
,
-
731016
,
15289673
,
25947805
,
15286587
,
30997318
,
-
6703063
},
FieldElement
{
7392032
,
16618386
,
23946583
,
-
8039892
,
-
13265164
,
-
1533858
,
-
14197445
,
-
2321576
,
17649998
,
-
250080
},
},
{
FieldElement
{
-
9301088
,
-
14193827
,
30609526
,
-
3049543
,
-
25175069
,
-
1283752
,
-
15241566
,
-
9525724
,
-
2233253
,
7662146
},
FieldElement
{
-
17558673
,
1763594
,
-
33114336
,
15908610
,
-
30040870
,
-
12174295
,
7335080
,
-
8472199
,
-
3174674
,
3440183
},
FieldElement
{
-
19889700
,
-
5977008
,
-
24111293
,
-
9688870
,
10799743
,
-
16571957
,
40450
,
-
4431835
,
4862400
,
1133
},
},
{
FieldElement
{
-
32856209
,
-
7873957
,
-
5422389
,
14860950
,
-
16319031
,
7956142
,
7258061
,
311861
,
-
30594991
,
-
7379421
},
FieldElement
{
-
3773428
,
-
1565936
,
28985340
,
7499440
,
24445838
,
9325937
,
29727763
,
16527196
,
18278453
,
15405622
},
FieldElement
{
-
4381906
,
8508652
,
-
19898366
,
-
3674424
,
-
5984453
,
15149970
,
-
13313598
,
843523
,
-
21875062
,
13626197
},
},
{
FieldElement
{
2281448
,
-
13487055
,
-
10915418
,
-
2609910
,
1879358
,
16164207
,
-
10783882
,
3953792
,
13340839
,
15928663
},
FieldElement
{
31727126
,
-
7179855
,
-
18437503
,
-
8283652
,
2875793
,
-
16390330
,
-
25269894
,
-
7014826
,
-
23452306
,
5964753
},
FieldElement
{
4100420
,
-
5959452
,
-
17179337
,
6017714
,
-
18705837
,
12227141
,
-
26684835
,
11344144
,
2538215
,
-
7570755
},
},
{
FieldElement
{
-
9433605
,
6123113
,
11159803
,
-
2156608
,
30016280
,
14966241
,
-
20474983
,
1485421
,
-
629256
,
-
15958862
},
FieldElement
{
-
26804558
,
4260919
,
11851389
,
9658551
,
-
32017107
,
16367492
,
-
20205425
,
-
13191288
,
11659922
,
-
11115118
},
FieldElement
{
26180396
,
10015009
,
-
30844224
,
-
8581293
,
5418197
,
9480663
,
2231568
,
-
10170080
,
33100372
,
-
1306171
},
},
{
FieldElement
{
15121113
,
-
5201871
,
-
10389905
,
15427821
,
-
27509937
,
-
15992507
,
21670947
,
4486675
,
-
5931810
,
-
14466380
},
FieldElement
{
16166486
,
-
9483733
,
-
11104130
,
6023908
,
-
31926798
,
-
1364923
,
2340060
,
-
16254968
,
-
10735770
,
-
10039824
},
FieldElement
{
28042865
,
-
3557089
,
-
12126526
,
12259706
,
-
3717498
,
-
6945899
,
6766453
,
-
8689599
,
18036436
,
5803270
},
},
},
{
{
FieldElement
{
-
817581
,
6763912
,
11803561
,
1585585
,
10958447
,
-
2671165
,
23855391
,
4598332
,
-
6159431
,
-
14117438
},
FieldElement
{
-
31031306
,
-
14256194
,
17332029
,
-
2383520
,
31312682
,
-
5967183
,
696309
,
50292
,
-
20095739
,
11763584
},
FieldElement
{
-
594563
,
-
2514283
,
-
32234153
,
12643980
,
12650761
,
14811489
,
665117
,
-
12613632
,
-
19773211
,
-
10713562
},
},
{
FieldElement
{
30464590
,
-
11262872
,
-
4127476
,
-
12734478
,
19835327
,
-
7105613
,
-
24396175
,
2075773
,
-
17020157
,
992471
},
FieldElement
{
18357185
,
-
6994433
,
7766382
,
16342475
,
-
29324918
,
411174
,
14578841
,
8080033
,
-
11574335
,
-
10601610
},
FieldElement
{
19598397
,
10334610
,
12555054
,
2555664
,
18821899
,
-
10339780
,
21873263
,
16014234
,
26224780
,
16452269
},
},
{
FieldElement
{
-
30223925
,
5145196
,
5944548
,
16385966
,
3976735
,
2009897
,
-
11377804
,
-
7618186
,
-
20533829
,
3698650
},
FieldElement
{
14187449
,
3448569
,
-
10636236
,
-
10810935
,
-
22663880
,
-
3433596
,
7268410
,
-
10890444
,
27394301
,
12015369
},
FieldElement
{
19695761
,
16087646
,
28032085
,
12999827
,
6817792
,
11427614
,
20244189
,
-
1312777
,
-
13259127
,
-
3402461
},
},
{
FieldElement
{
30860103
,
12735208
,
-
1888245
,
-
4699734
,
-
16974906
,
2256940
,
-
8166013
,
12298312
,
-
8550524
,
-
10393462
},
FieldElement
{
-
5719826
,
-
11245325
,
-
1910649
,
15569035
,
26642876
,
-
7587760
,
-
5789354
,
-
15118654
,
-
4976164
,
12651793
},
FieldElement
{
-
2848395
,
9953421
,
11531313
,
-
5282879
,
26895123
,
-
12697089
,
-
13118820
,
-
16517902
,
9768698
,
-
2533218
},
},
{
FieldElement
{
-
24719459
,
1894651
,
-
287698
,
-
4704085
,
15348719
,
-
8156530
,
32767513
,
12765450
,
4940095
,
10678226
},
FieldElement
{
18860224
,
15980149
,
-
18987240
,
-
1562570
,
-
26233012
,
-
11071856
,
-
7843882
,
13944024
,
-
24372348
,
16582019
},
FieldElement
{
-
15504260
,
4970268
,
-
29893044
,
4175593
,
-
20993212
,
-
2199756
,
-
11704054
,
15444560
,
-
11003761
,
7989037
},
},
{
FieldElement
{
31490452
,
5568061
,
-
2412803
,
2182383
,
-
32336847
,
4531686
,
-
32078269
,
6200206
,
-
19686113
,
-
14800171
},
FieldElement
{
-
17308668
,
-
15879940
,
-
31522777
,
-
2831
,
-
32887382
,
16375549
,
8680158
,
-
16371713
,
28550068
,
-
6857132
},
FieldElement
{
-
28126887
,
-
5688091
,
16837845
,
-
1820458
,
-
6850681
,
12700016
,
-
30039981
,
4364038
,
1155602
,
5988841
},
},
{
FieldElement
{
21890435
,
-
13272907
,
-
12624011
,
12154349
,
-
7831873
,
15300496
,
23148983
,
-
4470481
,
24618407
,
8283181
},
FieldElement
{
-
33136107
,
-
10512751
,
9975416
,
6841041
,
-
31559793
,
16356536
,
3070187
,
-
7025928
,
1466169
,
10740210
},
FieldElement
{
-
1509399
,
-
15488185
,
-
13503385
,
-
10655916
,
32799044
,
909394
,
-
13938903
,
-
5779719
,
-
32164649
,
-
15327040
},
},
{
FieldElement
{
3960823
,
-
14267803
,
-
28026090
,
-
15918051
,
-
19404858
,
13146868
,
15567327
,
951507
,
-
3260321
,
-
573935
},
FieldElement
{
24740841
,
5052253
,
-
30094131
,
8961361
,
25877428
,
6165135
,
-
24368180
,
14397372
,
-
7380369
,
-
6144105
},
FieldElement
{
-
28888365
,
3510803
,
-
28103278
,
-
1158478
,
-
11238128
,
-
10631454
,
-
15441463
,
-
14453128
,
-
1625486
,
-
6494814
},
},
},
{
{
FieldElement
{
793299
,
-
9230478
,
8836302
,
-
6235707
,
-
27360908
,
-
2369593
,
33152843
,
-
4885251
,
-
9906200
,
-
621852
},
FieldElement
{
5666233
,
525582
,
20782575
,
-
8038419
,
-
24538499
,
14657740
,
16099374
,
1468826
,
-
6171428
,
-
15186581
},
FieldElement
{
-
4859255
,
-
3779343
,
-
2917758
,
-
6748019
,
7778750
,
11688288
,
-
30404353
,
-
9871238
,
-
1558923
,
-
9863646
},
},
{
FieldElement
{
10896332
,
-
7719704
,
824275
,
472601
,
-
19460308
,
3009587
,
25248958
,
14783338
,
-
30581476
,
-
15757844
},
FieldElement
{
10566929
,
12612572
,
-
31944212
,
11118703
,
-
12633376
,
12362879
,
21752402
,
8822496
,
24003793
,
14264025
},
FieldElement
{
27713862
,
-
7355973
,
-
11008240
,
9227530
,
27050101
,
2504721
,
23886875
,
-
13117525
,
13958495
,
-
5732453
},
},
{
FieldElement
{
-
23481610
,
4867226
,
-
27247128
,
3900521
,
29838369
,
-
8212291
,
-
31889399
,
-
10041781
,
7340521
,
-
15410068
},
FieldElement
{
4646514
,
-
8011124
,
-
22766023
,
-
11532654
,
23184553
,
8566613
,
31366726
,
-
1381061
,
-
15066784
,
-
10375192
},
FieldElement
{
-
17270517
,
12723032
,
-
16993061
,
14878794
,
21619651
,
-
6197576
,
27584817
,
3093888
,
-
8843694
,
3849921
},
},
{
FieldElement
{
-
9064912
,
2103172
,
25561640
,
-
15125738
,
-
5239824
,
9582958
,
32477045
,
-
9017955
,
5002294
,
-
15550259
},
FieldElement
{
-
12057553
,
-
11177906
,
21115585
,
-
13365155
,
8808712
,
-
12030708
,
16489530
,
13378448
,
-
25845716
,
12741426
},
FieldElement
{
-
5946367
,
10645103
,
-
30911586
,
15390284
,
-
3286982
,
-
7118677
,
24306472
,
15852464
,
28834118
,
-
7646072
},
},
{
FieldElement
{
-
17335748
,
-
9107057
,
-
24531279
,
9434953
,
-
8472084
,
-
583362
,
-
13090771
,
455841
,
20461858
,
5491305
},
FieldElement
{
13669248
,
-
16095482
,
-
12481974
,
-
10203039
,
-
14569770
,
-
11893198
,
-
24995986
,
11293807
,
-
28588204
,
-
9421832
},
FieldElement
{
28497928
,
6272777
,
-
33022994
,
14470570
,
8906179
,
-
1225630
,
18504674
,
-
14165166
,
29867745
,
-
8795943
},
},
{
FieldElement
{
-
16207023
,
13517196
,
-
27799630
,
-
13697798
,
24009064
,
-
6373891
,
-
6367600
,
-
13175392
,
22853429
,
-
4012011
},
FieldElement
{
24191378
,
16712145
,
-
13931797
,
15217831
,
14542237
,
1646131
,
18603514
,
-
11037887
,
12876623
,
-
2112447
},
FieldElement
{
17902668
,
4518229
,
-
411702
,
-
2829247
,
26878217
,
5258055
,
-
12860753
,
608397
,
16031844
,
3723494
},
},
{
FieldElement
{
-
28632773
,
12763728
,
-
20446446
,
7577504
,
33001348
,
-
13017745
,
17558842
,
-
7872890
,
23896954
,
-
4314245
},
FieldElement
{
-
20005381
,
-
12011952
,
31520464
,
605201
,
2543521
,
5991821
,
-
2945064
,
7229064
,
-
9919646
,
-
8826859
},
FieldElement
{
28816045
,
298879
,
-
28165016
,
-
15920938
,
19000928
,
-
1665890
,
-
12680833
,
-
2949325
,
-
18051778
,
-
2082915
},
},
{
FieldElement
{
16000882
,
-
344896
,
3493092
,
-
11447198
,
-
29504595
,
-
13159789
,
12577740
,
16041268
,
-
19715240
,
7847707
},
FieldElement
{
10151868
,
10572098
,
27312476
,
7922682
,
14825339
,
4723128
,
-
32855931
,
-
6519018
,
-
10020567
,
3852848
},
FieldElement
{
-
11430470
,
15697596
,
-
21121557
,
-
4420647
,
5386314
,
15063598
,
16514493
,
-
15932110
,
29330899
,
-
15076224
},
},
},
{
{
FieldElement
{
-
25499735
,
-
4378794
,
-
15222908
,
-
6901211
,
16615731
,
2051784
,
3303702
,
15490
,
-
27548796
,
12314391
},
FieldElement
{
15683520
,
-
6003043
,
18109120
,
-
9980648
,
15337968
,
-
5997823
,
-
16717435
,
15921866
,
16103996
,
-
3731215
},
FieldElement
{
-
23169824
,
-
10781249
,
13588192
,
-
1628807
,
-
3798557
,
-
1074929
,
-
19273607
,
5402699
,
-
29815713
,
-
9841101
},
},
{
FieldElement
{
23190676
,
2384583
,
-
32714340
,
3462154
,
-
29903655
,
-
1529132
,
-
11266856
,
8911517
,
-
25205859
,
2739713
},
FieldElement
{
21374101
,
-
3554250
,
-
33524649
,
9874411
,
15377179
,
11831242
,
-
33529904
,
6134907
,
4931255
,
11987849
},
FieldElement
{
-
7732
,
-
2978858
,
-
16223486
,
7277597
,
105524
,
-
322051
,
-
31480539
,
13861388
,
-
30076310
,
10117930
},
},
{
FieldElement
{
-
29501170
,
-
10744872
,
-
26163768
,
13051539
,
-
25625564
,
5089643
,
-
6325503
,
6704079
,
12890019
,
15728940
},
FieldElement
{
-
21972360
,
-
11771379
,
-
951059
,
-
4418840
,
14704840
,
2695116
,
903376
,
-
10428139
,
12885167
,
8311031
},
FieldElement
{
-
17516482
,
5352194
,
10384213
,
-
13811658
,
7506451
,
13453191
,
26423267
,
4384730
,
1888765
,
-
5435404
},
},
{
FieldElement
{
-
25817338
,
-
3107312
,
-
13494599
,
-
3182506
,
30896459
,
-
13921729
,
-
32251644
,
-
12707869
,
-
19464434
,
-
3340243
},
FieldElement
{
-
23607977
,
-
2665774
,
-
526091
,
4651136
,
5765089
,
4618330
,
6092245
,
14845197
,
17151279
,
-
9854116
},
FieldElement
{
-
24830458
,
-
12733720
,
-
15165978
,
10367250
,
-
29530908
,
-
265356
,
22825805
,
-
7087279
,
-
16866484
,
16176525
},
},
{
FieldElement
{
-
23583256
,
6564961
,
20063689
,
3798228
,
-
4740178
,
7359225
,
2006182
,
-
10363426
,
-
28746253
,
-
10197509
},
FieldElement
{
-
10626600
,
-
4486402
,
-
13320562
,
-
5125317
,
3432136
,
-
6393229
,
23632037
,
-
1940610
,
32808310
,
1099883
},
FieldElement
{
15030977
,
5768825
,
-
27451236
,
-
2887299
,
-
6427378
,
-
15361371
,
-
15277896
,
-
6809350
,
2051441
,
-
15225865
},
},
{
FieldElement
{
-
3362323
,
-
7239372
,
7517890
,
9824992
,
23555850
,
295369
,
5148398
,
-
14154188
,
-
22686354
,
16633660
},
FieldElement
{
4577086
,
-
16752288
,
13249841
,
-
15304328
,
19958763
,
-
14537274
,
18559670
,
-
10759549
,
8402478
,
-
9864273
},
FieldElement
{
-
28406330
,
-
1051581
,
-
26790155
,
-
907698
,
-
17212414
,
-
11030789
,
9453451
,
-
14980072
,
17983010
,
9967138
},
},
{
FieldElement
{
-
25762494
,
6524722
,
26585488
,
9969270
,
24709298
,
1220360
,
-
1677990
,
7806337
,
17507396
,
3651560
},
FieldElement
{
-
10420457
,
-
4118111
,
14584639
,
15971087
,
-
15768321
,
8861010
,
26556809
,
-
5574557
,
-
18553322
,
-
11357135
},
FieldElement
{
2839101
,
14284142
,
4029895
,
3472686
,
14402957
,
12689363
,
-
26642121
,
8459447
,
-
5605463
,
-
7621941
},
},
{
FieldElement
{
-
4839289
,
-
3535444
,
9744961
,
2871048
,
25113978
,
3187018
,
-
25110813
,
-
849066
,
17258084
,
-
7977739
},
FieldElement
{
18164541
,
-
10595176
,
-
17154882
,
-
1542417
,
19237078
,
-
9745295
,
23357533
,
-
15217008
,
26908270
,
12150756
},
FieldElement
{
-
30264870
,
-
7647865
,
5112249
,
-
7036672
,
-
1499807
,
-
6974257
,
43168
,
-
5537701
,
-
32302074
,
16215819
},
},
},
{
{
FieldElement
{
-
6898905
,
9824394
,
-
12304779
,
-
4401089
,
-
31397141
,
-
6276835
,
32574489
,
12532905
,
-
7503072
,
-
8675347
},
FieldElement
{
-
27343522
,
-
16515468
,
-
27151524
,
-
10722951
,
946346
,
16291093
,
254968
,
7168080
,
21676107
,
-
1943028
},
FieldElement
{
21260961
,
-
8424752
,
-
16831886
,
-
11920822
,
-
23677961
,
3968121
,
-
3651949
,
-
6215466
,
-
3556191
,
-
7913075
},
},
{
FieldElement
{
16544754
,
13250366
,
-
16804428
,
15546242
,
-
4583003
,
12757258
,
-
2462308
,
-
8680336
,
-
18907032
,
-
9662799
},
FieldElement
{
-
2415239
,
-
15577728
,
18312303
,
4964443
,
-
15272530
,
-
12653564
,
26820651
,
16690659
,
25459437
,
-
4564609
},
FieldElement
{
-
25144690
,
11425020
,
28423002
,
-
11020557
,
-
6144921
,
-
15826224
,
9142795
,
-
2391602
,
-
6432418
,
-
1644817
},
},
{
FieldElement
{
-
23104652
,
6253476
,
16964147
,
-
3768872
,
-
25113972
,
-
12296437
,
-
27457225
,
-
16344658
,
6335692
,
7249989
},
FieldElement
{
-
30333227
,
13979675
,
7503222
,
-
12368314
,
-
11956721
,
-
4621693
,
-
30272269
,
2682242
,
25993170
,
-
12478523
},
FieldElement
{
4364628
,
5930691
,
32304656
,
-
10044554
,
-
8054781
,
15091131
,
22857016
,
-
10598955
,
31820368
,
15075278
},
},
{
FieldElement
{
31879134
,
-
8918693
,
17258761
,
90626
,
-
8041836
,
-
4917709
,
24162788
,
-
9650886
,
-
17970238
,
12833045
},
FieldElement
{
19073683
,
14851414
,
-
24403169
,
-
11860168
,
7625278
,
11091125
,
-
19619190
,
2074449
,
-
9413939
,
14905377
},
FieldElement
{
24483667
,
-
11935567
,
-
2518866
,
-
11547418
,
-
1553130
,
15355506
,
-
25282080
,
9253129
,
27628530
,
-
7555480
},
},
{
FieldElement
{
17597607
,
8340603
,
19355617
,
552187
,
26198470
,
-
3176583
,
4593324
,
-
9157582
,
-
14110875
,
15297016
},
FieldElement
{
510886
,
14337390
,
-
31785257
,
16638632
,
6328095
,
2713355
,
-
20217417
,
-
11864220
,
8683221
,
2921426
},
FieldElement
{
18606791
,
11874196
,
27155355
,
-
5281482
,
-
24031742
,
6265446
,
-
25178240
,
-
1278924
,
4674690
,
13890525
},
},
{
FieldElement
{
13609624
,
13069022
,
-
27372361
,
-
13055908
,
24360586
,
9592974
,
14977157
,
9835105
,
4389687
,
288396
},
FieldElement
{
9922506
,
-
519394
,
13613107
,
5883594
,
-
18758345
,
-
434263
,
-
12304062
,
8317628
,
23388070
,
16052080
},
FieldElement
{
12720016
,
11937594
,
-
31970060
,
-
5028689
,
26900120
,
8561328
,
-
20155687
,
-
11632979
,
-
14754271
,
-
10812892
},
},
{
FieldElement
{
15961858
,
14150409
,
26716931
,
-
665832
,
-
22794328
,
13603569
,
11829573
,
7467844
,
-
28822128
,
929275
},
FieldElement
{
11038231
,
-
11582396
,
-
27310482
,
-
7316562
,
-
10498527
,
-
16307831
,
-
23479533
,
-
9371869
,
-
21393143
,
2465074
},
FieldElement
{
20017163
,
-
4323226
,
27915242
,
1529148
,
12396362
,
15675764
,
13817261
,
-
9658066
,
2463391
,
-
4622140
},
},
{
FieldElement
{
-
16358878
,
-
12663911
,
-
12065183
,
4996454
,
-
1256422
,
1073572
,
9583558
,
12851107
,
4003896
,
12673717
},
FieldElement
{
-
1731589
,
-
15155870
,
-
3262930
,
16143082
,
19294135
,
13385325
,
14741514
,
-
9103726
,
7903886
,
2348101
},
FieldElement
{
24536016
,
-
16515207
,
12715592
,
-
3862155
,
1511293
,
10047386
,
-
3842346
,
-
7129159
,
-
28377538
,
10048127
},
},
},
{
{
FieldElement
{
-
12622226
,
-
6204820
,
30718825
,
2591312
,
-
10617028
,
12192840
,
18873298
,
-
7297090
,
-
32297756
,
15221632
},
FieldElement
{
-
26478122
,
-
11103864
,
11546244
,
-
1852483
,
9180880
,
7656409
,
-
21343950
,
2095755
,
29769758
,
6593415
},
FieldElement
{
-
31994208
,
-
2907461
,
4176912
,
3264766
,
12538965
,
-
868111
,
26312345
,
-
6118678
,
30958054
,
8292160
},
},
{
FieldElement
{
31429822
,
-
13959116
,
29173532
,
15632448
,
12174511
,
-
2760094
,
32808831
,
3977186
,
26143136
,
-
3148876
},
FieldElement
{
22648901
,
1402143
,
-
22799984
,
13746059
,
7936347
,
365344
,
-
8668633
,
-
1674433
,
-
3758243
,
-
2304625
},
FieldElement
{
-
15491917
,
8012313
,
-
2514730
,
-
12702462
,
-
23965846
,
-
10254029
,
-
1612713
,
-
1535569
,
-
16664475
,
8194478
},
},
{
FieldElement
{
27338066
,
-
7507420
,
-
7414224
,
10140405
,
-
19026427
,
-
6589889
,
27277191
,
8855376
,
28572286
,
3005164
},
FieldElement
{
26287124
,
4821776
,
25476601
,
-
4145903
,
-
3764513
,
-
15788984
,
-
18008582
,
1182479
,
-
26094821
,
-
13079595
},
FieldElement
{
-
7171154
,
3178080
,
23970071
,
6201893
,
-
17195577
,
-
4489192
,
-
21876275
,
-
13982627
,
32208683
,
-
1198248
},
},
{
FieldElement
{
-
16657702
,
2817643
,
-
10286362
,
14811298
,
6024667
,
13349505
,
-
27315504
,
-
10497842
,
-
27672585
,
-
11539858
},
FieldElement
{
15941029
,
-
9405932
,
-
21367050
,
8062055
,
31876073
,
-
238629
,
-
15278393
,
-
1444429
,
15397331
,
-
4130193
},
FieldElement
{
8934485
,
-
13485467
,
-
23286397
,
-
13423241
,
-
32446090
,
14047986
,
31170398
,
-
1441021
,
-
27505566
,
15087184
},
},
{
FieldElement
{
-
18357243
,
-
2156491
,
24524913
,
-
16677868
,
15520427
,
-
6360776
,
-
15502406
,
11461896
,
16788528
,
-
5868942
},
FieldElement
{
-
1947386
,
16013773
,
21750665
,
3714552
,
-
17401782
,
-
16055433
,
-
3770287
,
-
10323320
,
31322514
,
-
11615635
},
FieldElement
{
21426655
,
-
5650218
,
-
13648287
,
-
5347537
,
-
28812189
,
-
4920970
,
-
18275391
,
-
14621414
,
13040862
,
-
12112948
},
},
{
FieldElement
{
11293895
,
12478086
,
-
27136401
,
15083750
,
-
29307421
,
14748872
,
14555558
,
-
13417103
,
1613711
,
4896935
},
FieldElement
{
-
25894883
,
15323294
,
-
8489791
,
-
8057900
,
25967126
,
-
13425460
,
2825960
,
-
4897045
,
-
23971776
,
-
11267415
},
FieldElement
{
-
15924766
,
-
5229880
,
-
17443532
,
6410664
,
3622847
,
10243618
,
20615400
,
12405433
,
-
23753030
,
-
8436416
},
},
{
FieldElement
{
-
7091295
,
12556208
,
-
20191352
,
9025187
,
-
17072479
,
4333801
,
4378436
,
2432030
,
23097949
,
-
566018
},
FieldElement
{
4565804
,
-
16025654
,
20084412
,
-
7842817
,
1724999
,
189254
,
24767264
,
10103221
,
-
18512313
,
2424778
},
FieldElement
{
366633
,
-
11976806
,
8173090
,
-
6890119
,
30788634
,
5745705
,
-
7168678
,
1344109
,
-
3642553
,
12412659
},
},
{
FieldElement
{
-
24001791
,
7690286
,
14929416
,
-
168257
,
-
32210835
,
-
13412986
,
24162697
,
-
15326504
,
-
3141501
,
11179385
},
FieldElement
{
18289522
,
-
14724954
,
8056945
,
16430056
,
-
21729724
,
7842514
,
-
6001441
,
-
1486897
,
-
18684645
,
-
11443503
},
FieldElement
{
476239
,
6601091
,
-
6152790
,
-
9723375
,
17503545
,
-
4863900
,
27672959
,
13403813
,
11052904
,
5219329
},
},
},
{
{
FieldElement
{
20678546
,
-
8375738
,
-
32671898
,
8849123
,
-
5009758
,
14574752
,
31186971
,
-
3973730
,
9014762
,
-
8579056
},
FieldElement
{
-
13644050
,
-
10350239
,
-
15962508
,
5075808
,
-
1514661
,
-
11534600
,
-
33102500
,
9160280
,
8473550
,
-
3256838
},
FieldElement
{
24900749
,
14435722
,
17209120
,
-
15292541
,
-
22592275
,
9878983
,
-
7689309
,
-
16335821
,
-
24568481
,
11788948
},
},
{
FieldElement
{
-
3118155
,
-
11395194
,
-
13802089
,
14797441
,
9652448
,
-
6845904
,
-
20037437
,
10410733
,
-
24568470
,
-
1458691
},
FieldElement
{
-
15659161
,
16736706
,
-
22467150
,
10215878
,
-
9097177
,
7563911
,
11871841
,
-
12505194
,
-
18513325
,
8464118
},
FieldElement
{
-
23400612
,
8348507
,
-
14585951
,
-
861714
,
-
3950205
,
-
6373419
,
14325289
,
8628612
,
33313881
,
-
8370517
},
},
{
FieldElement
{
-
20186973
,
-
4967935
,
22367356
,
5271547
,
-
1097117
,
-
4788838
,
-
24805667
,
-
10236854
,
-
8940735
,
-
5818269
},
FieldElement
{
-
6948785
,
-
1795212
,
-
32625683
,
-
16021179
,
32635414
,
-
7374245
,
15989197
,
-
12838188
,
28358192
,
-
4253904
},
FieldElement
{
-
23561781
,
-
2799059
,
-
32351682
,
-
1661963
,
-
9147719
,
10429267
,
-
16637684
,
4072016
,
-
5351664
,
5596589
},
},
{
FieldElement
{
-
28236598
,
-
3390048
,
12312896
,
6213178
,
3117142
,
16078565
,
29266239
,
2557221
,
1768301
,
15373193
},
FieldElement
{
-
7243358
,
-
3246960
,
-
4593467
,
-
7553353
,
-
127927
,
-
912245
,
-
1090902
,
-
4504991
,
-
24660491
,
3442910
},
FieldElement
{
-
30210571
,
5124043
,
14181784
,
8197961
,
18964734
,
-
11939093
,
22597931
,
7176455
,
-
18585478
,
13365930
},
},
{
FieldElement
{
-
7877390
,
-
1499958
,
8324673
,
4690079
,
6261860
,
890446
,
24538107
,
-
8570186
,
-
9689599
,
-
3031667
},
FieldElement
{
25008904
,
-
10771599
,
-
4305031
,
-
9638010
,
16265036
,
15721635
,
683793
,
-
11823784
,
15723479
,
-
15163481
},
FieldElement
{
-
9660625
,
12374379
,
-
27006999
,
-
7026148
,
-
7724114
,
-
12314514
,
11879682
,
5400171
,
519526
,
-
1235876
},
},
{
FieldElement
{
22258397
,
-
16332233
,
-
7869817
,
14613016
,
-
22520255
,
-
2950923
,
-
20353881
,
7315967
,
16648397
,
7605640
},
FieldElement
{
-
8081308
,
-
8464597
,
-
8223311
,
9719710
,
19259459
,
-
15348212
,
23994942
,
-
5281555
,
-
9468848
,
4763278
},
FieldElement
{
-
21699244
,
9220969
,
-
15730624
,
1084137
,
-
25476107
,
-
2852390
,
31088447
,
-
7764523
,
-
11356529
,
728112
},
},
{
FieldElement
{
26047220
,
-
11751471
,
-
6900323
,
-
16521798
,
24092068
,
9158119
,
-
4273545
,
-
12555558
,
-
29365436
,
-
5498272
},
FieldElement
{
17510331
,
-
322857
,
5854289
,
8403524
,
17133918
,
-
3112612
,
-
28111007
,
12327945
,
10750447
,
10014012
},
FieldElement
{
-
10312768
,
3936952
,
9156313
,
-
8897683
,
16498692
,
-
994647
,
-
27481051
,
-
666732
,
3424691
,
7540221
},
},
{
FieldElement
{
30322361
,
-
6964110
,
11361005
,
-
4143317
,
7433304
,
4989748
,
-
7071422
,
-
16317219
,
-
9244265
,
15258046
},
FieldElement
{
13054562
,
-
2779497
,
19155474
,
469045
,
-
12482797
,
4566042
,
5631406
,
2711395
,
1062915
,
-
5136345
},
FieldElement
{
-
19240248
,
-
11254599
,
-
29509029
,
-
7499965
,
-
5835763
,
13005411
,
-
6066489
,
12194497
,
32960380
,
1459310
},
},
},
{
{
FieldElement
{
19852034
,
7027924
,
23669353
,
10020366
,
8586503
,
-
6657907
,
394197
,
-
6101885
,
18638003
,
-
11174937
},
FieldElement
{
31395534
,
15098109
,
26581030
,
8030562
,
-
16527914
,
-
5007134
,
9012486
,
-
7584354
,
-
6643087
,
-
5442636
},
FieldElement
{
-
9192165
,
-
2347377
,
-
1997099
,
4529534
,
25766844
,
607986
,
-
13222
,
9677543
,
-
32294889
,
-
6456008
},
},
{
FieldElement
{
-
2444496
,
-
149937
,
29348902
,
8186665
,
1873760
,
12489863
,
-
30934579
,
-
7839692
,
-
7852844
,
-
8138429
},
FieldElement
{
-
15236356
,
-
15433509
,
7766470
,
746860
,
26346930
,
-
10221762
,
-
27333451
,
10754588
,
-
9431476
,
5203576
},
FieldElement
{
31834314
,
14135496
,
-
770007
,
5159118
,
20917671
,
-
16768096
,
-
7467973
,
-
7337524
,
31809243
,
7347066
},
},
{
FieldElement
{
-
9606723
,
-
11874240
,
20414459
,
13033986
,
13716524
,
-
11691881
,
19797970
,
-
12211255
,
15192876
,
-
2087490
},
FieldElement
{
-
12663563
,
-
2181719
,
1168162
,
-
3804809
,
26747877
,
-
14138091
,
10609330
,
12694420
,
33473243
,
-
13382104
},
FieldElement
{
33184999
,
11180355
,
15832085
,
-
11385430
,
-
1633671
,
225884
,
15089336
,
-
11023903
,
-
6135662
,
14480053
},
},
{
FieldElement
{
31308717
,
-
5619998
,
31030840
,
-
1897099
,
15674547
,
-
6582883
,
5496208
,
13685227
,
27595050
,
8737275
},
FieldElement
{
-
20318852
,
-
15150239
,
10933843
,
-
16178022
,
8335352
,
-
7546022
,
-
31008351
,
-
12610604
,
26498114
,
66511
},
FieldElement
{
22644454
,
-
8761729
,
-
16671776
,
4884562
,
-
3105614
,
-
13559366
,
30540766
,
-
4286747
,
-
13327787
,
-
7515095
},
},
{
FieldElement
{
-
28017847
,
9834845
,
18617207
,
-
2681312
,
-
3401956
,
-
13307506
,
8205540
,
13585437
,
-
17127465
,
15115439
},
FieldElement
{
23711543
,
-
672915
,
31206561
,
-
8362711
,
6164647
,
-
9709987
,
-
33535882
,
-
1426096
,
8236921
,
16492939
},
FieldElement
{
-
23910559
,
-
13515526
,
-
26299483
,
-
4503841
,
25005590
,
-
7687270
,
19574902
,
10071562
,
6708380
,
-
6222424
},
},
{
FieldElement
{
2101391
,
-
4930054
,
19702731
,
2367575
,
-
15427167
,
1047675
,
5301017
,
9328700
,
29955601
,
-
11678310
},
FieldElement
{
3096359
,
9271816
,
-
21620864
,
-
15521844
,
-
14847996
,
-
7592937
,
-
25892142
,
-
12635595
,
-
9917575
,
6216608
},
FieldElement
{
-
32615849
,
338663
,
-
25195611
,
2510422
,
-
29213566
,
-
13820213
,
24822830
,
-
6146567
,
-
26767480
,
7525079
},
},
{
FieldElement
{
-
23066649
,
-
13985623
,
16133487
,
-
7896178
,
-
3389565
,
778788
,
-
910336
,
-
2782495
,
-
19386633
,
11994101
},
FieldElement
{
21691500
,
-
13624626
,
-
641331
,
-
14367021
,
3285881
,
-
3483596
,
-
25064666
,
9718258
,
-
7477437
,
13381418
},
FieldElement
{
18445390
,
-
4202236
,
14979846
,
11622458
,
-
1727110
,
-
3582980
,
23111648
,
-
6375247
,
28535282
,
15779576
},
},
{
FieldElement
{
30098053
,
3089662
,
-
9234387
,
16662135
,
-
21306940
,
11308411
,
-
14068454
,
12021730
,
9955285
,
-
16303356
},
FieldElement
{
9734894
,
-
14576830
,
-
7473633
,
-
9138735
,
2060392
,
11313496
,
-
18426029
,
9924399
,
20194861
,
13380996
},
FieldElement
{
-
26378102
,
-
7965207
,
-
22167821
,
15789297
,
-
18055342
,
-
6168792
,
-
1984914
,
15707771
,
26342023
,
10146099
},
},
},
{
{
FieldElement
{
-
26016874
,
-
219943
,
21339191
,
-
41388
,
19745256
,
-
2878700
,
-
29637280
,
2227040
,
21612326
,
-
545728
},
FieldElement
{
-
13077387
,
1184228
,
23562814
,
-
5970442
,
-
20351244
,
-
6348714
,
25764461
,
12243797
,
-
20856566
,
11649658
},
FieldElement
{
-
10031494
,
11262626
,
27384172
,
2271902
,
26947504
,
-
15997771
,
39944
,
6114064
,
33514190
,
2333242
},
},
{
FieldElement
{
-
21433588
,
-
12421821
,
8119782
,
7219913
,
-
21830522
,
-
9016134
,
-
6679750
,
-
12670638
,
24350578
,
-
13450001
},
FieldElement
{
-
4116307
,
-
11271533
,
-
23886186
,
4843615
,
-
30088339
,
690623
,
-
31536088
,
-
10406836
,
8317860
,
12352766
},
FieldElement
{
18200138
,
-
14475911
,
-
33087759
,
-
2696619
,
-
23702521
,
-
9102511
,
-
23552096
,
-
2287550
,
20712163
,
6719373
},
},
{
FieldElement
{
26656208
,
6075253
,
-
7858556
,
1886072
,
-
28344043
,
4262326
,
11117530
,
-
3763210
,
26224235
,
-
3297458
},
FieldElement
{
-
17168938
,
-
14854097
,
-
3395676
,
-
16369877
,
-
19954045
,
14050420
,
21728352
,
9493610
,
18620611
,
-
16428628
},
FieldElement
{
-
13323321
,
13325349
,
11432106
,
5964811
,
18609221
,
6062965
,
-
5269471
,
-
9725556
,
-
30701573
,
-
16479657
},
},
{
FieldElement
{
-
23860538
,
-
11233159
,
26961357
,
1640861
,
-
32413112
,
-
16737940
,
12248509
,
-
5240639
,
13735342
,
1934062
},
FieldElement
{
25089769
,
6742589
,
17081145
,
-
13406266
,
21909293
,
-
16067981
,
-
15136294
,
-
3765346
,
-
21277997
,
5473616
},
FieldElement
{
31883677
,
-
7961101
,
1083432
,
-
11572403
,
22828471
,
13290673
,
-
7125085
,
12469656
,
29111212
,
-
5451014
},
},
{
FieldElement
{
24244947
,
-
15050407
,
-
26262976
,
2791540
,
-
14997599
,
16666678
,
24367466
,
6388839
,
-
10295587
,
452383
},
FieldElement
{
-
25640782
,
-
3417841
,
5217916
,
16224624
,
19987036
,
-
4082269
,
-
24236251
,
-
5915248
,
15766062
,
8407814
},
FieldElement
{
-
20406999
,
13990231
,
15495425
,
16395525
,
5377168
,
15166495
,
-
8917023
,
-
4388953
,
-
8067909
,
2276718
},
},
{
FieldElement
{
30157918
,
12924066
,
-
17712050
,
9245753
,
19895028
,
3368142
,
-
23827587
,
5096219
,
22740376
,
-
7303417
},
FieldElement
{
2041139
,
-
14256350
,
7783687
,
13876377
,
-
25946985
,
-
13352459
,
24051124
,
13742383
,
-
15637599
,
13295222
},
FieldElement
{
33338237
,
-
8505733
,
12532113
,
7977527
,
9106186
,
-
1715251
,
-
17720195
,
-
4612972
,
-
4451357
,
-
14669444
},
},
{
FieldElement
{
-
20045281
,
5454097
,
-
14346548
,
6447146
,
28862071
,
1883651
,
-
2469266
,
-
4141880
,
7770569
,
9620597
},
FieldElement
{
23208068
,
7979712
,
33071466
,
8149229
,
1758231
,
-
10834995
,
30945528
,
-
1694323
,
-
33502340
,
-
14767970
},
FieldElement
{
1439958
,
-
16270480
,
-
1079989
,
-
793782
,
4625402
,
10647766
,
-
5043801
,
1220118
,
30494170
,
-
11440799
},
},
{
FieldElement
{
-
5037580
,
-
13028295
,
-
2970559
,
-
3061767
,
15640974
,
-
6701666
,
-
26739026
,
926050
,
-
1684339
,
-
13333647
},
FieldElement
{
13908495
,
-
3549272
,
30919928
,
-
6273825
,
-
21521863
,
7989039
,
9021034
,
9078865
,
3353509
,
4033511
},
FieldElement
{
-
29663431
,
-
15113610
,
32259991
,
-
344482
,
24295849
,
-
12912123
,
23161163
,
8839127
,
27485041
,
7356032
},
},
},
{
{
FieldElement
{
9661027
,
705443
,
11980065
,
-
5370154
,
-
1628543
,
14661173
,
-
6346142
,
2625015
,
28431036
,
-
16771834
},
FieldElement
{
-
23839233
,
-
8311415
,
-
25945511
,
7480958
,
-
17681669
,
-
8354183
,
-
22545972
,
14150565
,
15970762
,
4099461
},
FieldElement
{
29262576
,
16756590
,
26350592
,
-
8793563
,
8529671
,
-
11208050
,
13617293
,
-
9937143
,
11465739
,
8317062
},
},
{
FieldElement
{
-
25493081
,
-
6962928
,
32500200
,
-
9419051
,
-
23038724
,
-
2302222
,
14898637
,
3848455
,
20969334
,
-
5157516
},
FieldElement
{
-
20384450
,
-
14347713
,
-
18336405
,
13884722
,
-
33039454
,
2842114
,
-
21610826
,
-
3649888
,
11177095
,
14989547
},
FieldElement
{
-
24496721
,
-
11716016
,
16959896
,
2278463
,
12066309
,
10137771
,
13515641
,
2581286
,
-
28487508
,
9930240
},
},
{
FieldElement
{
-
17751622
,
-
2097826
,
16544300
,
-
13009300
,
-
15914807
,
-
14949081
,
18345767
,
-
13403753
,
16291481
,
-
5314038
},
FieldElement
{
-
33229194
,
2553288
,
32678213
,
9875984
,
8534129
,
6889387
,
-
9676774
,
6957617
,
4368891
,
9788741
},
FieldElement
{
16660756
,
7281060
,
-
10830758
,
12911820
,
20108584
,
-
8101676
,
-
21722536
,
-
8613148
,
16250552
,
-
11111103
},
},
{
FieldElement
{
-
19765507
,
2390526
,
-
16551031
,
14161980
,
1905286
,
6414907
,
4689584
,
10604807
,
-
30190403
,
4782747
},
FieldElement
{
-
1354539
,
14736941
,
-
7367442
,
-
13292886
,
7710542
,
-
14155590
,
-
9981571
,
4383045
,
22546403
,
437323
},
FieldElement
{
31665577
,
-
12180464
,
-
16186830
,
1491339
,
-
18368625
,
3294682
,
27343084
,
2786261
,
-
30633590
,
-
14097016
},
},
{
FieldElement
{
-
14467279
,
-
683715
,
-
33374107
,
7448552
,
19294360
,
14334329
,
-
19690631
,
2355319
,
-
19284671
,
-
6114373
},
FieldElement
{
15121312
,
-
15796162
,
6377020
,
-
6031361
,
-
10798111
,
-
12957845
,
18952177
,
15496498
,
-
29380133
,
11754228
},
FieldElement
{
-
2637277
,
-
13483075
,
8488727
,
-
14303896
,
12728761
,
-
1622493
,
7141596
,
11724556
,
22761615
,
-
10134141
},
},
{
FieldElement
{
16918416
,
11729663
,
-
18083579
,
3022987
,
-
31015732
,
-
13339659
,
-
28741185
,
-
12227393
,
32851222
,
11717399
},
FieldElement
{
11166634
,
7338049
,
-
6722523
,
4531520
,
-
29468672
,
-
7302055
,
31474879
,
3483633
,
-
1193175
,
-
4030831
},
FieldElement
{
-
185635
,
9921305
,
31456609
,
-
13536438
,
-
12013818
,
13348923
,
33142652
,
6546660
,
-
19985279
,
-
3948376
},
},
{
FieldElement
{
-
32460596
,
11266712
,
-
11197107
,
-
7899103
,
31703694
,
3855903
,
-
8537131
,
-
12833048
,
-
30772034
,
-
15486313
},
FieldElement
{
-
18006477
,
12709068
,
3991746
,
-
6479188
,
-
21491523
,
-
10550425
,
-
31135347
,
-
16049879
,
10928917
,
3011958
},
FieldElement
{
-
6957757
,
-
15594337
,
31696059
,
334240
,
29576716
,
14796075
,
-
30831056
,
-
12805180
,
18008031
,
10258577
},
},
{
FieldElement
{
-
22448644
,
15655569
,
7018479
,
-
4410003
,
-
30314266
,
-
1201591
,
-
1853465
,
1367120
,
25127874
,
6671743
},
FieldElement
{
29701166
,
-
14373934
,
-
10878120
,
9279288
,
-
17568
,
13127210
,
21382910
,
11042292
,
25838796
,
4642684
},
FieldElement
{
-
20430234
,
14955537
,
-
24126347
,
8124619
,
-
5369288
,
-
5990470
,
30468147
,
-
13900640
,
18423289
,
4177476
},
},
},
}
vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
0 → 100644
View file @
316acbee
// Copyright 2016 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
edwards25519
// This code is a port of the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
// FieldElement represents an element of the field GF(2^255 - 19). An element
// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on
// context.
type
FieldElement
[
10
]
int32
var
zero
FieldElement
func
FeZero
(
fe
*
FieldElement
)
{
copy
(
fe
[
:
],
zero
[
:
])
}
func
FeOne
(
fe
*
FieldElement
)
{
FeZero
(
fe
)
fe
[
0
]
=
1
}
func
FeAdd
(
dst
,
a
,
b
*
FieldElement
)
{
dst
[
0
]
=
a
[
0
]
+
b
[
0
]
dst
[
1
]
=
a
[
1
]
+
b
[
1
]
dst
[
2
]
=
a
[
2
]
+
b
[
2
]
dst
[
3
]
=
a
[
3
]
+
b
[
3
]
dst
[
4
]
=
a
[
4
]
+
b
[
4
]
dst
[
5
]
=
a
[
5
]
+
b
[
5
]
dst
[
6
]
=
a
[
6
]
+
b
[
6
]
dst
[
7
]
=
a
[
7
]
+
b
[
7
]
dst
[
8
]
=
a
[
8
]
+
b
[
8
]
dst
[
9
]
=
a
[
9
]
+
b
[
9
]
}
func
FeSub
(
dst
,
a
,
b
*
FieldElement
)
{
dst
[
0
]
=
a
[
0
]
-
b
[
0
]
dst
[
1
]
=
a
[
1
]
-
b
[
1
]
dst
[
2
]
=
a
[
2
]
-
b
[
2
]
dst
[
3
]
=
a
[
3
]
-
b
[
3
]
dst
[
4
]
=
a
[
4
]
-
b
[
4
]
dst
[
5
]
=
a
[
5
]
-
b
[
5
]
dst
[
6
]
=
a
[
6
]
-
b
[
6
]
dst
[
7
]
=
a
[
7
]
-
b
[
7
]
dst
[
8
]
=
a
[
8
]
-
b
[
8
]
dst
[
9
]
=
a
[
9
]
-
b
[
9
]
}
func
FeCopy
(
dst
,
src
*
FieldElement
)
{
copy
(
dst
[
:
],
src
[
:
])
}
// Replace (f,g) with (g,g) if b == 1;
// replace (f,g) with (f,g) if b == 0.
//
// Preconditions: b in {0,1}.
func
FeCMove
(
f
,
g
*
FieldElement
,
b
int32
)
{
b
=
-
b
f
[
0
]
^=
b
&
(
f
[
0
]
^
g
[
0
])
f
[
1
]
^=
b
&
(
f
[
1
]
^
g
[
1
])
f
[
2
]
^=
b
&
(
f
[
2
]
^
g
[
2
])
f
[
3
]
^=
b
&
(
f
[
3
]
^
g
[
3
])
f
[
4
]
^=
b
&
(
f
[
4
]
^
g
[
4
])
f
[
5
]
^=
b
&
(
f
[
5
]
^
g
[
5
])
f
[
6
]
^=
b
&
(
f
[
6
]
^
g
[
6
])
f
[
7
]
^=
b
&
(
f
[
7
]
^
g
[
7
])
f
[
8
]
^=
b
&
(
f
[
8
]
^
g
[
8
])
f
[
9
]
^=
b
&
(
f
[
9
]
^
g
[
9
])
}
func
load3
(
in
[]
byte
)
int64
{
var
r
int64
r
=
int64
(
in
[
0
])
r
|=
int64
(
in
[
1
])
<<
8
r
|=
int64
(
in
[
2
])
<<
16
return
r
}
func
load4
(
in
[]
byte
)
int64
{
var
r
int64
r
=
int64
(
in
[
0
])
r
|=
int64
(
in
[
1
])
<<
8
r
|=
int64
(
in
[
2
])
<<
16
r
|=
int64
(
in
[
3
])
<<
24
return
r
}
func
FeFromBytes
(
dst
*
FieldElement
,
src
*
[
32
]
byte
)
{
h0
:=
load4
(
src
[
:
])
h1
:=
load3
(
src
[
4
:
])
<<
6
h2
:=
load3
(
src
[
7
:
])
<<
5
h3
:=
load3
(
src
[
10
:
])
<<
3
h4
:=
load3
(
src
[
13
:
])
<<
2
h5
:=
load4
(
src
[
16
:
])
h6
:=
load3
(
src
[
20
:
])
<<
7
h7
:=
load3
(
src
[
23
:
])
<<
5
h8
:=
load3
(
src
[
26
:
])
<<
4
h9
:=
(
load3
(
src
[
29
:
])
&
8388607
)
<<
2
FeCombine
(
dst
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
// FeToBytes marshals h to s.
// Preconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
//
// Write p=2^255-19; q=floor(h/p).
// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
//
// Proof:
// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.
//
// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
// Then 0<y<1.
//
// Write r=h-pq.
// Have 0<=r<=p-1=2^255-20.
// Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
//
// Write x=r+19(2^-255)r+y.
// Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
//
// Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
// so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
func
FeToBytes
(
s
*
[
32
]
byte
,
h
*
FieldElement
)
{
var
carry
[
10
]
int32
q
:=
(
19
*
h
[
9
]
+
(
1
<<
24
))
>>
25
q
=
(
h
[
0
]
+
q
)
>>
26
q
=
(
h
[
1
]
+
q
)
>>
25
q
=
(
h
[
2
]
+
q
)
>>
26
q
=
(
h
[
3
]
+
q
)
>>
25
q
=
(
h
[
4
]
+
q
)
>>
26
q
=
(
h
[
5
]
+
q
)
>>
25
q
=
(
h
[
6
]
+
q
)
>>
26
q
=
(
h
[
7
]
+
q
)
>>
25
q
=
(
h
[
8
]
+
q
)
>>
26
q
=
(
h
[
9
]
+
q
)
>>
25
// Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.
h
[
0
]
+=
19
*
q
// Goal: Output h-2^255 q, which is between 0 and 2^255-20.
carry
[
0
]
=
h
[
0
]
>>
26
h
[
1
]
+=
carry
[
0
]
h
[
0
]
-=
carry
[
0
]
<<
26
carry
[
1
]
=
h
[
1
]
>>
25
h
[
2
]
+=
carry
[
1
]
h
[
1
]
-=
carry
[
1
]
<<
25
carry
[
2
]
=
h
[
2
]
>>
26
h
[
3
]
+=
carry
[
2
]
h
[
2
]
-=
carry
[
2
]
<<
26
carry
[
3
]
=
h
[
3
]
>>
25
h
[
4
]
+=
carry
[
3
]
h
[
3
]
-=
carry
[
3
]
<<
25
carry
[
4
]
=
h
[
4
]
>>
26
h
[
5
]
+=
carry
[
4
]
h
[
4
]
-=
carry
[
4
]
<<
26
carry
[
5
]
=
h
[
5
]
>>
25
h
[
6
]
+=
carry
[
5
]
h
[
5
]
-=
carry
[
5
]
<<
25
carry
[
6
]
=
h
[
6
]
>>
26
h
[
7
]
+=
carry
[
6
]
h
[
6
]
-=
carry
[
6
]
<<
26
carry
[
7
]
=
h
[
7
]
>>
25
h
[
8
]
+=
carry
[
7
]
h
[
7
]
-=
carry
[
7
]
<<
25
carry
[
8
]
=
h
[
8
]
>>
26
h
[
9
]
+=
carry
[
8
]
h
[
8
]
-=
carry
[
8
]
<<
26
carry
[
9
]
=
h
[
9
]
>>
25
h
[
9
]
-=
carry
[
9
]
<<
25
// h10 = carry9
// Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
// Have h[0]+...+2^230 h[9] between 0 and 2^255-1;
// evidently 2^255 h10-2^255 q = 0.
// Goal: Output h[0]+...+2^230 h[9].
s
[
0
]
=
byte
(
h
[
0
]
>>
0
)
s
[
1
]
=
byte
(
h
[
0
]
>>
8
)
s
[
2
]
=
byte
(
h
[
0
]
>>
16
)
s
[
3
]
=
byte
((
h
[
0
]
>>
24
)
|
(
h
[
1
]
<<
2
))
s
[
4
]
=
byte
(
h
[
1
]
>>
6
)
s
[
5
]
=
byte
(
h
[
1
]
>>
14
)
s
[
6
]
=
byte
((
h
[
1
]
>>
22
)
|
(
h
[
2
]
<<
3
))
s
[
7
]
=
byte
(
h
[
2
]
>>
5
)
s
[
8
]
=
byte
(
h
[
2
]
>>
13
)
s
[
9
]
=
byte
((
h
[
2
]
>>
21
)
|
(
h
[
3
]
<<
5
))
s
[
10
]
=
byte
(
h
[
3
]
>>
3
)
s
[
11
]
=
byte
(
h
[
3
]
>>
11
)
s
[
12
]
=
byte
((
h
[
3
]
>>
19
)
|
(
h
[
4
]
<<
6
))
s
[
13
]
=
byte
(
h
[
4
]
>>
2
)
s
[
14
]
=
byte
(
h
[
4
]
>>
10
)
s
[
15
]
=
byte
(
h
[
4
]
>>
18
)
s
[
16
]
=
byte
(
h
[
5
]
>>
0
)
s
[
17
]
=
byte
(
h
[
5
]
>>
8
)
s
[
18
]
=
byte
(
h
[
5
]
>>
16
)
s
[
19
]
=
byte
((
h
[
5
]
>>
24
)
|
(
h
[
6
]
<<
1
))
s
[
20
]
=
byte
(
h
[
6
]
>>
7
)
s
[
21
]
=
byte
(
h
[
6
]
>>
15
)
s
[
22
]
=
byte
((
h
[
6
]
>>
23
)
|
(
h
[
7
]
<<
3
))
s
[
23
]
=
byte
(
h
[
7
]
>>
5
)
s
[
24
]
=
byte
(
h
[
7
]
>>
13
)
s
[
25
]
=
byte
((
h
[
7
]
>>
21
)
|
(
h
[
8
]
<<
4
))
s
[
26
]
=
byte
(
h
[
8
]
>>
4
)
s
[
27
]
=
byte
(
h
[
8
]
>>
12
)
s
[
28
]
=
byte
((
h
[
8
]
>>
20
)
|
(
h
[
9
]
<<
6
))
s
[
29
]
=
byte
(
h
[
9
]
>>
2
)
s
[
30
]
=
byte
(
h
[
9
]
>>
10
)
s
[
31
]
=
byte
(
h
[
9
]
>>
18
)
}
func
FeIsNegative
(
f
*
FieldElement
)
byte
{
var
s
[
32
]
byte
FeToBytes
(
&
s
,
f
)
return
s
[
0
]
&
1
}
func
FeIsNonZero
(
f
*
FieldElement
)
int32
{
var
s
[
32
]
byte
FeToBytes
(
&
s
,
f
)
var
x
uint8
for
_
,
b
:=
range
s
{
x
|=
b
}
x
|=
x
>>
4
x
|=
x
>>
2
x
|=
x
>>
1
return
int32
(
x
&
1
)
}
// FeNeg sets h = -f
//
// Preconditions:
// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
//
// Postconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
func
FeNeg
(
h
,
f
*
FieldElement
)
{
h
[
0
]
=
-
f
[
0
]
h
[
1
]
=
-
f
[
1
]
h
[
2
]
=
-
f
[
2
]
h
[
3
]
=
-
f
[
3
]
h
[
4
]
=
-
f
[
4
]
h
[
5
]
=
-
f
[
5
]
h
[
6
]
=
-
f
[
6
]
h
[
7
]
=
-
f
[
7
]
h
[
8
]
=
-
f
[
8
]
h
[
9
]
=
-
f
[
9
]
}
func
FeCombine
(
h
*
FieldElement
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
int64
)
{
var
c0
,
c1
,
c2
,
c3
,
c4
,
c5
,
c6
,
c7
,
c8
,
c9
int64
/*
|h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))
i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8
|h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))
i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9
*/
c0
=
(
h0
+
(
1
<<
25
))
>>
26
h1
+=
c0
h0
-=
c0
<<
26
c4
=
(
h4
+
(
1
<<
25
))
>>
26
h5
+=
c4
h4
-=
c4
<<
26
/* |h0| <= 2^25 */
/* |h4| <= 2^25 */
/* |h1| <= 1.51*2^58 */
/* |h5| <= 1.51*2^58 */
c1
=
(
h1
+
(
1
<<
24
))
>>
25
h2
+=
c1
h1
-=
c1
<<
25
c5
=
(
h5
+
(
1
<<
24
))
>>
25
h6
+=
c5
h5
-=
c5
<<
25
/* |h1| <= 2^24; from now on fits into int32 */
/* |h5| <= 2^24; from now on fits into int32 */
/* |h2| <= 1.21*2^59 */
/* |h6| <= 1.21*2^59 */
c2
=
(
h2
+
(
1
<<
25
))
>>
26
h3
+=
c2
h2
-=
c2
<<
26
c6
=
(
h6
+
(
1
<<
25
))
>>
26
h7
+=
c6
h6
-=
c6
<<
26
/* |h2| <= 2^25; from now on fits into int32 unchanged */
/* |h6| <= 2^25; from now on fits into int32 unchanged */
/* |h3| <= 1.51*2^58 */
/* |h7| <= 1.51*2^58 */
c3
=
(
h3
+
(
1
<<
24
))
>>
25
h4
+=
c3
h3
-=
c3
<<
25
c7
=
(
h7
+
(
1
<<
24
))
>>
25
h8
+=
c7
h7
-=
c7
<<
25
/* |h3| <= 2^24; from now on fits into int32 unchanged */
/* |h7| <= 2^24; from now on fits into int32 unchanged */
/* |h4| <= 1.52*2^33 */
/* |h8| <= 1.52*2^33 */
c4
=
(
h4
+
(
1
<<
25
))
>>
26
h5
+=
c4
h4
-=
c4
<<
26
c8
=
(
h8
+
(
1
<<
25
))
>>
26
h9
+=
c8
h8
-=
c8
<<
26
/* |h4| <= 2^25; from now on fits into int32 unchanged */
/* |h8| <= 2^25; from now on fits into int32 unchanged */
/* |h5| <= 1.01*2^24 */
/* |h9| <= 1.51*2^58 */
c9
=
(
h9
+
(
1
<<
24
))
>>
25
h0
+=
c9
*
19
h9
-=
c9
<<
25
/* |h9| <= 2^24; from now on fits into int32 unchanged */
/* |h0| <= 1.8*2^37 */
c0
=
(
h0
+
(
1
<<
25
))
>>
26
h1
+=
c0
h0
-=
c0
<<
26
/* |h0| <= 2^25; from now on fits into int32 unchanged */
/* |h1| <= 1.01*2^24 */
h
[
0
]
=
int32
(
h0
)
h
[
1
]
=
int32
(
h1
)
h
[
2
]
=
int32
(
h2
)
h
[
3
]
=
int32
(
h3
)
h
[
4
]
=
int32
(
h4
)
h
[
5
]
=
int32
(
h5
)
h
[
6
]
=
int32
(
h6
)
h
[
7
]
=
int32
(
h7
)
h
[
8
]
=
int32
(
h8
)
h
[
9
]
=
int32
(
h9
)
}
// FeMul calculates h = f * g
// Can overlap h with f or g.
//
// Preconditions:
// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
//
// Postconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
//
// Notes on implementation strategy:
//
// Using schoolbook multiplication.
// Karatsuba would save a little in some cost models.
//
// Most multiplications by 2 and 19 are 32-bit precomputations;
// cheaper than 64-bit postcomputations.
//
// There is one remaining multiplication by 19 in the carry chain;
// one *19 precomputation can be merged into this,
// but the resulting data flow is considerably less clean.
//
// There are 12 carries below.
// 10 of them are 2-way parallelizable and vectorizable.
// Can get away with 11 carries, but then data flow is much deeper.
//
// With tighter constraints on inputs, can squeeze carries into int32.
func
FeMul
(
h
,
f
,
g
*
FieldElement
)
{
f0
:=
int64
(
f
[
0
])
f1
:=
int64
(
f
[
1
])
f2
:=
int64
(
f
[
2
])
f3
:=
int64
(
f
[
3
])
f4
:=
int64
(
f
[
4
])
f5
:=
int64
(
f
[
5
])
f6
:=
int64
(
f
[
6
])
f7
:=
int64
(
f
[
7
])
f8
:=
int64
(
f
[
8
])
f9
:=
int64
(
f
[
9
])
f1_2
:=
int64
(
2
*
f
[
1
])
f3_2
:=
int64
(
2
*
f
[
3
])
f5_2
:=
int64
(
2
*
f
[
5
])
f7_2
:=
int64
(
2
*
f
[
7
])
f9_2
:=
int64
(
2
*
f
[
9
])
g0
:=
int64
(
g
[
0
])
g1
:=
int64
(
g
[
1
])
g2
:=
int64
(
g
[
2
])
g3
:=
int64
(
g
[
3
])
g4
:=
int64
(
g
[
4
])
g5
:=
int64
(
g
[
5
])
g6
:=
int64
(
g
[
6
])
g7
:=
int64
(
g
[
7
])
g8
:=
int64
(
g
[
8
])
g9
:=
int64
(
g
[
9
])
g1_19
:=
int64
(
19
*
g
[
1
])
/* 1.4*2^29 */
g2_19
:=
int64
(
19
*
g
[
2
])
/* 1.4*2^30; still ok */
g3_19
:=
int64
(
19
*
g
[
3
])
g4_19
:=
int64
(
19
*
g
[
4
])
g5_19
:=
int64
(
19
*
g
[
5
])
g6_19
:=
int64
(
19
*
g
[
6
])
g7_19
:=
int64
(
19
*
g
[
7
])
g8_19
:=
int64
(
19
*
g
[
8
])
g9_19
:=
int64
(
19
*
g
[
9
])
h0
:=
f0
*
g0
+
f1_2
*
g9_19
+
f2
*
g8_19
+
f3_2
*
g7_19
+
f4
*
g6_19
+
f5_2
*
g5_19
+
f6
*
g4_19
+
f7_2
*
g3_19
+
f8
*
g2_19
+
f9_2
*
g1_19
h1
:=
f0
*
g1
+
f1
*
g0
+
f2
*
g9_19
+
f3
*
g8_19
+
f4
*
g7_19
+
f5
*
g6_19
+
f6
*
g5_19
+
f7
*
g4_19
+
f8
*
g3_19
+
f9
*
g2_19
h2
:=
f0
*
g2
+
f1_2
*
g1
+
f2
*
g0
+
f3_2
*
g9_19
+
f4
*
g8_19
+
f5_2
*
g7_19
+
f6
*
g6_19
+
f7_2
*
g5_19
+
f8
*
g4_19
+
f9_2
*
g3_19
h3
:=
f0
*
g3
+
f1
*
g2
+
f2
*
g1
+
f3
*
g0
+
f4
*
g9_19
+
f5
*
g8_19
+
f6
*
g7_19
+
f7
*
g6_19
+
f8
*
g5_19
+
f9
*
g4_19
h4
:=
f0
*
g4
+
f1_2
*
g3
+
f2
*
g2
+
f3_2
*
g1
+
f4
*
g0
+
f5_2
*
g9_19
+
f6
*
g8_19
+
f7_2
*
g7_19
+
f8
*
g6_19
+
f9_2
*
g5_19
h5
:=
f0
*
g5
+
f1
*
g4
+
f2
*
g3
+
f3
*
g2
+
f4
*
g1
+
f5
*
g0
+
f6
*
g9_19
+
f7
*
g8_19
+
f8
*
g7_19
+
f9
*
g6_19
h6
:=
f0
*
g6
+
f1_2
*
g5
+
f2
*
g4
+
f3_2
*
g3
+
f4
*
g2
+
f5_2
*
g1
+
f6
*
g0
+
f7_2
*
g9_19
+
f8
*
g8_19
+
f9_2
*
g7_19
h7
:=
f0
*
g7
+
f1
*
g6
+
f2
*
g5
+
f3
*
g4
+
f4
*
g3
+
f5
*
g2
+
f6
*
g1
+
f7
*
g0
+
f8
*
g9_19
+
f9
*
g8_19
h8
:=
f0
*
g8
+
f1_2
*
g7
+
f2
*
g6
+
f3_2
*
g5
+
f4
*
g4
+
f5_2
*
g3
+
f6
*
g2
+
f7_2
*
g1
+
f8
*
g0
+
f9_2
*
g9_19
h9
:=
f0
*
g9
+
f1
*
g8
+
f2
*
g7
+
f3
*
g6
+
f4
*
g5
+
f5
*
g4
+
f6
*
g3
+
f7
*
g2
+
f8
*
g1
+
f9
*
g0
FeCombine
(
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
func
feSquare
(
f
*
FieldElement
)
(
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
int64
)
{
f0
:=
int64
(
f
[
0
])
f1
:=
int64
(
f
[
1
])
f2
:=
int64
(
f
[
2
])
f3
:=
int64
(
f
[
3
])
f4
:=
int64
(
f
[
4
])
f5
:=
int64
(
f
[
5
])
f6
:=
int64
(
f
[
6
])
f7
:=
int64
(
f
[
7
])
f8
:=
int64
(
f
[
8
])
f9
:=
int64
(
f
[
9
])
f0_2
:=
int64
(
2
*
f
[
0
])
f1_2
:=
int64
(
2
*
f
[
1
])
f2_2
:=
int64
(
2
*
f
[
2
])
f3_2
:=
int64
(
2
*
f
[
3
])
f4_2
:=
int64
(
2
*
f
[
4
])
f5_2
:=
int64
(
2
*
f
[
5
])
f6_2
:=
int64
(
2
*
f
[
6
])
f7_2
:=
int64
(
2
*
f
[
7
])
f5_38
:=
38
*
f5
// 1.31*2^30
f6_19
:=
19
*
f6
// 1.31*2^30
f7_38
:=
38
*
f7
// 1.31*2^30
f8_19
:=
19
*
f8
// 1.31*2^30
f9_38
:=
38
*
f9
// 1.31*2^30
h0
=
f0
*
f0
+
f1_2
*
f9_38
+
f2_2
*
f8_19
+
f3_2
*
f7_38
+
f4_2
*
f6_19
+
f5
*
f5_38
h1
=
f0_2
*
f1
+
f2
*
f9_38
+
f3_2
*
f8_19
+
f4
*
f7_38
+
f5_2
*
f6_19
h2
=
f0_2
*
f2
+
f1_2
*
f1
+
f3_2
*
f9_38
+
f4_2
*
f8_19
+
f5_2
*
f7_38
+
f6
*
f6_19
h3
=
f0_2
*
f3
+
f1_2
*
f2
+
f4
*
f9_38
+
f5_2
*
f8_19
+
f6
*
f7_38
h4
=
f0_2
*
f4
+
f1_2
*
f3_2
+
f2
*
f2
+
f5_2
*
f9_38
+
f6_2
*
f8_19
+
f7
*
f7_38
h5
=
f0_2
*
f5
+
f1_2
*
f4
+
f2_2
*
f3
+
f6
*
f9_38
+
f7_2
*
f8_19
h6
=
f0_2
*
f6
+
f1_2
*
f5_2
+
f2_2
*
f4
+
f3_2
*
f3
+
f7_2
*
f9_38
+
f8
*
f8_19
h7
=
f0_2
*
f7
+
f1_2
*
f6
+
f2_2
*
f5
+
f3_2
*
f4
+
f8
*
f9_38
h8
=
f0_2
*
f8
+
f1_2
*
f7_2
+
f2_2
*
f6
+
f3_2
*
f5_2
+
f4
*
f4
+
f9
*
f9_38
h9
=
f0_2
*
f9
+
f1_2
*
f8
+
f2_2
*
f7
+
f3_2
*
f6
+
f4_2
*
f5
return
}
// FeSquare calculates h = f*f. Can overlap h with f.
//
// Preconditions:
// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
//
// Postconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
func
FeSquare
(
h
,
f
*
FieldElement
)
{
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
:=
feSquare
(
f
)
FeCombine
(
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
// FeSquare2 sets h = 2 * f * f
//
// Can overlap h with f.
//
// Preconditions:
// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
//
// Postconditions:
// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
// See fe_mul.c for discussion of implementation strategy.
func
FeSquare2
(
h
,
f
*
FieldElement
)
{
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
:=
feSquare
(
f
)
h0
+=
h0
h1
+=
h1
h2
+=
h2
h3
+=
h3
h4
+=
h4
h5
+=
h5
h6
+=
h6
h7
+=
h7
h8
+=
h8
h9
+=
h9
FeCombine
(
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
func
FeInvert
(
out
,
z
*
FieldElement
)
{
var
t0
,
t1
,
t2
,
t3
FieldElement
var
i
int
FeSquare
(
&
t0
,
z
)
// 2^1
FeSquare
(
&
t1
,
&
t0
)
// 2^2
for
i
=
1
;
i
<
2
;
i
++
{
// 2^3
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
z
,
&
t1
)
// 2^3 + 2^0
FeMul
(
&
t0
,
&
t0
,
&
t1
)
// 2^3 + 2^1 + 2^0
FeSquare
(
&
t2
,
&
t0
)
// 2^4 + 2^2 + 2^1
FeMul
(
&
t1
,
&
t1
,
&
t2
)
// 2^4 + 2^3 + 2^2 + 2^1 + 2^0
FeSquare
(
&
t2
,
&
t1
)
// 5,4,3,2,1
for
i
=
1
;
i
<
5
;
i
++
{
// 9,8,7,6,5
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
// 9,8,7,6,5,4,3,2,1,0
FeSquare
(
&
t2
,
&
t1
)
// 10..1
for
i
=
1
;
i
<
10
;
i
++
{
// 19..10
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t2
,
&
t2
,
&
t1
)
// 19..0
FeSquare
(
&
t3
,
&
t2
)
// 20..1
for
i
=
1
;
i
<
20
;
i
++
{
// 39..20
FeSquare
(
&
t3
,
&
t3
)
}
FeMul
(
&
t2
,
&
t3
,
&
t2
)
// 39..0
FeSquare
(
&
t2
,
&
t2
)
// 40..1
for
i
=
1
;
i
<
10
;
i
++
{
// 49..10
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
// 49..0
FeSquare
(
&
t2
,
&
t1
)
// 50..1
for
i
=
1
;
i
<
50
;
i
++
{
// 99..50
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t2
,
&
t2
,
&
t1
)
// 99..0
FeSquare
(
&
t3
,
&
t2
)
// 100..1
for
i
=
1
;
i
<
100
;
i
++
{
// 199..100
FeSquare
(
&
t3
,
&
t3
)
}
FeMul
(
&
t2
,
&
t3
,
&
t2
)
// 199..0
FeSquare
(
&
t2
,
&
t2
)
// 200..1
for
i
=
1
;
i
<
50
;
i
++
{
// 249..50
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
// 249..0
FeSquare
(
&
t1
,
&
t1
)
// 250..1
for
i
=
1
;
i
<
5
;
i
++
{
// 254..5
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
out
,
&
t1
,
&
t0
)
// 254..5,3,1,0
}
func
fePow22523
(
out
,
z
*
FieldElement
)
{
var
t0
,
t1
,
t2
FieldElement
var
i
int
FeSquare
(
&
t0
,
z
)
for
i
=
1
;
i
<
1
;
i
++
{
FeSquare
(
&
t0
,
&
t0
)
}
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
2
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
z
,
&
t1
)
FeMul
(
&
t0
,
&
t0
,
&
t1
)
FeSquare
(
&
t0
,
&
t0
)
for
i
=
1
;
i
<
1
;
i
++
{
FeSquare
(
&
t0
,
&
t0
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
5
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
10
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
&
t1
,
&
t0
)
FeSquare
(
&
t2
,
&
t1
)
for
i
=
1
;
i
<
20
;
i
++
{
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
FeSquare
(
&
t1
,
&
t1
)
for
i
=
1
;
i
<
10
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
50
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
&
t1
,
&
t0
)
FeSquare
(
&
t2
,
&
t1
)
for
i
=
1
;
i
<
100
;
i
++
{
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
FeSquare
(
&
t1
,
&
t1
)
for
i
=
1
;
i
<
50
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t0
,
&
t0
)
for
i
=
1
;
i
<
2
;
i
++
{
FeSquare
(
&
t0
,
&
t0
)
}
FeMul
(
out
,
&
t0
,
z
)
}
// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 *
// y^2 where d = -121665/121666.
//
// Several representations are used:
// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z
// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
// PreComputedGroupElement: (y+x,y-x,2dxy)
type
ProjectiveGroupElement
struct
{
X
,
Y
,
Z
FieldElement
}
type
ExtendedGroupElement
struct
{
X
,
Y
,
Z
,
T
FieldElement
}
type
CompletedGroupElement
struct
{
X
,
Y
,
Z
,
T
FieldElement
}
type
PreComputedGroupElement
struct
{
yPlusX
,
yMinusX
,
xy2d
FieldElement
}
type
CachedGroupElement
struct
{
yPlusX
,
yMinusX
,
Z
,
T2d
FieldElement
}
func
(
p
*
ProjectiveGroupElement
)
Zero
()
{
FeZero
(
&
p
.
X
)
FeOne
(
&
p
.
Y
)
FeOne
(
&
p
.
Z
)
}
func
(
p
*
ProjectiveGroupElement
)
Double
(
r
*
CompletedGroupElement
)
{
var
t0
FieldElement
FeSquare
(
&
r
.
X
,
&
p
.
X
)
FeSquare
(
&
r
.
Z
,
&
p
.
Y
)
FeSquare2
(
&
r
.
T
,
&
p
.
Z
)
FeAdd
(
&
r
.
Y
,
&
p
.
X
,
&
p
.
Y
)
FeSquare
(
&
t0
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
X
)
FeSub
(
&
r
.
Z
,
&
r
.
Z
,
&
r
.
X
)
FeSub
(
&
r
.
X
,
&
t0
,
&
r
.
Y
)
FeSub
(
&
r
.
T
,
&
r
.
T
,
&
r
.
Z
)
}
func
(
p
*
ProjectiveGroupElement
)
ToBytes
(
s
*
[
32
]
byte
)
{
var
recip
,
x
,
y
FieldElement
FeInvert
(
&
recip
,
&
p
.
Z
)
FeMul
(
&
x
,
&
p
.
X
,
&
recip
)
FeMul
(
&
y
,
&
p
.
Y
,
&
recip
)
FeToBytes
(
s
,
&
y
)
s
[
31
]
^=
FeIsNegative
(
&
x
)
<<
7
}
func
(
p
*
ExtendedGroupElement
)
Zero
()
{
FeZero
(
&
p
.
X
)
FeOne
(
&
p
.
Y
)
FeOne
(
&
p
.
Z
)
FeZero
(
&
p
.
T
)
}
func
(
p
*
ExtendedGroupElement
)
Double
(
r
*
CompletedGroupElement
)
{
var
q
ProjectiveGroupElement
p
.
ToProjective
(
&
q
)
q
.
Double
(
r
)
}
func
(
p
*
ExtendedGroupElement
)
ToCached
(
r
*
CachedGroupElement
)
{
FeAdd
(
&
r
.
yPlusX
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
yMinusX
,
&
p
.
Y
,
&
p
.
X
)
FeCopy
(
&
r
.
Z
,
&
p
.
Z
)
FeMul
(
&
r
.
T2d
,
&
p
.
T
,
&
d2
)
}
func
(
p
*
ExtendedGroupElement
)
ToProjective
(
r
*
ProjectiveGroupElement
)
{
FeCopy
(
&
r
.
X
,
&
p
.
X
)
FeCopy
(
&
r
.
Y
,
&
p
.
Y
)
FeCopy
(
&
r
.
Z
,
&
p
.
Z
)
}
func
(
p
*
ExtendedGroupElement
)
ToBytes
(
s
*
[
32
]
byte
)
{
var
recip
,
x
,
y
FieldElement
FeInvert
(
&
recip
,
&
p
.
Z
)
FeMul
(
&
x
,
&
p
.
X
,
&
recip
)
FeMul
(
&
y
,
&
p
.
Y
,
&
recip
)
FeToBytes
(
s
,
&
y
)
s
[
31
]
^=
FeIsNegative
(
&
x
)
<<
7
}
func
(
p
*
ExtendedGroupElement
)
FromBytes
(
s
*
[
32
]
byte
)
bool
{
var
u
,
v
,
v3
,
vxx
,
check
FieldElement
FeFromBytes
(
&
p
.
Y
,
s
)
FeOne
(
&
p
.
Z
)
FeSquare
(
&
u
,
&
p
.
Y
)
FeMul
(
&
v
,
&
u
,
&
d
)
FeSub
(
&
u
,
&
u
,
&
p
.
Z
)
// y = y^2-1
FeAdd
(
&
v
,
&
v
,
&
p
.
Z
)
// v = dy^2+1
FeSquare
(
&
v3
,
&
v
)
FeMul
(
&
v3
,
&
v3
,
&
v
)
// v3 = v^3
FeSquare
(
&
p
.
X
,
&
v3
)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
v
)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
u
)
// x = uv^7
fePow22523
(
&
p
.
X
,
&
p
.
X
)
// x = (uv^7)^((q-5)/8)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
v3
)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
u
)
// x = uv^3(uv^7)^((q-5)/8)
var
tmpX
,
tmp2
[
32
]
byte
FeSquare
(
&
vxx
,
&
p
.
X
)
FeMul
(
&
vxx
,
&
vxx
,
&
v
)
FeSub
(
&
check
,
&
vxx
,
&
u
)
// vx^2-u
if
FeIsNonZero
(
&
check
)
==
1
{
FeAdd
(
&
check
,
&
vxx
,
&
u
)
// vx^2+u
if
FeIsNonZero
(
&
check
)
==
1
{
return
false
}
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
SqrtM1
)
FeToBytes
(
&
tmpX
,
&
p
.
X
)
for
i
,
v
:=
range
tmpX
{
tmp2
[
31
-
i
]
=
v
}
}
if
FeIsNegative
(
&
p
.
X
)
!=
(
s
[
31
]
>>
7
)
{
FeNeg
(
&
p
.
X
,
&
p
.
X
)
}
FeMul
(
&
p
.
T
,
&
p
.
X
,
&
p
.
Y
)
return
true
}
func
(
p
*
CompletedGroupElement
)
ToProjective
(
r
*
ProjectiveGroupElement
)
{
FeMul
(
&
r
.
X
,
&
p
.
X
,
&
p
.
T
)
FeMul
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
Z
)
FeMul
(
&
r
.
Z
,
&
p
.
Z
,
&
p
.
T
)
}
func
(
p
*
CompletedGroupElement
)
ToExtended
(
r
*
ExtendedGroupElement
)
{
FeMul
(
&
r
.
X
,
&
p
.
X
,
&
p
.
T
)
FeMul
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
Z
)
FeMul
(
&
r
.
Z
,
&
p
.
Z
,
&
p
.
T
)
FeMul
(
&
r
.
T
,
&
p
.
X
,
&
p
.
Y
)
}
func
(
p
*
PreComputedGroupElement
)
Zero
()
{
FeOne
(
&
p
.
yPlusX
)
FeOne
(
&
p
.
yMinusX
)
FeZero
(
&
p
.
xy2d
)
}
func
geAdd
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
CachedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
T
,
&
q
.
T2d
,
&
p
.
T
)
FeMul
(
&
r
.
X
,
&
p
.
Z
,
&
q
.
Z
)
FeAdd
(
&
t0
,
&
r
.
X
,
&
r
.
X
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeSub
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
geSub
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
CachedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
T
,
&
q
.
T2d
,
&
p
.
T
)
FeMul
(
&
r
.
X
,
&
p
.
Z
,
&
q
.
Z
)
FeAdd
(
&
t0
,
&
r
.
X
,
&
r
.
X
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeSub
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeAdd
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
geMixedAdd
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
PreComputedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
T
,
&
q
.
xy2d
,
&
p
.
T
)
FeAdd
(
&
t0
,
&
p
.
Z
,
&
p
.
Z
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeSub
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
geMixedSub
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
PreComputedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
T
,
&
q
.
xy2d
,
&
p
.
T
)
FeAdd
(
&
t0
,
&
p
.
Z
,
&
p
.
Z
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeSub
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeAdd
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
slide
(
r
*
[
256
]
int8
,
a
*
[
32
]
byte
)
{
for
i
:=
range
r
{
r
[
i
]
=
int8
(
1
&
(
a
[
i
>>
3
]
>>
uint
(
i
&
7
)))
}
for
i
:=
range
r
{
if
r
[
i
]
!=
0
{
for
b
:=
1
;
b
<=
6
&&
i
+
b
<
256
;
b
++
{
if
r
[
i
+
b
]
!=
0
{
if
r
[
i
]
+
(
r
[
i
+
b
]
<<
uint
(
b
))
<=
15
{
r
[
i
]
+=
r
[
i
+
b
]
<<
uint
(
b
)
r
[
i
+
b
]
=
0
}
else
if
r
[
i
]
-
(
r
[
i
+
b
]
<<
uint
(
b
))
>=
-
15
{
r
[
i
]
-=
r
[
i
+
b
]
<<
uint
(
b
)
for
k
:=
i
+
b
;
k
<
256
;
k
++
{
if
r
[
k
]
==
0
{
r
[
k
]
=
1
break
}
r
[
k
]
=
0
}
}
else
{
break
}
}
}
}
}
}
// GeDoubleScalarMultVartime sets r = a*A + b*B
// where a = a[0]+256*a[1]+...+256^31 a[31].
// and b = b[0]+256*b[1]+...+256^31 b[31].
// B is the Ed25519 base point (x,4/5) with x positive.
func
GeDoubleScalarMultVartime
(
r
*
ProjectiveGroupElement
,
a
*
[
32
]
byte
,
A
*
ExtendedGroupElement
,
b
*
[
32
]
byte
)
{
var
aSlide
,
bSlide
[
256
]
int8
var
Ai
[
8
]
CachedGroupElement
// A,3A,5A,7A,9A,11A,13A,15A
var
t
CompletedGroupElement
var
u
,
A2
ExtendedGroupElement
var
i
int
slide
(
&
aSlide
,
a
)
slide
(
&
bSlide
,
b
)
A
.
ToCached
(
&
Ai
[
0
])
A
.
Double
(
&
t
)
t
.
ToExtended
(
&
A2
)
for
i
:=
0
;
i
<
7
;
i
++
{
geAdd
(
&
t
,
&
A2
,
&
Ai
[
i
])
t
.
ToExtended
(
&
u
)
u
.
ToCached
(
&
Ai
[
i
+
1
])
}
r
.
Zero
()
for
i
=
255
;
i
>=
0
;
i
--
{
if
aSlide
[
i
]
!=
0
||
bSlide
[
i
]
!=
0
{
break
}
}
for
;
i
>=
0
;
i
--
{
r
.
Double
(
&
t
)
if
aSlide
[
i
]
>
0
{
t
.
ToExtended
(
&
u
)
geAdd
(
&
t
,
&
u
,
&
Ai
[
aSlide
[
i
]
/
2
])
}
else
if
aSlide
[
i
]
<
0
{
t
.
ToExtended
(
&
u
)
geSub
(
&
t
,
&
u
,
&
Ai
[(
-
aSlide
[
i
])
/
2
])
}
if
bSlide
[
i
]
>
0
{
t
.
ToExtended
(
&
u
)
geMixedAdd
(
&
t
,
&
u
,
&
bi
[
bSlide
[
i
]
/
2
])
}
else
if
bSlide
[
i
]
<
0
{
t
.
ToExtended
(
&
u
)
geMixedSub
(
&
t
,
&
u
,
&
bi
[(
-
bSlide
[
i
])
/
2
])
}
t
.
ToProjective
(
r
)
}
}
// equal returns 1 if b == c and 0 otherwise, assuming that b and c are
// non-negative.
func
equal
(
b
,
c
int32
)
int32
{
x
:=
uint32
(
b
^
c
)
x
--
return
int32
(
x
>>
31
)
}
// negative returns 1 if b < 0 and 0 otherwise.
func
negative
(
b
int32
)
int32
{
return
(
b
>>
31
)
&
1
}
func
PreComputedGroupElementCMove
(
t
,
u
*
PreComputedGroupElement
,
b
int32
)
{
FeCMove
(
&
t
.
yPlusX
,
&
u
.
yPlusX
,
b
)
FeCMove
(
&
t
.
yMinusX
,
&
u
.
yMinusX
,
b
)
FeCMove
(
&
t
.
xy2d
,
&
u
.
xy2d
,
b
)
}
func
selectPoint
(
t
*
PreComputedGroupElement
,
pos
int32
,
b
int32
)
{
var
minusT
PreComputedGroupElement
bNegative
:=
negative
(
b
)
bAbs
:=
b
-
(((
-
bNegative
)
&
b
)
<<
1
)
t
.
Zero
()
for
i
:=
int32
(
0
);
i
<
8
;
i
++
{
PreComputedGroupElementCMove
(
t
,
&
base
[
pos
][
i
],
equal
(
bAbs
,
i
+
1
))
}
FeCopy
(
&
minusT
.
yPlusX
,
&
t
.
yMinusX
)
FeCopy
(
&
minusT
.
yMinusX
,
&
t
.
yPlusX
)
FeNeg
(
&
minusT
.
xy2d
,
&
t
.
xy2d
)
PreComputedGroupElementCMove
(
t
,
&
minusT
,
bNegative
)
}
// GeScalarMultBase computes h = a*B, where
// a = a[0]+256*a[1]+...+256^31 a[31]
// B is the Ed25519 base point (x,4/5) with x positive.
//
// Preconditions:
// a[31] <= 127
func
GeScalarMultBase
(
h
*
ExtendedGroupElement
,
a
*
[
32
]
byte
)
{
var
e
[
64
]
int8
for
i
,
v
:=
range
a
{
e
[
2
*
i
]
=
int8
(
v
&
15
)
e
[
2
*
i
+
1
]
=
int8
((
v
>>
4
)
&
15
)
}
// each e[i] is between 0 and 15 and e[63] is between 0 and 7.
carry
:=
int8
(
0
)
for
i
:=
0
;
i
<
63
;
i
++
{
e
[
i
]
+=
carry
carry
=
(
e
[
i
]
+
8
)
>>
4
e
[
i
]
-=
carry
<<
4
}
e
[
63
]
+=
carry
// each e[i] is between -8 and 8.
h
.
Zero
()
var
t
PreComputedGroupElement
var
r
CompletedGroupElement
for
i
:=
int32
(
1
);
i
<
64
;
i
+=
2
{
selectPoint
(
&
t
,
i
/
2
,
int32
(
e
[
i
]))
geMixedAdd
(
&
r
,
h
,
&
t
)
r
.
ToExtended
(
h
)
}
var
s
ProjectiveGroupElement
h
.
Double
(
&
r
)
r
.
ToProjective
(
&
s
)
s
.
Double
(
&
r
)
r
.
ToProjective
(
&
s
)
s
.
Double
(
&
r
)
r
.
ToProjective
(
&
s
)
s
.
Double
(
&
r
)
r
.
ToExtended
(
h
)
for
i
:=
int32
(
0
);
i
<
64
;
i
+=
2
{
selectPoint
(
&
t
,
i
/
2
,
int32
(
e
[
i
]))
geMixedAdd
(
&
r
,
h
,
&
t
)
r
.
ToExtended
(
h
)
}
}
// The scalars are GF(2^252 + 27742317777372353535851937790883648493).
// Input:
// a[0]+256*a[1]+...+256^31*a[31] = a
// b[0]+256*b[1]+...+256^31*b[31] = b
// c[0]+256*c[1]+...+256^31*c[31] = c
//
// Output:
// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
// where l = 2^252 + 27742317777372353535851937790883648493.
func
ScMulAdd
(
s
,
a
,
b
,
c
*
[
32
]
byte
)
{
a0
:=
2097151
&
load3
(
a
[
:
])
a1
:=
2097151
&
(
load4
(
a
[
2
:
])
>>
5
)
a2
:=
2097151
&
(
load3
(
a
[
5
:
])
>>
2
)
a3
:=
2097151
&
(
load4
(
a
[
7
:
])
>>
7
)
a4
:=
2097151
&
(
load4
(
a
[
10
:
])
>>
4
)
a5
:=
2097151
&
(
load3
(
a
[
13
:
])
>>
1
)
a6
:=
2097151
&
(
load4
(
a
[
15
:
])
>>
6
)
a7
:=
2097151
&
(
load3
(
a
[
18
:
])
>>
3
)
a8
:=
2097151
&
load3
(
a
[
21
:
])
a9
:=
2097151
&
(
load4
(
a
[
23
:
])
>>
5
)
a10
:=
2097151
&
(
load3
(
a
[
26
:
])
>>
2
)
a11
:=
(
load4
(
a
[
28
:
])
>>
7
)
b0
:=
2097151
&
load3
(
b
[
:
])
b1
:=
2097151
&
(
load4
(
b
[
2
:
])
>>
5
)
b2
:=
2097151
&
(
load3
(
b
[
5
:
])
>>
2
)
b3
:=
2097151
&
(
load4
(
b
[
7
:
])
>>
7
)
b4
:=
2097151
&
(
load4
(
b
[
10
:
])
>>
4
)
b5
:=
2097151
&
(
load3
(
b
[
13
:
])
>>
1
)
b6
:=
2097151
&
(
load4
(
b
[
15
:
])
>>
6
)
b7
:=
2097151
&
(
load3
(
b
[
18
:
])
>>
3
)
b8
:=
2097151
&
load3
(
b
[
21
:
])
b9
:=
2097151
&
(
load4
(
b
[
23
:
])
>>
5
)
b10
:=
2097151
&
(
load3
(
b
[
26
:
])
>>
2
)
b11
:=
(
load4
(
b
[
28
:
])
>>
7
)
c0
:=
2097151
&
load3
(
c
[
:
])
c1
:=
2097151
&
(
load4
(
c
[
2
:
])
>>
5
)
c2
:=
2097151
&
(
load3
(
c
[
5
:
])
>>
2
)
c3
:=
2097151
&
(
load4
(
c
[
7
:
])
>>
7
)
c4
:=
2097151
&
(
load4
(
c
[
10
:
])
>>
4
)
c5
:=
2097151
&
(
load3
(
c
[
13
:
])
>>
1
)
c6
:=
2097151
&
(
load4
(
c
[
15
:
])
>>
6
)
c7
:=
2097151
&
(
load3
(
c
[
18
:
])
>>
3
)
c8
:=
2097151
&
load3
(
c
[
21
:
])
c9
:=
2097151
&
(
load4
(
c
[
23
:
])
>>
5
)
c10
:=
2097151
&
(
load3
(
c
[
26
:
])
>>
2
)
c11
:=
(
load4
(
c
[
28
:
])
>>
7
)
var
carry
[
23
]
int64
s0
:=
c0
+
a0
*
b0
s1
:=
c1
+
a0
*
b1
+
a1
*
b0
s2
:=
c2
+
a0
*
b2
+
a1
*
b1
+
a2
*
b0
s3
:=
c3
+
a0
*
b3
+
a1
*
b2
+
a2
*
b1
+
a3
*
b0
s4
:=
c4
+
a0
*
b4
+
a1
*
b3
+
a2
*
b2
+
a3
*
b1
+
a4
*
b0
s5
:=
c5
+
a0
*
b5
+
a1
*
b4
+
a2
*
b3
+
a3
*
b2
+
a4
*
b1
+
a5
*
b0
s6
:=
c6
+
a0
*
b6
+
a1
*
b5
+
a2
*
b4
+
a3
*
b3
+
a4
*
b2
+
a5
*
b1
+
a6
*
b0
s7
:=
c7
+
a0
*
b7
+
a1
*
b6
+
a2
*
b5
+
a3
*
b4
+
a4
*
b3
+
a5
*
b2
+
a6
*
b1
+
a7
*
b0
s8
:=
c8
+
a0
*
b8
+
a1
*
b7
+
a2
*
b6
+
a3
*
b5
+
a4
*
b4
+
a5
*
b3
+
a6
*
b2
+
a7
*
b1
+
a8
*
b0
s9
:=
c9
+
a0
*
b9
+
a1
*
b8
+
a2
*
b7
+
a3
*
b6
+
a4
*
b5
+
a5
*
b4
+
a6
*
b3
+
a7
*
b2
+
a8
*
b1
+
a9
*
b0
s10
:=
c10
+
a0
*
b10
+
a1
*
b9
+
a2
*
b8
+
a3
*
b7
+
a4
*
b6
+
a5
*
b5
+
a6
*
b4
+
a7
*
b3
+
a8
*
b2
+
a9
*
b1
+
a10
*
b0
s11
:=
c11
+
a0
*
b11
+
a1
*
b10
+
a2
*
b9
+
a3
*
b8
+
a4
*
b7
+
a5
*
b6
+
a6
*
b5
+
a7
*
b4
+
a8
*
b3
+
a9
*
b2
+
a10
*
b1
+
a11
*
b0
s12
:=
a1
*
b11
+
a2
*
b10
+
a3
*
b9
+
a4
*
b8
+
a5
*
b7
+
a6
*
b6
+
a7
*
b5
+
a8
*
b4
+
a9
*
b3
+
a10
*
b2
+
a11
*
b1
s13
:=
a2
*
b11
+
a3
*
b10
+
a4
*
b9
+
a5
*
b8
+
a6
*
b7
+
a7
*
b6
+
a8
*
b5
+
a9
*
b4
+
a10
*
b3
+
a11
*
b2
s14
:=
a3
*
b11
+
a4
*
b10
+
a5
*
b9
+
a6
*
b8
+
a7
*
b7
+
a8
*
b6
+
a9
*
b5
+
a10
*
b4
+
a11
*
b3
s15
:=
a4
*
b11
+
a5
*
b10
+
a6
*
b9
+
a7
*
b8
+
a8
*
b7
+
a9
*
b6
+
a10
*
b5
+
a11
*
b4
s16
:=
a5
*
b11
+
a6
*
b10
+
a7
*
b9
+
a8
*
b8
+
a9
*
b7
+
a10
*
b6
+
a11
*
b5
s17
:=
a6
*
b11
+
a7
*
b10
+
a8
*
b9
+
a9
*
b8
+
a10
*
b7
+
a11
*
b6
s18
:=
a7
*
b11
+
a8
*
b10
+
a9
*
b9
+
a10
*
b8
+
a11
*
b7
s19
:=
a8
*
b11
+
a9
*
b10
+
a10
*
b9
+
a11
*
b8
s20
:=
a9
*
b11
+
a10
*
b10
+
a11
*
b9
s21
:=
a10
*
b11
+
a11
*
b10
s22
:=
a11
*
b11
s23
:=
int64
(
0
)
carry
[
0
]
=
(
s0
+
(
1
<<
20
))
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
2
]
=
(
s2
+
(
1
<<
20
))
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
4
]
=
(
s4
+
(
1
<<
20
))
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
12
]
=
(
s12
+
(
1
<<
20
))
>>
21
s13
+=
carry
[
12
]
s12
-=
carry
[
12
]
<<
21
carry
[
14
]
=
(
s14
+
(
1
<<
20
))
>>
21
s15
+=
carry
[
14
]
s14
-=
carry
[
14
]
<<
21
carry
[
16
]
=
(
s16
+
(
1
<<
20
))
>>
21
s17
+=
carry
[
16
]
s16
-=
carry
[
16
]
<<
21
carry
[
18
]
=
(
s18
+
(
1
<<
20
))
>>
21
s19
+=
carry
[
18
]
s18
-=
carry
[
18
]
<<
21
carry
[
20
]
=
(
s20
+
(
1
<<
20
))
>>
21
s21
+=
carry
[
20
]
s20
-=
carry
[
20
]
<<
21
carry
[
22
]
=
(
s22
+
(
1
<<
20
))
>>
21
s23
+=
carry
[
22
]
s22
-=
carry
[
22
]
<<
21
carry
[
1
]
=
(
s1
+
(
1
<<
20
))
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
3
]
=
(
s3
+
(
1
<<
20
))
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
5
]
=
(
s5
+
(
1
<<
20
))
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
carry
[
13
]
=
(
s13
+
(
1
<<
20
))
>>
21
s14
+=
carry
[
13
]
s13
-=
carry
[
13
]
<<
21
carry
[
15
]
=
(
s15
+
(
1
<<
20
))
>>
21
s16
+=
carry
[
15
]
s15
-=
carry
[
15
]
<<
21
carry
[
17
]
=
(
s17
+
(
1
<<
20
))
>>
21
s18
+=
carry
[
17
]
s17
-=
carry
[
17
]
<<
21
carry
[
19
]
=
(
s19
+
(
1
<<
20
))
>>
21
s20
+=
carry
[
19
]
s19
-=
carry
[
19
]
<<
21
carry
[
21
]
=
(
s21
+
(
1
<<
20
))
>>
21
s22
+=
carry
[
21
]
s21
-=
carry
[
21
]
<<
21
s11
+=
s23
*
666643
s12
+=
s23
*
470296
s13
+=
s23
*
654183
s14
-=
s23
*
997805
s15
+=
s23
*
136657
s16
-=
s23
*
683901
s23
=
0
s10
+=
s22
*
666643
s11
+=
s22
*
470296
s12
+=
s22
*
654183
s13
-=
s22
*
997805
s14
+=
s22
*
136657
s15
-=
s22
*
683901
s22
=
0
s9
+=
s21
*
666643
s10
+=
s21
*
470296
s11
+=
s21
*
654183
s12
-=
s21
*
997805
s13
+=
s21
*
136657
s14
-=
s21
*
683901
s21
=
0
s8
+=
s20
*
666643
s9
+=
s20
*
470296
s10
+=
s20
*
654183
s11
-=
s20
*
997805
s12
+=
s20
*
136657
s13
-=
s20
*
683901
s20
=
0
s7
+=
s19
*
666643
s8
+=
s19
*
470296
s9
+=
s19
*
654183
s10
-=
s19
*
997805
s11
+=
s19
*
136657
s12
-=
s19
*
683901
s19
=
0
s6
+=
s18
*
666643
s7
+=
s18
*
470296
s8
+=
s18
*
654183
s9
-=
s18
*
997805
s10
+=
s18
*
136657
s11
-=
s18
*
683901
s18
=
0
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
12
]
=
(
s12
+
(
1
<<
20
))
>>
21
s13
+=
carry
[
12
]
s12
-=
carry
[
12
]
<<
21
carry
[
14
]
=
(
s14
+
(
1
<<
20
))
>>
21
s15
+=
carry
[
14
]
s14
-=
carry
[
14
]
<<
21
carry
[
16
]
=
(
s16
+
(
1
<<
20
))
>>
21
s17
+=
carry
[
16
]
s16
-=
carry
[
16
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
carry
[
13
]
=
(
s13
+
(
1
<<
20
))
>>
21
s14
+=
carry
[
13
]
s13
-=
carry
[
13
]
<<
21
carry
[
15
]
=
(
s15
+
(
1
<<
20
))
>>
21
s16
+=
carry
[
15
]
s15
-=
carry
[
15
]
<<
21
s5
+=
s17
*
666643
s6
+=
s17
*
470296
s7
+=
s17
*
654183
s8
-=
s17
*
997805
s9
+=
s17
*
136657
s10
-=
s17
*
683901
s17
=
0
s4
+=
s16
*
666643
s5
+=
s16
*
470296
s6
+=
s16
*
654183
s7
-=
s16
*
997805
s8
+=
s16
*
136657
s9
-=
s16
*
683901
s16
=
0
s3
+=
s15
*
666643
s4
+=
s15
*
470296
s5
+=
s15
*
654183
s6
-=
s15
*
997805
s7
+=
s15
*
136657
s8
-=
s15
*
683901
s15
=
0
s2
+=
s14
*
666643
s3
+=
s14
*
470296
s4
+=
s14
*
654183
s5
-=
s14
*
997805
s6
+=
s14
*
136657
s7
-=
s14
*
683901
s14
=
0
s1
+=
s13
*
666643
s2
+=
s13
*
470296
s3
+=
s13
*
654183
s4
-=
s13
*
997805
s5
+=
s13
*
136657
s6
-=
s13
*
683901
s13
=
0
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
(
s0
+
(
1
<<
20
))
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
2
]
=
(
s2
+
(
1
<<
20
))
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
4
]
=
(
s4
+
(
1
<<
20
))
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
1
]
=
(
s1
+
(
1
<<
20
))
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
3
]
=
(
s3
+
(
1
<<
20
))
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
5
]
=
(
s5
+
(
1
<<
20
))
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
11
]
=
s11
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
s
[
0
]
=
byte
(
s0
>>
0
)
s
[
1
]
=
byte
(
s0
>>
8
)
s
[
2
]
=
byte
((
s0
>>
16
)
|
(
s1
<<
5
))
s
[
3
]
=
byte
(
s1
>>
3
)
s
[
4
]
=
byte
(
s1
>>
11
)
s
[
5
]
=
byte
((
s1
>>
19
)
|
(
s2
<<
2
))
s
[
6
]
=
byte
(
s2
>>
6
)
s
[
7
]
=
byte
((
s2
>>
14
)
|
(
s3
<<
7
))
s
[
8
]
=
byte
(
s3
>>
1
)
s
[
9
]
=
byte
(
s3
>>
9
)
s
[
10
]
=
byte
((
s3
>>
17
)
|
(
s4
<<
4
))
s
[
11
]
=
byte
(
s4
>>
4
)
s
[
12
]
=
byte
(
s4
>>
12
)
s
[
13
]
=
byte
((
s4
>>
20
)
|
(
s5
<<
1
))
s
[
14
]
=
byte
(
s5
>>
7
)
s
[
15
]
=
byte
((
s5
>>
15
)
|
(
s6
<<
6
))
s
[
16
]
=
byte
(
s6
>>
2
)
s
[
17
]
=
byte
(
s6
>>
10
)
s
[
18
]
=
byte
((
s6
>>
18
)
|
(
s7
<<
3
))
s
[
19
]
=
byte
(
s7
>>
5
)
s
[
20
]
=
byte
(
s7
>>
13
)
s
[
21
]
=
byte
(
s8
>>
0
)
s
[
22
]
=
byte
(
s8
>>
8
)
s
[
23
]
=
byte
((
s8
>>
16
)
|
(
s9
<<
5
))
s
[
24
]
=
byte
(
s9
>>
3
)
s
[
25
]
=
byte
(
s9
>>
11
)
s
[
26
]
=
byte
((
s9
>>
19
)
|
(
s10
<<
2
))
s
[
27
]
=
byte
(
s10
>>
6
)
s
[
28
]
=
byte
((
s10
>>
14
)
|
(
s11
<<
7
))
s
[
29
]
=
byte
(
s11
>>
1
)
s
[
30
]
=
byte
(
s11
>>
9
)
s
[
31
]
=
byte
(
s11
>>
17
)
}
// Input:
// s[0]+256*s[1]+...+256^63*s[63] = s
//
// Output:
// s[0]+256*s[1]+...+256^31*s[31] = s mod l
// where l = 2^252 + 27742317777372353535851937790883648493.
func
ScReduce
(
out
*
[
32
]
byte
,
s
*
[
64
]
byte
)
{
s0
:=
2097151
&
load3
(
s
[
:
])
s1
:=
2097151
&
(
load4
(
s
[
2
:
])
>>
5
)
s2
:=
2097151
&
(
load3
(
s
[
5
:
])
>>
2
)
s3
:=
2097151
&
(
load4
(
s
[
7
:
])
>>
7
)
s4
:=
2097151
&
(
load4
(
s
[
10
:
])
>>
4
)
s5
:=
2097151
&
(
load3
(
s
[
13
:
])
>>
1
)
s6
:=
2097151
&
(
load4
(
s
[
15
:
])
>>
6
)
s7
:=
2097151
&
(
load3
(
s
[
18
:
])
>>
3
)
s8
:=
2097151
&
load3
(
s
[
21
:
])
s9
:=
2097151
&
(
load4
(
s
[
23
:
])
>>
5
)
s10
:=
2097151
&
(
load3
(
s
[
26
:
])
>>
2
)
s11
:=
2097151
&
(
load4
(
s
[
28
:
])
>>
7
)
s12
:=
2097151
&
(
load4
(
s
[
31
:
])
>>
4
)
s13
:=
2097151
&
(
load3
(
s
[
34
:
])
>>
1
)
s14
:=
2097151
&
(
load4
(
s
[
36
:
])
>>
6
)
s15
:=
2097151
&
(
load3
(
s
[
39
:
])
>>
3
)
s16
:=
2097151
&
load3
(
s
[
42
:
])
s17
:=
2097151
&
(
load4
(
s
[
44
:
])
>>
5
)
s18
:=
2097151
&
(
load3
(
s
[
47
:
])
>>
2
)
s19
:=
2097151
&
(
load4
(
s
[
49
:
])
>>
7
)
s20
:=
2097151
&
(
load4
(
s
[
52
:
])
>>
4
)
s21
:=
2097151
&
(
load3
(
s
[
55
:
])
>>
1
)
s22
:=
2097151
&
(
load4
(
s
[
57
:
])
>>
6
)
s23
:=
(
load4
(
s
[
60
:
])
>>
3
)
s11
+=
s23
*
666643
s12
+=
s23
*
470296
s13
+=
s23
*
654183
s14
-=
s23
*
997805
s15
+=
s23
*
136657
s16
-=
s23
*
683901
s23
=
0
s10
+=
s22
*
666643
s11
+=
s22
*
470296
s12
+=
s22
*
654183
s13
-=
s22
*
997805
s14
+=
s22
*
136657
s15
-=
s22
*
683901
s22
=
0
s9
+=
s21
*
666643
s10
+=
s21
*
470296
s11
+=
s21
*
654183
s12
-=
s21
*
997805
s13
+=
s21
*
136657
s14
-=
s21
*
683901
s21
=
0
s8
+=
s20
*
666643
s9
+=
s20
*
470296
s10
+=
s20
*
654183
s11
-=
s20
*
997805
s12
+=
s20
*
136657
s13
-=
s20
*
683901
s20
=
0
s7
+=
s19
*
666643
s8
+=
s19
*
470296
s9
+=
s19
*
654183
s10
-=
s19
*
997805
s11
+=
s19
*
136657
s12
-=
s19
*
683901
s19
=
0
s6
+=
s18
*
666643
s7
+=
s18
*
470296
s8
+=
s18
*
654183
s9
-=
s18
*
997805
s10
+=
s18
*
136657
s11
-=
s18
*
683901
s18
=
0
var
carry
[
17
]
int64
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
12
]
=
(
s12
+
(
1
<<
20
))
>>
21
s13
+=
carry
[
12
]
s12
-=
carry
[
12
]
<<
21
carry
[
14
]
=
(
s14
+
(
1
<<
20
))
>>
21
s15
+=
carry
[
14
]
s14
-=
carry
[
14
]
<<
21
carry
[
16
]
=
(
s16
+
(
1
<<
20
))
>>
21
s17
+=
carry
[
16
]
s16
-=
carry
[
16
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
carry
[
13
]
=
(
s13
+
(
1
<<
20
))
>>
21
s14
+=
carry
[
13
]
s13
-=
carry
[
13
]
<<
21
carry
[
15
]
=
(
s15
+
(
1
<<
20
))
>>
21
s16
+=
carry
[
15
]
s15
-=
carry
[
15
]
<<
21
s5
+=
s17
*
666643
s6
+=
s17
*
470296
s7
+=
s17
*
654183
s8
-=
s17
*
997805
s9
+=
s17
*
136657
s10
-=
s17
*
683901
s17
=
0
s4
+=
s16
*
666643
s5
+=
s16
*
470296
s6
+=
s16
*
654183
s7
-=
s16
*
997805
s8
+=
s16
*
136657
s9
-=
s16
*
683901
s16
=
0
s3
+=
s15
*
666643
s4
+=
s15
*
470296
s5
+=
s15
*
654183
s6
-=
s15
*
997805
s7
+=
s15
*
136657
s8
-=
s15
*
683901
s15
=
0
s2
+=
s14
*
666643
s3
+=
s14
*
470296
s4
+=
s14
*
654183
s5
-=
s14
*
997805
s6
+=
s14
*
136657
s7
-=
s14
*
683901
s14
=
0
s1
+=
s13
*
666643
s2
+=
s13
*
470296
s3
+=
s13
*
654183
s4
-=
s13
*
997805
s5
+=
s13
*
136657
s6
-=
s13
*
683901
s13
=
0
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
(
s0
+
(
1
<<
20
))
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
2
]
=
(
s2
+
(
1
<<
20
))
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
4
]
=
(
s4
+
(
1
<<
20
))
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
1
]
=
(
s1
+
(
1
<<
20
))
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
3
]
=
(
s3
+
(
1
<<
20
))
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
5
]
=
(
s5
+
(
1
<<
20
))
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
11
]
=
s11
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
out
[
0
]
=
byte
(
s0
>>
0
)
out
[
1
]
=
byte
(
s0
>>
8
)
out
[
2
]
=
byte
((
s0
>>
16
)
|
(
s1
<<
5
))
out
[
3
]
=
byte
(
s1
>>
3
)
out
[
4
]
=
byte
(
s1
>>
11
)
out
[
5
]
=
byte
((
s1
>>
19
)
|
(
s2
<<
2
))
out
[
6
]
=
byte
(
s2
>>
6
)
out
[
7
]
=
byte
((
s2
>>
14
)
|
(
s3
<<
7
))
out
[
8
]
=
byte
(
s3
>>
1
)
out
[
9
]
=
byte
(
s3
>>
9
)
out
[
10
]
=
byte
((
s3
>>
17
)
|
(
s4
<<
4
))
out
[
11
]
=
byte
(
s4
>>
4
)
out
[
12
]
=
byte
(
s4
>>
12
)
out
[
13
]
=
byte
((
s4
>>
20
)
|
(
s5
<<
1
))
out
[
14
]
=
byte
(
s5
>>
7
)
out
[
15
]
=
byte
((
s5
>>
15
)
|
(
s6
<<
6
))
out
[
16
]
=
byte
(
s6
>>
2
)
out
[
17
]
=
byte
(
s6
>>
10
)
out
[
18
]
=
byte
((
s6
>>
18
)
|
(
s7
<<
3
))
out
[
19
]
=
byte
(
s7
>>
5
)
out
[
20
]
=
byte
(
s7
>>
13
)
out
[
21
]
=
byte
(
s8
>>
0
)
out
[
22
]
=
byte
(
s8
>>
8
)
out
[
23
]
=
byte
((
s8
>>
16
)
|
(
s9
<<
5
))
out
[
24
]
=
byte
(
s9
>>
3
)
out
[
25
]
=
byte
(
s9
>>
11
)
out
[
26
]
=
byte
((
s9
>>
19
)
|
(
s10
<<
2
))
out
[
27
]
=
byte
(
s10
>>
6
)
out
[
28
]
=
byte
((
s10
>>
14
)
|
(
s11
<<
7
))
out
[
29
]
=
byte
(
s11
>>
1
)
out
[
30
]
=
byte
(
s11
>>
9
)
out
[
31
]
=
byte
(
s11
>>
17
)
}
vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go
0 → 100644
View file @
316acbee
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
/*
Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC
2898 / PKCS #5 v2.0.
A key derivation function is useful when encrypting data based on a password
or any other not-fully-random data. It uses a pseudorandom function to derive
a secure encryption key based on the password.
While v2.0 of the standard defines only one pseudorandom function to use,
HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved
Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To
choose, you can pass the `New` functions from the different SHA packages to
pbkdf2.Key.
*/
package
pbkdf2
// import "golang.org/x/crypto/pbkdf2"
import
(
"crypto/hmac"
"hash"
)
// Key derives a key from the password, salt and iteration count, returning a
// []byte of length keylen that can be used as cryptographic key. The key is
// derived based on the method described as PBKDF2 with the HMAC variant using
// the supplied hash function.
//
// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you
// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by
// doing:
//
// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New)
//
// Remember to get a good random salt. At least 8 bytes is recommended by the
// RFC.
//
// Using a higher iteration count will increase the cost of an exhaustive
// search but will also make derivation proportionally slower.
func
Key
(
password
,
salt
[]
byte
,
iter
,
keyLen
int
,
h
func
()
hash
.
Hash
)
[]
byte
{
prf
:=
hmac
.
New
(
h
,
password
)
hashLen
:=
prf
.
Size
()
numBlocks
:=
(
keyLen
+
hashLen
-
1
)
/
hashLen
var
buf
[
4
]
byte
dk
:=
make
([]
byte
,
0
,
numBlocks
*
hashLen
)
U
:=
make
([]
byte
,
hashLen
)
for
block
:=
1
;
block
<=
numBlocks
;
block
++
{
// N.B.: || means concatenation, ^ means XOR
// for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter
// U_1 = PRF(password, salt || uint(i))
prf
.
Reset
()
prf
.
Write
(
salt
)
buf
[
0
]
=
byte
(
block
>>
24
)
buf
[
1
]
=
byte
(
block
>>
16
)
buf
[
2
]
=
byte
(
block
>>
8
)
buf
[
3
]
=
byte
(
block
)
prf
.
Write
(
buf
[
:
4
])
dk
=
prf
.
Sum
(
dk
)
T
:=
dk
[
len
(
dk
)
-
hashLen
:
]
copy
(
U
,
T
)
// U_n = PRF(password, U_(n-1))
for
n
:=
2
;
n
<=
iter
;
n
++
{
prf
.
Reset
()
prf
.
Write
(
U
)
U
=
U
[
:
0
]
U
=
prf
.
Sum
(
U
)
for
x
:=
range
U
{
T
[
x
]
^=
U
[
x
]
}
}
}
return
dk
[
:
keyLen
]
}
vendor/gopkg.in/square/go-jose.v2/asymmetric.go
View file @
316acbee
...
...
@@ -28,7 +28,9 @@ import (
"fmt"
"math/big"
"golang.org/x/crypto/ed25519"
"gopkg.in/square/go-jose.v2/cipher"
"gopkg.in/square/go-jose.v2/json"
)
// A generic RSA-based encrypter/verifier
...
...
@@ -46,6 +48,10 @@ type ecEncrypterVerifier struct {
publicKey
*
ecdsa
.
PublicKey
}
type
edEncrypterVerifier
struct
{
publicKey
ed25519
.
PublicKey
}
// A key generator for ECDH-ES
type
ecKeyGenerator
struct
{
size
int
...
...
@@ -58,6 +64,10 @@ type ecDecrypterSigner struct {
privateKey
*
ecdsa
.
PrivateKey
}
type
edDecrypterSigner
struct
{
privateKey
ed25519
.
PrivateKey
}
// newRSARecipient creates recipientKeyInfo based on the given key.
func
newRSARecipient
(
keyAlg
KeyAlgorithm
,
publicKey
*
rsa
.
PublicKey
)
(
recipientKeyInfo
,
error
)
{
// Verify that key management algorithm is supported by this encrypter
...
...
@@ -94,15 +104,34 @@ func newRSASigner(sigAlg SignatureAlgorithm, privateKey *rsa.PrivateKey) (recipi
return
recipientSigInfo
{
sigAlg
:
sigAlg
,
publicKey
:
&
JSONWebKey
{
Key
:
&
privateKey
.
PublicKey
,
},
publicKey
:
staticPublicKey
(
&
JSONWebKey
{
Key
:
privateKey
.
Public
()
,
}
)
,
signer
:
&
rsaDecrypterSigner
{
privateKey
:
privateKey
,
},
},
nil
}
func
newEd25519Signer
(
sigAlg
SignatureAlgorithm
,
privateKey
ed25519
.
PrivateKey
)
(
recipientSigInfo
,
error
)
{
if
sigAlg
!=
EdDSA
{
return
recipientSigInfo
{},
ErrUnsupportedAlgorithm
}
if
privateKey
==
nil
{
return
recipientSigInfo
{},
errors
.
New
(
"invalid private key"
)
}
return
recipientSigInfo
{
sigAlg
:
sigAlg
,
publicKey
:
staticPublicKey
(
&
JSONWebKey
{
Key
:
privateKey
.
Public
(),
}),
signer
:
&
edDecrypterSigner
{
privateKey
:
privateKey
,
},
},
nil
}
// newECDHRecipient creates recipientKeyInfo based on the given key.
func
newECDHRecipient
(
keyAlg
KeyAlgorithm
,
publicKey
*
ecdsa
.
PublicKey
)
(
recipientKeyInfo
,
error
)
{
// Verify that key management algorithm is supported by this encrypter
...
...
@@ -139,9 +168,9 @@ func newECDSASigner(sigAlg SignatureAlgorithm, privateKey *ecdsa.PrivateKey) (re
return
recipientSigInfo
{
sigAlg
:
sigAlg
,
publicKey
:
&
JSONWebKey
{
Key
:
&
privateKey
.
PublicKey
,
},
publicKey
:
staticPublicKey
(
&
JSONWebKey
{
Key
:
privateKey
.
Public
()
,
}
)
,
signer
:
&
ecDecrypterSigner
{
privateKey
:
privateKey
,
},
...
...
@@ -178,7 +207,7 @@ func (ctx rsaEncrypterVerifier) encrypt(cek []byte, alg KeyAlgorithm) ([]byte, e
// Decrypt the given payload and return the content encryption key.
func
(
ctx
rsaDecrypterSigner
)
decryptKey
(
headers
rawHeader
,
recipient
*
recipientInfo
,
generator
keyGenerator
)
([]
byte
,
error
)
{
return
ctx
.
decrypt
(
recipient
.
encryptedKey
,
KeyAlgorithm
(
headers
.
Alg
),
generator
)
return
ctx
.
decrypt
(
recipient
.
encryptedKey
,
headers
.
getAlgorithm
(
),
generator
)
}
// Decrypt the given payload. Based on the key encryption algorithm,
...
...
@@ -366,10 +395,15 @@ func (ctx ecKeyGenerator) genKey() ([]byte, rawHeader, error) {
out
:=
josecipher
.
DeriveECDHES
(
ctx
.
algID
,
[]
byte
{},
[]
byte
{},
priv
,
ctx
.
publicKey
,
ctx
.
size
)
headers
:=
rawHeader
{
Epk
:
&
JSONWebKey
{
b
,
err
:=
json
.
Marshal
(
&
JSONWebKey
{
Key
:
&
priv
.
PublicKey
,
},
})
if
err
!=
nil
{
return
nil
,
nil
,
err
}
headers
:=
rawHeader
{
headerEPK
:
makeRawMessage
(
b
),
}
return
out
,
headers
,
nil
...
...
@@ -377,11 +411,15 @@ func (ctx ecKeyGenerator) genKey() ([]byte, rawHeader, error) {
// Decrypt the given payload and return the content encryption key.
func
(
ctx
ecDecrypterSigner
)
decryptKey
(
headers
rawHeader
,
recipient
*
recipientInfo
,
generator
keyGenerator
)
([]
byte
,
error
)
{
if
headers
.
Epk
==
nil
{
epk
,
err
:=
headers
.
getEPK
()
if
err
!=
nil
{
return
nil
,
errors
.
New
(
"square/go-jose: invalid epk header"
)
}
if
epk
==
nil
{
return
nil
,
errors
.
New
(
"square/go-jose: missing epk header"
)
}
publicKey
,
ok
:=
headers
.
E
pk
.
Key
.
(
*
ecdsa
.
PublicKey
)
publicKey
,
ok
:=
e
pk
.
Key
.
(
*
ecdsa
.
PublicKey
)
if
publicKey
==
nil
||
!
ok
{
return
nil
,
errors
.
New
(
"square/go-jose: invalid epk header"
)
}
...
...
@@ -390,19 +428,26 @@ func (ctx ecDecrypterSigner) decryptKey(headers rawHeader, recipient *recipientI
return
nil
,
errors
.
New
(
"square/go-jose: invalid public key in epk header"
)
}
apuData
:=
headers
.
Apu
.
bytes
()
apvData
:=
headers
.
Apv
.
bytes
()
apuData
,
err
:=
headers
.
getAPU
()
if
err
!=
nil
{
return
nil
,
errors
.
New
(
"square/go-jose: invalid apu header"
)
}
apvData
,
err
:=
headers
.
getAPV
()
if
err
!=
nil
{
return
nil
,
errors
.
New
(
"square/go-jose: invalid apv header"
)
}
deriveKey
:=
func
(
algID
string
,
size
int
)
[]
byte
{
return
josecipher
.
DeriveECDHES
(
algID
,
apuData
,
apvData
,
ctx
.
privateKey
,
publicKey
,
size
)
return
josecipher
.
DeriveECDHES
(
algID
,
apuData
.
bytes
(),
apvData
.
bytes
()
,
ctx
.
privateKey
,
publicKey
,
size
)
}
var
keySize
int
switch
KeyAlgorithm
(
headers
.
Alg
)
{
algorithm
:=
headers
.
getAlgorithm
()
switch
algorithm
{
case
ECDH_ES
:
// ECDH-ES uses direct key agreement, no key unwrapping necessary.
return
deriveKey
(
string
(
headers
.
Enc
),
generator
.
keySize
()),
nil
return
deriveKey
(
string
(
headers
.
getEncryption
()
),
generator
.
keySize
()),
nil
case
ECDH_ES_A128KW
:
keySize
=
16
case
ECDH_ES_A192KW
:
...
...
@@ -413,7 +458,7 @@ func (ctx ecDecrypterSigner) decryptKey(headers rawHeader, recipient *recipientI
return
nil
,
ErrUnsupportedAlgorithm
}
key
:=
deriveKey
(
headers
.
Alg
,
keySize
)
key
:=
deriveKey
(
string
(
algorithm
)
,
keySize
)
block
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -422,6 +467,33 @@ func (ctx ecDecrypterSigner) decryptKey(headers rawHeader, recipient *recipientI
return
josecipher
.
KeyUnwrap
(
block
,
recipient
.
encryptedKey
)
}
func
(
ctx
edDecrypterSigner
)
signPayload
(
payload
[]
byte
,
alg
SignatureAlgorithm
)
(
Signature
,
error
)
{
if
alg
!=
EdDSA
{
return
Signature
{},
ErrUnsupportedAlgorithm
}
sig
,
err
:=
ctx
.
privateKey
.
Sign
(
randReader
,
payload
,
crypto
.
Hash
(
0
))
if
err
!=
nil
{
return
Signature
{},
err
}
return
Signature
{
Signature
:
sig
,
protected
:
&
rawHeader
{},
},
nil
}
func
(
ctx
edEncrypterVerifier
)
verifyPayload
(
payload
[]
byte
,
signature
[]
byte
,
alg
SignatureAlgorithm
)
error
{
if
alg
!=
EdDSA
{
return
ErrUnsupportedAlgorithm
}
ok
:=
ed25519
.
Verify
(
ctx
.
publicKey
,
payload
,
signature
)
if
!
ok
{
return
errors
.
New
(
"square/go-jose: ed25519 signature failed to verify"
)
}
return
nil
}
// Sign the given payload
func
(
ctx
ecDecrypterSigner
)
signPayload
(
payload
[]
byte
,
alg
SignatureAlgorithm
)
(
Signature
,
error
)
{
var
expectedBitSize
int
...
...
@@ -460,7 +532,7 @@ func (ctx ecDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm)
keyBytes
++
}
// We serialize the outpus (r and s) into big-endian byte arrays and pad
// We serialize the outpu
t
s (r and s) into big-endian byte arrays and pad
// them with zeros on the left to make sure the sizes work out. Both arrays
// must be keyBytes long, and the output must be 2*keyBytes long.
rBytes
:=
r
.
Bytes
()
...
...
vendor/gopkg.in/square/go-jose.v2/cipher/ecdh_es.go
View file @
316acbee
...
...
@@ -28,7 +28,7 @@ import (
// size may be at most 1<<16 bytes (64 KiB).
func
DeriveECDHES
(
alg
string
,
apuData
,
apvData
[]
byte
,
priv
*
ecdsa
.
PrivateKey
,
pub
*
ecdsa
.
PublicKey
,
size
int
)
[]
byte
{
if
size
>
1
<<
16
{
panic
(
"ECDH-ES output size too large, must be less than 1<<16"
)
panic
(
"ECDH-ES output size too large, must be less than
or equal to
1<<16"
)
}
// algId, partyUInfo, partyVInfo inputs must be prefixed with the length
...
...
vendor/gopkg.in/square/go-jose.v2/crypter.go
View file @
316acbee
...
...
@@ -22,12 +22,15 @@ import (
"errors"
"fmt"
"reflect"
"gopkg.in/square/go-jose.v2/json"
)
// Encrypter represents an encrypter which produces an encrypted JWE object.
type
Encrypter
interface
{
Encrypt
(
plaintext
[]
byte
)
(
*
JSONWebEncryption
,
error
)
EncryptWithAuthData
(
plaintext
[]
byte
,
aad
[]
byte
)
(
*
JSONWebEncryption
,
error
)
Options
()
EncrypterOptions
}
// A generic content cipher
...
...
@@ -60,6 +63,7 @@ type genericEncrypter struct {
cipher
contentCipher
recipients
[]
recipientKeyInfo
keyGenerator
keyGenerator
extraHeaders
map
[
HeaderKey
]
interface
{}
}
type
recipientKeyInfo
struct
{
...
...
@@ -71,13 +75,47 @@ type recipientKeyInfo struct {
// EncrypterOptions represents options that can be set on new encrypters.
type
EncrypterOptions
struct
{
Compression
CompressionAlgorithm
// Optional map of additional keys to be inserted into the protected header
// of a JWS object. Some specifications which make use of JWS like to insert
// additional values here. All values must be JSON-serializable.
ExtraHeaders
map
[
HeaderKey
]
interface
{}
}
// WithHeader adds an arbitrary value to the ExtraHeaders map, initializing it
// if necessary. It returns itself and so can be used in a fluent style.
func
(
eo
*
EncrypterOptions
)
WithHeader
(
k
HeaderKey
,
v
interface
{})
*
EncrypterOptions
{
if
eo
.
ExtraHeaders
==
nil
{
eo
.
ExtraHeaders
=
map
[
HeaderKey
]
interface
{}{}
}
eo
.
ExtraHeaders
[
k
]
=
v
return
eo
}
// WithContentType adds a content type ("cty") header and returns the updated
// EncrypterOptions.
func
(
eo
*
EncrypterOptions
)
WithContentType
(
contentType
ContentType
)
*
EncrypterOptions
{
return
eo
.
WithHeader
(
HeaderContentType
,
contentType
)
}
// WithType adds a type ("typ") header and returns the updated EncrypterOptions.
func
(
eo
*
EncrypterOptions
)
WithType
(
typ
ContentType
)
*
EncrypterOptions
{
return
eo
.
WithHeader
(
HeaderType
,
typ
)
}
// Recipient represents an algorithm/key to encrypt messages to.
//
// PBES2Count and PBES2Salt correspond with the "p2c" and "p2s" headers used
// on the password-based encryption algorithms PBES2-HS256+A128KW,
// PBES2-HS384+A192KW, and PBES2-HS512+A256KW. If they are not provided a safe
// default of 100000 will be used for the count and a 128-bit random salt will
// be generated.
type
Recipient
struct
{
Algorithm
KeyAlgorithm
Key
interface
{}
KeyID
string
PBES2Count
int
PBES2Salt
[]
byte
}
// NewEncrypter creates an appropriate encrypter based on the key type
...
...
@@ -89,6 +127,7 @@ func NewEncrypter(enc ContentEncryption, rcpt Recipient, opts *EncrypterOptions)
}
if
opts
!=
nil
{
encrypter
.
compressionAlg
=
opts
.
Compression
encrypter
.
extraHeaders
=
opts
.
ExtraHeaders
}
if
encrypter
.
cipher
==
nil
{
...
...
@@ -98,9 +137,10 @@ func NewEncrypter(enc ContentEncryption, rcpt Recipient, opts *EncrypterOptions)
var
keyID
string
var
rawKey
interface
{}
switch
encryptionKey
:=
rcpt
.
Key
.
(
type
)
{
case
JSONWebKey
:
keyID
,
rawKey
=
encryptionKey
.
KeyID
,
encryptionKey
.
Key
case
*
JSONWebKey
:
keyID
=
encryptionKey
.
KeyID
rawKey
=
encryptionKey
.
Key
keyID
,
rawKey
=
encryptionKey
.
KeyID
,
encryptionKey
.
Key
default
:
rawKey
=
encryptionKey
}
...
...
@@ -196,6 +236,14 @@ func (ctx *genericEncrypter) addRecipient(recipient Recipient) (err error) {
recipientInfo
.
keyID
=
recipient
.
KeyID
}
switch
recipient
.
Algorithm
{
case
PBES2_HS256_A128KW
,
PBES2_HS384_A192KW
,
PBES2_HS512_A256KW
:
if
sr
,
ok
:=
recipientInfo
.
keyEncrypter
.
(
*
symmetricKeyCipher
);
ok
{
sr
.
p2c
=
recipient
.
PBES2Count
sr
.
p2s
=
recipient
.
PBES2Salt
}
}
if
err
==
nil
{
ctx
.
recipients
=
append
(
ctx
.
recipients
,
recipientInfo
)
}
...
...
@@ -210,6 +258,8 @@ func makeJWERecipient(alg KeyAlgorithm, encryptionKey interface{}) (recipientKey
return
newECDHRecipient
(
alg
,
encryptionKey
)
case
[]
byte
:
return
newSymmetricRecipient
(
alg
,
encryptionKey
)
case
string
:
return
newSymmetricRecipient
(
alg
,
[]
byte
(
encryptionKey
))
case
*
JSONWebKey
:
recipient
,
err
:=
makeJWERecipient
(
alg
,
encryptionKey
.
Key
)
recipient
.
keyID
=
encryptionKey
.
KeyID
...
...
@@ -234,6 +284,12 @@ func newDecrypter(decryptionKey interface{}) (keyDecrypter, error) {
return
&
symmetricKeyCipher
{
key
:
decryptionKey
,
},
nil
case
string
:
return
&
symmetricKeyCipher
{
key
:
[]
byte
(
decryptionKey
),
},
nil
case
JSONWebKey
:
return
newDecrypter
(
decryptionKey
.
Key
)
case
*
JSONWebKey
:
return
newDecrypter
(
decryptionKey
.
Key
)
default
:
...
...
@@ -251,9 +307,12 @@ func (ctx *genericEncrypter) EncryptWithAuthData(plaintext, aad []byte) (*JSONWe
obj
:=
&
JSONWebEncryption
{}
obj
.
aad
=
aad
obj
.
protected
=
&
rawHeader
{
Enc
:
ctx
.
contentAlg
,
obj
.
protected
=
&
rawHeader
{}
err
:=
obj
.
protected
.
set
(
headerEncryption
,
ctx
.
contentAlg
)
if
err
!=
nil
{
return
nil
,
err
}
obj
.
recipients
=
make
([]
recipientInfo
,
len
(
ctx
.
recipients
))
if
len
(
ctx
.
recipients
)
==
0
{
...
...
@@ -273,9 +332,16 @@ func (ctx *genericEncrypter) EncryptWithAuthData(plaintext, aad []byte) (*JSONWe
return
nil
,
err
}
recipient
.
header
.
Alg
=
string
(
info
.
keyAlg
)
err
=
recipient
.
header
.
set
(
headerAlgorithm
,
info
.
keyAlg
)
if
err
!=
nil
{
return
nil
,
err
}
if
info
.
keyID
!=
""
{
recipient
.
header
.
Kid
=
info
.
keyID
err
=
recipient
.
header
.
set
(
headerKeyID
,
info
.
keyID
)
if
err
!=
nil
{
return
nil
,
err
}
}
obj
.
recipients
[
i
]
=
recipient
}
...
...
@@ -293,7 +359,18 @@ func (ctx *genericEncrypter) EncryptWithAuthData(plaintext, aad []byte) (*JSONWe
return
nil
,
err
}
obj
.
protected
.
Zip
=
ctx
.
compressionAlg
err
=
obj
.
protected
.
set
(
headerCompression
,
ctx
.
compressionAlg
)
if
err
!=
nil
{
return
nil
,
err
}
}
for
k
,
v
:=
range
ctx
.
extraHeaders
{
b
,
err
:=
json
.
Marshal
(
v
)
if
err
!=
nil
{
return
nil
,
err
}
(
*
obj
.
protected
)[
k
]
=
makeRawMessage
(
b
)
}
authData
:=
obj
.
computeAuthData
()
...
...
@@ -309,6 +386,13 @@ func (ctx *genericEncrypter) EncryptWithAuthData(plaintext, aad []byte) (*JSONWe
return
obj
,
nil
}
func
(
ctx
*
genericEncrypter
)
Options
()
EncrypterOptions
{
return
EncrypterOptions
{
Compression
:
ctx
.
compressionAlg
,
ExtraHeaders
:
ctx
.
extraHeaders
,
}
}
// Decrypt and validate the object and return the plaintext. Note that this
// function does not support multi-recipient, if you desire multi-recipient
// decryption use DecryptMulti instead.
...
...
@@ -319,7 +403,12 @@ func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error)
return
nil
,
errors
.
New
(
"square/go-jose: too many recipients in payload; expecting only one"
)
}
if
len
(
headers
.
Crit
)
>
0
{
critical
,
err
:=
headers
.
getCritical
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid crit header"
)
}
if
len
(
critical
)
>
0
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: unsupported crit header"
)
}
...
...
@@ -328,9 +417,9 @@ func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error)
return
nil
,
err
}
cipher
:=
getContentCipher
(
headers
.
Enc
)
cipher
:=
getContentCipher
(
headers
.
getEncryption
()
)
if
cipher
==
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: unsupported enc value '%s'"
,
string
(
headers
.
Enc
))
return
nil
,
fmt
.
Errorf
(
"square/go-jose: unsupported enc value '%s'"
,
string
(
headers
.
getEncryption
()
))
}
generator
:=
randomKeyGenerator
{
...
...
@@ -360,8 +449,8 @@ func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error)
}
// The "zip" header parameter may only be present in the protected header.
if
obj
.
protected
.
Zi
p
!=
""
{
plaintext
,
err
=
decompress
(
obj
.
protected
.
Zi
p
,
plaintext
)
if
comp
:=
obj
.
protected
.
getCompression
();
com
p
!=
""
{
plaintext
,
err
=
decompress
(
com
p
,
plaintext
)
}
return
plaintext
,
err
...
...
@@ -374,7 +463,12 @@ func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error)
func
(
obj
JSONWebEncryption
)
DecryptMulti
(
decryptionKey
interface
{})
(
int
,
Header
,
[]
byte
,
error
)
{
globalHeaders
:=
obj
.
mergedHeaders
(
nil
)
if
len
(
globalHeaders
.
Crit
)
>
0
{
critical
,
err
:=
globalHeaders
.
getCritical
()
if
err
!=
nil
{
return
-
1
,
Header
{},
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid crit header"
)
}
if
len
(
critical
)
>
0
{
return
-
1
,
Header
{},
nil
,
fmt
.
Errorf
(
"square/go-jose: unsupported crit header"
)
}
...
...
@@ -383,9 +477,10 @@ func (obj JSONWebEncryption) DecryptMulti(decryptionKey interface{}) (int, Heade
return
-
1
,
Header
{},
nil
,
err
}
cipher
:=
getContentCipher
(
globalHeaders
.
Enc
)
encryption
:=
globalHeaders
.
getEncryption
()
cipher
:=
getContentCipher
(
encryption
)
if
cipher
==
nil
{
return
-
1
,
Header
{},
nil
,
fmt
.
Errorf
(
"square/go-jose: unsupported enc value '%s'"
,
string
(
globalHeaders
.
Enc
))
return
-
1
,
Header
{},
nil
,
fmt
.
Errorf
(
"square/go-jose: unsupported enc value '%s'"
,
string
(
encryption
))
}
generator
:=
randomKeyGenerator
{
...
...
@@ -424,9 +519,14 @@ func (obj JSONWebEncryption) DecryptMulti(decryptionKey interface{}) (int, Heade
}
// The "zip" header parameter may only be present in the protected header.
if
obj
.
protected
.
Zip
!=
""
{
plaintext
,
err
=
decompress
(
obj
.
protected
.
Zip
,
plaintext
)
if
comp
:=
obj
.
protected
.
getCompression
();
comp
!=
""
{
plaintext
,
err
=
decompress
(
comp
,
plaintext
)
}
sanitized
,
err
:=
headers
.
sanitized
()
if
err
!=
nil
{
return
-
1
,
Header
{},
nil
,
fmt
.
Errorf
(
"square/go-jose: failed to sanitize header: %v"
,
err
)
}
return
index
,
headers
.
sanitized
()
,
plaintext
,
err
return
index
,
sanitized
,
plaintext
,
err
}
vendor/gopkg.in/square/go-jose.v2/doc.go
View file @
316acbee
...
...
@@ -17,10 +17,11 @@
/*
Package jose aims to provide an implementation of the Javascript Object Signing
and Encryption set of standards. For the moment, it mainly focuses on
encryption and signing based on the JSON Web Encryption and JSON Web Signature
standards. The library supports both the compact and full serialization
formats, and has optional support for multiple recipients.
and Encryption set of standards. It implements encryption and signing based on
the JSON Web Encryption and JSON Web Signature standards, with optional JSON
Web Token support available in a sub-package. The library supports both the
compact and full serialization formats, and has optional support for multiple
recipients.
*/
package
jose
vendor/gopkg.in/square/go-jose.v2/encoding.go
View file @
316acbee
...
...
@@ -21,10 +21,11 @@ import (
"compress/flate"
"encoding/base64"
"encoding/binary"
"encoding/json"
"io"
"math/big"
"regexp"
"gopkg.in/square/go-jose.v2/json"
)
var
stripWhitespaceRegex
=
regexp
.
MustCompile
(
"
\\
s"
)
...
...
vendor/gopkg.in/square/go-jose.v2/jwe.go
View file @
316acbee
...
...
@@ -18,9 +18,10 @@ package jose
import
(
"encoding/base64"
"encoding/json"
"fmt"
"strings"
"gopkg.in/square/go-jose.v2/json"
)
// rawJSONWebEncryption represents a raw JWE JSON object. Used for parsing/serializing.
...
...
@@ -85,10 +86,12 @@ func (obj JSONWebEncryption) mergedHeaders(recipient *recipientInfo) rawHeader {
func
(
obj
JSONWebEncryption
)
computeAuthData
()
[]
byte
{
var
protected
string
if
obj
.
original
!=
nil
{
if
obj
.
original
!=
nil
&&
obj
.
original
.
Protected
!=
nil
{
protected
=
obj
.
original
.
Protected
.
base64
()
}
else
{
}
else
if
obj
.
protected
!=
nil
{
protected
=
base64
.
RawURLEncoding
.
EncodeToString
(
mustSerializeJSON
((
obj
.
protected
)))
}
else
{
protected
=
""
}
output
:=
[]
byte
(
protected
)
...
...
@@ -129,10 +132,16 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) {
}
// Check that there is not a nonce in the unprotected headers
if
(
parsed
.
Unprotected
!=
nil
&&
parsed
.
Unprotected
.
Nonce
!=
""
)
||
(
parsed
.
Header
!=
nil
&&
parsed
.
Header
.
Nonce
!=
""
)
{
if
parsed
.
Unprotected
!=
nil
{
if
nonce
:=
parsed
.
Unprotected
.
getNonce
();
nonce
!=
""
{
return
nil
,
ErrUnprotectedNonce
}
}
if
parsed
.
Header
!=
nil
{
if
nonce
:=
parsed
.
Header
.
getNonce
();
nonce
!=
""
{
return
nil
,
ErrUnprotectedNonce
}
}
if
parsed
.
Protected
!=
nil
&&
len
(
parsed
.
Protected
.
bytes
())
>
0
{
err
:=
json
.
Unmarshal
(
parsed
.
Protected
.
bytes
(),
&
obj
.
protected
)
...
...
@@ -143,7 +152,12 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) {
// Note: this must be called _after_ we parse the protected header,
// otherwise fields from the protected header will not get picked up.
obj
.
Header
=
obj
.
mergedHeaders
(
nil
)
.
sanitized
()
var
err
error
mergedHeaders
:=
obj
.
mergedHeaders
(
nil
)
obj
.
Header
,
err
=
mergedHeaders
.
sanitized
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: cannot sanitize merged headers: %v (%v)"
,
err
,
mergedHeaders
)
}
if
len
(
parsed
.
Recipients
)
==
0
{
obj
.
recipients
=
[]
recipientInfo
{
...
...
@@ -161,7 +175,7 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) {
}
// Check that there is not a nonce in the unprotected header
if
parsed
.
Recipients
[
r
]
.
Header
!=
nil
&&
parsed
.
Recipients
[
r
]
.
Header
.
Nonce
!=
""
{
if
parsed
.
Recipients
[
r
]
.
Header
!=
nil
&&
parsed
.
Recipients
[
r
]
.
Header
.
getNonce
()
!=
""
{
return
nil
,
ErrUnprotectedNonce
}
...
...
@@ -172,7 +186,7 @@ func (parsed *rawJSONWebEncryption) sanitized() (*JSONWebEncryption, error) {
for
_
,
recipient
:=
range
obj
.
recipients
{
headers
:=
obj
.
mergedHeaders
(
&
recipient
)
if
headers
.
Alg
==
""
||
headers
.
Enc
==
""
{
if
headers
.
getAlgorithm
()
==
""
||
headers
.
getEncryption
()
==
""
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: message is missing alg/enc headers"
)
}
}
...
...
vendor/gopkg.in/square/go-jose.v2/jwk.go
View file @
316acbee
...
...
@@ -29,6 +29,8 @@ import (
"reflect"
"strings"
"golang.org/x/crypto/ed25519"
"gopkg.in/square/go-jose.v2/json"
)
...
...
@@ -73,10 +75,14 @@ func (k JSONWebKey) MarshalJSON() ([]byte, error) {
var
err
error
switch
key
:=
k
.
Key
.
(
type
)
{
case
ed25519
.
PublicKey
:
raw
=
fromEdPublicKey
(
key
)
case
*
ecdsa
.
PublicKey
:
raw
,
err
=
fromEcPublicKey
(
key
)
case
*
rsa
.
PublicKey
:
raw
=
fromRsaPublicKey
(
key
)
case
ed25519
.
PrivateKey
:
raw
,
err
=
fromEdPrivateKey
(
key
)
case
*
ecdsa
.
PrivateKey
:
raw
,
err
=
fromEcPrivateKey
(
key
)
case
*
rsa
.
PrivateKey
:
...
...
@@ -126,23 +132,26 @@ func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) {
}
case
"oct"
:
key
,
err
=
raw
.
symmetricKey
()
case
"OKP"
:
if
raw
.
Crv
==
"Ed25519"
&&
raw
.
X
!=
nil
{
if
raw
.
D
!=
nil
{
key
,
err
=
raw
.
edPrivateKey
()
}
else
{
key
,
err
=
raw
.
edPublicKey
()
}
}
else
{
err
=
fmt
.
Errorf
(
"square/go-jose: unknown curve %s'"
,
raw
.
Crv
)
}
default
:
err
=
fmt
.
Errorf
(
"square/go-jose: unknown json web key type '%s'"
,
raw
.
Kty
)
}
if
err
==
nil
{
*
k
=
JSONWebKey
{
Key
:
key
,
KeyID
:
raw
.
Kid
,
Algorithm
:
raw
.
Alg
,
Use
:
raw
.
Use
}
}
k
.
Certificates
=
make
([]
*
x509
.
Certificate
,
len
(
raw
.
X5c
))
for
i
,
cert
:=
range
raw
.
X5c
{
raw
,
err
:=
base64
.
StdEncoding
.
DecodeString
(
cert
)
k
.
Certificates
,
err
=
parseCertificateChain
(
raw
.
X5c
)
if
err
!=
nil
{
return
err
}
k
.
Certificates
[
i
],
err
=
x509
.
ParseCertificate
(
raw
)
if
err
!=
nil
{
return
err
return
fmt
.
Errorf
(
"failed to unmarshal x5c field: %s"
,
err
)
}
}
...
...
@@ -171,6 +180,7 @@ func (s *JSONWebKeySet) Key(kid string) []JSONWebKey {
const
rsaThumbprintTemplate
=
`{"e":"%s","kty":"RSA","n":"%s"}`
const
ecThumbprintTemplate
=
`{"crv":"%s","kty":"EC","x":"%s","y":"%s"}`
const
edThumbprintTemplate
=
`{"crv":"%s","kty":"OKP",x":"%s"}`
func
ecThumbprintInput
(
curve
elliptic
.
Curve
,
x
,
y
*
big
.
Int
)
(
string
,
error
)
{
coordLength
:=
curveSize
(
curve
)
...
...
@@ -179,6 +189,10 @@ func ecThumbprintInput(curve elliptic.Curve, x, y *big.Int) (string, error) {
return
""
,
err
}
if
len
(
x
.
Bytes
())
>
coordLength
||
len
(
y
.
Bytes
())
>
coordLength
{
return
""
,
errors
.
New
(
"square/go-jose: invalid elliptic key (too large)"
)
}
return
fmt
.
Sprintf
(
ecThumbprintTemplate
,
crv
,
newFixedSizeBuffer
(
x
.
Bytes
(),
coordLength
)
.
base64
(),
newFixedSizeBuffer
(
y
.
Bytes
(),
coordLength
)
.
base64
()),
nil
...
...
@@ -190,12 +204,23 @@ func rsaThumbprintInput(n *big.Int, e int) (string, error) {
newBuffer
(
n
.
Bytes
())
.
base64
()),
nil
}
func
edThumbprintInput
(
ed
ed25519
.
PublicKey
)
(
string
,
error
)
{
crv
:=
"Ed25519"
if
len
(
ed
)
>
32
{
return
""
,
errors
.
New
(
"square/go-jose: invalid elliptic key (too large)"
)
}
return
fmt
.
Sprintf
(
edThumbprintTemplate
,
crv
,
newFixedSizeBuffer
(
ed
,
32
)
.
base64
()),
nil
}
// Thumbprint computes the JWK Thumbprint of a key using the
// indicated hash algorithm.
func
(
k
*
JSONWebKey
)
Thumbprint
(
hash
crypto
.
Hash
)
([]
byte
,
error
)
{
var
input
string
var
err
error
switch
key
:=
k
.
Key
.
(
type
)
{
case
ed25519
.
PublicKey
:
input
,
err
=
edThumbprintInput
(
key
)
case
*
ecdsa
.
PublicKey
:
input
,
err
=
ecThumbprintInput
(
key
.
Curve
,
key
.
X
,
key
.
Y
)
case
*
ecdsa
.
PrivateKey
:
...
...
@@ -204,6 +229,8 @@ func (k *JSONWebKey) Thumbprint(hash crypto.Hash) ([]byte, error) {
input
,
err
=
rsaThumbprintInput
(
key
.
N
,
key
.
E
)
case
*
rsa
.
PrivateKey
:
input
,
err
=
rsaThumbprintInput
(
key
.
N
,
key
.
E
)
case
ed25519
.
PrivateKey
:
input
,
err
=
edThumbprintInput
(
ed25519
.
PublicKey
(
key
[
0
:
32
]))
default
:
return
nil
,
fmt
.
Errorf
(
"square/go-jose: unknown key type '%s'"
,
reflect
.
TypeOf
(
key
))
}
...
...
@@ -220,13 +247,32 @@ func (k *JSONWebKey) Thumbprint(hash crypto.Hash) ([]byte, error) {
// IsPublic returns true if the JWK represents a public key (not symmetric, not private).
func
(
k
*
JSONWebKey
)
IsPublic
()
bool
{
switch
k
.
Key
.
(
type
)
{
case
*
ecdsa
.
PublicKey
,
*
rsa
.
PublicKey
:
case
*
ecdsa
.
PublicKey
,
*
rsa
.
PublicKey
,
ed25519
.
PublicKey
:
return
true
default
:
return
false
}
}
// Public creates JSONWebKey with corresponding publik key if JWK represents asymmetric private key.
func
(
k
*
JSONWebKey
)
Public
()
JSONWebKey
{
if
k
.
IsPublic
()
{
return
*
k
}
ret
:=
*
k
switch
key
:=
k
.
Key
.
(
type
)
{
case
*
ecdsa
.
PrivateKey
:
ret
.
Key
=
key
.
Public
()
case
*
rsa
.
PrivateKey
:
ret
.
Key
=
key
.
Public
()
case
ed25519
.
PrivateKey
:
ret
.
Key
=
key
.
Public
()
default
:
return
JSONWebKey
{}
// returning invalid key
}
return
ret
}
// Valid checks that the key contains the expected parameters.
func
(
k
*
JSONWebKey
)
Valid
()
bool
{
if
k
.
Key
==
nil
{
...
...
@@ -249,6 +295,14 @@ func (k *JSONWebKey) Valid() bool {
if
key
.
N
==
nil
||
key
.
E
==
0
||
key
.
D
==
nil
||
len
(
key
.
Primes
)
<
2
{
return
false
}
case
ed25519
.
PublicKey
:
if
len
(
key
)
!=
32
{
return
false
}
case
ed25519
.
PrivateKey
:
if
len
(
key
)
!=
64
{
return
false
}
default
:
return
false
}
...
...
@@ -266,6 +320,14 @@ func (key rawJSONWebKey) rsaPublicKey() (*rsa.PublicKey, error) {
},
nil
}
func
fromEdPublicKey
(
pub
ed25519
.
PublicKey
)
*
rawJSONWebKey
{
return
&
rawJSONWebKey
{
Kty
:
"OKP"
,
Crv
:
"Ed25519"
,
X
:
newBuffer
(
pub
),
}
}
func
fromRsaPublicKey
(
pub
*
rsa
.
PublicKey
)
*
rawJSONWebKey
{
return
&
rawJSONWebKey
{
Kty
:
"RSA"
,
...
...
@@ -334,6 +396,36 @@ func fromEcPublicKey(pub *ecdsa.PublicKey) (*rawJSONWebKey, error) {
return
key
,
nil
}
func
(
key
rawJSONWebKey
)
edPrivateKey
()
(
ed25519
.
PrivateKey
,
error
)
{
var
missing
[]
string
switch
{
case
key
.
D
==
nil
:
missing
=
append
(
missing
,
"D"
)
case
key
.
X
==
nil
:
missing
=
append
(
missing
,
"X"
)
}
if
len
(
missing
)
>
0
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid Ed25519 private key, missing %s value(s)"
,
strings
.
Join
(
missing
,
", "
))
}
privateKey
:=
make
([]
byte
,
ed25519
.
PrivateKeySize
)
copy
(
privateKey
[
0
:
32
],
key
.
X
.
bytes
())
copy
(
privateKey
[
32
:
],
key
.
D
.
bytes
())
rv
:=
ed25519
.
PrivateKey
(
privateKey
)
return
rv
,
nil
}
func
(
key
rawJSONWebKey
)
edPublicKey
()
(
ed25519
.
PublicKey
,
error
)
{
if
key
.
X
==
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid Ed key, missing x value"
)
}
publicKey
:=
make
([]
byte
,
ed25519
.
PublicKeySize
)
copy
(
publicKey
[
0
:
32
],
key
.
X
.
bytes
())
rv
:=
ed25519
.
PublicKey
(
publicKey
)
return
rv
,
nil
}
func
(
key
rawJSONWebKey
)
rsaPrivateKey
()
(
*
rsa
.
PrivateKey
,
error
)
{
var
missing
[]
string
switch
{
...
...
@@ -379,6 +471,13 @@ func (key rawJSONWebKey) rsaPrivateKey() (*rsa.PrivateKey, error) {
return
rv
,
err
}
func
fromEdPrivateKey
(
ed
ed25519
.
PrivateKey
)
(
*
rawJSONWebKey
,
error
)
{
raw
:=
fromEdPublicKey
(
ed25519
.
PublicKey
(
ed
[
0
:
32
]))
raw
.
D
=
newBuffer
(
ed
[
32
:
])
return
raw
,
nil
}
func
fromRsaPrivateKey
(
rsa
*
rsa
.
PrivateKey
)
(
*
rawJSONWebKey
,
error
)
{
if
len
(
rsa
.
Primes
)
!=
2
{
return
nil
,
ErrUnsupportedKeyType
...
...
vendor/gopkg.in/square/go-jose.v2/jws.go
View file @
316acbee
...
...
@@ -52,9 +52,20 @@ type JSONWebSignature struct {
// Signature represents a single signature over the JWS payload and protected header.
type
Signature
struct
{
// Header fields, such as the signature algorithm
// Merged header fields. Contains both protected and unprotected header
// values. Prefer using Protected and Unprotected fields instead of this.
// Values in this header may or may not have been signed and in general
// should not be trusted.
Header
Header
// Protected header. Values in this header were signed and
// will be verified as part of the signature verification process.
Protected
Header
// Unprotected header. Values in this header were not signed
// and in general should not be trusted.
Unprotected
Header
// The actual signature value
Signature
[]
byte
...
...
@@ -82,7 +93,7 @@ func (sig Signature) mergedHeaders() rawHeader {
}
// Compute data to be signed
func
(
obj
JSONWebSignature
)
computeAuthData
(
signature
*
Signature
)
[]
byte
{
func
(
obj
JSONWebSignature
)
computeAuthData
(
payload
[]
byte
,
signature
*
Signature
)
[]
byte
{
var
serializedProtected
string
if
signature
.
original
!=
nil
&&
signature
.
original
.
Protected
!=
nil
{
...
...
@@ -95,7 +106,7 @@ func (obj JSONWebSignature) computeAuthData(signature *Signature) []byte {
return
[]
byte
(
fmt
.
Sprintf
(
"%s.%s"
,
serializedProtected
,
base64
.
RawURLEncoding
.
EncodeToString
(
obj
.
payload
)))
base64
.
RawURLEncoding
.
EncodeToString
(
payload
)))
}
// parseSignedFull parses a message in full format.
...
...
@@ -132,7 +143,7 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) {
}
// Check that there is not a nonce in the unprotected header
if
parsed
.
Header
!=
nil
&&
parsed
.
Header
.
Nonce
!=
""
{
if
parsed
.
Header
!=
nil
&&
parsed
.
Header
.
getNonce
()
!=
""
{
return
nil
,
ErrUnprotectedNonce
}
...
...
@@ -153,7 +164,25 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) {
Signature
:
parsed
.
Signature
,
}
signature
.
Header
=
signature
.
mergedHeaders
()
.
sanitized
()
var
err
error
signature
.
Header
,
err
=
signature
.
mergedHeaders
()
.
sanitized
()
if
err
!=
nil
{
return
nil
,
err
}
if
signature
.
header
!=
nil
{
signature
.
Unprotected
,
err
=
signature
.
header
.
sanitized
()
if
err
!=
nil
{
return
nil
,
err
}
}
if
signature
.
protected
!=
nil
{
signature
.
Protected
,
err
=
signature
.
protected
.
sanitized
()
if
err
!=
nil
{
return
nil
,
err
}
}
// As per RFC 7515 Section 4.1.3, only public keys are allowed to be embedded.
jwk
:=
signature
.
Header
.
JSONWebKey
...
...
@@ -174,11 +203,30 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) {
}
// Check that there is not a nonce in the unprotected header
if
sig
.
Header
!=
nil
&&
sig
.
Header
.
Nonce
!=
""
{
if
sig
.
Header
!=
nil
&&
sig
.
Header
.
getNonce
()
!=
""
{
return
nil
,
ErrUnprotectedNonce
}
obj
.
Signatures
[
i
]
.
Header
=
obj
.
Signatures
[
i
]
.
mergedHeaders
()
.
sanitized
()
var
err
error
obj
.
Signatures
[
i
]
.
Header
,
err
=
obj
.
Signatures
[
i
]
.
mergedHeaders
()
.
sanitized
()
if
err
!=
nil
{
return
nil
,
err
}
if
obj
.
Signatures
[
i
]
.
header
!=
nil
{
obj
.
Signatures
[
i
]
.
Unprotected
,
err
=
obj
.
Signatures
[
i
]
.
header
.
sanitized
()
if
err
!=
nil
{
return
nil
,
err
}
}
if
obj
.
Signatures
[
i
]
.
protected
!=
nil
{
obj
.
Signatures
[
i
]
.
Protected
,
err
=
obj
.
Signatures
[
i
]
.
protected
.
sanitized
()
if
err
!=
nil
{
return
nil
,
err
}
}
obj
.
Signatures
[
i
]
.
Signature
=
sig
.
Signature
.
bytes
()
// As per RFC 7515 Section 4.1.3, only public keys are allowed to be embedded.
...
...
vendor/gopkg.in/square/go-jose.v2/opaque.go
0 → 100644
View file @
316acbee
/*-
* Copyright 2018 Square Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
jose
// OpaqueSigner is an interface that supports signing payloads with opaque
// private key(s). Private key operations preformed by implementors may, for
// example, occur in a hardware module. An OpaqueSigner may rotate signing keys
// transparently to the user of this interface.
type
OpaqueSigner
interface
{
// Public returns the public key of the current signing key.
Public
()
*
JSONWebKey
// Algs returns a list of supported signing algorithms.
Algs
()
[]
SignatureAlgorithm
// SignPayload signs a payload with the current signing key using the given
// algorithm.
SignPayload
(
payload
[]
byte
,
alg
SignatureAlgorithm
)
([]
byte
,
error
)
}
type
opaqueSigner
struct
{
signer
OpaqueSigner
}
func
newOpaqueSigner
(
alg
SignatureAlgorithm
,
signer
OpaqueSigner
)
(
recipientSigInfo
,
error
)
{
var
algSupported
bool
for
_
,
salg
:=
range
signer
.
Algs
()
{
if
alg
==
salg
{
algSupported
=
true
break
}
}
if
!
algSupported
{
return
recipientSigInfo
{},
ErrUnsupportedAlgorithm
}
return
recipientSigInfo
{
sigAlg
:
alg
,
publicKey
:
signer
.
Public
,
signer
:
&
opaqueSigner
{
signer
:
signer
,
},
},
nil
}
func
(
o
*
opaqueSigner
)
signPayload
(
payload
[]
byte
,
alg
SignatureAlgorithm
)
(
Signature
,
error
)
{
out
,
err
:=
o
.
signer
.
SignPayload
(
payload
,
alg
)
if
err
!=
nil
{
return
Signature
{},
err
}
return
Signature
{
Signature
:
out
,
protected
:
&
rawHeader
{},
},
nil
}
// OpaqueVerifier is an interface that supports verifying payloads with opaque
// public key(s). An OpaqueSigner may rotate signing keys transparently to the
// user of this interface.
type
OpaqueVerifier
interface
{
VerifyPayload
(
payload
[]
byte
,
signature
[]
byte
,
alg
SignatureAlgorithm
)
error
}
type
opaqueVerifier
struct
{
verifier
OpaqueVerifier
}
func
(
o
*
opaqueVerifier
)
verifyPayload
(
payload
[]
byte
,
signature
[]
byte
,
alg
SignatureAlgorithm
)
error
{
return
o
.
verifier
.
VerifyPayload
(
payload
,
signature
,
alg
)
}
vendor/gopkg.in/square/go-jose.v2/shared.go
View file @
316acbee
...
...
@@ -18,8 +18,12 @@ package jose
import
(
"crypto/elliptic"
"crypto/x509"
"encoding/base64"
"errors"
"fmt"
"gopkg.in/square/go-jose.v2/json"
)
// KeyAlgorithm represents a key management algorithm.
...
...
@@ -34,6 +38,9 @@ type ContentEncryption string
// CompressionAlgorithm represents an algorithm used for plaintext compression.
type
CompressionAlgorithm
string
// ContentType represents type of the contained data.
type
ContentType
string
var
(
// ErrCryptoFailure represents an error in cryptographic primitive. This
// occurs when, for example, a message had an invalid authentication tag or
...
...
@@ -63,6 +70,7 @@ var (
// Key management algorithms
const
(
ED25519
=
KeyAlgorithm
(
"ED25519"
)
RSA1_5
=
KeyAlgorithm
(
"RSA1_5"
)
// RSA-PKCS1v1.5
RSA_OAEP
=
KeyAlgorithm
(
"RSA-OAEP"
)
// RSA-OAEP-SHA1
RSA_OAEP_256
=
KeyAlgorithm
(
"RSA-OAEP-256"
)
// RSA-OAEP-SHA256
...
...
@@ -84,6 +92,7 @@ const (
// Signature algorithms
const
(
EdDSA
=
SignatureAlgorithm
(
"EdDSA"
)
HS256
=
SignatureAlgorithm
(
"HS256"
)
// HMAC using SHA-256
HS384
=
SignatureAlgorithm
(
"HS384"
)
// HMAC using SHA-384
HS512
=
SignatureAlgorithm
(
"HS512"
)
// HMAC using SHA-512
...
...
@@ -114,21 +123,44 @@ const (
DEFLATE
=
CompressionAlgorithm
(
"DEF"
)
// DEFLATE (RFC 1951)
)
// A key in the protected header of a JWS object. Use of the Header...
// constants is preferred to enhance type safety.
type
HeaderKey
string
const
(
HeaderType
HeaderKey
=
"typ"
// string
HeaderContentType
=
"cty"
// string
// These are set by go-jose and shouldn't need to be set by consumers of the
// library.
headerAlgorithm
=
"alg"
// string
headerEncryption
=
"enc"
// ContentEncryption
headerCompression
=
"zip"
// CompressionAlgorithm
headerCritical
=
"crit"
// []string
headerAPU
=
"apu"
// *byteBuffer
headerAPV
=
"apv"
// *byteBuffer
headerEPK
=
"epk"
// *JSONWebKey
headerIV
=
"iv"
// *byteBuffer
headerTag
=
"tag"
// *byteBuffer
headerX5c
=
"x5c"
// []*x509.Certificate
headerJWK
=
"jwk"
// *JSONWebKey
headerKeyID
=
"kid"
// string
headerNonce
=
"nonce"
// string
headerP2C
=
"p2c"
// *byteBuffer (int)
headerP2S
=
"p2s"
// *byteBuffer ([]byte)
)
// rawHeader represents the JOSE header for JWE/JWS objects (used for parsing).
type
rawHeader
struct
{
Alg
string
`json:"alg,omitempty"`
Enc
ContentEncryption
`json:"enc,omitempty"`
Zip
CompressionAlgorithm
`json:"zip,omitempty"`
Crit
[]
string
`json:"crit,omitempty"`
Apu
*
byteBuffer
`json:"apu,omitempty"`
Apv
*
byteBuffer
`json:"apv,omitempty"`
Epk
*
JSONWebKey
`json:"epk,omitempty"`
Iv
*
byteBuffer
`json:"iv,omitempty"`
Tag
*
byteBuffer
`json:"tag,omitempty"`
Jwk
*
JSONWebKey
`json:"jwk,omitempty"`
Kid
string
`json:"kid,omitempty"`
Nonce
string
`json:"nonce,omitempty"`
}
//
// The decoding of the constituent items is deferred because we want to marshal
// some members into particular structs rather than generic maps, but at the
// same time we need to receive any extra fields unhandled by this library to
// pass through to consuming code in case it wants to examine them.
type
rawHeader
map
[
HeaderKey
]
*
json
.
RawMessage
// Header represents the read-only JOSE header for JWE/JWS objects.
type
Header
struct
{
...
...
@@ -136,62 +168,295 @@ type Header struct {
JSONWebKey
*
JSONWebKey
Algorithm
string
Nonce
string
// Unverified certificate chain parsed from x5c header.
certificates
[]
*
x509
.
Certificate
// Any headers not recognised above get unmarshaled
// from JSON in a generic manner and placed in this map.
ExtraHeaders
map
[
HeaderKey
]
interface
{}
}
// sanitized produces a cleaned-up header object from the raw JSON.
func
(
parsed
rawHeader
)
sanitized
()
Header
{
return
Header
{
KeyID
:
parsed
.
Kid
,
JSONWebKey
:
parsed
.
Jwk
,
Algorithm
:
parsed
.
Alg
,
Nonce
:
parsed
.
Nonce
,
// Certificates verifies & returns the certificate chain present
// in the x5c header field of a message, if one was present. Returns
// an error if there was no x5c header present or the chain could
// not be validated with the given verify options.
func
(
h
Header
)
Certificates
(
opts
x509
.
VerifyOptions
)
([][]
*
x509
.
Certificate
,
error
)
{
if
len
(
h
.
certificates
)
==
0
{
return
nil
,
errors
.
New
(
"square/go-jose: no x5c header present in message"
)
}
leaf
:=
h
.
certificates
[
0
]
if
opts
.
Intermediates
==
nil
{
opts
.
Intermediates
=
x509
.
NewCertPool
()
for
_
,
intermediate
:=
range
h
.
certificates
[
1
:
]
{
opts
.
Intermediates
.
AddCert
(
intermediate
)
}
}
return
leaf
.
Verify
(
opts
)
}
// Merge headers from src into dst, giving precedence to headers from l.
func
(
dst
*
rawHeader
)
merge
(
src
*
rawHeader
)
{
if
src
=
=
nil
{
return
func
(
parsed
rawHeader
)
set
(
k
HeaderKey
,
v
interface
{})
error
{
b
,
err
:=
json
.
Marshal
(
v
)
if
err
!
=
nil
{
return
err
}
if
dst
.
Alg
==
""
{
dst
.
Alg
=
src
.
Alg
parsed
[
k
]
=
makeRawMessage
(
b
)
return
nil
}
// getString gets a string from the raw JSON, defaulting to "".
func
(
parsed
rawHeader
)
getString
(
k
HeaderKey
)
string
{
v
,
ok
:=
parsed
[
k
]
if
!
ok
||
v
==
nil
{
return
""
}
if
dst
.
Enc
==
""
{
dst
.
Enc
=
src
.
Enc
var
s
string
err
:=
json
.
Unmarshal
(
*
v
,
&
s
)
if
err
!=
nil
{
return
""
}
if
dst
.
Zip
==
""
{
dst
.
Zip
=
src
.
Zip
return
s
}
// getByteBuffer gets a byte buffer from the raw JSON. Returns (nil, nil) if
// not specified.
func
(
parsed
rawHeader
)
getByteBuffer
(
k
HeaderKey
)
(
*
byteBuffer
,
error
)
{
v
:=
parsed
[
k
]
if
v
==
nil
{
return
nil
,
nil
}
if
dst
.
Crit
==
nil
{
dst
.
Crit
=
src
.
Crit
var
bb
*
byteBuffer
err
:=
json
.
Unmarshal
(
*
v
,
&
bb
)
if
err
!=
nil
{
return
nil
,
err
}
if
dst
.
Crit
==
nil
{
dst
.
Crit
=
src
.
Crit
return
bb
,
nil
}
// getAlgorithm extracts parsed "alg" from the raw JSON as a KeyAlgorithm.
func
(
parsed
rawHeader
)
getAlgorithm
()
KeyAlgorithm
{
return
KeyAlgorithm
(
parsed
.
getString
(
headerAlgorithm
))
}
// getSignatureAlgorithm extracts parsed "alg" from the raw JSON as a SignatureAlgorithm.
func
(
parsed
rawHeader
)
getSignatureAlgorithm
()
SignatureAlgorithm
{
return
SignatureAlgorithm
(
parsed
.
getString
(
headerAlgorithm
))
}
// getEncryption extracts parsed "enc" from the raw JSON.
func
(
parsed
rawHeader
)
getEncryption
()
ContentEncryption
{
return
ContentEncryption
(
parsed
.
getString
(
headerEncryption
))
}
// getCompression extracts parsed "zip" from the raw JSON.
func
(
parsed
rawHeader
)
getCompression
()
CompressionAlgorithm
{
return
CompressionAlgorithm
(
parsed
.
getString
(
headerCompression
))
}
func
(
parsed
rawHeader
)
getNonce
()
string
{
return
parsed
.
getString
(
headerNonce
)
}
// getEPK extracts parsed "epk" from the raw JSON.
func
(
parsed
rawHeader
)
getEPK
()
(
*
JSONWebKey
,
error
)
{
v
:=
parsed
[
headerEPK
]
if
v
==
nil
{
return
nil
,
nil
}
if
dst
.
Apu
==
nil
{
dst
.
Apu
=
src
.
Apu
var
epk
*
JSONWebKey
err
:=
json
.
Unmarshal
(
*
v
,
&
epk
)
if
err
!=
nil
{
return
nil
,
err
}
if
dst
.
Apv
==
nil
{
dst
.
Apv
=
src
.
Apv
return
epk
,
nil
}
// getAPU extracts parsed "apu" from the raw JSON.
func
(
parsed
rawHeader
)
getAPU
()
(
*
byteBuffer
,
error
)
{
return
parsed
.
getByteBuffer
(
headerAPU
)
}
// getAPV extracts parsed "apv" from the raw JSON.
func
(
parsed
rawHeader
)
getAPV
()
(
*
byteBuffer
,
error
)
{
return
parsed
.
getByteBuffer
(
headerAPV
)
}
// getIV extracts parsed "iv" frpom the raw JSON.
func
(
parsed
rawHeader
)
getIV
()
(
*
byteBuffer
,
error
)
{
return
parsed
.
getByteBuffer
(
headerIV
)
}
// getTag extracts parsed "tag" frpom the raw JSON.
func
(
parsed
rawHeader
)
getTag
()
(
*
byteBuffer
,
error
)
{
return
parsed
.
getByteBuffer
(
headerTag
)
}
// getJWK extracts parsed "jwk" from the raw JSON.
func
(
parsed
rawHeader
)
getJWK
()
(
*
JSONWebKey
,
error
)
{
v
:=
parsed
[
headerJWK
]
if
v
==
nil
{
return
nil
,
nil
}
if
dst
.
Epk
==
nil
{
dst
.
Epk
=
src
.
Epk
var
jwk
*
JSONWebKey
err
:=
json
.
Unmarshal
(
*
v
,
&
jwk
)
if
err
!=
nil
{
return
nil
,
err
}
if
dst
.
Iv
==
nil
{
dst
.
Iv
=
src
.
Iv
return
jwk
,
nil
}
// getCritical extracts parsed "crit" from the raw JSON. If omitted, it
// returns an empty slice.
func
(
parsed
rawHeader
)
getCritical
()
([]
string
,
error
)
{
v
:=
parsed
[
headerCritical
]
if
v
==
nil
{
return
nil
,
nil
}
if
dst
.
Tag
==
nil
{
dst
.
Tag
=
src
.
Tag
var
q
[]
string
err
:=
json
.
Unmarshal
(
*
v
,
&
q
)
if
err
!=
nil
{
return
nil
,
err
}
if
dst
.
Kid
==
""
{
dst
.
Kid
=
src
.
Kid
return
q
,
nil
}
// getS2C extracts parsed "p2c" from the raw JSON.
func
(
parsed
rawHeader
)
getP2C
()
(
int
,
error
)
{
v
:=
parsed
[
headerP2C
]
if
v
==
nil
{
return
0
,
nil
}
var
p2c
int
err
:=
json
.
Unmarshal
(
*
v
,
&
p2c
)
if
err
!=
nil
{
return
0
,
err
}
return
p2c
,
nil
}
// getS2S extracts parsed "p2s" from the raw JSON.
func
(
parsed
rawHeader
)
getP2S
()
(
*
byteBuffer
,
error
)
{
return
parsed
.
getByteBuffer
(
headerP2S
)
}
// sanitized produces a cleaned-up header object from the raw JSON.
func
(
parsed
rawHeader
)
sanitized
()
(
h
Header
,
err
error
)
{
for
k
,
v
:=
range
parsed
{
if
v
==
nil
{
continue
}
switch
k
{
case
headerJWK
:
var
jwk
*
JSONWebKey
err
=
json
.
Unmarshal
(
*
v
,
&
jwk
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal JWK: %v: %#v"
,
err
,
string
(
*
v
))
return
}
h
.
JSONWebKey
=
jwk
case
headerKeyID
:
var
s
string
err
=
json
.
Unmarshal
(
*
v
,
&
s
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal key ID: %v: %#v"
,
err
,
string
(
*
v
))
return
}
if
dst
.
Jwk
==
nil
{
dst
.
Jwk
=
src
.
Jwk
h
.
KeyID
=
s
case
headerAlgorithm
:
var
s
string
err
=
json
.
Unmarshal
(
*
v
,
&
s
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal algorithm: %v: %#v"
,
err
,
string
(
*
v
))
return
}
h
.
Algorithm
=
s
case
headerNonce
:
var
s
string
err
=
json
.
Unmarshal
(
*
v
,
&
s
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal nonce: %v: %#v"
,
err
,
string
(
*
v
))
return
}
if
dst
.
Nonce
==
""
{
dst
.
Nonce
=
src
.
Nonce
h
.
Nonce
=
s
case
headerX5c
:
c
:=
[]
string
{}
err
=
json
.
Unmarshal
(
*
v
,
&
c
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal x5c header: %v: %#v"
,
err
,
string
(
*
v
))
return
}
h
.
certificates
,
err
=
parseCertificateChain
(
c
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal x5c header: %v: %#v"
,
err
,
string
(
*
v
))
return
}
default
:
if
h
.
ExtraHeaders
==
nil
{
h
.
ExtraHeaders
=
map
[
HeaderKey
]
interface
{}{}
}
var
v2
interface
{}
err
=
json
.
Unmarshal
(
*
v
,
&
v2
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"failed to unmarshal value: %v: %#v"
,
err
,
string
(
*
v
))
return
}
h
.
ExtraHeaders
[
k
]
=
v2
}
}
return
}
func
parseCertificateChain
(
chain
[]
string
)
([]
*
x509
.
Certificate
,
error
)
{
out
:=
make
([]
*
x509
.
Certificate
,
len
(
chain
))
for
i
,
cert
:=
range
chain
{
raw
,
err
:=
base64
.
StdEncoding
.
DecodeString
(
cert
)
if
err
!=
nil
{
return
nil
,
err
}
out
[
i
],
err
=
x509
.
ParseCertificate
(
raw
)
if
err
!=
nil
{
return
nil
,
err
}
}
return
out
,
nil
}
func
(
dst
rawHeader
)
isSet
(
k
HeaderKey
)
bool
{
dvr
:=
dst
[
k
]
if
dvr
==
nil
{
return
false
}
var
dv
interface
{}
err
:=
json
.
Unmarshal
(
*
dvr
,
&
dv
)
if
err
!=
nil
{
return
true
}
if
dvStr
,
ok
:=
dv
.
(
string
);
ok
{
return
dvStr
!=
""
}
return
true
}
// Merge headers from src into dst, giving precedence to headers from l.
func
(
dst
rawHeader
)
merge
(
src
*
rawHeader
)
{
if
src
==
nil
{
return
}
for
k
,
v
:=
range
*
src
{
if
dst
.
isSet
(
k
)
{
continue
}
dst
[
k
]
=
v
}
}
...
...
@@ -222,3 +487,8 @@ func curveSize(crv elliptic.Curve) int {
return
div
+
1
}
func
makeRawMessage
(
b
[]
byte
)
*
json
.
RawMessage
{
rm
:=
json
.
RawMessage
(
b
)
return
&
rm
}
vendor/gopkg.in/square/go-jose.v2/signing.go
View file @
316acbee
...
...
@@ -22,6 +22,10 @@ import (
"encoding/base64"
"errors"
"fmt"
"golang.org/x/crypto/ed25519"
"gopkg.in/square/go-jose.v2/json"
)
// NonceSource represents a source of random nonces to go into JWS objects
...
...
@@ -32,6 +36,7 @@ type NonceSource interface {
// Signer represents a signer which takes a payload and produces a signed JWS object.
type
Signer
interface
{
Sign
(
payload
[]
byte
)
(
*
JSONWebSignature
,
error
)
Options
()
SignerOptions
}
// SigningKey represents an algorithm/key used to sign a message.
...
...
@@ -44,6 +49,32 @@ type SigningKey struct {
type
SignerOptions
struct
{
NonceSource
NonceSource
EmbedJWK
bool
// Optional map of additional keys to be inserted into the protected header
// of a JWS object. Some specifications which make use of JWS like to insert
// additional values here. All values must be JSON-serializable.
ExtraHeaders
map
[
HeaderKey
]
interface
{}
}
// WithHeader adds an arbitrary value to the ExtraHeaders map, initializing it
// if necessary. It returns itself and so can be used in a fluent style.
func
(
so
*
SignerOptions
)
WithHeader
(
k
HeaderKey
,
v
interface
{})
*
SignerOptions
{
if
so
.
ExtraHeaders
==
nil
{
so
.
ExtraHeaders
=
map
[
HeaderKey
]
interface
{}{}
}
so
.
ExtraHeaders
[
k
]
=
v
return
so
}
// WithContentType adds a content type ("cty") header and returns the updated
// SignerOptions.
func
(
so
*
SignerOptions
)
WithContentType
(
contentType
ContentType
)
*
SignerOptions
{
return
so
.
WithHeader
(
HeaderContentType
,
contentType
)
}
// WithType adds a type ("typ") header and returns the updated SignerOptions.
func
(
so
*
SignerOptions
)
WithType
(
typ
ContentType
)
*
SignerOptions
{
return
so
.
WithHeader
(
HeaderType
,
typ
)
}
type
payloadSigner
interface
{
...
...
@@ -58,14 +89,21 @@ type genericSigner struct {
recipients
[]
recipientSigInfo
nonceSource
NonceSource
embedJWK
bool
extraHeaders
map
[
HeaderKey
]
interface
{}
}
type
recipientSigInfo
struct
{
sigAlg
SignatureAlgorithm
publicKey
*
JSONWebKey
publicKey
func
()
*
JSONWebKey
signer
payloadSigner
}
func
staticPublicKey
(
jwk
*
JSONWebKey
)
func
()
*
JSONWebKey
{
return
func
()
*
JSONWebKey
{
return
jwk
}
}
// NewSigner creates an appropriate signer based on the key type
func
NewSigner
(
sig
SigningKey
,
opts
*
SignerOptions
)
(
Signer
,
error
)
{
return
NewMultiSigner
([]
SigningKey
{
sig
},
opts
)
...
...
@@ -78,6 +116,7 @@ func NewMultiSigner(sigs []SigningKey, opts *SignerOptions) (Signer, error) {
if
opts
!=
nil
{
signer
.
nonceSource
=
opts
.
NonceSource
signer
.
embedJWK
=
opts
.
EmbedJWK
signer
.
extraHeaders
=
opts
.
ExtraHeaders
}
for
_
,
sig
:=
range
sigs
{
...
...
@@ -93,6 +132,10 @@ func NewMultiSigner(sigs []SigningKey, opts *SignerOptions) (Signer, error) {
// newVerifier creates a verifier based on the key type
func
newVerifier
(
verificationKey
interface
{})
(
payloadVerifier
,
error
)
{
switch
verificationKey
:=
verificationKey
.
(
type
)
{
case
ed25519
.
PublicKey
:
return
&
edEncrypterVerifier
{
publicKey
:
verificationKey
,
},
nil
case
*
rsa
.
PublicKey
:
return
&
rsaEncrypterVerifier
{
publicKey
:
verificationKey
,
...
...
@@ -105,11 +148,15 @@ func newVerifier(verificationKey interface{}) (payloadVerifier, error) {
return
&
symmetricMac
{
key
:
verificationKey
,
},
nil
case
JSONWebKey
:
return
newVerifier
(
verificationKey
.
Key
)
case
*
JSONWebKey
:
return
newVerifier
(
verificationKey
.
Key
)
default
:
return
nil
,
ErrUnsupportedKeyType
}
if
ov
,
ok
:=
verificationKey
.
(
OpaqueVerifier
);
ok
{
return
&
opaqueVerifier
{
verifier
:
ov
},
nil
}
return
nil
,
ErrUnsupportedKeyType
}
func
(
ctx
*
genericSigner
)
addRecipient
(
alg
SignatureAlgorithm
,
signingKey
interface
{})
error
{
...
...
@@ -124,22 +171,44 @@ func (ctx *genericSigner) addRecipient(alg SignatureAlgorithm, signingKey interf
func
makeJWSRecipient
(
alg
SignatureAlgorithm
,
signingKey
interface
{})
(
recipientSigInfo
,
error
)
{
switch
signingKey
:=
signingKey
.
(
type
)
{
case
ed25519
.
PrivateKey
:
return
newEd25519Signer
(
alg
,
signingKey
)
case
*
rsa
.
PrivateKey
:
return
newRSASigner
(
alg
,
signingKey
)
case
*
ecdsa
.
PrivateKey
:
return
newECDSASigner
(
alg
,
signingKey
)
case
[]
byte
:
return
newSymmetricSigner
(
alg
,
signingKey
)
case
JSONWebKey
:
return
newJWKSigner
(
alg
,
signingKey
)
case
*
JSONWebKey
:
return
newJWKSigner
(
alg
,
*
signingKey
)
}
if
signer
,
ok
:=
signingKey
.
(
OpaqueSigner
);
ok
{
return
newOpaqueSigner
(
alg
,
signer
)
}
return
recipientSigInfo
{},
ErrUnsupportedKeyType
}
func
newJWKSigner
(
alg
SignatureAlgorithm
,
signingKey
JSONWebKey
)
(
recipientSigInfo
,
error
)
{
recipient
,
err
:=
makeJWSRecipient
(
alg
,
signingKey
.
Key
)
if
err
!=
nil
{
return
recipientSigInfo
{},
err
}
recipient
.
publicKey
.
KeyID
=
signingKey
.
KeyID
return
recipient
,
nil
default
:
return
recipientSigInfo
{},
ErrUnsupportedKeyType
if
recipient
.
publicKey
!=
nil
&&
recipient
.
publicKey
()
!=
nil
{
// recipient.publicKey is a JWK synthesized for embedding when recipientSigInfo
// was created for the inner key (such as a RSA or ECDSA public key). It contains
// the pub key for embedding, but doesn't have extra params like key id.
publicKey
:=
signingKey
publicKey
.
Key
=
recipient
.
publicKey
()
.
Key
recipient
.
publicKey
=
staticPublicKey
(
&
publicKey
)
// This should be impossible, but let's check anyway.
if
!
recipient
.
publicKey
()
.
IsPublic
()
{
return
recipientSigInfo
{},
errors
.
New
(
"square/go-jose: public key was unexpectedly not public"
)
}
}
return
recipient
,
nil
}
func
(
ctx
*
genericSigner
)
Sign
(
payload
[]
byte
)
(
*
JSONWebSignature
,
error
)
{
...
...
@@ -148,15 +217,24 @@ func (ctx *genericSigner) Sign(payload []byte) (*JSONWebSignature, error) {
obj
.
Signatures
=
make
([]
Signature
,
len
(
ctx
.
recipients
))
for
i
,
recipient
:=
range
ctx
.
recipients
{
protected
:=
&
rawHeader
{
Alg
:
string
(
recipient
.
sigAlg
),
protected
:=
map
[
HeaderKey
]
interface
{}
{
headerAlgorithm
:
string
(
recipient
.
sigAlg
),
}
if
recipient
.
publicKey
!=
nil
{
if
recipient
.
publicKey
!=
nil
&&
recipient
.
publicKey
()
!=
nil
{
// We want to embed the JWK or set the kid header, but not both. Having a protected
// header that contains an embedded JWK while also simultaneously containing the kid
// header is confusing, and at least in ACME the two are considered to be mutually
// exclusive. The fact that both can exist at the same time is a somewhat unfortunate
// result of the JOSE spec. We've decided that this library will only include one or
// the other to avoid this confusion.
//
// See https://github.com/square/go-jose/issues/157 for more context.
if
ctx
.
embedJWK
{
protected
.
Jwk
=
recipient
.
publicKey
protected
[
headerJWK
]
=
recipient
.
publicKey
()
}
else
{
protected
[
headerKeyID
]
=
recipient
.
publicKey
()
.
KeyID
}
protected
.
Kid
=
recipient
.
publicKey
.
KeyID
}
if
ctx
.
nonceSource
!=
nil
{
...
...
@@ -164,7 +242,11 @@ func (ctx *genericSigner) Sign(payload []byte) (*JSONWebSignature, error) {
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: Error generating nonce: %v"
,
err
)
}
protected
.
Nonce
=
nonce
protected
[
headerNonce
]
=
nonce
}
for
k
,
v
:=
range
ctx
.
extraHeaders
{
protected
[
k
]
=
v
}
serializedProtected
:=
mustSerializeJSON
(
protected
)
...
...
@@ -178,13 +260,28 @@ func (ctx *genericSigner) Sign(payload []byte) (*JSONWebSignature, error) {
return
nil
,
err
}
signatureInfo
.
protected
=
protected
signatureInfo
.
protected
=
&
rawHeader
{}
for
k
,
v
:=
range
protected
{
b
,
err
:=
json
.
Marshal
(
v
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: Error marshalling item %#v: %v"
,
k
,
err
)
}
(
*
signatureInfo
.
protected
)[
k
]
=
makeRawMessage
(
b
)
}
obj
.
Signatures
[
i
]
=
signatureInfo
}
return
obj
,
nil
}
func
(
ctx
*
genericSigner
)
Options
()
SignerOptions
{
return
SignerOptions
{
NonceSource
:
ctx
.
nonceSource
,
EmbedJWK
:
ctx
.
embedJWK
,
ExtraHeaders
:
ctx
.
extraHeaders
,
}
}
// Verify validates the signature on the object and returns the payload.
// This function does not support multi-signature, if you desire multi-sig
// verification use VerifyMulti instead.
...
...
@@ -193,30 +290,53 @@ func (ctx *genericSigner) Sign(payload []byte) (*JSONWebSignature, error) {
// payload header. You cannot assume that the key received in a payload is
// trusted.
func
(
obj
JSONWebSignature
)
Verify
(
verificationKey
interface
{})
([]
byte
,
error
)
{
verifier
,
err
:=
newVerifier
(
verificationKey
)
err
:=
obj
.
DetachedVerify
(
obj
.
payload
,
verificationKey
)
if
err
!=
nil
{
return
nil
,
err
}
return
obj
.
payload
,
nil
}
// UnsafePayloadWithoutVerification returns the payload without
// verifying it. The content returned from this function cannot be
// trusted.
func
(
obj
JSONWebSignature
)
UnsafePayloadWithoutVerification
()
[]
byte
{
return
obj
.
payload
}
// DetachedVerify validates a detached signature on the given payload. In
// most cases, you will probably want to use Verify instead. DetachedVerify
// is only useful if you have a payload and signature that are separated from
// each other.
func
(
obj
JSONWebSignature
)
DetachedVerify
(
payload
[]
byte
,
verificationKey
interface
{})
error
{
verifier
,
err
:=
newVerifier
(
verificationKey
)
if
err
!=
nil
{
return
err
}
if
len
(
obj
.
Signatures
)
>
1
{
return
nil
,
errors
.
New
(
"square/go-jose: too many signatures in payload; expecting only one"
)
return
errors
.
New
(
"square/go-jose: too many signatures in payload; expecting only one"
)
}
signature
:=
obj
.
Signatures
[
0
]
headers
:=
signature
.
mergedHeaders
()
if
len
(
headers
.
Crit
)
>
0
{
critical
,
err
:=
headers
.
getCritical
()
if
err
!=
nil
{
return
err
}
if
len
(
critical
)
>
0
{
// Unsupported crit header
return
nil
,
ErrCryptoFailure
return
ErrCryptoFailure
}
input
:=
obj
.
computeAuthData
(
&
signature
)
alg
:=
SignatureAlgorithm
(
headers
.
Alg
)
input
:=
obj
.
computeAuthData
(
payload
,
&
signature
)
alg
:=
headers
.
getSignatureAlgorithm
(
)
err
=
verifier
.
verifyPayload
(
input
,
signature
.
Signature
,
alg
)
if
err
==
nil
{
return
obj
.
payload
,
nil
return
nil
}
return
nil
,
ErrCryptoFailure
return
ErrCryptoFailure
}
// VerifyMulti validates (one of the multiple) signatures on the object and
...
...
@@ -224,25 +344,46 @@ func (obj JSONWebSignature) Verify(verificationKey interface{}) ([]byte, error)
// object and the payload. We return the signature and index to guarantee that
// callers are getting the verified value.
func
(
obj
JSONWebSignature
)
VerifyMulti
(
verificationKey
interface
{})
(
int
,
Signature
,
[]
byte
,
error
)
{
verifier
,
err
:=
newVerifier
(
verificationKey
)
idx
,
sig
,
err
:=
obj
.
DetachedVerifyMulti
(
obj
.
payload
,
verificationKey
)
if
err
!=
nil
{
return
-
1
,
Signature
{},
nil
,
err
}
return
idx
,
sig
,
obj
.
payload
,
nil
}
// DetachedVerifyMulti validates a detached signature on the given payload with
// a signature/object that has potentially multiple signers. This returns the index
// of the signature that was verified, along with the signature object. We return
// the signature and index to guarantee that callers are getting the verified value.
//
// In most cases, you will probably want to use Verify or VerifyMulti instead.
// DetachedVerifyMulti is only useful if you have a payload and signature that are
// separated from each other, and the signature can have multiple signers at the
// same time.
func
(
obj
JSONWebSignature
)
DetachedVerifyMulti
(
payload
[]
byte
,
verificationKey
interface
{})
(
int
,
Signature
,
error
)
{
verifier
,
err
:=
newVerifier
(
verificationKey
)
if
err
!=
nil
{
return
-
1
,
Signature
{},
err
}
for
i
,
signature
:=
range
obj
.
Signatures
{
headers
:=
signature
.
mergedHeaders
()
if
len
(
headers
.
Crit
)
>
0
{
critical
,
err
:=
headers
.
getCritical
()
if
err
!=
nil
{
continue
}
if
len
(
critical
)
>
0
{
// Unsupported crit header
continue
}
input
:=
obj
.
computeAuthData
(
&
signature
)
alg
:=
SignatureAlgorithm
(
headers
.
Alg
)
err
:
=
verifier
.
verifyPayload
(
input
,
signature
.
Signature
,
alg
)
input
:=
obj
.
computeAuthData
(
payload
,
&
signature
)
alg
:=
headers
.
getSignatureAlgorithm
(
)
err
=
verifier
.
verifyPayload
(
input
,
signature
.
Signature
,
alg
)
if
err
==
nil
{
return
i
,
signature
,
obj
.
payload
,
nil
return
i
,
signature
,
nil
}
}
return
-
1
,
Signature
{},
nil
,
ErrCryptoFailure
return
-
1
,
Signature
{},
ErrCryptoFailure
}
vendor/gopkg.in/square/go-jose.v2/symmetric.go
View file @
316acbee
...
...
@@ -17,6 +17,7 @@
package
jose
import
(
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/hmac"
...
...
@@ -25,18 +26,34 @@ import (
"crypto/sha512"
"crypto/subtle"
"errors"
"fmt"
"hash"
"io"
"golang.org/x/crypto/pbkdf2"
"gopkg.in/square/go-jose.v2/cipher"
)
// Random reader (stubbed out in tests)
var
randReader
=
rand
.
Reader
const
(
// RFC7518 recommends a minimum of 1,000 iterations:
// https://tools.ietf.org/html/rfc7518#section-4.8.1.2
// NIST recommends a minimum of 10,000:
// https://pages.nist.gov/800-63-3/sp800-63b.html
// 1Password uses 100,000:
// https://support.1password.com/pbkdf2/
defaultP2C
=
100000
// Default salt size: 128 bits
defaultP2SSize
=
16
)
// Dummy key cipher for shared symmetric key mode
type
symmetricKeyCipher
struct
{
key
[]
byte
// Pre-shared content-encryption key
p2c
int
// PBES2 Count
p2s
[]
byte
// PBES2 Salt Input
}
// Signer/verifier for MAC modes
...
...
@@ -113,10 +130,37 @@ func getContentCipher(alg ContentEncryption) contentCipher {
}
}
// getPbkdf2Params returns the key length and hash function used in
// pbkdf2.Key.
func
getPbkdf2Params
(
alg
KeyAlgorithm
)
(
int
,
func
()
hash
.
Hash
)
{
switch
alg
{
case
PBES2_HS256_A128KW
:
return
16
,
sha256
.
New
case
PBES2_HS384_A192KW
:
return
24
,
sha512
.
New384
case
PBES2_HS512_A256KW
:
return
32
,
sha512
.
New
default
:
panic
(
"invalid algorithm"
)
}
}
// getRandomSalt generates a new salt of the given size.
func
getRandomSalt
(
size
int
)
([]
byte
,
error
)
{
salt
:=
make
([]
byte
,
size
)
_
,
err
:=
io
.
ReadFull
(
randReader
,
salt
)
if
err
!=
nil
{
return
nil
,
err
}
return
salt
,
nil
}
// newSymmetricRecipient creates a JWE encrypter based on AES-GCM key wrap.
func
newSymmetricRecipient
(
keyAlg
KeyAlgorithm
,
key
[]
byte
)
(
recipientKeyInfo
,
error
)
{
switch
keyAlg
{
case
DIRECT
,
A128GCMKW
,
A192GCMKW
,
A256GCMKW
,
A128KW
,
A192KW
,
A256KW
:
case
PBES2_HS256_A128KW
,
PBES2_HS384_A192KW
,
PBES2_HS512_A256KW
:
default
:
return
recipientKeyInfo
{},
ErrUnsupportedAlgorithm
}
...
...
@@ -211,6 +255,10 @@ func (ctx aeadContentCipher) decrypt(key, aad []byte, parts *aeadParts) ([]byte,
return
nil
,
err
}
if
len
(
parts
.
iv
)
!=
aead
.
NonceSize
()
||
len
(
parts
.
tag
)
<
ctx
.
authtagBytes
{
return
nil
,
ErrCryptoFailure
}
return
aead
.
Open
(
nil
,
parts
.
iv
,
append
(
parts
.
ciphertext
,
parts
.
tag
...
),
aad
)
}
...
...
@@ -229,11 +277,12 @@ func (ctx *symmetricKeyCipher) encryptKey(cek []byte, alg KeyAlgorithm) (recipie
return
recipientInfo
{},
err
}
header
:=
&
rawHeader
{}
header
.
set
(
headerIV
,
newBuffer
(
parts
.
iv
))
header
.
set
(
headerTag
,
newBuffer
(
parts
.
tag
))
return
recipientInfo
{
header
:
&
rawHeader
{
Iv
:
newBuffer
(
parts
.
iv
),
Tag
:
newBuffer
(
parts
.
tag
),
},
header
:
header
,
encryptedKey
:
parts
.
ciphertext
,
},
nil
case
A128KW
,
A192KW
,
A256KW
:
...
...
@@ -251,6 +300,45 @@ func (ctx *symmetricKeyCipher) encryptKey(cek []byte, alg KeyAlgorithm) (recipie
encryptedKey
:
jek
,
header
:
&
rawHeader
{},
},
nil
case
PBES2_HS256_A128KW
,
PBES2_HS384_A192KW
,
PBES2_HS512_A256KW
:
if
len
(
ctx
.
p2s
)
==
0
{
salt
,
err
:=
getRandomSalt
(
defaultP2SSize
)
if
err
!=
nil
{
return
recipientInfo
{},
err
}
ctx
.
p2s
=
salt
}
if
ctx
.
p2c
<=
0
{
ctx
.
p2c
=
defaultP2C
}
// salt is UTF8(Alg) || 0x00 || Salt Input
salt
:=
bytes
.
Join
([][]
byte
{[]
byte
(
alg
),
ctx
.
p2s
},
[]
byte
{
0x00
})
// derive key
keyLen
,
h
:=
getPbkdf2Params
(
alg
)
key
:=
pbkdf2
.
Key
(
ctx
.
key
,
salt
,
ctx
.
p2c
,
keyLen
,
h
)
// use AES cipher with derived key
block
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
recipientInfo
{},
err
}
jek
,
err
:=
josecipher
.
KeyWrap
(
block
,
cek
)
if
err
!=
nil
{
return
recipientInfo
{},
err
}
header
:=
&
rawHeader
{}
header
.
set
(
headerP2C
,
ctx
.
p2c
)
header
.
set
(
headerP2S
,
newBuffer
(
ctx
.
p2s
))
return
recipientInfo
{
encryptedKey
:
jek
,
header
:
header
,
},
nil
}
return
recipientInfo
{},
ErrUnsupportedAlgorithm
...
...
@@ -258,7 +346,7 @@ func (ctx *symmetricKeyCipher) encryptKey(cek []byte, alg KeyAlgorithm) (recipie
// Decrypt the content encryption key.
func
(
ctx
*
symmetricKeyCipher
)
decryptKey
(
headers
rawHeader
,
recipient
*
recipientInfo
,
generator
keyGenerator
)
([]
byte
,
error
)
{
switch
KeyAlgorithm
(
headers
.
Alg
)
{
switch
headers
.
getAlgorithm
(
)
{
case
DIRECT
:
cek
:=
make
([]
byte
,
len
(
ctx
.
key
))
copy
(
cek
,
ctx
.
key
)
...
...
@@ -266,10 +354,19 @@ func (ctx *symmetricKeyCipher) decryptKey(headers rawHeader, recipient *recipien
case
A128GCMKW
,
A192GCMKW
,
A256GCMKW
:
aead
:=
newAESGCM
(
len
(
ctx
.
key
))
iv
,
err
:=
headers
.
getIV
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid IV: %v"
,
err
)
}
tag
,
err
:=
headers
.
getTag
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid tag: %v"
,
err
)
}
parts
:=
&
aeadParts
{
iv
:
headers
.
I
v
.
bytes
(),
iv
:
i
v
.
bytes
(),
ciphertext
:
recipient
.
encryptedKey
,
tag
:
headers
.
T
ag
.
bytes
(),
tag
:
t
ag
.
bytes
(),
}
cek
,
err
:=
aead
.
decrypt
(
ctx
.
key
,
[]
byte
{},
parts
)
...
...
@@ -284,6 +381,42 @@ func (ctx *symmetricKeyCipher) decryptKey(headers rawHeader, recipient *recipien
return
nil
,
err
}
cek
,
err
:=
josecipher
.
KeyUnwrap
(
block
,
recipient
.
encryptedKey
)
if
err
!=
nil
{
return
nil
,
err
}
return
cek
,
nil
case
PBES2_HS256_A128KW
,
PBES2_HS384_A192KW
,
PBES2_HS512_A256KW
:
p2s
,
err
:=
headers
.
getP2S
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid P2S: %v"
,
err
)
}
if
p2s
==
nil
||
len
(
p2s
.
data
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid P2S: must be present"
)
}
p2c
,
err
:=
headers
.
getP2C
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid P2C: %v"
,
err
)
}
if
p2c
<=
0
{
return
nil
,
fmt
.
Errorf
(
"square/go-jose: invalid P2C: must be a positive integer"
)
}
// salt is UTF8(Alg) || 0x00 || Salt Input
alg
:=
headers
.
getAlgorithm
()
salt
:=
bytes
.
Join
([][]
byte
{[]
byte
(
alg
),
p2s
.
bytes
()},
[]
byte
{
0x00
})
// derive key
keyLen
,
h
:=
getPbkdf2Params
(
alg
)
key
:=
pbkdf2
.
Key
(
ctx
.
key
,
salt
,
p2c
,
keyLen
,
h
)
// use AES cipher with derived key
block
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
err
}
cek
,
err
:=
josecipher
.
KeyUnwrap
(
block
,
recipient
.
encryptedKey
)
if
err
!=
nil
{
return
nil
,
err
...
...
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