Fix bad cryptography

This commit is contained in:
Qian Wang 2019-08-01 00:16:33 +01:00
parent 0fbb6011fc
commit 2735de4f96
3 changed files with 23 additions and 28 deletions

View File

@ -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++ {

View File

@ -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)

View File

@ -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])