sig-auth.git

git clone https://git.crispbyte.dev/sig-auth.git

sig-auth.git / keydirectory
cheddar  ·  2025-02-21

sqlite.go

  1package keydirectory
  2
  3import (
  4	"context"
  5	"crypto"
  6	"crypto/x509"
  7	"database/sql"
  8
  9	"github.com/common-fate/httpsig/verifier"
 10	_ "github.com/mattn/go-sqlite3"
 11)
 12
 13type dbWrapper struct {
 14	db *sql.DB
 15}
 16
 17func InitSqlite(dbPath string) (*dbWrapper, error) {
 18	db, err := sql.Open("sqlite3", dbPath)
 19
 20	if err != nil {
 21		return &dbWrapper{}, err
 22	}
 23
 24	createStmt := `
 25	create table
 26	if not exists
 27	keys(keyId text not null primary key, userId text, publicKey blob)
 28	`
 29
 30	_, err = db.Exec(createStmt)
 31
 32	if err != nil {
 33		return &dbWrapper{}, err
 34	}
 35
 36	return &dbWrapper{db}, nil
 37}
 38
 39func (dir *dbWrapper) GetKey(ctx context.Context, keyId string, _ string) (verifier.Algorithm, error) {
 40	db := dir.db
 41
 42	query := "select userId, publicKey from keys where keyId = ?"
 43
 44	stmt, err := db.Prepare(query)
 45
 46	if err != nil {
 47		return nil, err
 48	}
 49
 50	defer stmt.Close()
 51
 52	var userId string
 53	var keyBytes []byte
 54
 55	row := stmt.QueryRow(keyId)
 56
 57	err = row.Scan(&userId, &keyBytes)
 58
 59	if err != nil {
 60		return nil, err
 61	}
 62
 63	publicKey, err := x509.ParsePKIXPublicKey(keyBytes)
 64
 65	if err != nil {
 66		return nil, err
 67	}
 68
 69	keyEntry := keyEntry{
 70		UserId:    userId,
 71		PublicKey: publicKey,
 72	}
 73
 74	return keyEntry.toAlg()
 75}
 76
 77func (dir *dbWrapper) RegisterKey(key crypto.PublicKey, userId string) (string, error) {
 78	db := dir.db
 79
 80	keyId, err := generateKeyId()
 81
 82	if err != nil {
 83		return "", err
 84	}
 85
 86	stmt := "insert into keys(keyId, userId, publicKey) values (?, ?, ?)"
 87
 88	keyBytes, err := x509.MarshalPKIXPublicKey(key)
 89
 90	if err != nil {
 91		return "", err
 92	}
 93
 94	_, err = db.Exec(stmt, keyId, userId, keyBytes)
 95
 96	if err != nil {
 97		return "", err
 98	}
 99
100	return keyId, nil
101}