diff --git a/channels/v3/inbound/3dhauthchannel.go b/channels/v3/inbound/3dhauthchannel.go index 7423acf..9fc9d9b 100644 --- a/channels/v3/inbound/3dhauthchannel.go +++ b/channels/v3/inbound/3dhauthchannel.go @@ -2,6 +2,7 @@ package inbound import ( "crypto/rand" + tapirutils "cwtch.im/tapir/utils" "errors" "git.openprivacy.ca/openprivacy/libricochet-go/channels" "git.openprivacy.ca/openprivacy/libricochet-go/identity" @@ -129,10 +130,20 @@ func (ah *Server3DHAuthChannel) Packet(data []byte) { secret1 := ah.ServerIdentity.EDH(ah.clientEphmeralPublicKey) // Server Ephemeral <-> Client Identity - secret2 := utils.EDH(ah.serverEphemeralPrivateKey, ah.clientPubKey) + secret2, err := tapirutils.EDH(ah.serverEphemeralPrivateKey, ah.clientPubKey) + + if err != nil { + ah.channel.CloseChannel() + return + } // Ephemeral <-> Ephemeral - secret3 := utils.EDH(ah.serverEphemeralPrivateKey, ah.clientEphmeralPublicKey) + secret3, err := tapirutils.EDH(ah.serverEphemeralPrivateKey, ah.clientEphmeralPublicKey) + + if err != nil { + ah.channel.CloseChannel() + return + } var secret [96]byte copy(secret[0:32], secret1[:]) diff --git a/channels/v3/outbound/3dhauthchannel.go b/channels/v3/outbound/3dhauthchannel.go index 5345e2d..a973fff 100644 --- a/channels/v3/outbound/3dhauthchannel.go +++ b/channels/v3/outbound/3dhauthchannel.go @@ -2,6 +2,7 @@ package outbound import ( "crypto/rand" + tapirutils "cwtch.im/tapir/utils" "errors" "git.openprivacy.ca/openprivacy/libricochet-go/channels" "git.openprivacy.ca/openprivacy/libricochet-go/identity" @@ -117,13 +118,23 @@ func (ah *Client3DHAuthChannel) OpenOutboundResult(err error, crm *Protocol_Data log.Debugf("Public Keys Exchanged. Deriving Encryption Keys and Sending Encrypted Test Message") // Server Ephemeral <-> Client Identity - secret1 := utils.EDH(ah.clientEphemeralPrivateKey, ah.serverPubKey) + secret1, err := tapirutils.EDH(ah.clientEphemeralPrivateKey, ah.serverPubKey) + + if err != nil { + ah.channel.CloseChannel() + return + } // Server Identity <-> Client Ephemeral secret2 := ah.ClientIdentity.EDH(ah.serverEphemeralPublicKey) // Ephemeral <-> Ephemeral - secret3 := utils.EDH(ah.clientEphemeralPrivateKey, ah.serverEphemeralPublicKey) + secret3, err := tapirutils.EDH(ah.clientEphemeralPrivateKey, ah.serverEphemeralPublicKey) + + if err != nil { + ah.channel.CloseChannel() + return + } var secret [96]byte copy(secret[0:32], secret1[:]) diff --git a/go.mod b/go.mod index fd0e29e..5ec8554 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,11 @@ module git.openprivacy.ca/openprivacy/libricochet-go -require ( - git.openprivacy.ca/openprivacy/connectivity v1.1.0 - git.openprivacy.ca/openprivacy/log v1.0.0 - github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 - github.com/golang/protobuf v1.2.0 - golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72 - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect -) +go 1.14 -go 1.13 +require ( + cwtch.im/tapir v0.1.18 + git.openprivacy.ca/openprivacy/connectivity v1.1.1 + git.openprivacy.ca/openprivacy/log v1.0.0 + github.com/golang/protobuf v1.4.0 + golang.org/x/crypto v0.0.0-20200420104511-884d27f42877 +) diff --git a/go.sum b/go.sum index 81c0ee4..3d3ebcf 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,64 @@ -git.openprivacy.ca/openprivacy/connectivity v1.1.0 h1:9PEeKuPdoIRYeA62BUkBW2BfK4KqKEXz1fvUxZoP4xs= +cwtch.im/tapir v0.1.18 h1:Fs/jL9ZRyel/A1D/BYzIPEVQau8y5BJg44yA+GQDbSM= +cwtch.im/tapir v0.1.18/go.mod h1:/IrAI6CBHfgzsfgRT8WHVb1P9fCCz7+45hfsdkKn8Zg= git.openprivacy.ca/openprivacy/connectivity v1.1.0/go.mod h1:4P8mirZZslKbo2zBrXXVjgEdqGwHo/6qoFBwFQW6d6E= +git.openprivacy.ca/openprivacy/connectivity v1.1.1 h1:hKxBOmxP7Jdu3K1BJ93mRtKNiWUoP6YHt/o2snE2Z0w= +git.openprivacy.ca/openprivacy/connectivity v1.1.1/go.mod h1:4P8mirZZslKbo2zBrXXVjgEdqGwHo/6qoFBwFQW6d6E= git.openprivacy.ca/openprivacy/log v1.0.0 h1:Rvqm1weUdR4AOnJ79b1upHCc9vC/QF1rhSD2Um7sr1Y= git.openprivacy.ca/openprivacy/log v1.0.0/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw= -github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI= -github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= github.com/cretz/bine v0.1.1-0.20200124154328-f9f678b84cca h1:Q2r7AxHdJwWfLtBZwvW621M3sPqxPc6ITv2j1FGsYpw= github.com/cretz/bine v0.1.1-0.20200124154328-f9f678b84cca/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72 h1:+ELyKg6m8UBf0nPFSqD0mi7zUfwPyXo23HNjMnXPz7w= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/crypto v0.0.0-20200206161412-a0c6ece9d31a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200420104511-884d27f42877 h1:IhZPbxNd1UjBCaD5AfpSSbJTRlp+ZSuyuH5uoksNS04= +golang.org/x/crypto v0.0.0-20200420104511-884d27f42877/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/identity/identity.go b/identity/identity.go index ec35844..50f19e4 100644 --- a/identity/identity.go +++ b/identity/identity.go @@ -3,6 +3,7 @@ package identity import ( "crypto" "crypto/rsa" + tapirutils "cwtch.im/tapir/utils" "encoding/asn1" "git.openprivacy.ca/openprivacy/libricochet-go/utils" "golang.org/x/crypto/ed25519" @@ -68,7 +69,7 @@ func (i *Identity) PublicKeyBytes() []byte { // EDH performs a diffie helman operation on this identities private key with the given public key. func (i *Identity) EDH(key ed25519.PublicKey) []byte { - secret := utils.EDH(*i.edpk, key) + secret, _ := tapirutils.EDH(*i.edpk, key) return secret[:] } diff --git a/utils/crypto.go b/utils/crypto.go index 1a60fee..16e6f68 100644 --- a/utils/crypto.go +++ b/utils/crypto.go @@ -5,8 +5,6 @@ import ( "crypto/rsa" "crypto/x509" "encoding/pem" - "github.com/agl/ed25519/extra25519" - "golang.org/x/crypto/curve25519" "golang.org/x/crypto/ed25519" "io/ioutil" "math" @@ -31,21 +29,6 @@ func GetRandNumber() *big.Int { return num } -// EDH implements diffie hellman using curve25519 keys derived from ed25519 keys -// NOTE: This uses a 3rd party library extra25519 as the key conversion is not in the core golang lib -// as such this definitely needs further review. -func EDH(privateKey ed25519.PrivateKey, remotePublicKey ed25519.PublicKey) [32]byte { - var privKeyBytes [64]byte - var remotePubKeyBytes [32]byte - copy(privKeyBytes[:], privateKey[:]) - copy(remotePubKeyBytes[:], remotePublicKey[:]) - var secret, curve25519priv, curve25519pub [32]byte - extra25519.PrivateKeyToCurve25519(&curve25519priv, &privKeyBytes) - extra25519.PublicKeyToCurve25519(&curve25519pub, &remotePubKeyBytes) - curve25519.ScalarMult(&secret, &curve25519priv, &curve25519pub) - return secret -} - // GeneratePrivateKeyV3 cryptographically creats a new ed25519 key pair. func GeneratePrivateKeyV3() (ed25519.PublicKey, ed25519.PrivateKey, error) { return ed25519.GenerateKey(rand.Reader) diff --git a/utils/crypto_test.go b/utils/crypto_test.go index 98a5e2d..da4e6dc 100644 --- a/utils/crypto_test.go +++ b/utils/crypto_test.go @@ -2,6 +2,7 @@ package utils import ( "crypto/rand" + "cwtch.im/tapir/utils" "golang.org/x/crypto/ed25519" "math" "testing" @@ -21,8 +22,8 @@ func TestLoadPrivateKey(t *testing.T) { func TestEDH(t *testing.T) { cpub, cpriv, _ := ed25519.GenerateKey(rand.Reader) spub, spriv, _ := ed25519.GenerateKey(rand.Reader) - cedh := EDH(cpriv, spub) - sedh := EDH(spriv, cpub) + cedh, _ := utils.EDH(cpriv, spub) + sedh, _ := utils.EDH(spriv, cpub) if string(cedh[:]) != string(sedh[:]) { t.Errorf("Client and Server should see the same secret %v %v", cedh, sedh) }