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}