forked from quic-go/quic-go
@@ -16,7 +16,7 @@ import (
|
||||
type KeyDerivationFunction func(forwardSecure bool, sharedSecret, nonces []byte, connID protocol.ConnectionID, chlo []byte, scfg []byte, cert []byte) (crypto.AEAD, error)
|
||||
|
||||
// KeyExchangeFunction is used to make a new KEX
|
||||
type KeyExchangeFunction func() crypto.KeyExchange
|
||||
type KeyExchangeFunction func() (crypto.KeyExchange, error)
|
||||
|
||||
// The CryptoSetup handles all things crypto for the Session
|
||||
type CryptoSetup struct {
|
||||
@@ -44,10 +44,10 @@ type CryptoSetup struct {
|
||||
var _ crypto.AEAD = &CryptoSetup{}
|
||||
|
||||
// NewCryptoSetup creates a new CryptoSetup instance
|
||||
func NewCryptoSetup(connID protocol.ConnectionID, version protocol.VersionNumber, scfg *ServerConfig, cryptoStream utils.Stream, connectionParametersManager *ConnectionParametersManager, aeadChanged chan struct{}) *CryptoSetup {
|
||||
func NewCryptoSetup(connID protocol.ConnectionID, version protocol.VersionNumber, scfg *ServerConfig, cryptoStream utils.Stream, connectionParametersManager *ConnectionParametersManager, aeadChanged chan struct{}) (*CryptoSetup, error) {
|
||||
nonce := make([]byte, 32)
|
||||
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
return &CryptoSetup{
|
||||
connID: connID,
|
||||
@@ -59,7 +59,7 @@ func NewCryptoSetup(connID protocol.ConnectionID, version protocol.VersionNumber
|
||||
cryptoStream: cryptoStream,
|
||||
connectionParametersManager: connectionParametersManager,
|
||||
aeadChanged: aeadChanged,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
// HandleCryptoStream reads and writes messages on the crypto stream
|
||||
@@ -219,7 +219,10 @@ func (h *CryptoSetup) handleCHLO(sni string, data []byte, cryptoData map[Tag][]b
|
||||
}
|
||||
|
||||
// Generate a new curve instance to derive the forward secure key
|
||||
ephermalKex := h.keyExchange()
|
||||
ephermalKex, err := h.keyExchange()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ephermalSharedSecret, err := ephermalKex.CalculateSharedKey(cryptoData[TagPUBS])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -104,16 +104,19 @@ var _ = Describe("Crypto setup", func() {
|
||||
)
|
||||
|
||||
BeforeEach(func() {
|
||||
var err error
|
||||
aeadChanged = make(chan struct{}, 1)
|
||||
stream = &mockStream{}
|
||||
kex = &mockKEX{}
|
||||
signer = &mockSigner{}
|
||||
scfg = NewServerConfig(kex, signer)
|
||||
scfg, err = NewServerConfig(kex, signer)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
v := protocol.SupportedVersions[len(protocol.SupportedVersions)-1]
|
||||
cpm = NewConnectionParamatersManager()
|
||||
cs = NewCryptoSetup(protocol.ConnectionID(42), v, scfg, stream, cpm, aeadChanged)
|
||||
cs, err = NewCryptoSetup(protocol.ConnectionID(42), v, scfg, stream, cpm, aeadChanged)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
cs.keyDerivation = mockKeyDerivation
|
||||
cs.keyExchange = func() crypto.KeyExchange { return &mockKEX{ephermal: true} }
|
||||
cs.keyExchange = func() (crypto.KeyExchange, error) { return &mockKEX{ephermal: true}, nil }
|
||||
})
|
||||
|
||||
It("has a nonce", func() {
|
||||
|
||||
@@ -16,17 +16,17 @@ type ServerConfig struct {
|
||||
}
|
||||
|
||||
// NewServerConfig creates a new server config
|
||||
func NewServerConfig(kex crypto.KeyExchange, signer crypto.Signer) *ServerConfig {
|
||||
func NewServerConfig(kex crypto.KeyExchange, signer crypto.Signer) (*ServerConfig, error) {
|
||||
id := make([]byte, 16)
|
||||
_, err := io.ReadFull(rand.Reader, id)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
return &ServerConfig{
|
||||
kex: kex,
|
||||
signer: signer,
|
||||
ID: id,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Get the server config binary representation
|
||||
|
||||
@@ -16,8 +16,11 @@ var _ = Describe("ServerConfig", func() {
|
||||
)
|
||||
|
||||
BeforeEach(func() {
|
||||
kex = crypto.NewCurve25519KEX()
|
||||
scfg = NewServerConfig(kex, nil)
|
||||
var err error
|
||||
kex, err = crypto.NewCurve25519KEX()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
scfg, err = NewServerConfig(kex, nil)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
})
|
||||
|
||||
It("gets the proper binary representation", func() {
|
||||
|
||||
Reference in New Issue
Block a user