git.sophuwu.com > seks   
              59
            
             package keyring

import (
	"crypto/rand"
	"encoding/hex"
	"encoding/json"
	"github.com/asdine/storm/v3"
	"golang.org/x/crypto/nacl/box"
	"strings"
)

const KEYHEADER = "----BEGIN SEKS PUBLIC KEY BLOCK-----"
const KEYFOOTER = "-----END SEKS PUBLIC KEY BLOCK-----"
const PRIVHEAD = "----BEGIN SEKS PRIVATE KEY BLOCK-----"
const PRIVFOOT = "-----END SEKS PRIVATE KEY BLOCK-----"

const KeyVersion = "SEKS1.0"

type PubKey struct {
	Name    string            `storm:"index"`
	Email   string            `storm:"index"`
	PubKey  [32]byte          `storm:"unique"`
	KeyID   string            `storm:"id"`
	Tags    map[string]string `storm:"index"`
	Version string            `storm:"index"`
}

func (p *PubKey) Export() (string, error) {
	s := KEYHEADER + "\n"
	s += "Version: " + p.Version + "\n"
	s += "Name: " + p.Name
	if p.Email != "" {
		s += " <" + p.Email + ">"
	}
	s += "\n"
	jsn, err := json.Marshal(p)
	if err != nil {
		return "", err
	}
	return s + "\n" + hex.EncodeToString(p.PubKey[:]) + "\n" + string(jsn) + "\n" + KEYFOOTER, nil
}

type PrivKey struct {
	PubID     string `storm:"index"`
	Encrypted string `storm:"index"`
}

func KeyGen() (string, string) {
	pub, priv, err := box.GenerateKey(rand.Reader)
	if err != nil {
		return "", ""
	}

	pubs := "public-key-" + hex.EncodeToString(pub[:])
	privs := "SECRET-KEY-" + strings.ToUpper(hex.EncodeToString(priv[:]))
	return pubs, privs
}

var DB *storm.DB