transx/tscipher/cipher.go

80 lines
1.5 KiB
Go

package tscipher
import (
"net"
)
type Cipher interface {
Decrypt(data []byte) (decrypted []byte, err error)
Encrypt(data []byte) (encryped []byte, err error)
}
type Carrier struct {
Conn net.Conn
Cipher Cipher
Cache []byte
}
func NewCipher(cipherName string) (cipher Cipher) {
if cipherName == "default" {
return NewChaCha()
}
if cipherName == "AES" {
return NewAES()
}
if cipherName == "XOR" {
return NewXOR([]byte("fasdfasdf!3297!jfsl12*&!HHHFds"))
}
return nil //TODO:临时这样处理
}
func SendData(carrier *Carrier, nByte int) (n int, err error) {
if carrier.Cipher == nil {
n, err = carrier.Conn.Write(carrier.Cache[:nByte])
return
}
encrypedByte, err := carrier.Cipher.Encrypt(carrier.Cache[:nByte])
if err != nil {
n = 0
return
}
n, err = carrier.Conn.Write(encrypedByte[:nByte])
copy(carrier.Cache, encrypedByte[:nByte]) // in case of debugging
return
}
func SendData2(carrier *Carrier, nByte int) (n int, err error) {
n, err = carrier.Conn.Write(carrier.Cache[:nByte])
if err != nil {
return
}
return
}
func ReceiveData(carrier *Carrier) (n int, err error) {
n, err = carrier.Conn.Read(carrier.Cache)
if err != nil {
n = 0
return
}
if carrier.Cipher == nil {
return
}
decrypted, err := carrier.Cipher.Decrypt(carrier.Cache[:n])
copy(carrier.Cache, decrypted[:n])
if err != nil {
n = 0
return
}
return
}
func ReceiveData2(carrier *Carrier) (n int, err error) {
n, err = carrier.Conn.Read(carrier.Cache)
if err != nil {
n = 0
return
}
return
}