|
|
|
|
@ -16,7 +16,6 @@ import ( |
|
|
|
|
"net" |
|
|
|
|
"sync" |
|
|
|
|
"time" |
|
|
|
|
"bytes" |
|
|
|
|
"errors" |
|
|
|
|
"flag" |
|
|
|
|
"os" |
|
|
|
|
@ -215,20 +214,22 @@ func checkPassword(hash, pw string) error { |
|
|
|
|
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(pw)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func encrypt(text string) ([]byte, error) { |
|
|
|
|
func encrypt(text string) (string, error) { |
|
|
|
|
block, err := aes.NewCipher(key) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
gcm, err := cipher.NewGCM(block) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
nonce := make([]byte, gcm.NonceSize()) |
|
|
|
|
return gcm.Seal(nonce, nonce, []byte(text), nil), nil |
|
|
|
|
fullMessage := gcm.Seal(nonce, nonce, []byte(text), nil) |
|
|
|
|
encoded := base64.StdEncoding.EncodeToString(fullMessage) |
|
|
|
|
return encoded, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func decrypt(data []byte) (string, error) { |
|
|
|
|
func decrypt(data string) (string, error) { |
|
|
|
|
block, err := aes.NewCipher(key) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
@ -237,8 +238,15 @@ func decrypt(data []byte) (string, error) { |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Decoding from base64
|
|
|
|
|
decoded, err := base64.StdEncoding.DecodeString(data) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
nonceSize := gcm.NonceSize() |
|
|
|
|
nonce, ciphertext := data[:nonceSize], data[nonceSize:] |
|
|
|
|
nonce, ciphertext := decoded[:nonceSize], decoded[nonceSize:] |
|
|
|
|
plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
@ -264,15 +272,9 @@ func chEnc(pwd string)(string, error) { |
|
|
|
|
if _, err := rand.Read(nonce); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
}
|
|
|
|
|
// Encode with gob first
|
|
|
|
|
var buf bytes.Buffer |
|
|
|
|
tempEnc := gob.NewEncoder(&buf) |
|
|
|
|
if err := tempEnc.Encode(pwd); err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Encrypt the encoded data
|
|
|
|
|
encrypted := aead.Seal(nil, nonce, buf.Bytes(), nil) |
|
|
|
|
encrypted := aead.Seal(nil, nonce, []byte(pwd), nil) |
|
|
|
|
|
|
|
|
|
// Send nonce + encrypted data
|
|
|
|
|
fullMessage := append(nonce, encrypted...) |
|
|
|
|
@ -287,7 +289,7 @@ func chDec(eText string)(string) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Decoding from base64
|
|
|
|
|
decoded, err := base64.StdEncoding.DecodeString(eText) |
|
|
|
|
encryptedMsg, err := base64.StdEncoding.DecodeString(eText) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatalf("Error: Base64 decode") |
|
|
|
|
} |
|
|
|
|
@ -298,8 +300,6 @@ func chDec(eText string)(string) { |
|
|
|
|
log.Fatalf("Error: Cha20 key") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
encryptedMsg := decoded |
|
|
|
|
|
|
|
|
|
// Decrypt: Split nonce and ciphertext
|
|
|
|
|
decryptedNonce := encryptedMsg[:aead.NonceSize()] |
|
|
|
|
decryptedCiphertext := encryptedMsg[aead.NonceSize():] |
|
|
|
|
@ -406,7 +406,7 @@ func handleConnection(conn net.Conn, db *sql.DB) { |
|
|
|
|
enc.Encode(Response{Message: "Password stored successfully", Enc: ""}) |
|
|
|
|
|
|
|
|
|
case "get": |
|
|
|
|
var encrypted []byte |
|
|
|
|
var encrypted string |
|
|
|
|
err := db.QueryRow("SELECT password FROM accounts WHERE user = ? AND site = ?", username, site).Scan(&encrypted) |
|
|
|
|
if err == sql.ErrNoRows { |
|
|
|
|
enc.Encode(Response{Message: "Site not found", Enc: ""}) |
|
|
|
|
|