45 lines
818 B
Go
45 lines
818 B
Go
package vpub
|
|
|
|
import (
|
|
"crypto/aes"
|
|
"database/sql"
|
|
"encoding/hex"
|
|
"fmt"
|
|
)
|
|
|
|
type Vpub struct {
|
|
db *sql.DB
|
|
key []byte
|
|
}
|
|
|
|
func New(databaseURL string, key []byte) (Vpub, error) {
|
|
db, err := sql.Open("postgres", databaseURL)
|
|
return Vpub{db: db, key: key}, err
|
|
}
|
|
|
|
func EncryptAES(key []byte, plaintext string) string {
|
|
c, err := aes.NewCipher(key)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return ""
|
|
}
|
|
out := make([]byte, len(plaintext))
|
|
c.Encrypt(out, []byte(plaintext))
|
|
return hex.EncodeToString(out)
|
|
}
|
|
|
|
func (v Vpub) FindOrCreateKey(name string) string {
|
|
padded := fmt.Sprintf("%16s", name)
|
|
key := EncryptAES(v.key, padded)[0:20]
|
|
|
|
query := `
|
|
insert into keys (key) values ($1) ON CONFLICT do nothing
|
|
`
|
|
|
|
_, err := v.db.Exec(query, key[:20])
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
|
|
return key
|
|
}
|