Yōten: A social tracker for your language learning journey built on the atproto.

feat: add a way to generate jwks

brookjeynes.dev fdfd60d6 829971ba

verified
Changed files
+64
cmd
genjwks
+64
cmd/genjwks/main.go
··· 1 + // MIT License 2 + // 3 + // Copyright (c) 2025 Anirudh Oppiliappan, Akshay Oppiliappan and 4 + // contributors. 5 + // 6 + // Permission is hereby granted, free of charge, to any person obtaining a copy 7 + // of this software and associated documentation files (the "Software"), to deal 8 + // in the Software without restriction, including without limitation the rights 9 + // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 + // copies of the Software, and to permit persons to whom the Software is 11 + // furnished to do so, subject to the following conditions: 12 + // 13 + // The above copyright notice and this permission notice shall be included in all 14 + // copies or substantial portions of the Software. 15 + // 16 + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 + // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 + // SOFTWARE. 23 + 24 + package main 25 + 26 + import ( 27 + "crypto/ecdsa" 28 + "crypto/elliptic" 29 + "crypto/rand" 30 + "encoding/json" 31 + "fmt" 32 + "time" 33 + 34 + "github.com/lestrrat-go/jwx/v2/jwk" 35 + ) 36 + 37 + func main() { 38 + privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 39 + if err != nil { 40 + panic(err) 41 + } 42 + 43 + key, err := jwk.FromRaw(privKey) 44 + if err != nil { 45 + panic(err) 46 + } 47 + 48 + kid := fmt.Sprintf("%d", time.Now().Unix()) 49 + 50 + if err := key.Set(jwk.KeyIDKey, kid); err != nil { 51 + panic(err) 52 + } 53 + 54 + if err := key.Set("use", "sig"); err != nil { 55 + panic(err) 56 + } 57 + 58 + b, err := json.Marshal(key) 59 + if err != nil { 60 + panic(err) 61 + } 62 + 63 + fmt.Println(string(b)) 64 + }