99 "github.com/jedisct1/dlog"
1010 "github.com/jedisct1/xsecretbox"
1111 "golang.org/x/crypto/curve25519"
12+ "golang.org/x/crypto/nacl/box"
13+ "golang.org/x/crypto/nacl/secretbox"
1214)
1315
1416const (
@@ -55,9 +57,19 @@ func ComputeSharedKey(
5557 dlog .Criticalf ("[%v] Weak XChaCha20 public key" , providerName )
5658 }
5759 } else {
58- dlog .Criticalf ("[%v] Unsupported encryption system" , providerName )
60+ box .Precompute (& sharedKey , serverPk , secretKey )
61+ c := byte (0 )
62+ for i := 0 ; i < 32 ; i ++ {
63+ c |= sharedKey [i ]
64+ }
65+ if c == 0 {
66+ dlog .Criticalf ("[%v] Weak XSalsa20 public key" , providerName )
67+ if _ , err := crypto_rand .Read (sharedKey [:]); err != nil {
68+ dlog .Fatal (err )
69+ }
70+ }
5971 }
60- return sharedKey
72+ return
6173}
6274
6375func (proxy * Proxy ) Encrypt (
@@ -112,7 +124,9 @@ func (proxy *Proxy) Encrypt(
112124 if serverInfo .CryptoConstruction == XChacha20Poly1305 {
113125 encrypted = xsecretbox .Seal (encrypted , nonce , padded , sharedKey [:])
114126 } else {
115- err = errors .New ("Unsupported encryption system" )
127+ var xsalsaNonce [24 ]byte
128+ copy (xsalsaNonce [:], nonce )
129+ encrypted = secretbox .Seal (encrypted , padded , & xsalsaNonce , sharedKey )
116130 }
117131 return
118132}
@@ -139,7 +153,13 @@ func (proxy *Proxy) Decrypt(
139153 if serverInfo .CryptoConstruction == XChacha20Poly1305 {
140154 packet , err = xsecretbox .Open (nil , serverNonce , encrypted [responseHeaderLen :], sharedKey [:])
141155 } else {
142- err = errors .New ("Unsupported encryption system" )
156+ var xsalsaServerNonce [24 ]byte
157+ copy (xsalsaServerNonce [:], serverNonce )
158+ var ok bool
159+ packet , ok = secretbox .Open (nil , encrypted [responseHeaderLen :], & xsalsaServerNonce , sharedKey )
160+ if ! ok {
161+ err = errors .New ("Incorrect tag" )
162+ }
143163 }
144164 if err != nil {
145165 return encrypted , err
0 commit comments