mirror of https://github.com/cbeuw/Cloak
Fix bad cryptography
This commit is contained in:
parent
0fbb6011fc
commit
2735de4f96
|
|
@ -3,6 +3,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/aes"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"flag"
|
"flag"
|
||||||
|
|
@ -101,7 +102,11 @@ func makeSession(sta *client.State) *mux.Session {
|
||||||
sta.UpdateIntervalKeys()
|
sta.UpdateIntervalKeys()
|
||||||
|
|
||||||
_, tthKey := sta.GetIntervalKeys()
|
_, tthKey := sta.GetIntervalKeys()
|
||||||
sesh := mux.MakeSession(sta.SessionID, mux.UNLIMITED_VALVE, mux.MakeObfs(tthKey, sta.Cipher), mux.MakeDeobfs(tthKey, sta.Cipher), util.ReadTLS)
|
headerCipher, err := aes.NewCipher(tthKey)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
sesh := mux.MakeSession(sta.SessionID, mux.UNLIMITED_VALVE, mux.MakeObfs(headerCipher, sta.Cipher), mux.MakeDeobfs(headerCipher, sta.Cipher), util.ReadTLS)
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
for i := 0; i < sta.NumConn; i++ {
|
for i := 0; i < sta.NumConn; i++ {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/aes"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -109,8 +110,15 @@ func dispatchConnection(conn net.Conn, sta *server.State) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
obfs := mux.MakeObfs(tthKey, crypto)
|
headerCipher, err := aes.NewCipher(tthKey)
|
||||||
deobfs := mux.MakeDeobfs(tthKey, crypto)
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
goWeb(data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
obfs := mux.MakeObfs(headerCipher, crypto)
|
||||||
|
deobfs := mux.MakeDeobfs(headerCipher, crypto)
|
||||||
|
|
||||||
finishHandshake := func() error {
|
finishHandshake := func() error {
|
||||||
reply := server.ComposeReply(ch)
|
reply := server.ComposeReply(ch)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package multiplex
|
package multiplex
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/cipher"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/sha1"
|
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
)
|
)
|
||||||
|
|
@ -15,19 +15,7 @@ var putU32 = binary.BigEndian.PutUint32
|
||||||
|
|
||||||
const HEADER_LEN = 12
|
const HEADER_LEN = 12
|
||||||
|
|
||||||
func genXorKey(key, salt []byte) []byte {
|
func MakeObfs(headerCipher cipher.Block, algo Crypto) Obfser {
|
||||||
h := sha1.New()
|
|
||||||
h.Write(append(key, salt...))
|
|
||||||
return h.Sum(nil)[:12]
|
|
||||||
}
|
|
||||||
|
|
||||||
func xor(a []byte, b []byte) {
|
|
||||||
for i := range a {
|
|
||||||
a[i] ^= b[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func MakeObfs(key []byte, algo Crypto) Obfser {
|
|
||||||
obfs := func(f *Frame) ([]byte, error) {
|
obfs := func(f *Frame) ([]byte, error) {
|
||||||
ret := make([]byte, 5+HEADER_LEN+len(f.Payload)+16)
|
ret := make([]byte, 5+HEADER_LEN+len(f.Payload)+16)
|
||||||
recordLayer := ret[0:5]
|
recordLayer := ret[0:5]
|
||||||
|
|
@ -46,11 +34,8 @@ func MakeObfs(key []byte, algo Crypto) Obfser {
|
||||||
}
|
}
|
||||||
copy(encryptedPayload, ciphertext)
|
copy(encryptedPayload, ciphertext)
|
||||||
|
|
||||||
cKey := make([]byte, len(key))
|
iv := encryptedPayload[len(encryptedPayload)-16:]
|
||||||
copy(cKey, key)
|
cipher.NewCTR(headerCipher, iv).XORKeyStream(header, header)
|
||||||
salt := encryptedPayload[len(encryptedPayload)-16:]
|
|
||||||
xorKey := genXorKey(cKey, salt)
|
|
||||||
xor(header, xorKey)
|
|
||||||
|
|
||||||
// Composing final obfsed message
|
// Composing final obfsed message
|
||||||
// We don't use util.AddRecordLayer here to avoid unnecessary malloc
|
// We don't use util.AddRecordLayer here to avoid unnecessary malloc
|
||||||
|
|
@ -63,7 +48,7 @@ func MakeObfs(key []byte, algo Crypto) Obfser {
|
||||||
return obfs
|
return obfs
|
||||||
}
|
}
|
||||||
|
|
||||||
func MakeDeobfs(key []byte, algo Crypto) Deobfser {
|
func MakeDeobfs(headerCipher cipher.Block, algo Crypto) Deobfser {
|
||||||
deobfs := func(in []byte) (*Frame, error) {
|
deobfs := func(in []byte) (*Frame, error) {
|
||||||
if len(in) < 5+HEADER_LEN+16 {
|
if len(in) < 5+HEADER_LEN+16 {
|
||||||
return nil, errors.New("Input cannot be shorter than 33 bytes")
|
return nil, errors.New("Input cannot be shorter than 33 bytes")
|
||||||
|
|
@ -72,12 +57,9 @@ func MakeDeobfs(key []byte, algo Crypto) Deobfser {
|
||||||
|
|
||||||
header := peeled[0:12]
|
header := peeled[0:12]
|
||||||
payload := peeled[12:]
|
payload := peeled[12:]
|
||||||
salt := peeled[len(peeled)-16:]
|
iv := peeled[len(peeled)-16:]
|
||||||
|
|
||||||
cKey := make([]byte, len(key))
|
cipher.NewCTR(headerCipher, iv).XORKeyStream(header, header)
|
||||||
copy(cKey, key)
|
|
||||||
xorKey := genXorKey(cKey, salt)
|
|
||||||
xor(header, xorKey)
|
|
||||||
|
|
||||||
streamID := u32(header[0:4])
|
streamID := u32(header[0:4])
|
||||||
seq := u32(header[4:8])
|
seq := u32(header[4:8])
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue