Add security package
This commit is contained in:
parent
9b3f9aefdb
commit
f471ef13a2
105
security/filesystem.go
Normal file
105
security/filesystem.go
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
package security
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"git.qowevisa.me/Qowevisa/gotell/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func findInStore(name string) KeyPair {
|
||||||
|
return KeyPair{}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
_int_FSPath = "./key-store"
|
||||||
|
_int_FSPairsPath = _int_FSPath + "/pairs"
|
||||||
|
_int_PrivateKeyAddon = "private.Key"
|
||||||
|
_int_PublicKeyAddon = "public.key"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initFS() error {
|
||||||
|
var err error
|
||||||
|
err = os.Mkdir(_int_FSPath, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("Mkdir:initFSPath", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.Mkdir(_int_FSPairsPath, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("Mkdir:initFSPairsPath", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fs_checkIfPairExists(name string) (bool, error) {
|
||||||
|
var err error
|
||||||
|
privateKeyPath := filepath.Join(_int_FSPairsPath, name+_int_PrivateKeyAddon)
|
||||||
|
_, err = os.Stat(privateKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return false, nil
|
||||||
|
} else {
|
||||||
|
return false, errors.WrapErr(privateKeyPath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
publicKeyPath := filepath.Join(_int_FSPairsPath, name+_int_PublicKeyAddon)
|
||||||
|
_, err = os.Stat(publicKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return false, nil
|
||||||
|
} else {
|
||||||
|
return false, errors.WrapErr(publicKeyPath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: add encryption
|
||||||
|
func fs_savePair(keyPair KeyPair) error {
|
||||||
|
var err error
|
||||||
|
err = os.WriteFile(keyPair.baseName+_int_PrivateKeyAddon, keyPair.privateKey, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("WriteFile:privateKey", err)
|
||||||
|
}
|
||||||
|
err = os.WriteFile(keyPair.baseName+_int_PublicKeyAddon, keyPair.publicKey, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("WriteFile:publicKey", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: add encryption
|
||||||
|
func fs_readPair(name string, keyPair *KeyPair) error {
|
||||||
|
var err error
|
||||||
|
privateKeyPath := filepath.Join(_int_FSPairsPath, name+_int_PrivateKeyAddon)
|
||||||
|
_, err = os.Stat(privateKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return errors.WrapErr(privateKeyPath, errors.NOT_FOUND)
|
||||||
|
} else {
|
||||||
|
return errors.WrapErr(privateKeyPath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
privKey, err := os.ReadFile(privateKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("os.ReadFile:private", err)
|
||||||
|
}
|
||||||
|
publicKeyPath := filepath.Join(_int_FSPairsPath, name+_int_PublicKeyAddon)
|
||||||
|
_, err = os.Stat(publicKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return errors.WrapErr(publicKeyPath, errors.NOT_FOUND)
|
||||||
|
} else {
|
||||||
|
return errors.WrapErr(publicKeyPath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pubKey, err := os.ReadFile(publicKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("os.ReadFile:publicKey", err)
|
||||||
|
}
|
||||||
|
keyPair.baseName = name
|
||||||
|
keyPair.privateKey = privKey
|
||||||
|
keyPair.publicKey = pubKey
|
||||||
|
return nil
|
||||||
|
}
|
69
security/store.go
Normal file
69
security/store.go
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package security
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.qowevisa.me/Qowevisa/gotell/errors"
|
||||||
|
"git.qowevisa.me/Qowevisa/gotell/types"
|
||||||
|
"golang.org/x/crypto/curve25519"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateKeyPair(cfg types.ECDHConfig) ([]byte, []byte, error) {
|
||||||
|
var private [32]byte
|
||||||
|
if _, err := rand.Read(private[:]); err != nil {
|
||||||
|
return nil, nil, errors.WrapErr("rand.Read", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
public, err := curve25519.X25519(private[:], curve25519.Basepoint)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.WrapErr("curve25519.X25519", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return private[:], public, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type KeyPair struct {
|
||||||
|
baseName string
|
||||||
|
privateKey []byte
|
||||||
|
publicKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type Store struct {
|
||||||
|
Pairs map[string]KeyPair
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitStorage() (*Store, error) {
|
||||||
|
err := initFS()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.WrapErr("initFS", err)
|
||||||
|
}
|
||||||
|
var newStore Store
|
||||||
|
newStore.Pairs = make(map[string]KeyPair)
|
||||||
|
|
||||||
|
return &newStore, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) AddNewPair(name string, ecdhCfg types.ECDHConfig) error {
|
||||||
|
_, exists := s.Pairs[name]
|
||||||
|
if exists {
|
||||||
|
return errors.WrapErr(fmt.Sprintf("Store.Pairs[%s]", name), errors.ALREADY_SET)
|
||||||
|
}
|
||||||
|
fileExists, err := fs_checkIfPairExists(name)
|
||||||
|
if fileExists {
|
||||||
|
return errors.WrapErr(fmt.Sprintf("Store.Pairs[%s]. FS found but in store", name), errors.NOT_SET)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("fs_checkIfPairExists", err)
|
||||||
|
}
|
||||||
|
private, public, err := generateKeyPair(ecdhCfg)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WrapErr("generateKeyPair", err)
|
||||||
|
}
|
||||||
|
s.Pairs[name] = KeyPair{
|
||||||
|
baseName: name,
|
||||||
|
privateKey: private,
|
||||||
|
publicKey: public,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user