parent
e7bdc58c97
commit
70b9ed78ea
Binary file not shown.
|
|
@ -0,0 +1,121 @@
|
||||||
|
package log
|
||||||
|
|
||||||
|
import (
|
||||||
|
log "github.com/alecthomas/log4go"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
var root log.Logger = make(log.Logger)
|
||||||
|
|
||||||
|
func LogTo(target string, level_name string) {
|
||||||
|
var writer log.LogWriter = nil
|
||||||
|
|
||||||
|
switch target {
|
||||||
|
case "stdout":
|
||||||
|
writer = log.NewConsoleLogWriter()
|
||||||
|
case "none":
|
||||||
|
// no logging
|
||||||
|
default:
|
||||||
|
writer = log.NewFileLogWriter(target, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
if writer != nil {
|
||||||
|
var level = log.DEBUG
|
||||||
|
|
||||||
|
switch level_name {
|
||||||
|
case "FINEST":
|
||||||
|
level = log.FINEST
|
||||||
|
case "FINE":
|
||||||
|
level = log.FINE
|
||||||
|
case "DEBUG":
|
||||||
|
level = log.DEBUG
|
||||||
|
case "TRACE":
|
||||||
|
level = log.TRACE
|
||||||
|
case "INFO":
|
||||||
|
level = log.INFO
|
||||||
|
case "WARNING":
|
||||||
|
level = log.WARNING
|
||||||
|
case "ERROR":
|
||||||
|
level = log.ERROR
|
||||||
|
case "CRITICAL":
|
||||||
|
level = log.CRITICAL
|
||||||
|
default:
|
||||||
|
level = log.DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
root.AddFilter("log", level, writer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Logger interface {
|
||||||
|
AddLogPrefix(string)
|
||||||
|
ClearLogPrefixes()
|
||||||
|
Debug(string, ...interface{})
|
||||||
|
Info(string, ...interface{})
|
||||||
|
Warn(string, ...interface{}) error
|
||||||
|
Error(string, ...interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type PrefixLogger struct {
|
||||||
|
*log.Logger
|
||||||
|
prefix string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPrefixLogger(prefixes ...string) Logger {
|
||||||
|
logger := &PrefixLogger{Logger: &root}
|
||||||
|
|
||||||
|
for _, p := range prefixes {
|
||||||
|
logger.AddLogPrefix(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) pfx(fmtstr string) interface{} {
|
||||||
|
return fmt.Sprintf("%s %s", pl.prefix, fmtstr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) Debug(arg0 string, args ...interface{}) {
|
||||||
|
pl.Logger.Debug(pl.pfx(arg0), args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) Info(arg0 string, args ...interface{}) {
|
||||||
|
pl.Logger.Info(pl.pfx(arg0), args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) Warn(arg0 string, args ...interface{}) error {
|
||||||
|
return pl.Logger.Warn(pl.pfx(arg0), args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) Error(arg0 string, args ...interface{}) error {
|
||||||
|
return pl.Logger.Error(pl.pfx(arg0), args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) AddLogPrefix(prefix string) {
|
||||||
|
if len(pl.prefix) > 0 {
|
||||||
|
pl.prefix += " "
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.prefix += "[" + prefix + "]"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pl *PrefixLogger) ClearLogPrefixes() {
|
||||||
|
pl.prefix = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// we should never really use these . . . always prefer logging through a prefix logger
|
||||||
|
func Debug(arg0 string, args ...interface{}) {
|
||||||
|
root.Debug(arg0, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Info(arg0 string, args ...interface{}) {
|
||||||
|
root.Info(arg0, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Warn(arg0 string, args ...interface{}) error {
|
||||||
|
return root.Warn(arg0, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Error(arg0 string, args ...interface{}) error {
|
||||||
|
return root.Error(arg0, args...)
|
||||||
|
}
|
||||||
3
main.go
3
main.go
|
|
@ -3,11 +3,12 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
// "github.com/TransX/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Tunnel() {
|
func Tunnel() {
|
||||||
trans := NewTransTCP()
|
trans := NewTransTCP()
|
||||||
trans.Start("1200", "127.0.0.1", "8118")
|
trans.Start("1200", "192.168.0.120", "8118")
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
|
||||||
36
main_test.go
36
main_test.go
|
|
@ -1,8 +1,10 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"github.com/TransX/tscipher"
|
||||||
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
@ -14,20 +16,24 @@ func server(t *testing.T) {
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
conn, err := listener.Accept()
|
conn, err := listener.Accept()
|
||||||
fmt.Println("Test Server Incoming", conn.RemoteAddr().String())
|
log.Println("Test Server Incoming", conn.RemoteAddr().String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
bytes := make([]byte, 32)
|
bytes := make([]byte, 32)
|
||||||
|
XOR := tscipher.NewXOR([]byte("fasdfasdf"))
|
||||||
n, err := conn.Read(bytes)
|
n, err := conn.Read(bytes)
|
||||||
fmt.Println("Test Server Receive ", string(bytes[:n]))
|
decryped, _ := XOR.Decrypt(bytes[:n])
|
||||||
_, err = conn.Write([]byte("OK"))
|
copy(bytes, decryped[:n])
|
||||||
fmt.Println("Test Server write")
|
log.Println("Test Server Receive ", string(bytes[:n]))
|
||||||
|
encrypted, _ := XOR.Encrypt([]byte("OK"))
|
||||||
|
_, err = conn.Write(encrypted)
|
||||||
|
log.Println("Test Server write")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
conn.Close()
|
conn.Close()
|
||||||
fmt.Println("Test Server closed")
|
log.Println("Test Server closed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -37,25 +43,31 @@ func client(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
conn.Write([]byte("Client"))
|
XOR := tscipher.NewXOR([]byte("fasdfasdf"))
|
||||||
fmt.Println("Test Client write")
|
encrypted, _ := XOR.Encrypt([]byte("Client"))
|
||||||
|
conn.Write(encrypted)
|
||||||
|
log.Println("Test Client write")
|
||||||
bytes := make([]byte, 32)
|
bytes := make([]byte, 32)
|
||||||
n, err := conn.Read(bytes)
|
n, err := conn.Read(bytes)
|
||||||
fmt.Println("Test Client read")
|
decryped, _ := XOR.Decrypt(bytes[:n])
|
||||||
|
copy(bytes, decryped[:n])
|
||||||
|
log.Println("Test Client read")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
fmt.Println("Test Client Receive ", string(bytes[:n]))
|
log.Println("Test Client Receive ", string(bytes[:n]))
|
||||||
time.Sleep(time.Second * 2)
|
time.Sleep(time.Second * 2)
|
||||||
conn.Close()
|
conn.Close()
|
||||||
fmt.Println("Test Client closed")
|
log.Println("Test Client closed")
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTunnel(t *testing.T) {
|
func TestTunnel(t *testing.T) {
|
||||||
|
file, _ := os.Create("log.txt")
|
||||||
|
log.SetOutput(file)
|
||||||
// t.Log("Start testing.")
|
// t.Log("Start testing.")
|
||||||
fmt.Println("Test Start testing.")
|
log.Println("Test Start testing.")
|
||||||
go server(t)
|
go server(t)
|
||||||
go client(t)
|
go client(t)
|
||||||
trans := NewTransTCP()
|
trans := NewTransTCP()
|
||||||
|
|
|
||||||
8
tcp.go
8
tcp.go
|
|
@ -63,18 +63,18 @@ func (this *TransTCP) tunnel(src, dest net.Conn, id string) {
|
||||||
//构建Carrier
|
//构建Carrier
|
||||||
revCarrier := &tscipher.Carrier{
|
revCarrier := &tscipher.Carrier{
|
||||||
src,
|
src,
|
||||||
tscipher.NewCipher("default"),
|
tscipher.NewCipher("XOR"),
|
||||||
cache,
|
cache,
|
||||||
}
|
}
|
||||||
nByte, err := tscipher.ReceiveData(revCarrier)
|
nByte, err := tscipher.ReceiveData(revCarrier)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicln("Read panic", id, err, src.RemoteAddr().String())
|
log.Panicln("Read panic", id, err, src.RemoteAddr().String())
|
||||||
}
|
}
|
||||||
log.Println("Reived ", id, string(cache[:nByte]))
|
log.Println("Reived ", nByte, "bytes:", id, string(cache[:nByte]))
|
||||||
sendCarrier := &tscipher.Carrier{
|
sendCarrier := &tscipher.Carrier{
|
||||||
dest,
|
dest,
|
||||||
tscipher.NewCipher("default"),
|
tscipher.NewCipher("XOR"),
|
||||||
cache,
|
cache, //TODO:危险,cache的容量容易被不小心修改
|
||||||
}
|
}
|
||||||
_, err = tscipher.SendData(sendCarrier, nByte)
|
_, err = tscipher.SendData(sendCarrier, nByte)
|
||||||
log.Println("Write")
|
log.Println("Write")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
package tscipher
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/aes"
|
||||||
|
"crypto/cipher"
|
||||||
|
crtrand "crypto/rand"
|
||||||
|
// "errors"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AES struct {
|
||||||
|
key []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES) aesEncrypt(key, text []byte) (ciphertext []byte) {
|
||||||
|
ciphertext = make([]byte, aes.BlockSize+len(string(text)))
|
||||||
|
// iv = initialization vector
|
||||||
|
iv := ciphertext[:aes.BlockSize]
|
||||||
|
|
||||||
|
io.ReadFull(crtrand.Reader, iv)
|
||||||
|
|
||||||
|
// var block cipher.Block
|
||||||
|
block, err := aes.NewCipher(key)
|
||||||
|
if err != nil {
|
||||||
|
ciphertext = nil
|
||||||
|
log.Println("encrypt err", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfb := cipher.NewCFBEncrypter(block, iv)
|
||||||
|
cfb.XORKeyStream(ciphertext[aes.BlockSize:], text)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES) aesDecrypt(key, ciphertext []byte) (plaintext []byte) {
|
||||||
|
|
||||||
|
// var block cipher.Block
|
||||||
|
// if len(ciphertext) < aes.BlockSize {
|
||||||
|
// err := errors.New("ciphertext too short")
|
||||||
|
// plaintext = nil
|
||||||
|
// log.Println("decrypt err", err)
|
||||||
|
// }
|
||||||
|
|
||||||
|
iv := ciphertext[:aes.BlockSize]
|
||||||
|
ciphertext = ciphertext[aes.BlockSize:]
|
||||||
|
block, err := aes.NewCipher(key)
|
||||||
|
if err != nil {
|
||||||
|
plaintext = nil
|
||||||
|
log.Println("decrypt err", err)
|
||||||
|
}
|
||||||
|
cfb := cipher.NewCFBDecrypter(block, iv)
|
||||||
|
cfb.XORKeyStream(ciphertext, ciphertext)
|
||||||
|
|
||||||
|
plaintext = ciphertext
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES) Decrypt(data []byte) (decrypted []byte, err error) {
|
||||||
|
data = this.aesDecrypt(this.key, data)
|
||||||
|
decrypted = data
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AES) Encrypt(data []byte) (encryped []byte, err error) {
|
||||||
|
this.aesEncrypt(this.key, data)
|
||||||
|
encryped = data
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAES() (cipher Cipher) {
|
||||||
|
key := make([]byte, 32)
|
||||||
|
io.ReadFull(crtrand.Reader, key)
|
||||||
|
return &AES{
|
||||||
|
key: key,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,20 +1,40 @@
|
||||||
package tscipher
|
package tscipher
|
||||||
|
|
||||||
|
import (
|
||||||
|
chacha "github.com/codahale/chacha20"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
type ChaCha struct {
|
type ChaCha struct {
|
||||||
|
key []byte
|
||||||
|
nonce []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*ChaCha) Decrypt(data []byte) (decrypted []byte, err error) {
|
func (this *ChaCha) Decrypt(data []byte) (decrypted []byte, err error) {
|
||||||
|
// xor, err := chacha.NewXChaCha(this.key, this.nonce)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Decrypt", err)
|
||||||
|
}
|
||||||
|
// xor.XORKeyStream(data, data)
|
||||||
decrypted = data
|
decrypted = data
|
||||||
err = nil
|
err = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*ChaCha) Encrypt(data []byte) (encryped []byte, err error) {
|
func (this *ChaCha) Encrypt(data []byte) (encryped []byte, err error) {
|
||||||
|
xor, err := chacha.NewXChaCha(this.key, this.nonce)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Chacha Encrypt", err)
|
||||||
|
}
|
||||||
|
xor.XORKeyStream(data, data)
|
||||||
encryped = data
|
encryped = data
|
||||||
err = nil
|
err = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewChaCha() (cipher Cipher) {
|
func NewChaCha() (cipher Cipher) {
|
||||||
return &ChaCha{}
|
return &ChaCha{
|
||||||
|
key: make([]byte, 256),
|
||||||
|
nonce: make([]byte, 64),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,15 +19,38 @@ func NewCipher(cipherName string) (cipher Cipher) {
|
||||||
if cipherName == "default" {
|
if cipherName == "default" {
|
||||||
return NewChaCha()
|
return NewChaCha()
|
||||||
}
|
}
|
||||||
|
if cipherName == "AES" {
|
||||||
|
return NewAES()
|
||||||
|
}
|
||||||
|
if cipherName == "XOR" {
|
||||||
|
return NewXOR([]byte("fasdfasdf"))
|
||||||
|
}
|
||||||
return nil //TODO:临时这样处理
|
return nil //TODO:临时这样处理
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendData(carrier *Carrier, nByte int) (n int, err error) {
|
func SendData(carrier *Carrier, nByte int) (n int, err error) {
|
||||||
n, err = carrier.Conn.Write(carrier.Cache[:nByte])
|
encrypedByte, err := carrier.Cipher.Encrypt(carrier.Cache[:nByte])
|
||||||
|
if err != nil {
|
||||||
|
n = 0
|
||||||
|
return
|
||||||
|
}
|
||||||
|
n, err = carrier.Conn.Write(encrypedByte[:nByte])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReceiveData(carrier *Carrier) (n int, err error) {
|
func ReceiveData(carrier *Carrier) (n int, err error) {
|
||||||
n, err = carrier.Conn.Read(carrier.Cache)
|
n, err = carrier.Conn.Read(carrier.Cache)
|
||||||
|
if err != nil {
|
||||||
|
n = 0
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//TODO:err
|
||||||
|
decrypted, err := carrier.Cipher.Decrypt(carrier.Cache[:n])
|
||||||
|
copy(carrier.Cache, decrypted[:n])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
n = 0
|
||||||
|
return
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
package tscipher
|
||||||
|
|
||||||
|
import ()
|
||||||
|
|
||||||
|
type XOR struct {
|
||||||
|
key []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *XOR) Decrypt(data []byte) (decrypted []byte, err error) {
|
||||||
|
decrypted = make([]byte, len(data))
|
||||||
|
for i := 0; i < len(data); i++ {
|
||||||
|
decrypted[i] = data[i] ^ this.key[i%len(this.key)]
|
||||||
|
}
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *XOR) Encrypt(data []byte) (encryped []byte, err error) {
|
||||||
|
encryped = make([]byte, len(data))
|
||||||
|
for i := 0; i < len(data); i++ {
|
||||||
|
encryped[i] = data[i] ^ this.key[i%len(this.key)]
|
||||||
|
}
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewXOR(key []byte) (cipher Cipher) {
|
||||||
|
return &XOR{
|
||||||
|
key: key,
|
||||||
|
}
|
||||||
|
}
|
||||||
18
tunnel.go
18
tunnel.go
|
|
@ -1,18 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
//func StartTunnel(sourceIP, desIP, desPort string) {
|
|
||||||
// remoteAddr := make(chan net.Addr)
|
|
||||||
// transSrcToDes := NewTransTCP()
|
|
||||||
// transSrcToDes.CreateTCPListener("0.0.0.0", desPort)
|
|
||||||
// transSrcToDes.CreateTCPClient(desIP, desPort)
|
|
||||||
// go transSrcToDes.Start(remoteAddr)
|
|
||||||
// sourcePort := <-remoteAddr
|
|
||||||
// transDesToSrc := NewTransTCP()
|
|
||||||
// transDesToSrc.CreateTCPListener("0.0.0.0", sourcePort)
|
|
||||||
// transSrcToDes.CreateTCPClient(sourceIP, sourcePort)
|
|
||||||
|
|
||||||
// go transDesToSrc.Start()
|
|
||||||
// c := make(chan byte)
|
|
||||||
// <-c
|
|
||||||
|
|
||||||
//}
|
|
||||||
Loading…
Reference in New Issue