crypto/ecdsa: use bigmod and nistec instead of math/big and crypto/elliptic
Ignoring custom curves, this makes the whole package constant-time.
There is a slight loss in performance for P-384 and P-521 because bigmod
is slower than math/big (but P-256 has an assembly scalar field
inversion, so doesn't use bigmod for anything big).
name old time/op new time/op delta
Sign/P256-8 19.2µs ± 2% 19.1µs ± 2% ~ (p=0.268 n=9+10)
Sign/P384-8 166µs ± 3% 188µs ± 2% +13.52% (p=0.000 n=10+10)
Sign/P521-8 337µs ± 2% 359µs ± 2% +6.46% (p=0.000 n=10+10)
Verify/P256-8 58.1µs ± 2% 58.1µs ± 2% ~ (p=0.971 n=10+10)
Verify/P384-8 484µs ± 2% 569µs ±12% +17.65% (p=0.000 n=10+10)
Verify/P521-8 1.03ms ± 4% 1.14ms ± 2% +11.02% (p=0.000 n=10+10)
GenerateKey/P256-8 12.4µs ±12% 12.0µs ± 2% ~ (p=0.063 n=10+10)
GenerateKey/P384-8 129µs ±18% 119µs ± 2% ~ (p=0.190 n=10+10)
GenerateKey/P521-8 241µs ± 2% 240µs ± 2% ~ (p=0.436 n=10+10)
name old alloc/op new alloc/op delta
Sign/P256-8 3.08kB ± 0% 2.47kB ± 0% -19.77% (p=0.000 n=10+10)
Sign/P384-8 6.16kB ± 0% 2.64kB ± 0% -57.16% (p=0.000 n=10+10)
Sign/P521-8 7.87kB ± 0% 3.01kB ± 0% -61.80% (p=0.000 n=10+10)
Verify/P256-8 1.29kB ± 1% 0.48kB ± 0% -62.69% (p=0.000 n=10+10)
Verify/P384-8 2.49kB ± 1% 0.64kB ± 0% -74.25% (p=0.000 n=10+10)
Verify/P521-8 3.31kB ± 0% 0.96kB ± 0% -71.02% (p=0.000 n=7+10)
GenerateKey/P256-8 720B ± 0% 920B ± 0% +27.78% (p=0.000 n=10+10)
GenerateKey/P384-8 921B ± 0% 1120B ± 0% +21.61% (p=0.000 n=9+10)
GenerateKey/P521-8 1.30kB ± 0% 1.44kB ± 0% +10.45% (p=0.000 n=10+10)
name old allocs/op new allocs/op delta
Sign/P256-8 45.0 ± 0% 33.0 ± 0% -26.67% (p=0.000 n=10+10)
Sign/P384-8 69.0 ± 0% 34.0 ± 0% -50.72% (p=0.000 n=10+10)
Sign/P521-8 71.0 ± 0% 35.0 ± 0% -50.70% (p=0.000 n=10+10)
Verify/P256-8 23.0 ± 0% 10.0 ± 0% -56.52% (p=0.000 n=10+10)
Verify/P384-8 43.0 ± 0% 14.0 ± 0% -67.44% (p=0.000 n=10+10)
Verify/P521-8 45.0 ± 0% 14.0 ± 0% -68.89% (p=0.000 n=7+10)
GenerateKey/P256-8 13.0 ± 0% 14.0 ± 0% +7.69% (p=0.000 n=10+10)
GenerateKey/P384-8 16.0 ± 0% 17.0 ± 0% +6.25% (p=0.000 n=10+10)
GenerateKey/P521-8 16.5 ± 3% 17.0 ± 0% +3.03% (p=0.033 n=10+10)
Change-Id: I4e074ef039b0f7ffbc436a4cdbe4ef90c647018d
Reviewed-on: https://go-review.googlesource.com/c/go/+/353849
Auto-Submit: Filippo Valsorda <filippo@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Roland Shoemaker <roland@golang.org>
diff --git a/src/crypto/ecdsa/ecdsa.go b/src/crypto/ecdsa/ecdsa.go
index 3d7a6b0..6722a6b 100644
--- a/src/crypto/ecdsa/ecdsa.go
+++ b/src/crypto/ecdsa/ecdsa.go
@@ -20,39 +20,28 @@
// [SEC 1, Version 2.0]: https://www.secg.org/sec1-v2.pdf
import (
+ "bytes"
"crypto"
"crypto/aes"
"crypto/cipher"
"crypto/ecdh"
"crypto/elliptic"
+ "crypto/internal/bigmod"
"crypto/internal/boring"
"crypto/internal/boring/bbig"
+ "crypto/internal/nistec"
"crypto/internal/randutil"
"crypto/sha512"
+ "crypto/subtle"
"errors"
"io"
"math/big"
+ "sync"
"golang.org/x/crypto/cryptobyte"
"golang.org/x/crypto/cryptobyte/asn1"
)
-// A invertible implements fast inverse in GF(N).
-type invertible interface {
- // Inverse returns the inverse of k mod Params().N.
- Inverse(k *big.Int) *big.Int
-}
-
-// A combinedMult implements fast combined multiplication for verification.
-type combinedMult interface {
- // CombinedMult returns [s1]G + [s2]P where G is the generator.
- CombinedMult(Px, Py *big.Int, s1, s2 []byte) (x, y *big.Int)
-}
-
-const (
- aesIV = "IV for ECDSA CTR"
-)
-
// PublicKey represents an ECDSA public key.
type PublicKey struct {
elliptic.Curve
@@ -86,7 +75,7 @@
if !ok {
return false
}
- return pub.X.Cmp(xx.X) == 0 && pub.Y.Cmp(xx.Y) == 0 &&
+ return bigIntEqual(pub.X, xx.X) && bigIntEqual(pub.Y, xx.Y) &&
// Standard library Curve implementations are singletons, so this check
// will work for those. Other Curves might be equivalent even if not
// singletons, but there is no definitive way to check for that, and
@@ -141,7 +130,13 @@
if !ok {
return false
}
- return priv.PublicKey.Equal(&xx.PublicKey) && priv.D.Cmp(xx.D) == 0
+ return priv.PublicKey.Equal(&xx.PublicKey) && bigIntEqual(priv.D, xx.D)
+}
+
+// bigIntEqual reports whether a and b are equal leaking only their bit length
+// through timing side-channels.
+func bigIntEqual(a, b *big.Int) bool {
+ return subtle.ConstantTimeCompare(a.Bytes(), b.Bytes()) == 1
}
// Sign signs digest with priv, reading randomness from rand. The opts argument
@@ -152,51 +147,13 @@
// where the private part is kept in, for example, a hardware module. Common
// uses can use the SignASN1 function in this package directly.
func (priv *PrivateKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
- if boring.Enabled && rand == boring.RandReader {
- b, err := boringPrivateKey(priv)
- if err != nil {
- return nil, err
- }
- return boring.SignMarshalECDSA(b, digest)
- }
- boring.UnreachableExceptTests()
-
- r, s, err := Sign(rand, priv, digest)
- if err != nil {
- return nil, err
- }
-
- var b cryptobyte.Builder
- b.AddASN1(asn1.SEQUENCE, func(b *cryptobyte.Builder) {
- b.AddASN1BigInt(r)
- b.AddASN1BigInt(s)
- })
- return b.Bytes()
-}
-
-var one = new(big.Int).SetInt64(1)
-
-// randFieldElement returns a random element of the order of the given
-// curve using the procedure given in FIPS 186-4, Appendix B.5.1.
-func randFieldElement(c elliptic.Curve, rand io.Reader) (k *big.Int, err error) {
- params := c.Params()
- // Note that for P-521 this will actually be 63 bits more than the order, as
- // division rounds down, but the extra bit is inconsequential.
- b := make([]byte, params.N.BitLen()/8+8)
- _, err = io.ReadFull(rand, b)
- if err != nil {
- return
- }
-
- k = new(big.Int).SetBytes(b)
- n := new(big.Int).Sub(params.N, one)
- k.Mod(k, n)
- k.Add(k, one)
- return
+ return SignASN1(rand, priv, digest)
}
// GenerateKey generates a public and private key pair.
func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) {
+ randutil.MaybeReadByte(rand)
+
if boring.Enabled && rand == boring.RandReader {
x, y, d, err := boring.GenerateKeyECDSA(c.Params().Name)
if err != nil {
@@ -206,80 +163,242 @@
}
boring.UnreachableExceptTests()
- k, err := randFieldElement(c, rand)
+ switch c.Params() {
+ case elliptic.P224().Params():
+ return generateNISTEC(p224(), rand)
+ case elliptic.P256().Params():
+ return generateNISTEC(p256(), rand)
+ case elliptic.P384().Params():
+ return generateNISTEC(p384(), rand)
+ case elliptic.P521().Params():
+ return generateNISTEC(p521(), rand)
+ default:
+ return generateLegacy(c, rand)
+ }
+}
+
+func generateNISTEC[Point nistPoint[Point]](c *nistCurve[Point], rand io.Reader) (*PrivateKey, error) {
+ k, Q, err := randomPoint(c, rand)
if err != nil {
return nil, err
}
priv := new(PrivateKey)
- priv.PublicKey.Curve = c
- priv.D = k
- priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes())
+ priv.PublicKey.Curve = c.curve
+ priv.D = new(big.Int).SetBytes(k.Bytes(c.N))
+ priv.PublicKey.X, priv.PublicKey.Y, err = c.pointToAffine(Q)
+ if err != nil {
+ return nil, err
+ }
return priv, nil
}
-// hashToInt converts a hash value to an integer. Per FIPS 186-4, Section 6.4,
-// we use the left-most bits of the hash to match the bit-length of the order of
-// the curve. This also performs Step 5 of SEC 1, Version 2.0, Section 4.1.3.
-func hashToInt(hash []byte, c elliptic.Curve) *big.Int {
- orderBits := c.Params().N.BitLen()
- orderBytes := (orderBits + 7) / 8
- if len(hash) > orderBytes {
- hash = hash[:orderBytes]
+// randomPoint returns a random scalar and the corresponding point using the
+// procedure given in FIPS 186-4, Appendix B.5.2 (rejection sampling).
+func randomPoint[Point nistPoint[Point]](c *nistCurve[Point], rand io.Reader) (k *bigmod.Nat, p Point, err error) {
+ k = bigmod.NewNat()
+ for {
+ b := make([]byte, c.N.Size())
+ if _, err = io.ReadFull(rand, b); err != nil {
+ return
+ }
+
+ // Mask off any excess bits to increase the chance of hitting a value in
+ // (0, N). These are the most dangerous lines in the package and maybe in
+ // the library: a single bit of bias in the selection of nonces would likely
+ // lead to key recovery, but no tests would fail. Look but DO NOT TOUCH.
+ if excess := len(b)*8 - c.N.BitLen(); excess > 0 {
+ // Just to be safe, assert that this only happens for the one curve that
+ // doesn't have a round number of bits.
+ if excess != 0 && c.curve.Params().Name != "P-521" {
+ panic("ecdsa: internal error: unexpectedly masking off bits")
+ }
+ b[0] >>= excess
+ }
+
+ // FIPS 186-4 makes us check k <= N - 2 and then add one.
+ // Checking 0 < k <= N - 1 is strictly equivalent.
+ // None of this matters anyway because the chance of selecting
+ // zero is cryptographically negligible.
+ if _, err = k.SetBytes(b, c.N); err == nil && k.IsZero() == 0 {
+ break
+ }
+
+ if testingOnlyRejectionSamplingLooped != nil {
+ testingOnlyRejectionSamplingLooped()
+ }
}
- ret := new(big.Int).SetBytes(hash)
- excess := len(hash)*8 - orderBits
- if excess > 0 {
- ret.Rsh(ret, uint(excess))
- }
- return ret
+ p, err = c.newPoint().ScalarBaseMult(k.Bytes(c.N))
+ return
}
-// fermatInverse calculates the inverse of k in GF(P) using Fermat's method
-// (exponentiation modulo P - 2, per Euler's theorem). This has better
-// constant-time properties than Euclid's method (implemented in
-// math/big.Int.ModInverse and FIPS 186-4, Appendix C.1) although math/big
-// itself isn't strictly constant-time so it's not perfect.
-func fermatInverse(k, N *big.Int) *big.Int {
- two := big.NewInt(2)
- nMinus2 := new(big.Int).Sub(N, two)
- return new(big.Int).Exp(k, nMinus2, N)
-}
+// testingOnlyRejectionSamplingLooped is called when rejection sampling in
+// randomPoint rejects a candidate for being higher than the modulus.
+var testingOnlyRejectionSamplingLooped func()
-var errZeroParam = errors.New("zero parameter")
+// errNoAsm is returned by signAsm and verifyAsm when the assembly
+// implementation is not available.
+var errNoAsm = errors.New("no assembly implementation available")
-// Sign signs a hash (which should be the result of hashing a larger message)
+// SignASN1 signs a hash (which should be the result of hashing a larger message)
// using the private key, priv. If the hash is longer than the bit-length of the
// private key's curve order, the hash will be truncated to that length. It
-// returns the signature as a pair of integers. Most applications should use
-// SignASN1 instead of dealing directly with r, s.
-func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) {
+// returns the ASN.1 encoded signature.
+func SignASN1(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error) {
randutil.MaybeReadByte(rand)
if boring.Enabled && rand == boring.RandReader {
b, err := boringPrivateKey(priv)
if err != nil {
- return nil, nil, err
+ return nil, err
}
- sig, err := boring.SignMarshalECDSA(b, hash)
- if err != nil {
- return nil, nil, err
- }
- var r, s big.Int
- var inner cryptobyte.String
- input := cryptobyte.String(sig)
- if !input.ReadASN1(&inner, asn1.SEQUENCE) ||
- !input.Empty() ||
- !inner.ReadASN1Integer(&r) ||
- !inner.ReadASN1Integer(&s) ||
- !inner.Empty() {
- return nil, nil, errors.New("invalid ASN.1 from boringcrypto")
- }
- return &r, &s, nil
+ return boring.SignMarshalECDSA(b, hash)
}
boring.UnreachableExceptTests()
+ csprng, err := mixedCSPRNG(rand, priv, hash)
+ if err != nil {
+ return nil, err
+ }
+
+ if sig, err := signAsm(priv, csprng, hash); err != errNoAsm {
+ return sig, err
+ }
+
+ switch priv.Curve.Params() {
+ case elliptic.P224().Params():
+ return signNISTEC(p224(), priv, csprng, hash)
+ case elliptic.P256().Params():
+ return signNISTEC(p256(), priv, csprng, hash)
+ case elliptic.P384().Params():
+ return signNISTEC(p384(), priv, csprng, hash)
+ case elliptic.P521().Params():
+ return signNISTEC(p521(), priv, csprng, hash)
+ default:
+ return signLegacy(priv, csprng, hash)
+ }
+}
+
+func signNISTEC[Point nistPoint[Point]](c *nistCurve[Point], priv *PrivateKey, csprng io.Reader, hash []byte) (sig []byte, err error) {
+ // SEC 1, Version 2.0, Section 4.1.3
+
+ k, R, err := randomPoint(c, csprng)
+ if err != nil {
+ return nil, err
+ }
+
+ // kInv = k⁻¹
+ kInv := bigmod.NewNat()
+ inverse(c, kInv, k)
+
+ Rx, err := R.BytesX()
+ if err != nil {
+ return nil, err
+ }
+ r, err := bigmod.NewNat().SetOverflowingBytes(Rx, c.N)
+ if err != nil {
+ return nil, err
+ }
+
+ // The spec wants us to retry here, but the chance of hitting this condition
+ // on a large prime-order group like the NIST curves we support is
+ // cryptographically negligible. If we hit it, something is awfully wrong.
+ if r.IsZero() == 1 {
+ return nil, errors.New("ecdsa: internal error: r is zero")
+ }
+
+ e := bigmod.NewNat()
+ hashToNat(c, e, hash)
+
+ s, err := bigmod.NewNat().SetBytes(priv.D.Bytes(), c.N)
+ if err != nil {
+ return nil, err
+ }
+ s.Mul(r, c.N)
+ s.Add(e, c.N)
+ s.Mul(kInv, c.N)
+
+ // Again, the chance of this happening is cryptographically negligible.
+ if s.IsZero() == 1 {
+ return nil, errors.New("ecdsa: internal error: s is zero")
+ }
+
+ return encodeSignature(r.Bytes(c.N), s.Bytes(c.N))
+}
+
+func encodeSignature(r, s []byte) ([]byte, error) {
+ var b cryptobyte.Builder
+ b.AddASN1(asn1.SEQUENCE, func(b *cryptobyte.Builder) {
+ addASN1IntBytes(b, r)
+ addASN1IntBytes(b, s)
+ })
+ return b.Bytes()
+}
+
+// addASN1IntBytes encodes in ASN.1 a positive integer represented as
+// a big-endian byte slice with zero or more leading zeroes.
+func addASN1IntBytes(b *cryptobyte.Builder, bytes []byte) {
+ for len(bytes) > 1 && bytes[0] == 0 {
+ bytes = bytes[1:]
+ }
+ b.AddASN1(asn1.INTEGER, func(c *cryptobyte.Builder) {
+ if bytes[0]&0x80 != 0 {
+ c.AddUint8(0)
+ }
+ c.AddBytes(bytes)
+ })
+}
+
+// inverse sets kInv to the inverse of k modulo the order of the curve.
+func inverse[Point nistPoint[Point]](c *nistCurve[Point], kInv, k *bigmod.Nat) {
+ if c.curve.Params().Name == "P-256" {
+ kBytes, err := nistec.P256OrdInverse(k.Bytes(c.N))
+ // Some platforms don't implement P256OrdInverse, and always return an error.
+ if err == nil {
+ _, err := kInv.SetBytes(kBytes, c.N)
+ if err != nil {
+ panic("ecdsa: internal error: P256OrdInverse produced an invalid value")
+ }
+ return
+ }
+ }
+
+ // Calculate the inverse of s in GF(N) using Fermat's method
+ // (exponentiation modulo P - 2, per Euler's theorem)
+ kInv.Exp(k, c.nMinus2, c.N)
+}
+
+// hashToNat sets e to the left-most bits of hash, according to
+// SEC 1, Section 4.1.3, point 5 and Section 4.1.4, point 3.
+func hashToNat[Point nistPoint[Point]](c *nistCurve[Point], e *bigmod.Nat, hash []byte) {
+ // ECDSA asks us to take the left-most log2(N) bits of hash, and use them as
+ // an integer modulo N. This is the absolute worst of all worlds: we still
+ // have to reduce, because the result might still overflow N, but to take
+ // the left-most bits for P-521 we have to do a right shift.
+ if size := c.N.Size(); len(hash) > size {
+ hash = hash[:size]
+ if excess := len(hash)*8 - c.N.BitLen(); excess > 0 {
+ hash = bytes.Clone(hash)
+ for i := len(hash) - 1; i >= 0; i-- {
+ hash[i] >>= excess
+ if i > 0 {
+ hash[i] |= hash[i-1] << (8 - excess)
+ }
+ }
+ }
+ }
+ _, err := e.SetOverflowingBytes(hash, c.N)
+ if err != nil {
+ panic("ecdsa: internal error: truncated hash is too long")
+ }
+}
+
+// mixedCSPRNG returns a CSPRNG that mixes entropy from rand with the message
+// and the private key, to protect the key in case rand fails. This is
+// equivalent in security to RFC 6979 deterministic nonce generation, but still
+// produces randomized signatures.
+func mixedCSPRNG(rand io.Reader, priv *PrivateKey, hash []byte) (io.Reader, error) {
// This implementation derives the nonce from an AES-CTR CSPRNG keyed by:
//
// SHA2-512(priv.D || entropy || hash)[:32]
@@ -293,9 +412,8 @@
// Get 256 bits of entropy from rand.
entropy := make([]byte, 32)
- _, err = io.ReadFull(rand, entropy)
- if err != nil {
- return
+ if _, err := io.ReadFull(rand, entropy); err != nil {
+ return nil, err
}
// Initialize an SHA-512 hash context; digest...
@@ -309,156 +427,22 @@
// Create an AES-CTR instance to use as a CSPRNG.
block, err := aes.NewCipher(key)
if err != nil {
- return nil, nil, err
+ return nil, err
}
// Create a CSPRNG that xors a stream of zeros with
// the output of the AES-CTR instance.
- csprng := &cipher.StreamReader{
+ const aesIV = "IV for ECDSA CTR"
+ return &cipher.StreamReader{
R: zeroReader,
S: cipher.NewCTR(block, []byte(aesIV)),
- }
-
- c := priv.PublicKey.Curve
- return sign(priv, csprng, c, hash)
-}
-
-func signGeneric(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, hash []byte) (r, s *big.Int, err error) {
- // SEC 1, Version 2.0, Section 4.1.3
- N := c.Params().N
- if N.Sign() == 0 {
- return nil, nil, errZeroParam
- }
- var k, kInv *big.Int
- for {
- for {
- k, err = randFieldElement(c, *csprng)
- if err != nil {
- r = nil
- return
- }
-
- if in, ok := priv.Curve.(invertible); ok {
- kInv = in.Inverse(k)
- } else {
- kInv = fermatInverse(k, N) // N != 0
- }
-
- r, _ = priv.Curve.ScalarBaseMult(k.Bytes())
- r.Mod(r, N)
- if r.Sign() != 0 {
- break
- }
- }
-
- e := hashToInt(hash, c)
- s = new(big.Int).Mul(priv.D, r)
- s.Add(s, e)
- s.Mul(s, kInv)
- s.Mod(s, N) // N != 0
- if s.Sign() != 0 {
- break
- }
- }
-
- return
-}
-
-// SignASN1 signs a hash (which should be the result of hashing a larger message)
-// using the private key, priv. If the hash is longer than the bit-length of the
-// private key's curve order, the hash will be truncated to that length. It
-// returns the ASN.1 encoded signature.
-func SignASN1(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error) {
- return priv.Sign(rand, hash, nil)
-}
-
-// Verify verifies the signature in r, s of hash using the public key, pub. Its
-// return value records whether the signature is valid. Most applications should
-// use VerifyASN1 instead of dealing directly with r, s.
-func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {
- if boring.Enabled {
- key, err := boringPublicKey(pub)
- if err != nil {
- return false
- }
- var b cryptobyte.Builder
- b.AddASN1(asn1.SEQUENCE, func(b *cryptobyte.Builder) {
- b.AddASN1BigInt(r)
- b.AddASN1BigInt(s)
- })
- sig, err := b.Bytes()
- if err != nil {
- return false
- }
- return boring.VerifyECDSA(key, hash, sig)
- }
- boring.UnreachableExceptTests()
-
- c := pub.Curve
- N := c.Params().N
-
- if r.Sign() <= 0 || s.Sign() <= 0 {
- return false
- }
- if r.Cmp(N) >= 0 || s.Cmp(N) >= 0 {
- return false
- }
- return verify(pub, c, hash, r, s)
-}
-
-func verifyGeneric(pub *PublicKey, c elliptic.Curve, hash []byte, r, s *big.Int) bool {
- // SEC 1, Version 2.0, Section 4.1.4
- e := hashToInt(hash, c)
- var w *big.Int
- N := c.Params().N
- if in, ok := c.(invertible); ok {
- w = in.Inverse(s)
- } else {
- w = new(big.Int).ModInverse(s, N)
- }
-
- u1 := e.Mul(e, w)
- u1.Mod(u1, N)
- u2 := w.Mul(r, w)
- u2.Mod(u2, N)
-
- // Check if implements S1*g + S2*p
- var x, y *big.Int
- if opt, ok := c.(combinedMult); ok {
- x, y = opt.CombinedMult(pub.X, pub.Y, u1.Bytes(), u2.Bytes())
- } else {
- x1, y1 := c.ScalarBaseMult(u1.Bytes())
- x2, y2 := c.ScalarMult(pub.X, pub.Y, u2.Bytes())
- x, y = c.Add(x1, y1, x2, y2)
- }
-
- if x.Sign() == 0 && y.Sign() == 0 {
- return false
- }
- x.Mod(x, N)
- return x.Cmp(r) == 0
-}
-
-// VerifyASN1 verifies the ASN.1 encoded signature, sig, of hash using the
-// public key, pub. Its return value records whether the signature is valid.
-func VerifyASN1(pub *PublicKey, hash, sig []byte) bool {
- var (
- r, s = &big.Int{}, &big.Int{}
- inner cryptobyte.String
- )
- input := cryptobyte.String(sig)
- if !input.ReadASN1(&inner, asn1.SEQUENCE) ||
- !input.Empty() ||
- !inner.ReadASN1Integer(r) ||
- !inner.ReadASN1Integer(s) ||
- !inner.Empty() {
- return false
- }
- return Verify(pub, hash, r, s)
+ }, nil
}
type zr struct{}
+var zeroReader = zr{}
+
// Read replaces the contents of dst with zeros. It is safe for concurrent use.
func (zr) Read(dst []byte) (n int, err error) {
for i := range dst {
@@ -467,4 +451,206 @@
return len(dst), nil
}
-var zeroReader = zr{}
+// VerifyASN1 verifies the ASN.1 encoded signature, sig, of hash using the
+// public key, pub. Its return value records whether the signature is valid.
+func VerifyASN1(pub *PublicKey, hash, sig []byte) bool {
+ if boring.Enabled {
+ key, err := boringPublicKey(pub)
+ if err != nil {
+ return false
+ }
+ return boring.VerifyECDSA(key, hash, sig)
+ }
+ boring.UnreachableExceptTests()
+
+ if err := verifyAsm(pub, hash, sig); err != errNoAsm {
+ return err == nil
+ }
+
+ switch pub.Curve.Params() {
+ case elliptic.P224().Params():
+ return verifyNISTEC(p224(), pub, hash, sig)
+ case elliptic.P256().Params():
+ return verifyNISTEC(p256(), pub, hash, sig)
+ case elliptic.P384().Params():
+ return verifyNISTEC(p384(), pub, hash, sig)
+ case elliptic.P521().Params():
+ return verifyNISTEC(p521(), pub, hash, sig)
+ default:
+ return verifyLegacy(pub, hash, sig)
+ }
+}
+
+func verifyNISTEC[Point nistPoint[Point]](c *nistCurve[Point], pub *PublicKey, hash, sig []byte) bool {
+ rBytes, sBytes, err := parseSignature(sig)
+ if err != nil {
+ return false
+ }
+
+ Q, err := c.pointFromAffine(pub.X, pub.Y)
+ if err != nil {
+ return false
+ }
+
+ // SEC 1, Version 2.0, Section 4.1.4
+
+ r, err := bigmod.NewNat().SetBytes(rBytes, c.N)
+ if err != nil || r.IsZero() == 1 {
+ return false
+ }
+ s, err := bigmod.NewNat().SetBytes(sBytes, c.N)
+ if err != nil || s.IsZero() == 1 {
+ return false
+ }
+
+ e := bigmod.NewNat()
+ hashToNat(c, e, hash)
+
+ // w = s⁻¹
+ w := bigmod.NewNat()
+ inverse(c, w, s)
+
+ // p₁ = [e * s⁻¹]G
+ p1, err := c.newPoint().ScalarBaseMult(e.Mul(w, c.N).Bytes(c.N))
+ if err != nil {
+ return false
+ }
+ // p₂ = [r * s⁻¹]Q
+ p2, err := Q.ScalarMult(Q, w.Mul(r, c.N).Bytes(c.N))
+ if err != nil {
+ return false
+ }
+ // BytesX returns an error for the point at infinity.
+ Rx, err := p1.Add(p1, p2).BytesX()
+ if err != nil {
+ return false
+ }
+
+ v, err := bigmod.NewNat().SetOverflowingBytes(Rx, c.N)
+ if err != nil {
+ return false
+ }
+
+ return v.Equal(r) == 1
+}
+
+func parseSignature(sig []byte) (r, s []byte, err error) {
+ var inner cryptobyte.String
+ input := cryptobyte.String(sig)
+ if !input.ReadASN1(&inner, asn1.SEQUENCE) ||
+ !input.Empty() ||
+ !inner.ReadASN1Integer(&r) ||
+ !inner.ReadASN1Integer(&s) ||
+ !inner.Empty() {
+ return nil, nil, errors.New("invalid ASN.1")
+ }
+ return r, s, nil
+}
+
+type nistCurve[Point nistPoint[Point]] struct {
+ newPoint func() Point
+ curve elliptic.Curve
+ N *bigmod.Modulus
+ nMinus2 []byte
+}
+
+// nistPoint is a generic constraint for the nistec Point types.
+type nistPoint[T any] interface {
+ Bytes() []byte
+ BytesX() ([]byte, error)
+ SetBytes([]byte) (T, error)
+ Add(T, T) T
+ ScalarMult(T, []byte) (T, error)
+ ScalarBaseMult([]byte) (T, error)
+}
+
+// pointFromAffine is used to convert the PublicKey to a nistec Point.
+func (curve *nistCurve[Point]) pointFromAffine(x, y *big.Int) (p Point, err error) {
+ bitSize := curve.curve.Params().BitSize
+ // Reject values that would not get correctly encoded.
+ if x.Sign() < 0 || y.Sign() < 0 {
+ return p, errors.New("negative coordinate")
+ }
+ if x.BitLen() > bitSize || y.BitLen() > bitSize {
+ return p, errors.New("overflowing coordinate")
+ }
+ // Encode the coordinates and let SetBytes reject invalid points.
+ byteLen := (bitSize + 7) / 8
+ buf := make([]byte, 1+2*byteLen)
+ buf[0] = 4 // uncompressed point
+ x.FillBytes(buf[1 : 1+byteLen])
+ y.FillBytes(buf[1+byteLen : 1+2*byteLen])
+ return curve.newPoint().SetBytes(buf)
+}
+
+// pointToAffine is used to convert a nistec Point to a PublicKey.
+func (curve *nistCurve[Point]) pointToAffine(p Point) (x, y *big.Int, err error) {
+ out := p.Bytes()
+ if len(out) == 1 && out[0] == 0 {
+ // This is the encoding of the point at infinity.
+ return nil, nil, errors.New("ecdsa: public key point is the infinity")
+ }
+ byteLen := (curve.curve.Params().BitSize + 7) / 8
+ x = new(big.Int).SetBytes(out[1 : 1+byteLen])
+ y = new(big.Int).SetBytes(out[1+byteLen:])
+ return x, y, nil
+}
+
+var p224Once sync.Once
+var _p224 *nistCurve[*nistec.P224Point]
+
+func p224() *nistCurve[*nistec.P224Point] {
+ p224Once.Do(func() {
+ _p224 = &nistCurve[*nistec.P224Point]{
+ newPoint: func() *nistec.P224Point { return nistec.NewP224Point() },
+ }
+ precomputeParams(_p224, elliptic.P224())
+ })
+ return _p224
+}
+
+var p256Once sync.Once
+var _p256 *nistCurve[*nistec.P256Point]
+
+func p256() *nistCurve[*nistec.P256Point] {
+ p256Once.Do(func() {
+ _p256 = &nistCurve[*nistec.P256Point]{
+ newPoint: func() *nistec.P256Point { return nistec.NewP256Point() },
+ }
+ precomputeParams(_p256, elliptic.P256())
+ })
+ return _p256
+}
+
+var p384Once sync.Once
+var _p384 *nistCurve[*nistec.P384Point]
+
+func p384() *nistCurve[*nistec.P384Point] {
+ p384Once.Do(func() {
+ _p384 = &nistCurve[*nistec.P384Point]{
+ newPoint: func() *nistec.P384Point { return nistec.NewP384Point() },
+ }
+ precomputeParams(_p384, elliptic.P384())
+ })
+ return _p384
+}
+
+var p521Once sync.Once
+var _p521 *nistCurve[*nistec.P521Point]
+
+func p521() *nistCurve[*nistec.P521Point] {
+ p521Once.Do(func() {
+ _p521 = &nistCurve[*nistec.P521Point]{
+ newPoint: func() *nistec.P521Point { return nistec.NewP521Point() },
+ }
+ precomputeParams(_p521, elliptic.P521())
+ })
+ return _p521
+}
+
+func precomputeParams[Point nistPoint[Point]](c *nistCurve[Point], curve elliptic.Curve) {
+ params := curve.Params()
+ c.curve = curve
+ c.N = bigmod.NewModulusFromBig(params.N)
+ c.nMinus2 = new(big.Int).Sub(params.N, big.NewInt(2)).Bytes()
+}
diff --git a/src/crypto/ecdsa/ecdsa_legacy.go b/src/crypto/ecdsa/ecdsa_legacy.go
new file mode 100644
index 0000000..4ae0b41
--- /dev/null
+++ b/src/crypto/ecdsa/ecdsa_legacy.go
@@ -0,0 +1,185 @@
+// Copyright 2022 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 ecdsa
+
+import (
+ "crypto/elliptic"
+ "errors"
+ "io"
+ "math/big"
+
+ "golang.org/x/crypto/cryptobyte"
+ "golang.org/x/crypto/cryptobyte/asn1"
+)
+
+// This file contains a math/big implementation of ECDSA that is only used for
+// deprecated custom curves.
+
+func generateLegacy(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) {
+ k, err := randFieldElement(c, rand)
+ if err != nil {
+ return nil, err
+ }
+
+ priv := new(PrivateKey)
+ priv.PublicKey.Curve = c
+ priv.D = k
+ priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes())
+ return priv, nil
+}
+
+// hashToInt converts a hash value to an integer. Per FIPS 186-4, Section 6.4,
+// we use the left-most bits of the hash to match the bit-length of the order of
+// the curve. This also performs Step 5 of SEC 1, Version 2.0, Section 4.1.3.
+func hashToInt(hash []byte, c elliptic.Curve) *big.Int {
+ orderBits := c.Params().N.BitLen()
+ orderBytes := (orderBits + 7) / 8
+ if len(hash) > orderBytes {
+ hash = hash[:orderBytes]
+ }
+
+ ret := new(big.Int).SetBytes(hash)
+ excess := len(hash)*8 - orderBits
+ if excess > 0 {
+ ret.Rsh(ret, uint(excess))
+ }
+ return ret
+}
+
+var errZeroParam = errors.New("zero parameter")
+
+// Sign signs a hash (which should be the result of hashing a larger message)
+// using the private key, priv. If the hash is longer than the bit-length of the
+// private key's curve order, the hash will be truncated to that length. It
+// returns the signature as a pair of integers. Most applications should use
+// SignASN1 instead of dealing directly with r, s.
+func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) {
+ sig, err := SignASN1(rand, priv, hash)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ r, s = new(big.Int), new(big.Int)
+ var inner cryptobyte.String
+ input := cryptobyte.String(sig)
+ if !input.ReadASN1(&inner, asn1.SEQUENCE) ||
+ !input.Empty() ||
+ !inner.ReadASN1Integer(r) ||
+ !inner.ReadASN1Integer(s) ||
+ !inner.Empty() {
+ return nil, nil, errors.New("invalid ASN.1 from SignASN1")
+ }
+ return r, s, nil
+}
+
+func signLegacy(priv *PrivateKey, csprng io.Reader, hash []byte) (sig []byte, err error) {
+ c := priv.Curve
+
+ // SEC 1, Version 2.0, Section 4.1.3
+ N := c.Params().N
+ if N.Sign() == 0 {
+ return nil, errZeroParam
+ }
+ var k, kInv, r, s *big.Int
+ for {
+ for {
+ k, err = randFieldElement(c, csprng)
+ if err != nil {
+ return nil, err
+ }
+
+ kInv = new(big.Int).ModInverse(k, N)
+
+ r, _ = c.ScalarBaseMult(k.Bytes())
+ r.Mod(r, N)
+ if r.Sign() != 0 {
+ break
+ }
+ }
+
+ e := hashToInt(hash, c)
+ s = new(big.Int).Mul(priv.D, r)
+ s.Add(s, e)
+ s.Mul(s, kInv)
+ s.Mod(s, N) // N != 0
+ if s.Sign() != 0 {
+ break
+ }
+ }
+
+ return encodeSignature(r.Bytes(), s.Bytes())
+}
+
+// Verify verifies the signature in r, s of hash using the public key, pub. Its
+// return value records whether the signature is valid. Most applications should
+// use VerifyASN1 instead of dealing directly with r, s.
+func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {
+ sig, err := encodeSignature(r.Bytes(), s.Bytes())
+ if err != nil {
+ return false
+ }
+ return VerifyASN1(pub, hash, sig)
+}
+
+func verifyLegacy(pub *PublicKey, hash []byte, sig []byte) bool {
+ rBytes, sBytes, err := parseSignature(sig)
+ if err != nil {
+ return false
+ }
+ r, s := new(big.Int).SetBytes(rBytes), new(big.Int).SetBytes(sBytes)
+
+ c := pub.Curve
+ N := c.Params().N
+
+ if r.Sign() <= 0 || s.Sign() <= 0 {
+ return false
+ }
+ if r.Cmp(N) >= 0 || s.Cmp(N) >= 0 {
+ return false
+ }
+
+ // SEC 1, Version 2.0, Section 4.1.4
+ e := hashToInt(hash, c)
+ w := new(big.Int).ModInverse(s, N)
+
+ u1 := e.Mul(e, w)
+ u1.Mod(u1, N)
+ u2 := w.Mul(r, w)
+ u2.Mod(u2, N)
+
+ x1, y1 := c.ScalarBaseMult(u1.Bytes())
+ x2, y2 := c.ScalarMult(pub.X, pub.Y, u2.Bytes())
+ x, y := c.Add(x1, y1, x2, y2)
+
+ if x.Sign() == 0 && y.Sign() == 0 {
+ return false
+ }
+ x.Mod(x, N)
+ return x.Cmp(r) == 0
+}
+
+var one = new(big.Int).SetInt64(1)
+
+// randFieldElement returns a random element of the order of the given
+// curve using the procedure given in FIPS 186-4, Appendix B.5.2.
+func randFieldElement(c elliptic.Curve, rand io.Reader) (k *big.Int, err error) {
+ // See randomPoint for notes on the algorithm. This has to match, or s390x
+ // signatures will come out different from other architectures, which will
+ // break TLS recorded tests.
+ for {
+ N := c.Params().N
+ b := make([]byte, (N.BitLen()+7)/8)
+ if _, err = io.ReadFull(rand, b); err != nil {
+ return
+ }
+ if excess := len(b)*8 - N.BitLen(); excess > 0 {
+ b[0] >>= excess
+ }
+ k = new(big.Int).SetBytes(b)
+ if k.Sign() != 0 && k.Cmp(N) < 0 {
+ return
+ }
+ }
+}
diff --git a/src/crypto/ecdsa/ecdsa_noasm.go b/src/crypto/ecdsa/ecdsa_noasm.go
index 7fbca10b..a72aa4b 100644
--- a/src/crypto/ecdsa/ecdsa_noasm.go
+++ b/src/crypto/ecdsa/ecdsa_noasm.go
@@ -6,16 +6,12 @@
package ecdsa
-import (
- "crypto/cipher"
- "crypto/elliptic"
- "math/big"
-)
+import "io"
-func sign(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, hash []byte) (r, s *big.Int, err error) {
- return signGeneric(priv, csprng, c, hash)
+func verifyAsm(pub *PublicKey, hash []byte, sig []byte) error {
+ return errNoAsm
}
-func verify(pub *PublicKey, c elliptic.Curve, hash []byte, r, s *big.Int) bool {
- return verifyGeneric(pub, c, hash, r, s)
+func signAsm(priv *PrivateKey, csprng io.Reader, hash []byte) (sig []byte, err error) {
+ return nil, errNoAsm
}
diff --git a/src/crypto/ecdsa/ecdsa_s390x.go b/src/crypto/ecdsa/ecdsa_s390x.go
index bd92579..49f645a 100644
--- a/src/crypto/ecdsa/ecdsa_s390x.go
+++ b/src/crypto/ecdsa/ecdsa_s390x.go
@@ -5,9 +5,10 @@
package ecdsa
import (
- "crypto/cipher"
"crypto/elliptic"
+ "errors"
"internal/cpu"
+ "io"
"math/big"
)
@@ -69,67 +70,20 @@
hashToInt(hash, c).FillBytes(dst)
}
-func sign(priv *PrivateKey, csprng *cipher.StreamReader, c elliptic.Curve, hash []byte) (r, s *big.Int, err error) {
- if functionCode, blockSize, ok := canUseKDSA(c); ok {
- for {
- var k *big.Int
- k, err = randFieldElement(c, *csprng)
- if err != nil {
- return nil, nil, err
- }
-
- // The parameter block looks like the following for sign.
- // +---------------------+
- // | Signature(R) |
- // +---------------------+
- // | Signature(S) |
- // +---------------------+
- // | Hashed Message |
- // +---------------------+
- // | Private Key |
- // +---------------------+
- // | Random Number |
- // +---------------------+
- // | |
- // | ... |
- // | |
- // +---------------------+
- // The common components(signatureR, signatureS, hashedMessage, privateKey and
- // random number) each takes block size of bytes. The block size is different for
- // different curves and is set by canUseKDSA function.
- var params [4096]byte
-
- // Copy content into the parameter block. In the sign case,
- // we copy hashed message, private key and random number into
- // the parameter block.
- hashToBytes(params[2*blockSize:3*blockSize], hash, c)
- priv.D.FillBytes(params[3*blockSize : 4*blockSize])
- k.FillBytes(params[4*blockSize : 5*blockSize])
- // Convert verify function code into a sign function code by adding 8.
- // We also need to set the 'deterministic' bit in the function code, by
- // adding 128, in order to stop the instruction using its own random number
- // generator in addition to the random number we supply.
- switch kdsa(functionCode+136, ¶ms) {
- case 0: // success
- r = new(big.Int)
- r.SetBytes(params[:blockSize])
- s = new(big.Int)
- s.SetBytes(params[blockSize : 2*blockSize])
- return
- case 1: // error
- return nil, nil, errZeroParam
- case 2: // retry
- continue
- }
- panic("unreachable")
- }
+func signAsm(priv *PrivateKey, csprng io.Reader, hash []byte) (sig []byte, err error) {
+ c := priv.Curve
+ functionCode, blockSize, ok := canUseKDSA(c)
+ if !ok {
+ return nil, errNoAsm
}
- return signGeneric(priv, csprng, c, hash)
-}
+ for {
+ var k *big.Int
+ k, err = randFieldElement(c, csprng)
+ if err != nil {
+ return nil, err
+ }
-func verify(pub *PublicKey, c elliptic.Curve, hash []byte, r, s *big.Int) bool {
- if functionCode, blockSize, ok := canUseKDSA(c); ok {
- // The parameter block looks like the following for verify:
+ // The parameter block looks like the following for sign.
// +---------------------+
// | Signature(R) |
// +---------------------+
@@ -137,28 +91,87 @@
// +---------------------+
// | Hashed Message |
// +---------------------+
- // | Public Key X |
+ // | Private Key |
// +---------------------+
- // | Public Key Y |
+ // | Random Number |
// +---------------------+
// | |
// | ... |
// | |
// +---------------------+
- // The common components(signatureR, signatureS, hashed message, public key X,
- // and public key Y) each takes block size of bytes. The block size is different for
+ // The common components(signatureR, signatureS, hashedMessage, privateKey and
+ // random number) each takes block size of bytes. The block size is different for
// different curves and is set by canUseKDSA function.
var params [4096]byte
- // Copy content into the parameter block. In the verify case,
- // we copy signature (r), signature(s), hashed message, public key x component,
- // and public key y component into the parameter block.
- r.FillBytes(params[0*blockSize : 1*blockSize])
- s.FillBytes(params[1*blockSize : 2*blockSize])
+ // Copy content into the parameter block. In the sign case,
+ // we copy hashed message, private key and random number into
+ // the parameter block.
hashToBytes(params[2*blockSize:3*blockSize], hash, c)
- pub.X.FillBytes(params[3*blockSize : 4*blockSize])
- pub.Y.FillBytes(params[4*blockSize : 5*blockSize])
- return kdsa(functionCode, ¶ms) == 0
+ priv.D.FillBytes(params[3*blockSize : 4*blockSize])
+ k.FillBytes(params[4*blockSize : 5*blockSize])
+ // Convert verify function code into a sign function code by adding 8.
+ // We also need to set the 'deterministic' bit in the function code, by
+ // adding 128, in order to stop the instruction using its own random number
+ // generator in addition to the random number we supply.
+ switch kdsa(functionCode+136, ¶ms) {
+ case 0: // success
+ return encodeSignature(params[:blockSize], params[blockSize:2*blockSize])
+ case 1: // error
+ return nil, errZeroParam
+ case 2: // retry
+ continue
+ }
+ panic("unreachable")
}
- return verifyGeneric(pub, c, hash, r, s)
+}
+
+func verifyAsm(pub *PublicKey, hash []byte, sig []byte) error {
+ c := pub.Curve
+ functionCode, blockSize, ok := canUseKDSA(c)
+ if !ok {
+ return errNoAsm
+ }
+
+ r, s, err := parseSignature(sig)
+ if err != nil {
+ return err
+ }
+ if len(r) > blockSize || len(s) > blockSize {
+ return errors.New("invalid signature")
+ }
+
+ // The parameter block looks like the following for verify:
+ // +---------------------+
+ // | Signature(R) |
+ // +---------------------+
+ // | Signature(S) |
+ // +---------------------+
+ // | Hashed Message |
+ // +---------------------+
+ // | Public Key X |
+ // +---------------------+
+ // | Public Key Y |
+ // +---------------------+
+ // | |
+ // | ... |
+ // | |
+ // +---------------------+
+ // The common components(signatureR, signatureS, hashed message, public key X,
+ // and public key Y) each takes block size of bytes. The block size is different for
+ // different curves and is set by canUseKDSA function.
+ var params [4096]byte
+
+ // Copy content into the parameter block. In the verify case,
+ // we copy signature (r), signature(s), hashed message, public key x component,
+ // and public key y component into the parameter block.
+ copy(params[0*blockSize+blockSize-len(r):], r)
+ copy(params[1*blockSize+blockSize-len(s):], s)
+ hashToBytes(params[2*blockSize:3*blockSize], hash, c)
+ pub.X.FillBytes(params[3*blockSize : 4*blockSize])
+ pub.Y.FillBytes(params[4*blockSize : 5*blockSize])
+ if kdsa(functionCode, ¶ms) != 0 {
+ return errors.New("invalid signature")
+ }
+ return nil
}
diff --git a/src/crypto/ecdsa/ecdsa_test.go b/src/crypto/ecdsa/ecdsa_test.go
index 4fd4d87..6ed2f94 100644
--- a/src/crypto/ecdsa/ecdsa_test.go
+++ b/src/crypto/ecdsa/ecdsa_test.go
@@ -6,6 +6,7 @@
import (
"bufio"
+ "bytes"
"compress/bzip2"
"crypto/elliptic"
"crypto/rand"
@@ -30,6 +31,7 @@
{"P224", elliptic.P224()},
{"P384", elliptic.P384()},
{"P521", elliptic.P521()},
+ {"P256/Generic", genericParamsForCurve(elliptic.P256())},
}
if testing.Short() {
tests = tests[:1]
@@ -43,6 +45,15 @@
}
}
+// genericParamsForCurve returns the dereferenced CurveParams for
+// the specified curve. This is used to avoid the logic for
+// upgrading a curve to its specific implementation, forcing
+// usage of the generic implementation.
+func genericParamsForCurve(c elliptic.Curve) *elliptic.CurveParams {
+ d := *(c.Params())
+ return &d
+}
+
func TestKeyGeneration(t *testing.T) {
testAllCurves(t, testKeyGeneration)
}
@@ -327,6 +338,85 @@
}
}
+func TestRandomPoint(t *testing.T) {
+ t.Run("P-224", func(t *testing.T) { testRandomPoint(t, p224()) })
+ t.Run("P-256", func(t *testing.T) { testRandomPoint(t, p256()) })
+ t.Run("P-384", func(t *testing.T) { testRandomPoint(t, p384()) })
+ t.Run("P-521", func(t *testing.T) { testRandomPoint(t, p521()) })
+}
+
+func testRandomPoint[Point nistPoint[Point]](t *testing.T, c *nistCurve[Point]) {
+ t.Cleanup(func() { testingOnlyRejectionSamplingLooped = nil })
+ var loopCount int
+ testingOnlyRejectionSamplingLooped = func() { loopCount++ }
+
+ // A sequence of all ones will generate 2^N-1, which should be rejected.
+ // (Unless, for example, we are masking too many bits.)
+ r := io.MultiReader(bytes.NewReader(bytes.Repeat([]byte{0xff}, 100)), rand.Reader)
+ if k, p, err := randomPoint(c, r); err != nil {
+ t.Fatal(err)
+ } else if k.IsZero() == 1 {
+ t.Error("k is zero")
+ } else if p.Bytes()[0] != 4 {
+ t.Error("p is infinity")
+ }
+ if loopCount == 0 {
+ t.Error("overflow was not rejected")
+ }
+ loopCount = 0
+
+ // A sequence of all zeroes will generate zero, which should be rejected.
+ r = io.MultiReader(bytes.NewReader(bytes.Repeat([]byte{0}, 100)), rand.Reader)
+ if k, p, err := randomPoint(c, r); err != nil {
+ t.Fatal(err)
+ } else if k.IsZero() == 1 {
+ t.Error("k is zero")
+ } else if p.Bytes()[0] != 4 {
+ t.Error("p is infinity")
+ }
+ if loopCount == 0 {
+ t.Error("zero was not rejected")
+ }
+ loopCount = 0
+
+ // P-256 has a 2⁻³² chance or randomly hitting a rejection. For P-224 it's
+ // 2⁻¹¹², for P-384 it's 2⁻¹⁹⁴, and for P-521 it's 2⁻²⁶², so if we hit in
+ // tests, something is horribly wrong. (For example, we are masking the
+ // wrong bits.)
+ if c.curve == elliptic.P256() {
+ return
+ }
+ if k, p, err := randomPoint(c, rand.Reader); err != nil {
+ t.Fatal(err)
+ } else if k.IsZero() == 1 {
+ t.Error("k is zero")
+ } else if p.Bytes()[0] != 4 {
+ t.Error("p is infinity")
+ }
+ if loopCount > 0 {
+ t.Error("unexpected rejection")
+ }
+}
+
+func randomPointForCurve(curve elliptic.Curve, rand io.Reader) error {
+ switch curve.Params() {
+ case elliptic.P224().Params():
+ _, _, err := randomPoint(p224(), rand)
+ return err
+ case elliptic.P256().Params():
+ _, _, err := randomPoint(p256(), rand)
+ return err
+ case elliptic.P384().Params():
+ _, _, err := randomPoint(p384(), rand)
+ return err
+ case elliptic.P521().Params():
+ _, _, err := randomPoint(p521(), rand)
+ return err
+ default:
+ panic("unknown curve")
+ }
+}
+
func benchmarkAllCurves(b *testing.B, f func(*testing.B, elliptic.Curve)) {
tests := []struct {
name string
diff --git a/src/crypto/elliptic/nistec.go b/src/crypto/elliptic/nistec.go
index 9bb4600..d906c57 100644
--- a/src/crypto/elliptic/nistec.go
+++ b/src/crypto/elliptic/nistec.go
@@ -137,11 +137,10 @@
}
func (curve *nistCurve[Point]) pointFromAffine(x, y *big.Int) (p Point, err error) {
- p = curve.newPoint()
// (0, 0) is by convention the point at infinity, which can't be represented
// in affine coordinates. See Issue 37294.
if x.Sign() == 0 && y.Sign() == 0 {
- return p, nil
+ return curve.newPoint(), nil
}
// Reject values that would not get correctly encoded.
if x.Sign() < 0 || y.Sign() < 0 {
@@ -156,7 +155,7 @@
buf[0] = 4 // uncompressed point
x.FillBytes(buf[1 : 1+byteLen])
y.FillBytes(buf[1+byteLen : 1+2*byteLen])
- return p.SetBytes(buf)
+ return curve.newPoint().SetBytes(buf)
}
func (curve *nistCurve[Point]) pointToAffine(p Point) (x, y *big.Int) {
diff --git a/src/crypto/internal/bigmod/nat.go b/src/crypto/internal/bigmod/nat.go
index 679eb34..b9d0975 100644
--- a/src/crypto/internal/bigmod/nat.go
+++ b/src/crypto/internal/bigmod/nat.go
@@ -74,7 +74,7 @@
// common and most performant RSA key size. It's also enough to cover some of
// the operations of key sizes up to 4096.
const preallocTarget = 2048
-const preallocLimbs = (preallocTarget + _W) / _W
+const preallocLimbs = (preallocTarget + _W - 1) / _W
// NewNat returns a new nat with a size of zero, just like new(Nat), but with
// the preallocated capacity to hold a number of up to preallocTarget bits.
@@ -179,10 +179,37 @@
}
// SetBytes assigns x = b, where b is a slice of big-endian bytes.
-// SetBytes returns an error if b > m.
+// SetBytes returns an error if b >= m.
//
// The output will be resized to the size of m and overwritten.
func (x *Nat) SetBytes(b []byte, m *Modulus) (*Nat, error) {
+ if err := x.setBytes(b, m); err != nil {
+ return nil, err
+ }
+ if x.cmpGeq(m.nat) == yes {
+ return nil, errors.New("input overflows the modulus")
+ }
+ return x, nil
+}
+
+// SetOverflowingBytes assigns x = b, where b is a slice of big-endian bytes. SetOverflowingBytes
+// returns an error if b has a longer bit length than m, but reduces overflowing
+// values up to 2^⌈log2(m)⌉ - 1.
+//
+// The output will be resized to the size of m and overwritten.
+func (x *Nat) SetOverflowingBytes(b []byte, m *Modulus) (*Nat, error) {
+ if err := x.setBytes(b, m); err != nil {
+ return nil, err
+ }
+ leading := _W - bitLen(x.limbs[len(x.limbs)-1])
+ if leading < m.leading {
+ return nil, errors.New("input overflows the modulus")
+ }
+ x.sub(x.cmpGeq(m.nat), m.nat)
+ return x, nil
+}
+
+func (x *Nat) setBytes(b []byte, m *Modulus) error {
outI := 0
shift := 0
x.resetFor(m)
@@ -197,17 +224,14 @@
outI++
if outI >= len(x.limbs) {
if overflow > 0 || i > 0 {
- return nil, errors.New("input overflows the modulus")
+ return errors.New("input overflows the modulus")
}
break
}
x.limbs[outI] = uint(overflow)
}
}
- if x.cmpGeq(m.nat) == yes {
- return nil, errors.New("input overflows the modulus")
- }
- return x, nil
+ return nil
}
// Equal returns 1 if x == y, and 0 otherwise.
@@ -226,6 +250,19 @@
return equal
}
+// IsZero returns 1 if x == 0, and 0 otherwise.
+func (x *Nat) IsZero() choice {
+ // Eliminate bounds checks in the loop.
+ size := len(x.limbs)
+ xLimbs := x.limbs[:size]
+
+ zero := yes
+ for i := 0; i < size; i++ {
+ zero &= ctEq(xLimbs[i], 0)
+ }
+ return zero
+}
+
// cmpGeq returns 1 if x >= y, and 0 otherwise.
//
// Both operands must have the same announced length.
@@ -372,8 +409,12 @@
// Size returns the size of m in bytes.
func (m *Modulus) Size() int {
- bits := len(m.nat.limbs)*_W - int(m.leading)
- return (bits + 7) / 8
+ return (m.BitLen() + 7) / 8
+}
+
+// BitLen returns the size of m in bits.
+func (m *Modulus) BitLen() int {
+ return len(m.nat.limbs)*_W - int(m.leading)
}
// Nat returns m as a Nat. The return value must not be written to.
diff --git a/src/crypto/internal/nistec/p256_asm_ordinv.go b/src/crypto/internal/nistec/p256_ordinv.go
similarity index 100%
rename from src/crypto/internal/nistec/p256_asm_ordinv.go
rename to src/crypto/internal/nistec/p256_ordinv.go
diff --git a/src/crypto/internal/nistec/p256_ordinv_noasm.go b/src/crypto/internal/nistec/p256_ordinv_noasm.go
new file mode 100644
index 0000000..213875c
--- /dev/null
+++ b/src/crypto/internal/nistec/p256_ordinv_noasm.go
@@ -0,0 +1,13 @@
+// Copyright 2022 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.
+
+//go:build !amd64 && !arm64
+
+package nistec
+
+import "errors"
+
+func P256OrdInverse(k []byte) ([]byte, error) {
+ return nil, errors.New("unimplemented")
+}
diff --git a/src/crypto/internal/nistec/p256_asm_ordinv_test.go b/src/crypto/internal/nistec/p256_ordinv_test.go
similarity index 100%
rename from src/crypto/internal/nistec/p256_asm_ordinv_test.go
rename to src/crypto/internal/nistec/p256_ordinv_test.go
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
index c7fa530..d93f679 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
@@ -16,11 +16,11 @@
000000e0 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0|
000000f0 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |.........._X.;t|
>>> Flow 2 (server to client)
-00000000 16 03 01 00 59 02 00 00 55 03 01 92 4c b7 e6 07 |....Y...U...L...|
-00000010 09 b4 4a 47 6a 29 c7 79 18 0d 43 37 86 26 21 5a |..JGj).y..C7.&!Z|
-00000020 25 35 db 5f ae d0 20 0d 85 67 f7 20 75 e5 cb 25 |%5._.. ..g. u..%|
-00000030 4b 5d 95 87 78 00 fc 3f 78 26 e8 77 b5 0d d4 0e |K]..x..?x&.w....|
-00000040 54 06 66 b4 14 dc 6b db f2 af f3 2a c0 09 00 00 |T.f...k....*....|
+00000000 16 03 01 00 59 02 00 00 55 03 01 f1 70 ef e1 e5 |....Y...U...p...|
+00000010 96 73 83 d3 e2 b9 53 7e 81 ae 1d 40 24 5a ca f2 |.s....S~...@$Z..|
+00000020 06 b3 b6 01 e4 02 fb 81 bc d9 3d 20 1f 1a f0 b5 |..........= ....|
+00000030 b2 93 42 da 00 4d bf f6 dc 99 54 8d 3b 17 a4 74 |..B..M....T.;..t|
+00000040 ca 93 e1 5c a9 c4 d1 35 af f2 d8 f9 c0 09 00 00 |...\...5........|
00000050 0d ff 01 00 01 00 00 0b 00 04 03 00 01 02 16 03 |................|
00000060 01 02 0e 0b 00 02 0a 00 02 07 00 02 04 30 82 02 |.............0..|
00000070 00 30 82 01 62 02 09 00 b8 bf 2d 47 a0 d2 eb f4 |.0..b.....-G....|
@@ -55,18 +55,18 @@
00000240 13 83 0d 94 06 bb d4 37 7a f6 ec 7a c9 86 2e dd |.......7z..z....|
00000250 d7 11 69 7f 85 7c 56 de fb 31 78 2b e4 c7 78 0d |..i..|V..1x+..x.|
00000260 ae cb be 9e 4e 36 24 31 7b 6a 0f 39 95 12 07 8f |....N6$1{j.9....|
-00000270 2a 16 03 01 00 b5 0c 00 00 b1 03 00 1d 20 d7 b5 |*............ ..|
-00000280 51 8e b5 01 4f 02 2f 43 11 2b de 94 7d 82 e6 49 |Q...O./C.+..}..I|
-00000290 1b a6 ee a0 7f 12 35 a2 3a 62 46 ce 07 25 00 8b |......5.:bF..%..|
-000002a0 30 81 88 02 42 00 83 45 db 03 db b9 74 ce 77 35 |0...B..E....t.w5|
-000002b0 1b e5 76 18 dc 3a d3 ee 32 18 f3 16 a6 c3 62 be |..v..:..2.....b.|
-000002c0 46 47 40 80 2d a0 08 c5 1e 5a 4a 42 69 8c ee e5 |FG@.-....ZJBi...|
-000002d0 70 b5 71 30 2f 54 32 54 5f 5b 26 62 e1 81 52 9e |p.q0/T2T_[&b..R.|
-000002e0 49 70 d4 81 e4 76 f1 02 42 01 70 f6 87 84 bb 58 |Ip...v..B.p....X|
-000002f0 5d e4 a1 72 87 d5 35 53 99 9c 3f 30 2b 80 7e c9 |]..r..5S..?0+.~.|
-00000300 79 eb d8 97 3c 82 ff 37 a5 8d 36 bc 27 c1 51 58 |y...<..7..6.'.QX|
-00000310 e6 2a 48 05 bf 9b a4 a5 b1 7f 77 b8 d9 3e 37 c6 |.*H.......w..>7.|
-00000320 67 ad ef 8c 72 ea f6 ba bb af 00 16 03 01 00 0a |g...r...........|
+00000270 2a 16 03 01 00 b5 0c 00 00 b1 03 00 1d 20 f0 8c |*............ ..|
+00000280 cd 6a c2 7a ea f0 2b 4a 34 6d a9 3b 7a 29 5d 04 |.j.z..+J4m.;z)].|
+00000290 65 70 97 30 e7 10 6e c2 7e 50 c5 89 4a 3f 00 8b |ep.0..n.~P..J?..|
+000002a0 30 81 88 02 42 00 be e2 67 30 f0 8a cb 63 6c 13 |0...B...g0...cl.|
+000002b0 e0 4e 88 52 6e bc e4 83 53 f4 18 75 b7 46 a5 46 |.N.Rn...S..u.F.F|
+000002c0 11 f1 4b f9 bd 58 4e 62 5c fb a8 f2 93 99 3c 94 |..K..XNb\.....<.|
+000002d0 18 1d 7a f1 74 bf 9d c6 fe 65 b1 bc 54 2b c7 ba |..z.t....e..T+..|
+000002e0 f7 45 a8 0a 21 ad 23 02 42 01 c8 fd 48 62 e2 5e |.E..!.#.B...Hb.^|
+000002f0 f1 9c 95 c0 28 c4 c5 04 31 e5 ba a5 3c 09 d9 d7 |....(...1...<...|
+00000300 43 aa 8c 35 26 ed 47 57 6d c6 15 86 50 3c 72 e1 |C..5&.GWm...P<r.|
+00000310 6f 2b 85 63 97 5e 20 58 fc cf 0c f9 37 27 42 fb |o+.c.^ X....7'B.|
+00000320 cd ed c3 40 ac 5f d9 06 5c a3 27 16 03 01 00 0a |...@._..\.'.....|
00000330 0d 00 00 06 03 01 02 40 00 00 16 03 01 00 04 0e |.......@........|
00000340 00 00 00 |...|
>>> Flow 3 (client to server)
@@ -106,29 +106,29 @@
00000210 03 01 00 25 10 00 00 21 20 2f e5 7d a3 47 cd 62 |...%...! /.}.G.b|
00000220 43 15 28 da ac 5f bb 29 07 30 ff f6 84 af c4 cf |C.(.._.).0......|
00000230 c2 ed 90 99 5f 58 cb 3b 74 16 03 01 00 91 0f 00 |...._X.;t.......|
-00000240 00 8d 00 8b 30 81 88 02 42 01 f0 c3 b2 6e e2 a3 |....0...B....n..|
-00000250 cd 76 02 7a d5 b5 66 fa b6 66 4e 4b a0 17 d6 bd |.v.z..f..fNK....|
-00000260 ec f6 8c 1f f9 b4 32 18 a9 ba 66 a8 67 a4 fa c8 |......2...f.g...|
-00000270 f7 73 5f 22 fb f2 22 e2 4d a1 f6 30 a2 55 76 51 |.s_"..".M..0.UvQ|
-00000280 b7 61 7d 13 68 0a 89 9d 34 31 46 02 42 01 fa 8b |.a}.h...41F.B...|
-00000290 61 f6 91 8e 88 ca 84 e6 33 e0 da 92 7e ee 21 1c |a.......3...~.!.|
-000002a0 df 47 c2 5d 07 d8 ae 1b 04 58 f9 50 16 13 74 ea |.G.].....X.P..t.|
-000002b0 04 cc 18 2d 2b 9a 08 89 24 e8 b8 01 bb c6 84 6c |...-+...$......l|
-000002c0 e6 9a c6 8a 44 74 1c 3a 79 0c e9 3c 11 ba 1b 14 |....Dt.:y..<....|
-000002d0 03 01 00 01 01 16 03 01 00 30 1d 4b df 00 de 1c |.........0.K....|
-000002e0 b5 30 7b ea 64 a0 09 89 8c c5 be fc 9b 07 7e 45 |.0{.d.........~E|
-000002f0 27 00 e7 78 da 3e a3 04 97 87 b0 c2 17 32 01 91 |'..x.>.......2..|
-00000300 6e 66 7b dd 9e 28 bc cc 66 65 |nf{..(..fe|
+00000240 00 8d 00 8b 30 81 88 02 42 01 4c 44 9a a6 7e 6e |....0...B.LD..~n|
+00000250 8a f0 40 c0 63 cf 50 4d 1c 36 55 c2 ae 89 19 5a |..@.c.PM.6U....Z|
+00000260 3f ef 2b 2e 0d 66 4f fe c2 cb 17 86 7c a1 2c e9 |?.+..fO.....|.,.|
+00000270 d8 44 b6 45 36 cc 3a 29 74 19 3c 98 c1 f6 8f 9c |.D.E6.:)t.<.....|
+00000280 bb 29 fa ae d5 73 de c8 b3 27 7f 02 42 01 86 c9 |.)...s...'..B...|
+00000290 9d e6 1d 45 8b 35 7d ee 7d de ce 4b 15 40 1e 26 |...E.5}.}..K.@.&|
+000002a0 95 eb 8e b2 6d ac a3 52 b3 fe bc 9d 2b 61 1a 41 |....m..R....+a.A|
+000002b0 5c b5 e5 c0 df 3f 5b 84 4b d6 b2 c5 3a 15 05 0d |\....?[.K...:...|
+000002c0 3f 0a 6e d7 8d 49 35 50 67 3e 6e c5 a7 ba 84 14 |?.n..I5Pg>n.....|
+000002d0 03 01 00 01 01 16 03 01 00 30 91 e2 f5 b4 fc 0d |.........0......|
+000002e0 43 92 f1 18 99 68 d8 4d 94 ab e0 87 60 e5 46 e3 |C....h.M....`.F.|
+000002f0 dd b8 0c b5 c6 5b 73 ba ae e7 7f 0c 6d 6d 94 e7 |.....[s.....mm..|
+00000300 e2 21 c5 5c 0e b9 e6 c7 88 92 |.!.\......|
>>> Flow 4 (server to client)
-00000000 14 03 01 00 01 01 16 03 01 00 30 51 68 ca 97 63 |..........0Qh..c|
-00000010 c6 c0 24 1c 87 20 70 ac f7 47 16 45 44 17 cc 92 |..$.. p..G.ED...|
-00000020 b3 6d 8b fa d1 3c b8 10 d7 da e4 a7 35 3c a2 d0 |.m...<......5<..|
-00000030 da 4b 50 e4 89 94 4b bc 20 6b e3 |.KP...K. k.|
+00000000 14 03 01 00 01 01 16 03 01 00 30 24 93 c5 b1 d0 |..........0$....|
+00000010 bf 5e 5c 79 18 91 d4 c2 5d 82 bd b9 77 44 a8 75 |.^\y....]...wD.u|
+00000020 2a aa 22 c1 71 79 4c ad 7f 95 1f 94 b7 2b 5d cb |*.".qyL......+].|
+00000030 85 57 0a 7e 55 f1 56 4b 98 da b8 |.W.~U.VK...|
>>> Flow 5 (client to server)
-00000000 17 03 01 00 20 fc fa 90 90 d0 51 0d 35 0f 6a 6d |.... .....Q.5.jm|
-00000010 c2 32 ec 92 46 9f d7 e9 66 37 02 2a f6 c6 2e e2 |.2..F...f7.*....|
-00000020 13 aa fa fa d3 17 03 01 00 20 45 a9 36 19 7d a8 |......... E.6.}.|
-00000030 44 4c 8b aa 4e 47 c8 79 0c 97 a5 20 fa 6f 1f f7 |DL..NG.y... .o..|
-00000040 d3 bc d7 6d c2 67 23 c8 d6 05 15 03 01 00 20 f1 |...m.g#....... .|
-00000050 f1 ed f9 fc c2 f6 61 c8 42 9d c9 8a b0 d0 de d3 |......a.B.......|
-00000060 42 c7 04 64 eb 9e eb 58 3b c3 7d 0d 4d 16 d4 |B..d...X;.}.M..|
+00000000 17 03 01 00 20 21 19 00 1b 74 03 79 83 6a cf 87 |.... !...t.y.j..|
+00000010 c5 1f c6 e6 ff 1c 8d 9e a9 2b 3c 7e e5 e0 d5 b5 |.........+<~....|
+00000020 c0 d5 1a 84 45 17 03 01 00 20 77 40 7e ac d0 9e |....E.... w@~...|
+00000030 d1 86 73 26 d2 c6 a0 a4 94 9e d7 7e 28 59 5c b2 |..s&.......~(Y\.|
+00000040 9f 4d fa c5 c9 b7 a2 b2 b1 7b 15 03 01 00 20 59 |.M.......{.... Y|
+00000050 aa 2f 3f 2c 20 f1 15 ef 24 95 29 66 c0 48 78 00 |./?, ...$.)f.Hx.|
+00000060 19 d6 1e 95 af 83 03 6e d8 c7 8e bb c3 54 02 |.......n.....T.|
diff --git a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
index 81e5191..afe6e10 100644
--- a/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
@@ -16,11 +16,11 @@
000000e0 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0|
000000f0 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |.........._X.;t|
>>> Flow 2 (server to client)
-00000000 16 03 01 00 59 02 00 00 55 03 01 ca 72 6a a1 69 |....Y...U...rj.i|
-00000010 18 a4 f8 76 4a c3 5c e8 d5 c1 fb 06 c6 9a 14 67 |...vJ.\........g|
-00000020 ce e4 f6 52 67 ab 64 48 28 5a 63 20 55 ea ff 87 |...Rg.dH(Zc U...|
-00000030 5a 78 5c cb 21 af 83 a5 ed 1b d3 2c 39 81 e5 ca |Zx\.!......,9...|
-00000040 63 d2 5c 57 27 1d d0 f9 41 40 43 b0 c0 13 00 00 |c.\W'...A@C.....|
+00000000 16 03 01 00 59 02 00 00 55 03 01 b5 1a 96 ea d5 |....Y...U.......|
+00000010 01 ef fb 42 1d 49 e1 1b 7c e4 15 ec cc 7f b9 fc |...B.I..|.......|
+00000020 22 e0 0b 1d 66 0e c8 d6 9b cd ec 20 d5 2b fe 9a |"...f...... .+..|
+00000030 f7 e7 10 1c c4 15 10 f1 24 8d 8f f6 25 90 aa 1c |........$...%...|
+00000040 10 c4 87 c6 36 23 5b 6a c1 ae 20 5e c0 13 00 00 |....6#[j.. ^....|
00000050 0d ff 01 00 01 00 00 0b 00 04 03 00 01 02 16 03 |................|
00000060 01 02 59 0b 00 02 55 00 02 52 00 02 4f 30 82 02 |..Y...U..R..O0..|
00000070 4b 30 82 01 b4 a0 03 02 01 02 02 09 00 e8 f0 9d |K0..............|
@@ -60,17 +60,17 @@
00000290 77 8d 0c 1c f1 0f a1 d8 40 83 61 c9 4c 72 2b 9d |w.......@.a.Lr+.|
000002a0 ae db 46 06 06 4d f4 c1 b3 3e c0 d1 bd 42 d4 db |..F..M...>...B..|
000002b0 fe 3d 13 60 84 5c 21 d3 3b e9 fa e7 16 03 01 00 |.=.`.\!.;.......|
-000002c0 aa 0c 00 00 a6 03 00 1d 20 e8 a5 9c e4 73 3d 75 |........ ....s=u|
-000002d0 0c 3e f2 de 21 9c 0f 91 b4 fd 94 f0 27 f6 d9 7d |.>..!.......'..}|
-000002e0 cd 0c 4c 50 b0 47 db dd 12 00 80 04 c0 be d5 bb |..LP.G..........|
-000002f0 e8 e2 a2 2e d9 2e 75 fa b6 07 d0 f7 75 52 fb 2f |......u.....uR./|
-00000300 50 cd 43 68 bd 42 11 6d d6 9f a3 d1 00 fd a9 14 |P.Ch.B.m........|
-00000310 0c 2a dd 76 ea 73 21 52 00 3a 83 cf d7 07 c7 bd |.*.v.s!R.:......|
-00000320 78 21 ce 35 80 b3 06 22 f1 96 a7 20 41 f8 aa 61 |x!.5..."... A..a|
-00000330 94 b4 77 d4 d9 92 f2 66 c5 1c d1 82 f3 b9 e2 9d |..w....f........|
-00000340 a9 30 1c e2 4e ec 0d 32 3d 0d 61 22 c8 e5 95 9f |.0..N..2=.a"....|
-00000350 cf 3e fc a8 c5 c3 f8 45 45 29 ea a7 e7 b7 a6 17 |.>.....EE)......|
-00000360 9e 5f 83 d4 b3 f0 da 31 73 94 f2 16 03 01 00 0a |._.....1s.......|
+000002c0 aa 0c 00 00 a6 03 00 1d 20 87 d5 d1 27 70 92 d9 |........ ...'p..|
+000002d0 15 56 e4 fd a8 52 a9 a5 f6 db ab f5 e2 61 fa 5d |.V...R.......a.]|
+000002e0 64 ba c2 ee 37 0b 53 cf 3c 00 80 71 cd eb 4b 1c |d...7.S.<..q..K.|
+000002f0 f7 84 85 6a 20 5c c8 40 59 1c b0 8e 1b b6 b6 19 |...j \.@Y.......|
+00000300 f1 66 ad 7d 1d d5 58 da c3 c4 dd 12 57 04 05 0d |.f.}..X.....W...|
+00000310 79 46 20 0b 8c a3 49 95 e0 96 22 75 56 44 21 6b |yF ...I..."uVD!k|
+00000320 42 17 ed 32 eb 9c f3 fd b0 b3 08 da 61 7e f3 9b |B..2........a~..|
+00000330 43 51 c0 09 e3 53 17 5d 84 3f c4 52 db 73 f9 d1 |CQ...S.].?.R.s..|
+00000340 21 0e 55 a4 bc a1 1b b6 3a 5a d1 cb 15 7e 8b a4 |!.U.....:Z...~..|
+00000350 fb 0f e7 7e 36 a7 1b a4 c0 1f 79 37 49 17 84 d3 |...~6.....y7I...|
+00000360 97 39 78 1f 55 77 e8 aa 37 2a 36 16 03 01 00 0a |.9x.Uw..7*6.....|
00000370 0d 00 00 06 03 01 02 40 00 00 16 03 01 00 04 0e |.......@........|
00000380 00 00 00 |...|
>>> Flow 3 (client to server)
@@ -110,29 +110,29 @@
00000210 03 01 00 25 10 00 00 21 20 2f e5 7d a3 47 cd 62 |...%...! /.}.G.b|
00000220 43 15 28 da ac 5f bb 29 07 30 ff f6 84 af c4 cf |C.(.._.).0......|
00000230 c2 ed 90 99 5f 58 cb 3b 74 16 03 01 00 91 0f 00 |...._X.;t.......|
-00000240 00 8d 00 8b 30 81 88 02 42 00 9a b9 f6 98 e3 ed |....0...B.......|
-00000250 ed 0d a3 0e 54 51 9f 73 d4 87 40 4e a9 39 4b 2d |....TQ.s..@N.9K-|
-00000260 2a b9 4d 8d e3 46 c3 b6 39 f2 ca a9 c9 0f 79 c1 |*.M..F..9.....y.|
-00000270 0c 90 6f de 58 97 72 fc a8 c1 4c 12 aa a4 85 57 |..o.X.r...L....W|
-00000280 50 7c a0 02 8a 12 c5 80 aa b6 39 02 42 00 9c b7 |P|........9.B...|
-00000290 95 b4 04 83 5b 3a e1 ac da 78 86 11 f5 30 75 4a |....[:...x...0uJ|
-000002a0 25 67 6c fd ef 5a d8 56 d3 60 93 cf 65 07 2b 1f |%gl..Z.V.`..e.+.|
-000002b0 a9 40 a8 ba cd 0e 41 2d 10 43 a4 61 93 b7 0a 11 |.@....A-.C.a....|
-000002c0 78 d1 72 2b 20 07 49 5a 76 02 17 57 87 78 c7 14 |x.r+ .IZv..W.x..|
-000002d0 03 01 00 01 01 16 03 01 00 30 93 de 1b 64 0e 56 |.........0...d.V|
-000002e0 d9 a8 da f7 37 cb ac ac 3e f5 e2 f9 87 19 f2 79 |....7...>......y|
-000002f0 24 76 19 a4 a2 41 d6 9e 7d ca aa 3e 1d d7 22 dd |$v...A..}..>..".|
-00000300 05 aa dd 74 03 db fd a2 de ee |...t......|
+00000240 00 8d 00 8b 30 81 88 02 42 01 e7 32 ab 5d d7 f8 |....0...B..2.]..|
+00000250 b6 25 f9 b6 e6 19 eb 20 75 99 90 bc 41 06 74 ce |.%..... u...A.t.|
+00000260 92 31 fc 9e cd f3 b4 b1 b1 f7 1e d3 3c 5e 01 92 |.1..........<^..|
+00000270 a0 c6 24 05 6e 3b ba 6c 51 61 6c 11 fd fe d7 9f |..$.n;.lQal.....|
+00000280 0b 16 b3 1a f7 20 fa b2 3d 92 c9 02 42 01 d7 dc |..... ..=...B...|
+00000290 20 50 f6 91 a3 63 2a 79 37 d4 8b 71 0a 1e 73 f8 | P...c*y7..q..s.|
+000002a0 1e 1c 04 c5 c8 66 bc 5e 67 5e bb 94 76 87 23 12 |.....f.^g^..v.#.|
+000002b0 64 18 cb 09 66 58 f1 06 17 93 1e b9 83 67 9d 3d |d...fX.......g.=|
+000002c0 39 0a fb 37 7b a9 bf d2 59 1a 49 0f 4c 10 df 14 |9..7{...Y.I.L...|
+000002d0 03 01 00 01 01 16 03 01 00 30 4f 0e ba fc 20 81 |.........0O... .|
+000002e0 73 58 e0 47 33 b9 5e c4 6a 10 c2 1a 42 c3 85 2b |sX.G3.^.j...B..+|
+000002f0 20 38 80 5d 40 81 4a 78 40 d9 13 ac af b3 45 e7 | 8.]@.Jx@.....E.|
+00000300 1e 19 c6 b5 63 6e 9c 5c 8a 8d |....cn.\..|
>>> Flow 4 (server to client)
-00000000 14 03 01 00 01 01 16 03 01 00 30 4d 4f d6 67 05 |..........0MO.g.|
-00000010 32 8c 16 cb 19 35 b3 b9 02 d8 5e 24 b6 c8 b7 3a |2....5....^$...:|
-00000020 17 34 98 77 e1 73 e0 cd a9 30 a8 15 60 8c f4 9a |.4.w.s...0..`...|
-00000030 dc cf 7a fd 86 85 1c 2b 33 21 e8 |..z....+3!.|
+00000000 14 03 01 00 01 01 16 03 01 00 30 c6 bb 74 56 db |..........0..tV.|
+00000010 fd f7 a7 dd 3b a3 50 10 11 44 83 a1 c6 b1 6e 70 |....;.P..D....np|
+00000020 37 6e 68 b2 5a 45 6b fb e9 9d 4e 68 cf ba ea af |7nh.ZEk...Nh....|
+00000030 7d f6 65 ee 22 14 9e 5a a7 85 65 |}.e."..Z..e|
>>> Flow 5 (client to server)
-00000000 17 03 01 00 20 b8 c5 17 b7 92 d8 93 7a b2 fd 4f |.... .......z..O|
-00000010 15 d1 db b9 47 54 00 a0 f6 77 92 03 a8 89 e5 ba |....GT...w......|
-00000020 cc eb d9 bd 27 17 03 01 00 20 57 d5 9a f6 36 b2 |....'.... W...6.|
-00000030 57 ba cd 64 77 36 b9 74 fb bd 95 51 03 61 e8 45 |W..dw6.t...Q.a.E|
-00000040 cb b8 35 f0 05 17 b3 08 c6 cb 15 03 01 00 20 28 |..5........... (|
-00000050 43 03 ab 3f e2 f5 d0 33 4c 7f 50 a4 ee 7b 46 e6 |C..?...3L.P..{F.|
-00000060 12 76 d0 fd c3 99 5c 63 a4 04 ea 4b e3 bd 99 |.v....\c...K...|
+00000000 17 03 01 00 20 c7 78 67 68 03 48 2e a5 c3 7a 0a |.... .xgh.H...z.|
+00000010 56 73 14 02 12 f7 26 ac 48 19 3e e6 4b 0f ac d0 |Vs....&.H.>.K...|
+00000020 4e 74 dc 66 68 17 03 01 00 20 bf db fb e7 85 35 |Nt.fh.... .....5|
+00000030 50 4d 39 3f ab 25 95 30 4c 7a 20 d8 89 db 74 ff |PM9?.%.0Lz ...t.|
+00000040 e6 e1 05 30 98 17 f3 93 8a 0d 15 03 01 00 20 f9 |...0.......... .|
+00000050 33 18 32 46 d3 28 46 a4 06 8c e1 9b 9b 1d d1 d8 |3.2F.(F.........|
+00000060 7b 9f 6c ad 5d 2a 36 10 2c dd f8 30 23 54 ac |{.l.]*6.,..0#T.|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
index e1fb8a8..4b5a4ca 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
@@ -16,11 +16,11 @@
000000e0 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0|
000000f0 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |.........._X.;t|
>>> Flow 2 (server to client)
-00000000 16 03 03 00 59 02 00 00 55 03 03 36 60 84 12 26 |....Y...U..6`..&|
-00000010 51 e4 32 33 26 ef c3 31 bf ea ac 27 0f c3 fb cb |Q.23&..1...'....|
-00000020 05 89 af df 56 a9 3f 14 6e 5e 2c 20 ad 6e 60 2d |....V.?.n^, .n`-|
-00000030 94 aa e5 73 22 eb 68 92 77 1c 6c cb f4 5a 14 f2 |...s".h.w.l..Z..|
-00000040 29 85 88 aa 2e 56 2a ad 80 e1 f0 b1 c0 09 00 00 |)....V*.........|
+00000000 16 03 03 00 59 02 00 00 55 03 03 8f fe 05 df f3 |....Y...U.......|
+00000010 02 70 ec 72 c4 3d 1e 52 c3 63 b8 1d dc e0 36 72 |.p.r.=.R.c....6r|
+00000020 8b 04 94 a5 45 fb 97 a5 0b e1 a7 20 9d fb e5 2b |....E...... ...+|
+00000030 77 d7 1b da e8 d7 3e fe c5 8f 4e b6 5a 40 29 02 |w.....>...N.Z@).|
+00000040 fd 08 46 4e 27 24 53 e1 de 88 8a 77 c0 09 00 00 |..FN'$S....w....|
00000050 0d ff 01 00 01 00 00 0b 00 04 03 00 01 02 16 03 |................|
00000060 03 02 0e 0b 00 02 0a 00 02 07 00 02 04 30 82 02 |.............0..|
00000070 00 30 82 01 62 02 09 00 b8 bf 2d 47 a0 d2 eb f4 |.0..b.....-G....|
@@ -55,18 +55,18 @@
00000240 13 83 0d 94 06 bb d4 37 7a f6 ec 7a c9 86 2e dd |.......7z..z....|
00000250 d7 11 69 7f 85 7c 56 de fb 31 78 2b e4 c7 78 0d |..i..|V..1x+..x.|
00000260 ae cb be 9e 4e 36 24 31 7b 6a 0f 39 95 12 07 8f |....N6$1{j.9....|
-00000270 2a 16 03 03 00 b7 0c 00 00 b3 03 00 1d 20 87 2c |*............ .,|
-00000280 f2 fd 8e b9 3d 5f 1c c8 bb 04 f5 1e 01 a8 ba d8 |....=_..........|
-00000290 b6 8e 61 78 15 9e 3b a7 da 96 8e 77 d7 70 04 03 |..ax..;....w.p..|
-000002a0 00 8b 30 81 88 02 42 01 dc e2 26 f9 18 39 da 7d |..0...B...&..9.}|
-000002b0 bd a1 30 c6 6f dd cd aa a0 4f 71 cf 42 76 61 ba |..0.o....Oq.Bva.|
-000002c0 e7 9f 09 b5 05 f2 76 c7 db 2a 93 83 3b 0b 3a cf |......v..*..;.:.|
-000002d0 60 96 24 c8 af de 2c db 5a 29 1c 62 67 28 e9 d7 |`.$...,.Z).bg(..|
-000002e0 57 5f 54 18 cc bf ee d1 d9 02 42 01 04 cf 67 0b |W_T.......B...g.|
-000002f0 62 2c c2 17 a3 f4 f1 32 0f c5 b9 ae 3b 52 36 2b |b,.....2....;R6+|
-00000300 f0 c0 60 49 08 e0 bf f5 7c 09 13 e4 b8 ba 08 c7 |..`I....|.......|
-00000310 ea 74 a0 f5 88 45 e4 35 f1 c5 4e df fe 45 bc ca |.t...E.5..N..E..|
-00000320 9c 5f c8 84 66 13 8f b3 c9 7e b2 ba d6 16 03 03 |._..f....~......|
+00000270 2a 16 03 03 00 b7 0c 00 00 b3 03 00 1d 20 82 a8 |*............ ..|
+00000280 4b 0e 10 e1 2b a2 f6 9d 11 0a 4d 0b c0 2f 12 85 |K...+.....M../..|
+00000290 bc f3 e9 9f b4 50 50 fa b1 a9 fd 35 d1 39 04 03 |.....PP....5.9..|
+000002a0 00 8b 30 81 88 02 42 01 b1 cb c7 7a 83 6a 95 5b |..0...B....z.j.[|
+000002b0 09 4c 59 d6 9a 6b 9d 0c e9 f5 22 1c 46 76 5b 4e |.LY..k....".Fv[N|
+000002c0 3c 4a ac 81 b7 96 29 7c e2 e8 08 e7 5f be 9d dc |<J....)|...._...|
+000002d0 8d 9e 1d a1 84 4c 18 1a 8a 2d bd 97 de 26 70 14 |.....L...-...&p.|
+000002e0 11 74 49 4b e9 2e 59 30 9c 02 42 00 b5 9e 89 32 |.tIK..Y0..B....2|
+000002f0 45 02 71 19 6e 83 fc 26 26 b4 28 08 6a 7d d3 72 |E.q.n..&&.(.j}.r|
+00000300 4e ed 82 68 2f ad ff 39 5a ce 34 b8 e4 39 f2 f1 |N..h/..9Z.4..9..|
+00000310 60 5d 84 c4 da 4d 5a 33 f8 20 5a f2 7f aa 7e 18 |`]...MZ3. Z...~.|
+00000320 14 14 2a 68 a8 9d dd d0 ec e3 00 87 49 16 03 03 |..*h........I...|
00000330 00 3a 0d 00 00 36 03 01 02 40 00 2e 04 03 05 03 |.:...6...@......|
00000340 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 08 05 |................|
00000350 08 06 04 01 05 01 06 01 03 03 02 03 03 01 02 01 |................|
@@ -108,32 +108,32 @@
00000200 e4 fa cc b1 8a ce e2 23 a0 87 f0 e1 67 51 eb 16 |.......#....gQ..|
00000210 03 03 00 25 10 00 00 21 20 2f e5 7d a3 47 cd 62 |...%...! /.}.G.b|
00000220 43 15 28 da ac 5f bb 29 07 30 ff f6 84 af c4 cf |C.(.._.).0......|
-00000230 c2 ed 90 99 5f 58 cb 3b 74 16 03 03 00 92 0f 00 |...._X.;t.......|
-00000240 00 8e 04 03 00 8a 30 81 87 02 42 01 8f ff aa 8c |......0...B.....|
-00000250 bd 0c 94 39 34 e5 39 7b d2 12 26 8e 94 4a fd 68 |...94.9{..&..J.h|
-00000260 f2 f5 5b 30 69 e1 42 3a 74 cd 9a 37 75 5c d2 a6 |..[0i.B:t..7u\..|
-00000270 c9 7b b1 83 c1 d9 c5 55 1a af 3d 19 64 02 43 c0 |.{.....U..=.d.C.|
-00000280 0a 1c 0e ff f4 42 85 fb d1 aa a2 52 1a 02 41 2f |.....B.....R..A/|
-00000290 c6 23 d7 37 f1 36 75 0c 0f b4 49 14 c4 b4 d9 28 |.#.7.6u...I....(|
-000002a0 c1 00 2d e4 d6 93 fd a0 f5 59 4e 45 0c a4 28 d4 |..-......YNE..(.|
-000002b0 dc aa 7b 0b 28 29 12 94 f6 db 8c 23 af 81 7e ab |..{.().....#..~.|
-000002c0 fd 12 ba 11 27 b2 10 87 89 61 9f 5d 6d 18 79 c5 |....'....a.]m.y.|
-000002d0 14 03 03 00 01 01 16 03 03 00 40 00 00 00 00 00 |..........@.....|
-000002e0 00 00 00 00 00 00 00 00 00 00 00 2d 3e 6e 02 fb |...........->n..|
-000002f0 50 cc 37 62 77 17 08 ef 71 e6 06 23 82 ba 97 b7 |P.7bw...q..#....|
-00000300 0f 38 f9 5e 05 63 4c c9 04 6e bd e4 78 76 32 3b |.8.^.cL..n..xv2;|
-00000310 3a a7 9b de 30 ca ed fb 17 dc 40 |:...0.....@|
+00000230 c2 ed 90 99 5f 58 cb 3b 74 16 03 03 00 93 0f 00 |...._X.;t.......|
+00000240 00 8f 04 03 00 8b 30 81 88 02 42 01 cd 6b 44 a0 |......0...B..kD.|
+00000250 80 3b f5 5d f0 99 24 dd 89 94 b9 96 34 e7 04 e7 |.;.]..$.....4...|
+00000260 38 72 64 36 5a e9 ac bc e3 54 1b 75 69 e2 de 03 |8rd6Z....T.ui...|
+00000270 ce a9 2c 76 92 dd 6b 31 0a 93 10 57 69 8b e0 cf |..,v..k1...Wi...|
+00000280 7d 75 e4 e1 a9 d2 d3 29 b6 a7 ff 86 d4 02 42 01 |}u.....)......B.|
+00000290 e4 d9 31 56 23 62 e6 c2 2d 57 8a 6f d3 3f 1f 4d |..1V#b..-W.o.?.M|
+000002a0 ca 0e c0 60 53 55 1f fb 56 24 22 82 c0 fe d9 0b |...`SU..V$".....|
+000002b0 9b de fb f2 d4 a6 e4 98 9f 2c 07 07 01 83 ab 93 |.........,......|
+000002c0 3e c6 02 41 e9 8b 8d 95 eb cf b9 0f b5 fb 2c 9f |>..A..........,.|
+000002d0 90 14 03 03 00 01 01 16 03 03 00 40 00 00 00 00 |...........@....|
+000002e0 00 00 00 00 00 00 00 00 00 00 00 00 aa 12 12 09 |................|
+000002f0 c5 08 94 28 8d 59 f3 68 cc 02 69 47 fa cf 9c 81 |...(.Y.h..iG....|
+00000300 a6 a5 b5 c7 e7 26 45 4a 59 67 ca 0a ed 6c 58 38 |.....&EJYg...lX8|
+00000310 23 12 48 a9 3c 0c 26 00 78 58 db 21 |#.H.<.&.xX.!|
>>> Flow 4 (server to client)
-00000000 14 03 03 00 01 01 16 03 03 00 40 19 62 a8 82 26 |..........@.b..&|
-00000010 0f 0c 84 b4 31 6a 5d 12 65 dc b9 bc de 5c cb 77 |....1j].e....\.w|
-00000020 5d 04 7e a8 10 1a a5 05 e5 ca 04 68 a2 81 ef f5 |].~........h....|
-00000030 ae 4e bd f1 f3 ba 3f 6a 81 ae 71 9a 2f 31 e2 79 |.N....?j..q./1.y|
-00000040 f1 4d 6c 0e a4 be 4b f7 80 6f 97 |.Ml...K..o.|
+00000000 14 03 03 00 01 01 16 03 03 00 40 5a 63 b1 0f 47 |..........@Zc..G|
+00000010 76 ac c4 69 62 82 63 77 8b 26 7b a9 8a 7d 3d fe |v..ib.cw.&{..}=.|
+00000020 4a 04 b4 80 17 cc be 5e 9e b2 5d a3 2d 48 85 44 |J......^..].-H.D|
+00000030 7d db 62 77 31 27 18 b1 55 61 b3 64 6c d6 39 f7 |}.bw1'..Ua.dl.9.|
+00000040 f2 fe 7c 73 c8 3f 31 c9 78 83 8c |..|s.?1.x..|
>>> Flow 5 (client to server)
00000000 17 03 03 00 30 00 00 00 00 00 00 00 00 00 00 00 |....0...........|
-00000010 00 00 00 00 00 e9 f4 51 fe c1 02 35 de 6e 72 c3 |.......Q...5.nr.|
-00000020 58 f3 01 4a f0 9d f2 34 df fc 0e 93 ef 46 2e 45 |X..J...4.....F.E|
-00000030 5e 60 43 52 33 15 03 03 00 30 00 00 00 00 00 00 |^`CR3....0......|
-00000040 00 00 00 00 00 00 00 00 00 00 ac 82 d6 47 42 40 |.............GB@|
-00000050 d6 6c 6d e3 b6 c6 4a b7 83 ce 6f 3f 33 ad e7 eb |.lm...J...o?3...|
-00000060 bf 59 82 50 8a 18 e3 13 46 6c |.Y.P....Fl|
+00000010 00 00 00 00 00 b9 a3 b6 37 76 c9 69 20 8d 97 e3 |........7v.i ...|
+00000020 0d f1 6e d4 6d 79 0b 64 4f a5 0d 30 ff 1c cd 56 |..n.my.dO..0...V|
+00000030 e7 ce 69 a6 48 15 03 03 00 30 00 00 00 00 00 00 |..i.H....0......|
+00000040 00 00 00 00 00 00 00 00 00 00 c6 3c 3b f2 09 05 |...........<;...|
+00000050 2c 4d 07 4f 95 34 29 ec ef 3b b5 31 c6 a4 91 5e |,M.O.4)..;.1...^|
+00000060 14 20 5b c5 34 19 f9 1d 22 63 |. [.4..."c|
diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
index 7ae186d..36bddc2 100644
--- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
@@ -16,11 +16,11 @@
000000e0 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0|
000000f0 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |.........._X.;t|
>>> Flow 2 (server to client)
-00000000 16 03 03 00 59 02 00 00 55 03 03 2a 52 95 57 8c |....Y...U..*R.W.|
-00000010 55 3f d7 82 f0 3f af 57 a1 82 86 00 3a 6b c0 07 |U?...?.W....:k..|
-00000020 4d c3 0e 80 cc 37 2d 51 f4 d3 e2 20 4a f6 c9 8a |M....7-Q... J...|
-00000030 d2 98 4a ff 22 66 11 da 6f 9a a0 17 b9 96 b0 86 |..J."f..o.......|
-00000040 29 e0 39 86 0a 00 42 78 30 60 61 99 c0 2f 00 00 |).9...Bx0`a../..|
+00000000 16 03 03 00 59 02 00 00 55 03 03 b8 f6 b1 71 c5 |....Y...U.....q.|
+00000010 d0 3f 36 fb 8a b9 15 35 ae c5 08 8e eb c6 d5 ad |.?6....5........|
+00000020 a1 8a ff 65 2e 78 f5 2a 2b cb f7 20 26 1e c1 94 |...e.x.*+.. &...|
+00000030 85 a9 b1 ca 8d 5f 3f 00 6a 44 c9 ed 28 36 97 f2 |....._?.jD..(6..|
+00000040 7d 38 0a 56 75 a2 12 ac 34 ed 7e 14 c0 2f 00 00 |}8.Vu...4.~../..|
00000050 0d ff 01 00 01 00 00 0b 00 04 03 00 01 02 16 03 |................|
00000060 03 02 59 0b 00 02 55 00 02 52 00 02 4f 30 82 02 |..Y...U..R..O0..|
00000070 4b 30 82 01 b4 a0 03 02 01 02 02 09 00 e8 f0 9d |K0..............|
@@ -60,17 +60,17 @@
00000290 77 8d 0c 1c f1 0f a1 d8 40 83 61 c9 4c 72 2b 9d |w.......@.a.Lr+.|
000002a0 ae db 46 06 06 4d f4 c1 b3 3e c0 d1 bd 42 d4 db |..F..M...>...B..|
000002b0 fe 3d 13 60 84 5c 21 d3 3b e9 fa e7 16 03 03 00 |.=.`.\!.;.......|
-000002c0 ac 0c 00 00 a8 03 00 1d 20 fa 3a 8f b7 50 10 38 |........ .:..P.8|
-000002d0 04 9d fb c4 e4 76 6d 93 86 b2 8a d7 5b 8f 8d 45 |.....vm.....[..E|
-000002e0 41 b7 ba 54 bc cc 7b 07 3c 08 04 00 80 a1 14 65 |A..T..{.<......e|
-000002f0 f6 48 29 ba 08 86 52 65 dd 08 ef b8 b8 77 ef fd |.H)...Re.....w..|
-00000300 8a ca dc 37 f8 69 fa 04 69 73 84 07 b2 45 f0 a2 |...7.i..is...E..|
-00000310 8c 69 f7 7c 4c 5c 95 c5 66 80 ad 93 04 67 4b 3d |.i.|L\..f....gK=|
-00000320 f8 53 a9 33 b3 c0 40 17 62 34 f0 f3 1e d2 23 93 |.S.3..@.b4....#.|
-00000330 29 52 bc f4 f0 72 58 b9 76 9c 7b 54 b0 d5 d1 ab |)R...rX.v.{T....|
-00000340 b3 1b ae f7 f3 46 6a 07 7f f4 91 ee 46 d6 85 43 |.....Fj.....F..C|
-00000350 ea c6 f9 f5 47 89 85 39 72 35 af b4 03 e9 a2 ea |....G..9r5......|
-00000360 a8 19 09 ea b3 d2 c2 38 59 65 d1 2c 18 16 03 03 |.......8Ye.,....|
+000002c0 ac 0c 00 00 a8 03 00 1d 20 9d 82 84 ba 8e 4b 7e |........ .....K~|
+000002d0 bc f4 8e ab c1 31 68 42 cb 36 1d 64 60 55 74 11 |.....1hB.6.d`Ut.|
+000002e0 cf 63 d2 f4 c9 e7 a9 bf 7b 08 04 00 80 ce b2 06 |.c......{.......|
+000002f0 a3 54 1e fd f7 c4 a6 54 40 ea 74 8c e0 de ec aa |.T.....T@.t.....|
+00000300 30 66 c3 e4 a9 7f 86 cc f7 34 6b 55 a4 97 fd 6e |0f.......4kU...n|
+00000310 3b 1f c4 e9 17 3c 6d 94 66 78 e0 1a ab 41 64 9b |;....<m.fx...Ad.|
+00000320 2b 2e 14 99 96 68 aa ef 97 65 ea e7 72 28 9c 0f |+....h...e..r(..|
+00000330 f9 11 57 b7 1f 31 54 87 1a 36 45 ec c1 0f 72 53 |..W..1T..6E...rS|
+00000340 56 a1 8d e4 d0 93 3e bb 77 8a 32 bd fb 07 0b ce |V.....>.w.2.....|
+00000350 82 d3 a1 ab 6f 80 ac ac 4e da b7 7f 84 fe 3f 26 |....o...N.....?&|
+00000360 f4 d9 b9 b6 2b 68 1a cc ef 31 97 22 bf 16 03 03 |....+h...1."....|
00000370 00 3a 0d 00 00 36 03 01 02 40 00 2e 04 03 05 03 |.:...6...@......|
00000380 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 08 05 |................|
00000390 08 06 04 01 05 01 06 01 03 03 02 03 03 01 02 01 |................|
@@ -112,28 +112,28 @@
00000200 e4 fa cc b1 8a ce e2 23 a0 87 f0 e1 67 51 eb 16 |.......#....gQ..|
00000210 03 03 00 25 10 00 00 21 20 2f e5 7d a3 47 cd 62 |...%...! /.}.G.b|
00000220 43 15 28 da ac 5f bb 29 07 30 ff f6 84 af c4 cf |C.(.._.).0......|
-00000230 c2 ed 90 99 5f 58 cb 3b 74 16 03 03 00 91 0f 00 |...._X.;t.......|
-00000240 00 8d 04 03 00 89 30 81 86 02 41 63 34 72 b4 70 |......0...Ac4r.p|
-00000250 45 46 9c 3c 06 2c f5 ab d4 dd a7 91 69 9c 65 0f |EF.<.,......i.e.|
-00000260 4b d9 2d 90 3d d1 f2 4d 2a 6a 43 4f a7 fd b5 22 |K.-.=..M*jCO..."|
-00000270 83 61 e2 14 33 8c bc 8a 81 52 a1 f4 69 a7 12 c9 |.a..3....R..i...|
-00000280 c3 28 69 85 6d c1 b0 5d d3 5e ac 4e 02 41 35 cd |.(i.m..].^.N.A5.|
-00000290 3b c3 f6 ea 9e df 2a a1 ea 80 55 40 d2 13 d3 ff |;.....*...U@....|
-000002a0 b2 59 bb a0 c7 10 67 6e 9b dc 6c 3c 97 08 07 e0 |.Y....gn..l<....|
-000002b0 db da 79 6b 0e 6c a0 23 13 b1 02 32 ab ee 62 69 |..yk.l.#...2..bi|
-000002c0 f9 d5 7f 24 2e 26 94 36 a4 36 53 63 dd 90 20 14 |...$.&.6.6Sc.. .|
-000002d0 03 03 00 01 01 16 03 03 00 28 00 00 00 00 00 00 |.........(......|
-000002e0 00 00 a7 30 0e b0 f7 ba 51 35 c9 4c c2 24 90 5e |...0....Q5.L.$.^|
-000002f0 b2 59 57 5d 96 9d ad d1 1e 7d b0 35 09 9c c5 49 |.YW].....}.5...I|
-00000300 bd 82 |..|
+00000230 c2 ed 90 99 5f 58 cb 3b 74 16 03 03 00 93 0f 00 |...._X.;t.......|
+00000240 00 8f 04 03 00 8b 30 81 88 02 42 01 d0 ef 2f 75 |......0...B.../u|
+00000250 25 6e 4b 2a 16 21 c4 73 59 80 a8 c9 27 45 1b 06 |%nK*.!.sY...'E..|
+00000260 75 20 61 01 db aa c4 90 25 16 1b fb ec 92 54 f7 |u a.....%.....T.|
+00000270 16 9b 8c e0 34 48 3e 62 57 92 99 42 7f d1 35 09 |....4H>bW..B..5.|
+00000280 e1 55 4c 32 cc ed 9d 3e 18 25 1d 31 b8 02 42 01 |.UL2...>.%.1..B.|
+00000290 dd d8 20 b1 12 a2 7d 3b 6b 40 f3 db 59 2b 33 db |.. ...};k@..Y+3.|
+000002a0 5f 85 4d b4 5f 6f 23 ae d2 a2 74 2b 22 94 60 51 |_.M._o#...t+".`Q|
+000002b0 75 aa 66 88 2f 5a db f5 91 b2 7c f4 c4 e9 25 fa |u.f./Z....|...%.|
+000002c0 f7 74 20 00 c3 08 22 8e 88 28 1c 72 4b 36 cd 03 |.t ..."..(.rK6..|
+000002d0 46 14 03 03 00 01 01 16 03 03 00 28 00 00 00 00 |F..........(....|
+000002e0 00 00 00 00 2c 30 d5 ee d2 79 8c 68 62 7a c7 36 |....,0...y.hbz.6|
+000002f0 ce c9 39 25 4b 6d 3e 59 7d 42 21 72 65 00 41 45 |..9%Km>Y}B!re.AE|
+00000300 ba 47 88 64 |.G.d|
>>> Flow 4 (server to client)
-00000000 14 03 03 00 01 01 16 03 03 00 28 09 ff 53 e8 0f |..........(..S..|
-00000010 ad 86 30 ca 96 54 da 72 45 13 7a cd 51 f6 b3 a5 |..0..T.rE.z.Q...|
-00000020 27 4c 7c 26 81 6d 76 6f 19 8e f3 13 77 49 59 73 |'L|&.mvo....wIYs|
-00000030 4e 98 3e |N.>|
+00000000 14 03 03 00 01 01 16 03 03 00 28 9c e9 30 06 da |..........(..0..|
+00000010 ef 89 4a 77 db 17 d4 51 79 36 c1 97 45 8a b0 c9 |..Jw...Qy6..E...|
+00000020 b7 d4 69 8d fc f2 5e 1a c8 e3 43 6c 7a b4 0a 40 |..i...^...Clz..@|
+00000030 ec 35 c9 |.5.|
>>> Flow 5 (client to server)
-00000000 17 03 03 00 1e 00 00 00 00 00 00 00 01 99 7b 4c |..............{L|
-00000010 1d 0a b1 89 0d ac fa a7 39 eb 9a ff 8f 06 60 d1 |........9.....`.|
-00000020 88 e8 ef 15 03 03 00 1a 00 00 00 00 00 00 00 02 |................|
-00000030 99 42 7f c8 35 79 f3 a0 10 5c 05 25 c1 ac ab aa |.B..5y...\.%....|
-00000040 d5 9e |..|
+00000000 17 03 03 00 1e 00 00 00 00 00 00 00 01 f2 3b 7e |..............;~|
+00000010 59 d0 c1 2f 93 f8 8a 48 8d e6 f4 54 70 63 4a 2d |Y../...H...TpcJ-|
+00000020 90 5d 9b 15 03 03 00 1a 00 00 00 00 00 00 00 02 |.]..............|
+00000030 42 1f 5c b2 d3 14 4d 6e 30 85 59 89 5a 34 80 00 |B.\...Mn0.Y.Z4..|
+00000040 fe ab |..|
diff --git a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
index 251e339..bd8f6cd 100644
--- a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
+++ b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-ECDSA-RSA
@@ -16,124 +16,124 @@
000000e0 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0|
000000f0 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |.........._X.;t|
>>> Flow 2 (server to client)
-00000000 16 03 03 00 7a 02 00 00 76 03 03 ce 38 98 c9 b7 |....z...v...8...|
-00000010 f8 67 af 0d 29 52 88 a4 d0 c2 a8 10 c4 8e 80 26 |.g..)R.........&|
-00000020 43 84 0e 60 06 ce f0 b7 b1 cd 29 20 00 00 00 00 |C..`......) ....|
+00000000 16 03 03 00 7a 02 00 00 76 03 03 85 46 7d 9f 55 |....z...v...F}.U|
+00000010 82 34 10 06 5e 8d 60 5d 00 9d 28 cd 18 c2 18 ee |.4..^.`]..(.....|
+00000020 cb 9a 63 ee 9a 30 7d 5d 87 3d 24 20 00 00 00 00 |..c..0}].=$ ....|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 13 03 00 00 |................|
-00000050 2e 00 2b 00 02 03 04 00 33 00 24 00 1d 00 20 aa |..+.....3.$... .|
-00000060 00 03 6d 16 04 54 48 55 4d f9 04 e8 29 ca 9c 5d |..m..THUM...)..]|
-00000070 14 94 a2 7a 2e 0a 4e 75 12 2d 63 cf 19 81 21 14 |...z..Nu.-c...!.|
-00000080 03 03 00 01 01 17 03 03 00 17 7b 90 e1 af 77 ca |..........{...w.|
-00000090 a1 3b a6 e0 9f ea 4b f6 3f 45 a0 78 1c fb af 51 |.;....K.?E.x...Q|
-000000a0 30 17 03 03 00 42 ff 27 8b 9c fd 65 d7 b1 d4 43 |0....B.'...e...C|
-000000b0 eb 8f c3 ca b4 57 be 35 35 75 35 cf 43 73 d6 14 |.....W.55u5.Cs..|
-000000c0 7e 2d b4 f8 31 60 1b 35 2a 38 91 32 40 8b f0 ab |~-..1`.5*8.2@...|
-000000d0 a8 b0 dc 2b db b9 63 92 28 dc f2 c2 95 d3 4a 63 |...+..c.(.....Jc|
-000000e0 69 e7 58 0c e5 9c d5 22 17 03 03 02 6d 7c 70 9b |i.X...."....m|p.|
-000000f0 e1 81 3a 0d 6e 7f 5c 30 2e 09 1d 82 ac 48 a6 7e |..:.n.\0.....H.~|
-00000100 03 ce d0 ce e2 e8 9e 8b 2b ee af 1a b1 6a 3a 27 |........+....j:'|
-00000110 04 53 73 d2 d4 28 68 19 96 3a 3d 89 df 2c e3 2b |.Ss..(h..:=..,.+|
-00000120 45 c8 5e 60 42 b0 4d f2 9c 8a 8d 83 f6 97 e0 b0 |E.^`B.M.........|
-00000130 02 39 37 46 2b 07 28 8b e8 d8 c2 e3 ba 58 9b dc |.97F+.(......X..|
-00000140 62 c4 e6 cb b4 97 f0 67 2b b3 40 4b 64 3e 73 3f |b......g+.@Kd>s?|
-00000150 a1 1f 6e fe 7f ba af 7d bd c4 7c 37 60 c0 94 d6 |..n....}..|7`...|
-00000160 bc 14 70 a9 95 a6 b7 88 9d 50 cf 9f 36 0c 38 c4 |..p......P..6.8.|
-00000170 97 ba ea 43 16 e8 fd 72 22 3c 09 4a 97 1c 97 70 |...C...r"<.J...p|
-00000180 88 6d d4 f3 9d b9 5a f3 67 f5 7b da 3e ed 1a 66 |.m....Z.g.{.>..f|
-00000190 4c 62 50 ff cd 92 08 d8 5c 2e 11 de ea 44 16 91 |LbP.....\....D..|
-000001a0 3e 44 d7 8c dd 2a b4 c7 2b 4d 40 a2 f9 7e 49 a9 |>D...*..+M@..~I.|
-000001b0 d8 51 a1 27 b3 34 75 59 04 04 cd 52 d6 37 34 e6 |.Q.'.4uY...R.74.|
-000001c0 41 32 36 45 c0 65 fb 5c e2 21 77 7f 35 db 9d 34 |A26E.e.\.!w.5..4|
-000001d0 0d 6e 9d a7 9e 00 ec e3 3e 9c 50 50 13 5b ad b9 |.n......>.PP.[..|
-000001e0 b3 47 44 f8 9b 12 ab 50 7f a7 df 35 c5 d6 78 3c |.GD....P...5..x<|
-000001f0 c1 04 41 db 99 18 cd 8c 05 3f 08 ae 2b 41 c9 46 |..A......?..+A.F|
-00000200 16 9a e3 a9 5b d3 9c 00 56 0e e2 d1 da 6d 6b 20 |....[...V....mk |
-00000210 65 1b 55 1f 4f b1 eb 94 c6 48 e3 50 d6 14 c5 62 |e.U.O....H.P...b|
-00000220 5e fc d2 cf df f4 68 90 c9 bb 80 54 f3 f3 a3 78 |^.....h....T...x|
-00000230 af 1f 6f ef e1 d5 64 24 04 e5 d4 59 bc 4d 7b a0 |..o...d$...Y.M{.|
-00000240 1a 23 e1 81 b7 c4 bb 52 86 f4 2a 85 d2 d0 7a ed |.#.....R..*...z.|
-00000250 c0 5d 27 07 4b df 52 c4 ea c8 c9 9c f0 48 35 71 |.]'.K.R......H5q|
-00000260 bd 04 65 65 47 e3 21 88 ff 08 6c 6a f3 6c dd 81 |..eeG.!...lj.l..|
-00000270 3f 50 21 66 34 49 07 a0 e0 6d 80 54 77 8b 27 81 |?P!f4I...m.Tw.'.|
-00000280 4f b9 59 60 0a b0 c7 00 6a 7b 26 33 f6 5e ad 37 |O.Y`....j{&3.^.7|
-00000290 bf ea 87 e4 3c e7 b8 20 b0 89 88 ac 5a a4 af f7 |....<.. ....Z...|
-000002a0 23 3c 0a d0 ab 74 fc 49 d2 e5 51 a7 a5 4e 21 5f |#<...t.I..Q..N!_|
-000002b0 90 9a 65 36 9f e1 e3 9e 3d 67 d6 93 f1 b8 f0 4b |..e6....=g.....K|
-000002c0 c6 d8 ca 50 fb cc 92 ab 47 b5 8c 21 02 4a ee 42 |...P....G..!.J.B|
-000002d0 35 a3 52 41 04 94 19 cd 23 c6 33 b0 84 0d 88 97 |5.RA....#.3.....|
-000002e0 5a e0 3e 4c 6d 99 ec 6d 11 3f 19 e7 77 60 3b de |Z.>Lm..m.?..w`;.|
-000002f0 6d 04 b8 ab bc 83 4f 51 a5 ba 56 56 d6 e3 ff 0e |m.....OQ..VV....|
-00000300 d5 4b 75 29 6a f9 4b c6 ef fd 62 25 89 76 f1 fd |.Ku)j.K...b%.v..|
-00000310 84 3f e9 93 63 cf eb 47 85 b1 aa a2 4c 94 6b 99 |.?..c..G....L.k.|
-00000320 98 6e 1a 19 85 0b 90 d2 9f 0f ec d4 36 1e 22 a0 |.n..........6.".|
-00000330 4e 7f a1 ae 90 15 68 8a 48 c5 06 01 aa b9 56 cb |N.....h.H.....V.|
-00000340 e0 62 53 d8 96 56 61 1d 81 96 b8 66 ae 94 c8 5f |.bS..Va....f..._|
-00000350 86 47 fe ca 27 8d 7f 8e f8 74 17 03 03 00 99 ac |.G..'....t......|
-00000360 2b 09 0b 44 a5 33 27 19 86 59 ca 75 5c df 59 fc |+..D.3'..Y.u\.Y.|
-00000370 34 57 08 11 4f d8 1a c6 7c 76 d5 0a 36 91 f2 3a |4W..O...|v..6..:|
-00000380 d1 96 58 64 29 3a d1 05 e3 cb 6f ea 92 4a f6 3b |..Xd):....o..J.;|
-00000390 54 4c 16 41 99 6e 0f e9 c3 9a ac a3 59 ee fa c9 |TL.A.n......Y...|
-000003a0 4d 58 ae 23 58 58 b5 b5 d6 6a dd b4 0c 24 bf e1 |MX.#XX...j...$..|
-000003b0 d4 16 53 f2 2d e1 78 d0 ea 70 59 ac a3 e4 e4 6f |..S.-.x..pY....o|
-000003c0 65 93 28 ad e1 64 83 11 05 42 a3 a0 11 d5 f2 af |e.(..d...B......|
-000003d0 7e 03 93 80 82 48 e0 84 2e 1c 50 98 65 22 49 f1 |~....H....P.e"I.|
-000003e0 df 41 03 83 b2 5c 1c 56 cb b7 f3 72 04 d6 09 cf |.A...\.V...r....|
-000003f0 f9 3a 5d e8 35 80 b6 a2 17 03 03 00 35 b4 b5 c3 |.:].5.......5...|
-00000400 43 78 3d e8 eb 66 7d 1c 36 8e a1 9f 26 ab 5a aa |Cx=..f}.6...&.Z.|
-00000410 63 b6 2f 7a a5 f6 7d 89 1e 5d c5 a1 bf b4 3b 4a |c./z..}..]....;J|
-00000420 89 1f 96 74 e3 c4 d8 72 57 a5 c7 99 a9 f3 77 16 |...t...rW.....w.|
-00000430 f3 25 |.%|
+00000050 2e 00 2b 00 02 03 04 00 33 00 24 00 1d 00 20 15 |..+.....3.$... .|
+00000060 b8 ae de 9d dc 14 58 fe 01 5d 08 ed 41 ac c6 c7 |......X..]..A...|
+00000070 85 fe b1 a3 ae b6 8c 47 f3 e1 4e c5 f8 8b 48 14 |.......G..N...H.|
+00000080 03 03 00 01 01 17 03 03 00 17 d6 72 35 0b 81 34 |...........r5..4|
+00000090 42 89 f1 9b 31 94 72 af 0c 3c 45 36 96 26 71 e8 |B...1.r..<E6.&q.|
+000000a0 86 17 03 03 00 42 47 ed 30 6f 20 53 07 4f b2 c1 |.....BG.0o S.O..|
+000000b0 35 49 fa 5b d9 af 6c 0b c3 71 7a f3 a8 5b 24 ba |5I.[..l..qz..[$.|
+000000c0 59 dd 34 b7 02 07 63 5d a1 ad ac 4c a2 58 e7 cd |Y.4...c]...L.X..|
+000000d0 6d f7 23 4e e1 a9 af 75 23 93 37 25 59 7e fb 52 |m.#N...u#.7%Y~.R|
+000000e0 65 a4 e7 ea 0a df a7 ce 17 03 03 02 6d e5 aa db |e...........m...|
+000000f0 1d 7e 55 0f b4 79 96 de 15 74 52 95 52 c8 ce d6 |.~U..y...tR.R...|
+00000100 85 a9 a8 6f 79 63 cf d7 3a 9e 38 d2 9d 0a 73 a0 |...oyc..:.8...s.|
+00000110 0b c3 f3 85 77 d3 63 16 9b 13 79 e6 61 96 08 57 |....w.c...y.a..W|
+00000120 ba 4a 64 b6 af 1a 98 22 a6 d9 20 82 2c 40 28 57 |.Jd....".. .,@(W|
+00000130 b8 95 d6 b4 94 46 8f 67 2d eb ee 02 74 d3 94 e7 |.....F.g-...t...|
+00000140 6e 5b 2f a9 7d a2 c2 aa 89 0c 43 c3 9d 92 6f 16 |n[/.}.....C...o.|
+00000150 27 84 d7 79 dd 4b 6a ed 9b fc cd d7 c0 c4 59 09 |'..y.Kj.......Y.|
+00000160 21 1f 83 67 e7 76 c8 ee bf f5 79 87 a0 bd 14 6d |!..g.v....y....m|
+00000170 db ac 06 04 c4 3b 3a a7 1e cb 22 d1 97 21 9d c2 |.....;:..."..!..|
+00000180 ee ed a8 41 f7 a0 6a a0 64 2f b0 0a 6f b7 78 b8 |...A..j.d/..o.x.|
+00000190 20 36 ed 7a e9 3c 26 cb 36 7d 3c ee 73 27 32 e7 | 6.z.<&.6}<.s'2.|
+000001a0 e7 fd 6e 27 d9 da ad 48 67 29 94 50 f5 0e 56 af |..n'...Hg).P..V.|
+000001b0 e4 c5 1d d3 59 a4 de 59 d7 79 7a f3 10 36 fb ed |....Y..Y.yz..6..|
+000001c0 b1 97 00 a4 dd 6e c2 65 19 0a 73 fe 2c 49 dc c5 |.....n.e..s.,I..|
+000001d0 df 19 53 c2 7e de 0b 2b 55 3d ca 0b 39 a4 77 c4 |..S.~..+U=..9.w.|
+000001e0 21 53 93 12 f0 9a 3a 3b 97 0c 93 80 50 23 80 9e |!S....:;....P#..|
+000001f0 84 2e ef 22 2b c1 b3 dd b1 55 38 76 9a d6 a6 f1 |..."+....U8v....|
+00000200 67 11 df d9 a0 8a 18 c6 68 ef d8 7b d7 36 4b 57 |g.......h..{.6KW|
+00000210 a7 bf 4e 77 a5 f6 4f 1e be 6e 14 40 67 73 1c 20 |..Nw..O..n.@gs. |
+00000220 9f 17 30 b6 76 00 87 56 8c 2b 76 5f 04 46 5a a1 |..0.v..V.+v_.FZ.|
+00000230 0f fa 64 b3 fa da 4e 72 eb a7 95 c3 93 de 97 20 |..d...Nr....... |
+00000240 2d ea 06 84 aa f0 b6 5a ac ea 64 06 2a 8c b0 eb |-......Z..d.*...|
+00000250 58 0a e8 51 e1 34 c4 03 38 9f f7 fb ec 98 78 07 |X..Q.4..8.....x.|
+00000260 71 73 ad a5 d7 d5 d1 2d 95 b6 4f 7c 5a ee d9 f1 |qs.....-..O|Z...|
+00000270 fa e3 7d ae bd 31 98 27 31 07 f2 86 cf e5 8d 2c |..}..1.'1......,|
+00000280 e8 55 40 69 b0 26 a3 51 e8 60 59 6f 66 bb 36 4f |.U@i.&.Q.`Yof.6O|
+00000290 85 fc 36 d1 72 99 9d e1 83 ad ec 3f e8 90 a8 48 |..6.r......?...H|
+000002a0 f5 d1 41 30 59 4e 44 79 e4 de 6f 0d 37 61 01 bb |..A0YNDy..o.7a..|
+000002b0 b8 7f ee c7 a2 35 c7 12 dc d3 ca 49 8d d9 3e d8 |.....5.....I..>.|
+000002c0 24 69 34 a4 8f 92 f2 77 61 cb b7 04 f8 02 25 9c |$i4....wa.....%.|
+000002d0 88 ea c7 f0 13 3e 17 bc ac 5a 80 c4 80 c6 b0 19 |.....>...Z......|
+000002e0 d3 73 b5 94 5a 27 df 08 05 23 6e 03 64 67 ab c8 |.s..Z'...#n.dg..|
+000002f0 63 7c 76 b3 92 39 ef 29 77 28 ec 6f 05 70 a6 2f |c|v..9.)w(.o.p./|
+00000300 a0 d2 73 fd f9 cc 4f d7 6f 86 db 9a 02 84 8c 6c |..s...O.o......l|
+00000310 39 3a 54 28 38 43 ca 0d da 34 b5 d4 03 0c f8 c1 |9:T(8C...4......|
+00000320 8d 48 d0 63 c7 41 da 4c db 0a 45 56 cf 6b 0b ca |.H.c.A.L..EV.k..|
+00000330 2f a3 82 6e 8e 90 6f 8a f2 41 33 c5 56 c5 15 bd |/..n..o..A3.V...|
+00000340 c2 02 45 41 7a e7 2b 0d 15 82 a7 37 34 ea 19 c2 |..EAz.+....74...|
+00000350 8b 1d d4 17 9c 2d d4 c0 9d f3 17 03 03 00 99 37 |.....-.........7|
+00000360 6a b2 6e 07 32 19 45 80 7b 80 ef 93 b3 6e c3 19 |j.n.2.E.{....n..|
+00000370 4d fe 3e e9 7f e4 b9 37 d2 b0 83 56 f7 2f 9b 61 |M.>....7...V./.a|
+00000380 67 a1 65 b4 38 4b a1 06 c5 4a 20 44 37 26 d0 2a |g.e.8K...J D7&.*|
+00000390 b7 96 1e 72 ef a8 5d fb 5a b8 ea 26 0e 4b 38 e0 |...r..].Z..&.K8.|
+000003a0 6a 3a ab 4a e3 b4 db 00 f8 30 e6 db 02 e4 cf 89 |j:.J.....0......|
+000003b0 5b 57 b8 b8 3e 0a 97 b4 61 9e 89 7d 76 b3 9f 51 |[W..>...a..}v..Q|
+000003c0 a0 b8 46 95 8b 2b b9 25 8e 39 29 f5 97 41 e6 f1 |..F..+.%.9)..A..|
+000003d0 f0 0c 8b 70 bc 63 a0 56 24 c0 fb 0d 44 7f d8 78 |...p.c.V$...D..x|
+000003e0 c0 d5 a2 b7 53 67 c5 6d 0f 37 25 3e dc 08 e2 50 |....Sg.m.7%>...P|
+000003f0 ca 28 c3 1b ec 28 26 0c 17 03 03 00 35 ef 63 88 |.(...(&.....5.c.|
+00000400 13 79 07 a1 28 af 88 6e 8c e4 ad b3 0a 28 2a ce |.y..(..n.....(*.|
+00000410 db 0f 63 8a 16 95 ab 0a 01 51 4f 28 79 15 78 00 |..c......QO(y.x.|
+00000420 f9 7a a6 40 1b 39 98 d8 8d df 1b b9 ab 82 b9 59 |.z.@.9.........Y|
+00000430 67 b9 |g.|
>>> Flow 3 (client to server)
-00000000 14 03 03 00 01 01 17 03 03 02 1e 2e 1c 18 ac 6e |...............n|
-00000010 bd d7 35 f8 21 6f 36 d7 13 94 53 3b 56 5d 03 8e |..5.!o6...S;V]..|
-00000020 2d 92 fa cb 17 d3 75 55 13 84 9c aa be f7 34 9e |-.....uU......4.|
-00000030 35 67 9b 90 bc 76 5d 65 c0 23 b0 04 d0 ba 15 b5 |5g...v]e.#......|
-00000040 30 70 4d 8d d2 38 73 0a 3a 58 c3 bc da a4 f5 ae |0pM..8s.:X......|
-00000050 05 ee 0c 06 bd 06 fe ab 1b 31 cf 4d 46 63 cc ee |.........1.MFc..|
-00000060 8f 8a 0d e9 32 50 4d a0 f6 f2 ce c5 be 41 c2 16 |....2PM......A..|
-00000070 a7 c3 b3 8a 5c 27 4a fd 37 2d 32 d9 76 25 27 12 |....\'J.7-2.v%'.|
-00000080 03 b9 e7 ef bc c8 59 e1 16 80 dc b2 16 ae 05 b6 |......Y.........|
-00000090 cf 8e 99 0d f8 ed 5a b1 bb c1 05 d5 35 fe fd 2d |......Z.....5..-|
-000000a0 97 c6 19 d8 2d 1a a9 30 d1 4a 6d 27 45 93 5f 5d |....-..0.Jm'E._]|
-000000b0 45 f4 98 a8 d8 88 27 8f f2 ad 1e 24 6e c8 8f 12 |E.....'....$n...|
-000000c0 f7 32 b5 3d 3c e3 e0 32 56 4e 80 a8 5f 27 f0 d0 |.2.=<..2VN.._'..|
-000000d0 a1 c2 d0 22 2d 3a 36 0f bd 7b 94 9f ca 8d c1 ea |..."-:6..{......|
-000000e0 c6 1f d8 87 4a 75 bd 3e 0f ae 2f e1 78 ae 3f 00 |....Ju.>../.x.?.|
-000000f0 f4 3a 82 dd ec 3f 61 43 bf 4b f8 01 a3 32 df 13 |.:...?aC.K...2..|
-00000100 61 45 ca bb e0 9a 17 85 45 90 c6 fb 5d 79 1b 58 |aE......E...]y.X|
-00000110 54 ca 84 e9 a9 11 c4 74 82 f7 da e4 b3 4f 05 a1 |T......t.....O..|
-00000120 23 72 9f 63 b8 4c 55 e6 da 33 b9 1c b0 fe 28 72 |#r.c.LU..3....(r|
-00000130 f0 02 b6 ec 70 ae 27 d4 21 51 32 56 32 4e e7 7d |....p.'.!Q2V2N.}|
-00000140 b8 0d 75 25 45 5c 68 83 4f e3 3e 8a 87 7c 06 81 |..u%E\h.O.>..|..|
-00000150 ac ff 23 44 0e bd e7 0a 76 64 45 c4 04 df 35 db |..#D....vdE...5.|
-00000160 ab 8a 38 87 f5 e5 35 75 7a 92 85 3d 14 9e aa 19 |..8...5uz..=....|
-00000170 4d 94 25 8f c0 c3 37 ca 63 f3 dd 48 4a 6a 6b f5 |M.%...7.c..HJjk.|
-00000180 fa 52 67 30 ab ff 56 9f 58 bd cd 66 d4 83 85 d8 |.Rg0..V.X..f....|
-00000190 85 6c 6d 3c 56 e5 17 75 fc dc a7 3d ed 18 a1 3b |.lm<V..u...=...;|
-000001a0 6c e6 54 95 75 38 77 77 90 34 81 cb 1c cb e9 04 |l.T.u8ww.4......|
-000001b0 c8 d2 12 04 36 a8 9b f6 9b 6a 81 8d f5 b1 e2 ca |....6....j......|
-000001c0 31 37 27 f2 84 bd 5c 3a 1c 6c 64 83 35 94 89 ee |17'...\:.ld.5...|
-000001d0 08 42 1d 05 52 67 e6 4d 7f bb d2 21 82 8c 15 6b |.B..Rg.M...!...k|
-000001e0 e9 f9 6d bc b3 1f 5a df b8 55 aa 9d f6 aa d2 7c |..m...Z..U.....||
-000001f0 41 76 3b 1b b2 f5 b8 49 32 be bb f8 0e d3 74 be |Av;....I2.....t.|
-00000200 eb 0d 9b e2 57 b6 ec e5 61 d7 09 80 a8 63 b4 cf |....W...a....c..|
-00000210 bb 0a 14 9d 39 1c 08 58 22 c4 ae d5 4f 42 97 14 |....9..X"...OB..|
-00000220 71 e1 c0 a5 5e 8e 2f 89 27 17 03 03 00 a3 f0 96 |q...^./.'.......|
-00000230 d3 9e 8c 19 84 9a 42 d3 84 64 a6 89 40 6f d6 c9 |......B..d..@o..|
-00000240 50 90 bb 9d 16 90 9d fb aa 85 28 ab 25 63 78 a9 |P.........(.%cx.|
-00000250 dd dc 35 03 73 08 26 2b 30 53 84 f8 74 66 f2 6f |..5.s.&+0S..tf.o|
-00000260 d7 0a f0 e2 c4 10 a4 46 cf 77 ea cb b7 b7 a9 81 |.......F.w......|
-00000270 5f 09 4a 6a a5 16 a4 79 dc b0 c9 ae 5a ff 2a 7b |_.Jj...y....Z.*{|
-00000280 3f bd 7a 15 b3 02 ad 3e 90 37 46 51 71 fc 6d d0 |?.z....>.7FQq.m.|
-00000290 9f 38 42 95 1a 88 ac 5f 83 a1 8a 59 59 62 cc 4a |.8B...._...YYb.J|
-000002a0 57 d2 3e 1e 7e 1d c0 4d 41 23 85 5f 92 f4 63 16 |W.>.~..MA#._..c.|
-000002b0 df df 6e 3d d7 c1 e6 21 22 0f e1 13 82 29 a6 e3 |..n=...!"....)..|
-000002c0 f8 8c a4 a3 72 1d 61 c1 2a 9d a8 2d 13 8a 4f 87 |....r.a.*..-..O.|
-000002d0 91 17 03 03 00 35 9d 35 c8 ac 1e c6 46 8d e1 42 |.....5.5....F..B|
-000002e0 68 e5 79 77 64 15 e2 13 c0 70 1a 47 59 d0 1e c3 |h.ywd....p.GY...|
-000002f0 68 f7 5a fe 11 a2 3d e4 6e 2c b5 7d ea 98 e7 75 |h.Z...=.n,.}...u|
-00000300 7c 54 a4 35 9b 1f c9 ba 72 b1 94 17 03 03 00 17 ||T.5....r.......|
-00000310 a3 81 17 ac 97 a9 f0 91 b5 7a 04 38 ff fd 8e d3 |.........z.8....|
-00000320 d8 7b c4 40 7e d3 ea 17 03 03 00 13 a8 b1 06 94 |.{.@~...........|
-00000330 90 83 62 d5 be a8 23 d5 8b af 77 0d 90 13 98 |..b...#...w....|
+00000000 14 03 03 00 01 01 17 03 03 02 1e ad ee 84 48 28 |..............H(|
+00000010 bb dc e6 01 81 4c b3 55 85 2a 73 3a 34 d6 6b 3a |.....L.U.*s:4.k:|
+00000020 c6 e7 6b da e8 97 dc 13 72 9c d4 03 e2 fc ec e0 |..k.....r.......|
+00000030 0b 00 09 a9 3c 85 19 79 80 a3 fc da 39 b1 13 90 |....<..y....9...|
+00000040 3e 0c be 19 5a be a9 ac a5 46 a0 07 79 74 be 59 |>...Z....F..yt.Y|
+00000050 18 23 55 79 c0 29 3f 8c 37 d6 21 0c 64 57 4c f0 |.#Uy.)?.7.!.dWL.|
+00000060 a1 34 e0 52 f7 e5 3c af 48 b4 82 78 bd be 7c 90 |.4.R..<.H..x..|.|
+00000070 df 0e f3 46 84 6a e2 bb 88 aa 9a a0 ce 04 de 2b |...F.j.........+|
+00000080 b3 17 78 e1 a0 bb 65 7f c5 b3 a6 45 13 c6 11 e1 |..x...e....E....|
+00000090 e2 b4 ec 80 43 80 b6 a5 12 58 ac 5e 30 d3 a0 61 |....C....X.^0..a|
+000000a0 60 c2 90 36 aa 82 f7 ff 55 aa 4e 25 b3 29 5d 41 |`..6....U.N%.)]A|
+000000b0 67 4e 9c d4 f1 1d 55 f1 29 54 13 25 3c 04 41 8f |gN....U.)T.%<.A.|
+000000c0 6b 9d 95 06 3f 04 84 55 dd 43 7a fb 9f 73 ff df |k...?..U.Cz..s..|
+000000d0 3b da 12 3b 97 36 fa 51 0b ca c7 0b fb 6a 09 dd |;..;.6.Q.....j..|
+000000e0 61 2a df 79 b3 66 90 45 76 3c 2b c6 98 42 5a 82 |a*.y.f.Ev<+..BZ.|
+000000f0 0e 93 cf 6f 2b 60 e4 66 67 ad 43 66 73 d2 8c 94 |...o+`.fg.Cfs...|
+00000100 7f 7a 97 d5 a1 8b 07 63 44 cb 51 18 ac 2a af 19 |.z.....cD.Q..*..|
+00000110 66 df ab 18 6f 2a bf fc 7a fa 64 52 c4 1e 91 71 |f...o*..z.dR...q|
+00000120 f1 f7 7f 79 e1 ed 07 3a e1 08 07 d3 db 4d 74 76 |...y...:.....Mtv|
+00000130 db fa b9 b4 68 e3 d8 e7 8d ad 49 a7 1d 6d 7e 4e |....h.....I..m~N|
+00000140 3a 6a d2 9a c3 b0 72 61 bb 72 b8 8d 98 58 6e 2e |:j....ra.r...Xn.|
+00000150 20 f8 ab 4a df 96 c7 6c fe 33 5b 76 b0 80 26 34 | ..J...l.3[v..&4|
+00000160 b9 5c 9a 79 50 d7 6a 29 25 11 20 4e 3c b6 a7 73 |.\.yP.j)%. N<..s|
+00000170 64 55 a6 8e 57 22 4a 98 5e 14 95 21 ff 8d 3f 05 |dU..W"J.^..!..?.|
+00000180 eb d9 30 8e f1 a3 56 3a d8 6d 6e 07 de a2 62 ec |..0...V:.mn...b.|
+00000190 e4 06 bb 96 ae a3 23 d0 bd fd c7 f3 ee 2f 21 3f |......#....../!?|
+000001a0 8f 25 7a 4a fb 47 cf 78 db 74 35 c8 67 e6 f0 99 |.%zJ.G.x.t5.g...|
+000001b0 39 4e 1f 50 1a bc 64 2e ae 8e b5 38 63 06 86 5a |9N.P..d....8c..Z|
+000001c0 2b 1b b5 b9 a1 18 58 24 32 ce c9 de 66 ba 21 b3 |+.....X$2...f.!.|
+000001d0 d8 0f fa 3a 88 ac 6e 66 57 2c 45 5b 59 85 d4 b0 |...:..nfW,E[Y...|
+000001e0 ad 32 8c ef 0c 2a 51 1a cc ca 6a 82 3e 70 41 cc |.2...*Q...j.>pA.|
+000001f0 b8 80 db a0 48 22 47 49 a1 a5 d2 9a 80 dc 09 bc |....H"GI........|
+00000200 c8 c7 dd 53 4b 44 2f 9a 75 06 b7 31 5e fd 74 f5 |...SKD/.u..1^.t.|
+00000210 d4 53 e2 90 dc b7 9a 13 ca 00 96 56 a1 1b dd 71 |.S.........V...q|
+00000220 54 25 77 fa 42 31 95 dd ba 17 03 03 00 a3 9e 23 |T%w.B1.........#|
+00000230 96 bb c9 d5 30 f7 f4 a3 4c 33 a4 bd 2b 09 93 f5 |....0...L3..+...|
+00000240 04 02 a7 d7 9d 2e 00 5e 18 bc 18 de 1b 94 28 51 |.......^......(Q|
+00000250 4b cd 2c 15 0e 75 b1 59 12 96 8f eb cb b5 a4 4a |K.,..u.Y.......J|
+00000260 ea c2 e0 1d 28 72 4b 8f 62 d3 7d f0 2f f1 c4 de |....(rK.b.}./...|
+00000270 6a 6e dc 9c 43 80 c8 ae 99 86 97 de 67 58 d6 4c |jn..C.......gX.L|
+00000280 91 74 dc c3 23 a5 32 9b df f5 1e 64 15 04 7d df |.t..#.2....d..}.|
+00000290 12 e4 40 52 77 5c a3 26 de 20 b6 92 a5 d8 18 cf |..@Rw\.&. ......|
+000002a0 63 7e 9e 47 b8 ed db ee b7 9d b6 1c e5 c0 ad 7f |c~.G............|
+000002b0 d6 07 89 d8 b3 a0 2e 87 b9 81 0d 44 37 c2 c5 13 |...........D7...|
+000002c0 cc cb 70 87 e3 49 6e eb 66 79 76 37 4a f1 c4 4e |..p..In.fyv7J..N|
+000002d0 82 17 03 03 00 35 52 42 2a a8 a5 7a eb 5f 32 d5 |.....5RB*..z._2.|
+000002e0 68 71 42 8b ce 62 f0 48 43 0b 0f b8 8c ed 16 f4 |hqB..b.HC.......|
+000002f0 64 7e d3 74 57 9d 83 00 ad bc 9b f8 ed bb 23 35 |d~.tW.........#5|
+00000300 07 e9 7c b2 a1 d6 76 d0 f5 ba 15 17 03 03 00 17 |..|...v.........|
+00000310 e2 3f a0 cb 23 fe 4c f1 aa cb 21 70 74 46 4f 10 |.?..#.L...!ptFO.|
+00000320 30 76 0a 72 49 09 65 17 03 03 00 13 ee 7b 9d 32 |0v.rI.e......{.2|
+00000330 ac d4 8a 40 99 1b 0a 23 f7 a4 c6 a6 ef 33 77 |...@...#.....3w|
diff --git a/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
index 1132b39..c8f11ea 100644
--- a/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
@@ -1,11 +1,10 @@
>>> Flow 1 (client to server)
-00000000 16 03 01 00 63 01 00 00 5f 03 01 38 de f5 d6 ae |....c..._..8....|
-00000010 46 71 e8 02 f2 45 88 b8 64 fb 6e 68 67 d1 7f e8 |Fq...E..d.nhg...|
-00000020 49 71 1e a9 ec 8e 54 06 bb 2b 16 00 00 04 c0 0a |Iq....T..+......|
-00000030 00 ff 01 00 00 32 00 00 00 0e 00 0c 00 00 09 31 |.....2.........1|
-00000040 32 37 2e 30 2e 30 2e 31 00 0b 00 04 03 00 01 02 |27.0.0.1........|
-00000050 00 0a 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 |................|
-00000060 00 16 00 00 00 17 00 00 |........|
+00000000 16 03 01 00 51 01 00 00 4d 03 01 8a c0 af 21 2c |....Q...M.....!,|
+00000010 ff 48 d6 fd 10 92 4a 8c 84 c7 9e c3 90 3a f5 bf |.H....J......:..|
+00000020 cd 36 1b 2f 96 8b 13 86 f1 ff 5e 00 00 04 c0 0a |.6./......^.....|
+00000030 00 ff 01 00 00 20 00 0b 00 04 03 00 01 02 00 0a |..... ..........|
+00000040 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 00 16 |................|
+00000050 00 00 00 17 00 00 |......|
>>> Flow 2 (server to client)
00000000 16 03 01 00 37 02 00 00 33 03 01 00 00 00 00 00 |....7...3.......|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
@@ -44,37 +43,37 @@
00000220 0d 94 06 bb d4 37 7a f6 ec 7a c9 86 2e dd d7 11 |.....7z..z......|
00000230 69 7f 85 7c 56 de fb 31 78 2b e4 c7 78 0d ae cb |i..|V..1x+..x...|
00000240 be 9e 4e 36 24 31 7b 6a 0f 39 95 12 07 8f 2a 16 |..N6$1{j.9....*.|
-00000250 03 01 00 b5 0c 00 00 b1 03 00 1d 20 2f e5 7d a3 |........... /.}.|
+00000250 03 01 00 b4 0c 00 00 b0 03 00 1d 20 2f e5 7d a3 |........... /.}.|
00000260 47 cd 62 43 15 28 da ac 5f bb 29 07 30 ff f6 84 |G.bC.(.._.).0...|
-00000270 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 00 8b 30 81 |......._X.;t..0.|
-00000280 88 02 42 01 ad 26 fd 16 9a 93 5f 87 ce 29 8c d2 |..B..&...._..)..|
-00000290 56 a7 d2 59 56 bd d3 1f 90 54 bd af 91 81 25 ff |V..YV....T....%.|
-000002a0 66 74 57 16 2f 31 f2 5a 48 97 03 b9 41 4c 8e bb |ftW./1.ZH...AL..|
-000002b0 87 31 ed 71 84 37 63 78 9f 0a c7 9d 5e f3 5a 53 |.1.q.7cx....^.ZS|
-000002c0 88 89 46 ba a7 02 42 00 92 74 15 1c 0e 1f 2f 95 |..F...B..t..../.|
-000002d0 e5 79 d5 e9 90 ce d8 96 0d fd b8 42 55 00 94 08 |.y.........BU...|
-000002e0 4e 47 a9 ea bd 67 0b 02 a6 9e 8b d3 09 e5 53 ea |NG...g........S.|
-000002f0 03 22 2e 2d 78 2c 69 1d 28 ab 13 3d 0a 46 15 09 |.".-x,i.(..=.F..|
-00000300 b6 0b 74 69 2d 5a 96 bf b6 16 03 01 00 04 0e 00 |..ti-Z..........|
-00000310 00 00 |..|
+00000270 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 00 8a 30 81 |......._X.;t..0.|
+00000280 87 02 42 01 ea 1b 6f 67 3e cd 57 50 12 78 5a db |..B...og>.WP.xZ.|
+00000290 06 12 77 04 9d df 0c b0 98 4b a7 e8 23 fb ad 46 |..w......K..#..F|
+000002a0 ef 9b 99 d3 02 4b 46 51 c4 49 2a ae 29 b4 a7 e5 |.....KFQ.I*.)...|
+000002b0 08 d0 db ce 28 af 21 43 37 d4 29 03 00 e3 5f 50 |....(.!C7.)..._P|
+000002c0 35 cd 0a 3f 9d 02 41 35 05 7c a0 ed 81 23 98 38 |5..?..A5.|...#.8|
+000002d0 af 2c 12 8f 59 94 77 c7 56 ef 0b db 60 d0 5b 72 |.,..Y.w.V...`.[r|
+000002e0 9e fd 2a 6c ea 1d af cb ce 5b df 34 52 2a 4b 38 |..*l.....[.4R*K8|
+000002f0 48 81 2c 39 76 61 58 19 80 1b e0 eb fb 53 35 94 |H.,9vaX......S5.|
+00000300 55 ba a6 2b a2 b3 50 b4 16 03 01 00 04 0e 00 00 |U..+..P.........|
+00000310 00 |.|
>>> Flow 3 (client to server)
-00000000 16 03 01 00 25 10 00 00 21 20 82 c0 dd 83 c2 45 |....%...! .....E|
-00000010 a2 bc 3a 2a ec ab 60 8e 02 e0 db 7c 59 83 c1 62 |..:*..`....|Y..b|
-00000020 c7 cc 61 1e de dc 40 e4 65 6c 14 03 01 00 01 01 |..a...@.el......|
-00000030 16 03 01 00 30 3e 26 56 0b a2 10 47 00 55 27 21 |....0>&V...G.U'!|
-00000040 63 33 f2 7d 4b ba 77 5f e7 a7 09 7a 1f 51 85 f2 |c3.}K.w_...z.Q..|
-00000050 46 a5 af 80 79 1a c7 72 bb 3d f9 dd 1d 83 05 22 |F...y..r.=....."|
-00000060 c9 6c dd 91 d9 |.l...|
+00000000 16 03 01 00 25 10 00 00 21 20 29 f2 f2 54 f4 ff |....%...! )..T..|
+00000010 59 de df ab 55 18 04 cd 8c 27 28 7e 11 11 09 84 |Y...U....'(~....|
+00000020 18 e1 0f 09 70 f8 d7 13 a1 38 14 03 01 00 01 01 |....p....8......|
+00000030 16 03 01 00 30 d8 40 dc 30 cb d6 25 de 23 01 84 |....0.@.0..%.#..|
+00000040 30 75 1c 17 bd f3 fe 7e b4 cd 61 f3 55 c4 30 55 |0u.....~..a.U.0U|
+00000050 ee 43 6f f0 6b a7 0a ed 88 d9 d4 72 7c c7 c6 c7 |.Co.k......r|...|
+00000060 4d 2f 7b 9f 9b |M/{..|
>>> Flow 4 (server to client)
-00000000 14 03 01 00 01 01 16 03 01 00 30 38 fa fd 42 8f |..........08..B.|
-00000010 80 5a 7c 33 d4 6c 72 f7 4e 2f 00 ab c2 86 58 9d |.Z|3.lr.N/....X.|
-00000020 fc a5 43 fa ea 5b a1 ee a9 df df 9d 90 4c c0 e3 |..C..[.......L..|
-00000030 10 09 c4 23 21 f9 e9 69 f5 f8 fa 17 03 01 00 20 |...#!..i....... |
-00000040 1e 57 17 e4 96 06 32 d4 00 a3 98 ed bd 1c 61 78 |.W....2.......ax|
-00000050 e7 0d 89 ec 84 c3 56 fa 75 73 87 6f 47 35 80 3f |......V.us.oG5.?|
-00000060 17 03 01 00 30 4d 51 0a dd 70 6d b0 c2 d1 46 5c |....0MQ..pm...F\|
-00000070 b5 03 87 de e6 65 d3 e2 83 e0 33 f8 a2 0a 29 7f |.....e....3...).|
-00000080 6c 24 2b 1f 7b 2b 53 19 21 e9 62 6c 31 75 9c be |l$+.{+S.!.bl1u..|
-00000090 5b b0 3d 5b 1a 15 03 01 00 20 19 51 64 4b 5a 9b |[.=[..... .QdKZ.|
-000000a0 c8 2a 1c e7 9e 29 d9 df ad 1d 08 09 82 a3 b1 1d |.*...)..........|
-000000b0 60 99 00 25 30 51 a1 72 b6 27 |`..%0Q.r.'|
+00000000 14 03 01 00 01 01 16 03 01 00 30 60 b7 c0 a3 ba |..........0`....|
+00000010 ad dd 52 99 15 7a f2 9e 10 21 02 7c 91 6d cf c9 |..R..z...!.|.m..|
+00000020 09 ab fe 9c b3 46 46 60 1c 24 66 3f b6 14 b1 51 |.....FF`.$f?...Q|
+00000030 ac 05 75 48 03 c1 e0 3a c2 6d 5e 17 03 01 00 20 |..uH...:.m^.... |
+00000040 82 87 18 81 c3 24 55 8f 9c a3 49 fc 8a 8a 7a fe |.....$U...I...z.|
+00000050 93 05 c9 7e 90 73 a4 b1 0a d7 3b 7d 72 1f fc 6c |...~.s....;}r..l|
+00000060 17 03 01 00 30 1f 51 a5 44 2e 7a 40 12 43 28 c6 |....0.Q.D.z@.C(.|
+00000070 99 05 6d 92 d9 ed 0d f2 fb a7 48 a3 03 e9 34 b1 |..m.......H...4.|
+00000080 52 32 e1 be a9 7e bf b1 0e 1f b4 1c 3e 0a 9d d9 |R2...~......>...|
+00000090 90 10 4f 79 dd 15 03 01 00 20 57 98 fd dd 09 f9 |..Oy..... W.....|
+000000a0 c5 d9 33 24 1a b2 ed 56 ad 91 c9 25 2f ff ff 09 |..3$...V...%/...|
+000000b0 dc b0 2c 38 cc 70 1f cc 6f f4 |..,8.p..o.|
diff --git a/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
index d7e6188..62f4311 100644
--- a/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
@@ -1,14 +1,13 @@
>>> Flow 1 (client to server)
-00000000 16 03 01 00 97 01 00 00 93 03 03 86 3b 10 1e 5f |............;.._|
-00000010 81 eb 21 bd 77 47 61 e9 3f 82 85 14 91 8c ab 7d |..!.wGa.?......}|
-00000020 84 bd b1 f0 06 20 8a 7b 06 d6 78 00 00 04 c0 0a |..... .{..x.....|
-00000030 00 ff 01 00 00 66 00 00 00 0e 00 0c 00 00 09 31 |.....f.........1|
-00000040 32 37 2e 30 2e 30 2e 31 00 0b 00 04 03 00 01 02 |27.0.0.1........|
-00000050 00 0a 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 |................|
-00000060 00 16 00 00 00 17 00 00 00 0d 00 30 00 2e 04 03 |...........0....|
-00000070 05 03 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 |................|
-00000080 08 05 08 06 04 01 05 01 06 01 03 03 02 03 03 01 |................|
-00000090 02 01 03 02 02 02 04 02 05 02 06 02 |............|
+00000000 16 03 01 00 85 01 00 00 81 03 03 20 34 f0 4b 7a |........... 4.Kz|
+00000010 4f ed 31 de 38 ef 33 2e 69 7d 74 35 e5 02 b9 bb |O.1.8.3.i}t5....|
+00000020 bd 1a 5c 3a f2 57 f1 23 62 66 52 00 00 04 c0 0a |..\:.W.#bfR.....|
+00000030 00 ff 01 00 00 54 00 0b 00 04 03 00 01 02 00 0a |.....T..........|
+00000040 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 00 16 |................|
+00000050 00 00 00 17 00 00 00 0d 00 30 00 2e 04 03 05 03 |.........0......|
+00000060 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 08 05 |................|
+00000070 08 06 04 01 05 01 06 01 03 03 02 03 03 01 02 01 |................|
+00000080 03 02 02 02 04 02 05 02 06 02 |..........|
>>> Flow 2 (server to client)
00000000 16 03 03 00 37 02 00 00 33 03 03 00 00 00 00 00 |....7...3.......|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
@@ -47,39 +46,39 @@
00000220 0d 94 06 bb d4 37 7a f6 ec 7a c9 86 2e dd d7 11 |.....7z..z......|
00000230 69 7f 85 7c 56 de fb 31 78 2b e4 c7 78 0d ae cb |i..|V..1x+..x...|
00000240 be 9e 4e 36 24 31 7b 6a 0f 39 95 12 07 8f 2a 16 |..N6$1{j.9....*.|
-00000250 03 03 00 b7 0c 00 00 b3 03 00 1d 20 2f e5 7d a3 |........... /.}.|
+00000250 03 03 00 b6 0c 00 00 b2 03 00 1d 20 2f e5 7d a3 |........... /.}.|
00000260 47 cd 62 43 15 28 da ac 5f bb 29 07 30 ff f6 84 |G.bC.(.._.).0...|
-00000270 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 04 03 00 8b |......._X.;t....|
-00000280 30 81 88 02 42 01 c5 d1 36 97 5b 0e 5e a6 90 50 |0...B...6.[.^..P|
-00000290 a0 2e 80 b5 df d7 5a f6 95 0d a4 c6 f0 da 2e e7 |......Z.........|
-000002a0 91 79 9f 85 2e ef ca 66 3c f7 c4 7b bd 61 70 bb |.y.....f<..{.ap.|
-000002b0 16 c5 aa 00 35 33 ae 58 00 b3 f1 fe 0f 77 52 23 |....53.X.....wR#|
-000002c0 f4 40 ba 4b c7 e5 43 02 42 01 64 af ab 8a 87 38 |.@.K..C.B.d....8|
-000002d0 a1 7f b8 ae 84 0e a4 ff ad 16 09 44 0b 65 67 70 |...........D.egp|
-000002e0 12 7f 1a 37 9a 1d 5e b7 3b 63 df f9 6b f1 b9 ba |...7..^.;c..k...|
-000002f0 6b 35 8f b3 03 da 3d 61 00 3d 4e 75 b4 d0 92 d5 |k5....=a.=Nu....|
-00000300 ee 50 9d d7 f9 26 69 e6 ec cf 3b 16 03 03 00 04 |.P...&i...;.....|
-00000310 0e 00 00 00 |....|
+00000270 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 04 03 00 8a |......._X.;t....|
+00000280 30 81 87 02 41 21 2b cf 6b fc 8a 13 b6 21 8a 46 |0...A!+.k....!.F|
+00000290 fc 7c 56 7e 28 22 4d b2 c2 c8 45 92 cc 99 6a 3c |.|V~("M...E...j<|
+000002a0 48 0f 16 95 6c 43 3d ea bd ac 25 88 a3 35 0c 14 |H...lC=...%..5..|
+000002b0 c6 43 46 16 ec b5 57 76 86 1c 5a d1 52 44 3b 8c |.CF...Wv..Z.RD;.|
+000002c0 e5 b3 46 3b 47 d8 02 42 01 ad a2 c3 4c 69 35 13 |..F;G..B....Li5.|
+000002d0 d7 66 37 63 c9 43 50 68 f6 ff 7f 7d be 7e 8d 89 |.f7c.CPh...}.~..|
+000002e0 db 57 3e 0f 51 c8 49 9b 3a e2 87 65 dd 28 21 9a |.W>.Q.I.:..e.(!.|
+000002f0 c3 36 28 a4 e8 25 7b ae 8e 45 35 22 8f 2d 97 27 |.6(..%{..E5".-.'|
+00000300 fe b8 99 a9 c1 5f d8 8b 70 d3 16 03 03 00 04 0e |....._..p.......|
+00000310 00 00 00 |...|
>>> Flow 3 (client to server)
-00000000 16 03 03 00 25 10 00 00 21 20 54 db 5b a1 4c e0 |....%...! T.[.L.|
-00000010 0e 52 a2 45 e3 b4 ac 91 3d e1 de a9 3e eb 80 9e |.R.E....=...>...|
-00000020 f5 04 7b fc 82 10 2f d9 d1 41 14 03 03 00 01 01 |..{.../..A......|
-00000030 16 03 03 00 40 47 68 cc 5e 68 3f 05 d6 f8 5c 11 |....@Gh.^h?...\.|
-00000040 08 a3 91 72 ae 4c 98 67 2f 45 ee 16 6b 8b 2d 28 |...r.L.g/E..k.-(|
-00000050 15 34 43 47 f9 46 f2 96 c2 85 d5 cc 03 e0 84 de |.4CG.F..........|
-00000060 9c 03 fe bf c9 73 23 15 d0 0f 85 3a 76 db 9f 5d |.....s#....:v..]|
-00000070 95 b7 de 9c c2 |.....|
+00000000 16 03 03 00 25 10 00 00 21 20 c4 25 45 6f 39 18 |....%...! .%Eo9.|
+00000010 b1 f6 0a b3 f7 3e 98 ed 63 ae bd 74 12 91 0d 81 |.....>..c..t....|
+00000020 84 71 13 3c a7 cf a5 d2 24 5f 14 03 03 00 01 01 |.q.<....$_......|
+00000030 16 03 03 00 40 27 8d 44 74 7a ae 8a 4e 1c f9 1b |....@'.Dtz..N...|
+00000040 05 23 c4 89 57 27 4c dc db 4a ae aa 08 74 00 55 |.#..W'L..J...t.U|
+00000050 f9 4e 63 02 75 24 ca fb 30 78 cc 82 8a 69 be ab |.Nc.u$..0x...i..|
+00000060 10 9d 25 2d a8 b6 bb 64 6e 32 68 4b 0a 32 06 74 |..%-...dn2hK.2.t|
+00000070 26 5e bc 68 25 |&^.h%|
>>> Flow 4 (server to client)
00000000 14 03 03 00 01 01 16 03 03 00 40 00 00 00 00 00 |..........@.....|
-00000010 00 00 00 00 00 00 00 00 00 00 00 98 34 52 f3 44 |............4R.D|
-00000020 18 69 23 61 ef 8f e9 c0 88 9c ad 1f cb e4 8d 55 |.i#a...........U|
-00000030 bd bb 77 9c 65 9d 21 f0 54 4c 46 db 4f e6 e8 ab |..w.e.!.TLF.O...|
-00000040 6b 1d 60 38 7f e0 2c 38 ef e7 43 17 03 03 00 40 |k.`8..,8..C....@|
+00000010 00 00 00 00 00 00 00 00 00 00 00 b0 cf 70 b3 00 |.............p..|
+00000020 89 e2 77 af 87 08 f5 2f 2c c8 75 ce 8a ed 30 d8 |..w..../,.u...0.|
+00000030 f7 44 f3 9d 8b 4c 42 7a 52 d0 c8 37 9b 45 46 1c |.D...LBzR..7.EF.|
+00000040 56 3b ee 52 5d c4 72 04 13 49 aa 17 03 03 00 40 |V;.R].r..I.....@|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
-00000060 44 68 90 07 1e 8c 7f db 3e 3f 8c 28 e1 d7 41 38 |Dh......>?.(..A8|
-00000070 e2 78 04 e3 42 c2 a9 76 bb 0a ae b9 93 df 81 d7 |.x..B..v........|
-00000080 9b 0f 1d 44 19 79 ff 7c 21 8f 75 ca e2 82 cc c4 |...D.y.|!.u.....|
+00000060 ce c4 34 c2 d8 4e f5 db d1 ff 6d 64 ae 39 6d 78 |..4..N....md.9mx|
+00000070 3c c4 57 32 d1 af 35 d3 b4 79 3c b4 bd a1 21 7b |<.W2..5..y<...!{|
+00000080 1f ef b8 3c 97 37 18 e5 10 62 e8 3d 7d 12 f5 db |...<.7...b.=}...|
00000090 15 03 03 00 30 00 00 00 00 00 00 00 00 00 00 00 |....0...........|
-000000a0 00 00 00 00 00 82 1f e6 2c 3f c7 55 19 01 0b 62 |........,?.U...b|
-000000b0 1a 99 fc f8 d3 b0 38 21 41 92 1a d1 e0 43 96 da |......8!A....C..|
-000000c0 80 4b 58 91 c8 |.KX..|
+000000a0 00 00 00 00 00 81 75 ae 71 18 61 61 ae 35 ce c8 |......u.q.aa.5..|
+000000b0 43 57 52 c9 68 5e 0d 63 c4 0e 7d 36 90 b2 f6 f6 |CWR.h^.c..}6....|
+000000c0 ea 72 3c d9 41 |.r<.A|
diff --git a/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES b/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES
index d2b0250..22909cc 100644
--- a/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES
+++ b/src/crypto/tls/testdata/Server-TLSv13-ECDHE-ECDSA-AES
@@ -1,96 +1,94 @@
>>> Flow 1 (client to server)
-00000000 16 03 01 00 dc 01 00 00 d8 03 03 90 bc cf 62 d0 |..............b.|
-00000010 bc 89 6b 84 ad 18 87 f5 9c 96 0e 02 3f ae a5 4b |..k.........?..K|
-00000020 80 70 f8 54 47 b1 78 03 48 4d 06 20 ae 9e 3c 17 |.p.TG.x.HM. ..<.|
-00000030 1a c6 fa 52 84 da ea a9 9c 08 e7 10 65 3a 65 4e |...R........e:eN|
-00000040 d1 65 61 40 bf 7c ee db d4 f2 73 ff 00 04 13 01 |.ea@.|....s.....|
-00000050 00 ff 01 00 00 8b 00 00 00 0e 00 0c 00 00 09 31 |...............1|
-00000060 32 37 2e 30 2e 30 2e 31 00 0b 00 04 03 00 01 02 |27.0.0.1........|
-00000070 00 0a 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 |................|
-00000080 00 16 00 00 00 17 00 00 00 0d 00 1e 00 1c 04 03 |................|
-00000090 05 03 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 |................|
-000000a0 08 05 08 06 04 01 05 01 06 01 00 2b 00 03 02 03 |...........+....|
-000000b0 04 00 2d 00 02 01 01 00 33 00 26 00 24 00 1d 00 |..-.....3.&.$...|
-000000c0 20 ad 11 a7 07 20 9c cb 33 96 f4 0d 78 a1 89 55 | .... ..3...x..U|
-000000d0 6c af 70 f4 ac d6 cb d9 0d 1b 13 fa 50 de 68 17 |l.p.........P.h.|
-000000e0 1d |.|
+00000000 16 03 01 00 ca 01 00 00 c6 03 03 30 09 bc 8e d5 |...........0....|
+00000010 59 36 2b f3 2b 0f 9d 32 ff 23 ba c7 4a 1f 50 e6 |Y6+.+..2.#..J.P.|
+00000020 32 bd 0e c3 f6 df b7 70 dc d5 0c 20 44 0e b7 7b |2......p... D..{|
+00000030 a0 37 9f 1d 8d 7e 93 f7 c0 7d 25 d3 f8 e5 65 50 |.7...~...}%...eP|
+00000040 79 5e 4f 53 e5 67 40 f0 bf ad 4d f8 00 04 13 01 |y^OS.g@...M.....|
+00000050 00 ff 01 00 00 79 00 0b 00 04 03 00 01 02 00 0a |.....y..........|
+00000060 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 00 16 |................|
+00000070 00 00 00 17 00 00 00 0d 00 1e 00 1c 04 03 05 03 |................|
+00000080 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 08 05 |................|
+00000090 08 06 04 01 05 01 06 01 00 2b 00 03 02 03 04 00 |.........+......|
+000000a0 2d 00 02 01 01 00 33 00 26 00 24 00 1d 00 20 23 |-.....3.&.$... #|
+000000b0 23 ab 76 3d e8 d5 1b 9f 03 71 bc bf 3d 18 3a 86 |#.v=.....q..=.:.|
+000000c0 5d 59 ee ac b9 0a 2f f6 fc 5d 13 7b 3e 88 68 |]Y..../..].{>.h|
>>> Flow 2 (server to client)
00000000 16 03 03 00 7a 02 00 00 76 03 03 00 00 00 00 00 |....z...v.......|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
-00000020 00 00 00 00 00 00 00 00 00 00 00 20 ae 9e 3c 17 |........... ..<.|
-00000030 1a c6 fa 52 84 da ea a9 9c 08 e7 10 65 3a 65 4e |...R........e:eN|
-00000040 d1 65 61 40 bf 7c ee db d4 f2 73 ff 13 01 00 00 |.ea@.|....s.....|
+00000020 00 00 00 00 00 00 00 00 00 00 00 20 44 0e b7 7b |........... D..{|
+00000030 a0 37 9f 1d 8d 7e 93 f7 c0 7d 25 d3 f8 e5 65 50 |.7...~...}%...eP|
+00000040 79 5e 4f 53 e5 67 40 f0 bf ad 4d f8 13 01 00 00 |y^OS.g@...M.....|
00000050 2e 00 2b 00 02 03 04 00 33 00 24 00 1d 00 20 2f |..+.....3.$... /|
00000060 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0|
00000070 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 14 |.........._X.;t.|
-00000080 03 03 00 01 01 17 03 03 00 17 f1 16 14 8f 0a b5 |................|
-00000090 92 fa 55 d7 fb 6c 33 04 ae c6 ed 3b 90 27 e9 ae |..U..l3....;.'..|
-000000a0 e8 17 03 03 02 22 ca b1 97 19 9d da 2e 1d 12 f4 |....."..........|
-000000b0 05 af 35 28 1e 85 9d 28 81 f0 5a 83 46 9c df f7 |..5(...(..Z.F...|
-000000c0 58 2e 30 fa b9 07 00 cf fe 69 37 5e f2 75 a0 ef |X.0......i7^.u..|
-000000d0 f3 ab 60 0b c5 09 72 bd b4 42 2f 45 24 3e 82 d0 |..`...r..B/E$>..|
-000000e0 f1 a1 dd 3a de 6a b9 9d 85 2b 83 75 47 c9 d2 c3 |...:.j...+.uG...|
-000000f0 25 91 85 c2 a1 97 6a 62 dd aa 19 11 94 e2 6b f9 |%.....jb......k.|
-00000100 7d 5a bc 5e d4 64 bc 74 44 85 d1 7a eb 3a ef d5 |}Z.^.d.tD..z.:..|
-00000110 96 f4 22 64 61 2b 79 77 ac 8b 61 69 cc eb ad fd |.."da+yw..ai....|
-00000120 38 5e 61 74 d9 4f 70 82 06 3b 3e f8 a8 53 7c e8 |8^at.Op..;>..S|.|
-00000130 9d 98 43 a1 af 86 ba d9 64 64 f0 e0 b0 8f 39 6b |..C.....dd....9k|
-00000140 16 d6 92 09 8d 5b d0 34 f4 14 60 69 a0 28 73 3a |.....[.4..`i.(s:|
-00000150 24 7f 81 4e 8b d1 50 49 1a c0 60 92 fd 02 47 6d |$..N..PI..`...Gm|
-00000160 d8 97 62 b2 b4 57 8b d7 d1 b6 bf 19 40 cb 13 09 |..b..W......@...|
-00000170 ef d6 55 66 39 88 29 e0 14 2d 06 98 d6 b6 bf a6 |..Uf9.)..-......|
-00000180 04 10 47 d5 64 fe 38 69 db 33 a4 fc 12 de 83 5b |..G.d.8i.3.....[|
-00000190 c9 8e 76 56 bc f7 dd ac 96 c6 a0 ed e5 43 0b 13 |..vV.........C..|
-000001a0 1e 78 94 18 fd 57 50 79 08 91 18 aa 84 63 4e 46 |.x...WPy.....cNF|
-000001b0 53 db e0 f3 9a 0b d6 13 20 36 aa 56 dd 7a 62 d9 |S....... 6.V.zb.|
-000001c0 3f f6 bd 87 74 3c 86 d1 94 a1 04 79 a8 54 e4 8e |?...t<.....y.T..|
-000001d0 11 d6 52 42 5c 4b 77 18 b9 d7 db f7 48 9a 69 e1 |..RB\Kw.....H.i.|
-000001e0 2d b9 38 38 e4 e8 94 5e b1 7e 2c 81 96 6a a0 ed |-.88...^.~,..j..|
-000001f0 bb 35 6a 8c 93 f2 6d 38 70 df 79 54 d9 45 c8 b8 |.5j...m8p.yT.E..|
-00000200 b2 9c 0f 9f 70 34 8f ac b3 08 f5 3e b1 d2 5a d7 |....p4.....>..Z.|
-00000210 7b ee f3 dc 9a d1 12 c3 77 24 76 9b bf 09 50 a7 |{.......w$v...P.|
-00000220 3c ab 7f 1f 99 b5 02 8c ac 5e 85 cc 53 fd ca e0 |<........^..S...|
-00000230 c7 e2 41 08 fd cb b0 79 0c 8b 02 4f 80 92 c2 cd |..A....y...O....|
-00000240 6c a1 aa 75 d2 4c d1 25 40 7c 14 41 a7 15 20 a3 |l..u.L.%@|.A.. .|
-00000250 a6 81 64 7c c0 c7 2d dd 82 84 ad 2a f4 06 f9 61 |..d|..-....*...a|
-00000260 23 1c dd c6 ef 72 da 6b eb be 41 f0 b4 5f 9a 02 |#....r.k..A.._..|
-00000270 ee a8 f3 bb 05 48 ec 50 a3 ff f3 94 bb d8 a9 6d |.....H.P.......m|
-00000280 92 49 7c bf a1 eb 55 26 08 26 d3 80 d6 cb 05 ea |.I|...U&.&......|
-00000290 d1 db bf 97 3d 10 ff 4e f6 05 33 23 68 95 31 42 |....=..N..3#h.1B|
-000002a0 5a d5 30 61 79 c4 88 7f e1 be 28 ad 72 bb 78 36 |Z.0ay.....(.r.x6|
-000002b0 ba bb 38 75 fb 97 33 b6 28 8c a2 f4 46 fe 37 d8 |..8u..3.(...F.7.|
-000002c0 b0 67 63 97 c1 51 0c 61 17 03 03 00 a4 20 15 70 |.gc..Q.a..... .p|
-000002d0 7a 69 b1 33 c2 e1 f5 9c 2b b2 06 1e 01 a6 7f 03 |zi.3....+.......|
-000002e0 cd 00 13 02 3b 0c 2b 3f 85 d8 ed 6d 81 7e e9 b2 |....;.+?...m.~..|
-000002f0 b6 be 7b 77 51 30 dd b5 fc 93 08 91 9e 46 e2 85 |..{wQ0.......F..|
-00000300 74 3c 9a 04 26 86 b8 6c 98 99 57 7e 36 54 0d 90 |t<..&..l..W~6T..|
-00000310 4c 55 65 77 69 59 b2 e5 5b a3 19 4a b0 72 3d 91 |LUewiY..[..J.r=.|
-00000320 2e 5d 9b 8c 52 a1 e6 f5 22 c6 3c 0d 9b d8 9c b9 |.]..R...".<.....|
-00000330 cb 90 51 bc 16 69 06 30 22 16 62 08 3b 3f 05 99 |..Q..i.0".b.;?..|
-00000340 60 2a cc cf 29 f5 e1 b0 84 81 c8 63 00 d4 d4 13 |`*..)......c....|
-00000350 b5 5d 4c 63 8a 60 3e 44 24 03 30 85 91 4c 3d f2 |.]Lc.`>D$.0..L=.|
-00000360 2c c2 78 f2 c3 4c bb 90 60 0b 66 18 02 e7 5c 85 |,.x..L..`.f...\.|
-00000370 19 17 03 03 00 35 49 76 5f ff 32 3a 09 7a 4b f2 |.....5Iv_.2:.zK.|
-00000380 fe f3 38 b6 76 f4 12 f2 aa a3 ed b6 02 ab 0b b9 |..8.v...........|
-00000390 3b 9d 00 51 f1 5c 96 23 6b 49 f8 32 9f 74 30 32 |;..Q.\.#kI.2.t02|
-000003a0 4d af af ef d5 55 2c ff 2b a0 45 17 03 03 00 93 |M....U,.+.E.....|
-000003b0 6e e0 6a f9 44 af c0 af 95 ab 1e ff fd 97 38 f5 |n.j.D.........8.|
-000003c0 7b 24 70 da e2 4e 8b dc 9b 49 84 fe 73 0a b0 7e |{$p..N...I..s..~|
-000003d0 cf 14 f7 8a 67 e7 74 bd ee 82 93 c6 27 a2 bd 1e |....g.t.....'...|
-000003e0 cb 71 06 af 65 dd f0 d9 91 81 b0 f8 21 34 48 d1 |.q..e.......!4H.|
-000003f0 c4 e0 e3 19 a8 b4 48 b7 3a be 52 e5 7c a8 a3 c2 |......H.:.R.|...|
-00000400 08 6c ac 66 4d 36 cf a1 9d 1f 72 c5 09 20 db 05 |.l.fM6....r.. ..|
-00000410 e5 0a 44 af 4a d8 32 38 19 7d 28 e3 05 23 99 66 |..D.J.28.}(..#.f|
-00000420 f6 ad 77 02 7e 00 67 c1 71 58 b9 89 3c 93 15 95 |..w.~.g.qX..<...|
-00000430 ee 38 e2 ea c0 73 fe da e4 75 6d 38 ca 54 0b bf |.8...s...um8.T..|
-00000440 f0 af 86 |...|
+00000080 03 03 00 01 01 17 03 03 00 17 2a db 0a 1b 36 73 |..........*...6s|
+00000090 de 3d 2f d9 c8 c0 2b 93 43 b3 a8 96 30 d2 bc 3d |.=/...+.C...0..=|
+000000a0 f7 17 03 03 02 22 72 49 cc 6d 9e 7f f5 42 1c 8b |....."rI.m...B..|
+000000b0 8a 0e 1b ad 71 f4 21 50 be ad 91 df e0 d4 a0 dc |....q.!P........|
+000000c0 61 d2 eb 6a 39 f1 8d 31 66 9f 97 d9 b2 79 bf 10 |a..j9..1f....y..|
+000000d0 cc e1 2a 7f da 9f ff 10 22 a8 0b d6 26 c9 7c a4 |..*....."...&.|.|
+000000e0 51 8d a7 62 af 96 ec 01 72 7b 08 27 9f ff 1d a6 |Q..b....r{.'....|
+000000f0 26 54 6e 48 09 73 ac 7c b2 bc a5 04 4e a2 41 66 |&TnH.s.|....N.Af|
+00000100 37 07 dd 7f 0d 8b 5b fa 84 a4 12 8b 44 9b b3 44 |7.....[.....D..D|
+00000110 71 bb 3a ce 95 8b a1 c5 e2 9f d2 86 0b 2b b2 43 |q.:..........+.C|
+00000120 aa 24 4c 69 0f c8 e8 7d ff 53 2a 56 e8 dd 53 bf |.$Li...}.S*V..S.|
+00000130 1b a7 fa 74 f2 c3 3d fa 11 b4 30 ce c0 9b 05 a5 |...t..=...0.....|
+00000140 13 b9 d1 1d a7 02 0a a6 36 31 b5 91 1f 5e 7f 65 |........61...^.e|
+00000150 24 48 3c ec fa d3 db 11 31 d1 c3 cd 47 b2 89 95 |$H<.....1...G...|
+00000160 80 55 25 1a 66 bf d9 ba 42 05 1d 20 b3 6e 09 bc |.U%.f...B.. .n..|
+00000170 5f 1d 81 15 b2 54 c6 65 7e 75 35 e7 54 60 28 e1 |_....T.e~u5.T`(.|
+00000180 15 0e ee 51 09 3c c1 5b ba 90 2e af 0a 85 40 0a |...Q.<.[......@.|
+00000190 de 78 c8 c9 15 75 61 1f 75 a2 5c 80 d5 ed a5 71 |.x...ua.u.\....q|
+000001a0 a7 d8 21 f3 9c 84 f5 af b1 5c 45 76 de a7 05 20 |..!......\Ev... |
+000001b0 7f c4 c4 71 b1 68 e0 a2 17 7f ac f8 c4 80 a8 89 |...q.h..........|
+000001c0 e8 35 68 ae 98 cf 2d 29 4e dc 84 45 21 d3 bb 0a |.5h...-)N..E!...|
+000001d0 d8 c9 e1 41 48 b2 a8 53 31 5c 26 d0 28 9e 8e df |...AH..S1\&.(...|
+000001e0 72 f2 ef f7 78 3d 7e b9 09 0c a4 e8 3e c5 a5 f6 |r...x=~.....>...|
+000001f0 e3 aa 32 1d da 98 7b 0a f1 0a 42 f6 71 92 45 01 |..2...{...B.q.E.|
+00000200 e4 28 f3 c6 0f a2 cf c3 74 3b 09 f5 75 51 8e fa |.(......t;..uQ..|
+00000210 6c 12 9e 80 2b 0a 87 fb 29 3d 0d a6 c4 7b c8 42 |l...+...)=...{.B|
+00000220 75 57 48 b3 78 20 2c b3 a1 d7 b7 6f 95 18 a2 bc |uWH.x ,....o....|
+00000230 fd c9 22 d3 49 ae 5b 2a ec b1 1a ff cd 38 3a bf |..".I.[*.....8:.|
+00000240 45 e8 a8 fe 39 d5 f8 a2 89 73 7f 8f 2c 65 8a e6 |E...9....s..,e..|
+00000250 b7 20 f7 c9 5c 02 ea 33 4f f6 fc 68 2f d6 a0 d9 |. ..\..3O..h/...|
+00000260 73 10 38 35 ba d8 74 2d cf 05 07 ee d4 fc 09 89 |s.85..t-........|
+00000270 0b 77 72 61 74 1f 16 8d 1f 29 3b 20 8d ef 99 b8 |.wrat....); ....|
+00000280 3d 80 24 5a 1d 32 9b 2e 50 4c 35 7e 4f c9 bc a7 |=.$Z.2..PL5~O...|
+00000290 6e ae 26 42 fb 4e c3 a8 7c 77 b4 c5 4c 1b 3a db |n.&B.N..|w..L.:.|
+000002a0 cc 3f 44 fe ae d7 3f 42 5f ee 05 6a 1d 72 98 0e |.?D...?B_..j.r..|
+000002b0 db 97 3c 11 06 c7 9e 5b 03 95 e0 52 09 54 39 b1 |..<....[...R.T9.|
+000002c0 13 19 f3 98 6c ed e3 ab 17 03 03 00 a3 49 60 43 |....l........I`C|
+000002d0 34 81 d3 6f fe c4 eb ac 49 64 51 9f 22 81 03 41 |4..o....IdQ."..A|
+000002e0 fd bc 4f 41 78 59 81 8a 82 b5 c3 06 79 8d d4 b2 |..OAxY......y...|
+000002f0 8b 9f 08 2b 09 ae 88 7d bd 87 6a 40 19 b8 c7 1b |...+...}..j@....|
+00000300 e1 55 69 8d 47 7a 49 66 fe 22 1f 95 c7 b5 15 ce |.Ui.GzIf."......|
+00000310 6b d6 5b 37 45 57 72 ba 5f a3 62 49 13 80 b9 47 |k.[7EWr._.bI...G|
+00000320 9c e3 ce 6e a0 40 03 7d 41 4e 41 0d 21 ee e4 f6 |...n.@.}ANA.!...|
+00000330 71 74 12 48 1e d1 b2 80 82 b0 bf ff 07 61 04 82 |qt.H.........a..|
+00000340 db 4b 00 a1 11 97 48 1b 9b 13 b3 0e 5b 7f 99 f3 |.K....H.....[...|
+00000350 6f c1 a0 2f 41 d9 e2 30 f9 fa 0b 8a ef 6d d1 e1 |o../A..0.....m..|
+00000360 30 3d 07 5a 8a ef 8b a1 2b 44 c5 58 0d 3f 13 d7 |0=.Z....+D.X.?..|
+00000370 17 03 03 00 35 a2 fb e8 71 06 77 fa 70 66 75 01 |....5...q.w.pfu.|
+00000380 0a a0 d7 49 20 f0 8a f0 ea bf 79 20 68 46 02 43 |...I .....y hF.C|
+00000390 3c b9 cc c9 5f 1d c7 80 d8 58 f5 e3 94 6e 85 02 |<..._....X...n..|
+000003a0 c8 b2 4e a1 a2 43 b8 8d ae 89 17 03 03 00 93 4a |..N..C.........J|
+000003b0 dd 6b 37 b9 20 fa 51 b2 e2 60 a1 8e 08 40 bf c6 |.k7. .Q..`...@..|
+000003c0 25 22 9a 26 3a ec 35 aa f2 26 9c bc 39 05 91 7b |%".&:.5..&..9..{|
+000003d0 81 45 18 8d f7 f4 29 88 76 43 a8 63 e3 d3 59 d7 |.E....).vC.c..Y.|
+000003e0 2d 67 b3 4d 2f 6d c6 62 cf fd ac ed d6 80 04 57 |-g.M/m.b.......W|
+000003f0 b3 ac af 59 ce 35 43 94 1d 97 8c 2d 8d 89 b1 a7 |...Y.5C....-....|
+00000400 90 76 89 ec e4 0a 8f a9 9b 8d 22 02 8b 87 55 a4 |.v........"...U.|
+00000410 9b 55 da 85 a6 06 47 63 4c a2 1c 96 eb e1 77 35 |.U....GcL.....w5|
+00000420 71 0d 7e e5 78 ab 25 da ee 5e ae 07 a9 ed 44 3a |q.~.x.%..^....D:|
+00000430 75 ff 5c 4f 4e e5 01 27 7f 9e eb 63 db e2 85 70 |u.\ON..'...c...p|
+00000440 fc 99 |..|
>>> Flow 3 (client to server)
-00000000 14 03 03 00 01 01 17 03 03 00 35 23 02 12 13 f1 |..........5#....|
-00000010 db fa 70 c0 92 85 8a d3 fa 80 1b 5c a6 22 ff 20 |..p........\.". |
-00000020 5d bf 1d 61 58 34 c0 48 6f e1 26 a6 bf bc 76 c7 |]..aX4.Ho.&...v.|
-00000030 8b da ee 54 64 30 c4 5c b1 61 67 82 29 bb 3f 4b |...Td0.\.ag.).?K|
+00000000 14 03 03 00 01 01 17 03 03 00 35 8c c8 26 94 66 |..........5..&.f|
+00000010 2e fd e0 4e bf b8 77 9d 12 d9 f6 9c 1b 15 c4 f1 |...N..w.........|
+00000020 39 f8 91 27 16 0c 34 ef 33 46 22 4e 19 d6 d0 d2 |9..'..4.3F"N....|
+00000030 ef 6b 57 91 f8 e4 17 fe f9 ec f4 f1 ce c0 44 26 |.kW...........D&|
>>> Flow 4 (server to client)
-00000000 17 03 03 00 1e 95 c0 53 e2 37 94 09 83 1e 7e 23 |.......S.7....~#|
-00000010 dc 9f 02 5e 91 19 b6 f9 72 0d 38 3f 25 ae b2 5f |...^....r.8?%.._|
-00000020 4b f2 78 17 03 03 00 13 d2 ad 73 d6 f3 21 ab 7c |K.x.......s..!.||
-00000030 02 dd 63 ff cf d7 34 ca 71 3d 70 |..c...4.q=p|
+00000000 17 03 03 00 1e ab 4d 1a 04 59 10 8b ef f9 b5 8a |......M..Y......|
+00000010 62 34 91 4e f9 cd 93 8c 7a 6d be d6 72 42 ad 45 |b4.N....zm..rB.E|
+00000020 21 f5 4e 17 03 03 00 13 1e bf bd 27 1a ad ab 1f |!.N........'....|
+00000030 32 f5 99 95 dc 34 e3 eb 9c c1 1c |2....4.....|