package main import ( "git.smesh.lol/nostr/pkg/crypto/hkdf" "git.smesh.lol/musiquay/web/common/helpers" "git.smesh.lol/musiquay/web/common/jsbridge/dom" "git.smesh.lol/musiquay/web/common/jsbridge/localstorage" "git.smesh.lol/musiquay/web/common/jsbridge/signer" "git.smesh.lol/musiquay/web/common/jsbridge/subtle" ) const lsEncKeyPrefix = "musiquay-enc-epk-" // bootstrapEncKey derives the IDB encryption key and calls done when ready. // First run: generates ephemeral keypair, ECDH via signer, stores ephemeral pubkey. // Reload: reads stored ephemeral pubkey, ECDH via signer. func bootstrapEncKey(done func()) { lsKey := lsEncKeyPrefix | appSt.pubhex epkHex := localstorage.GetItem(lsKey) if epkHex == "" { // First run: generate ephemeral secret, derive pubkey via signer. var sec [32]byte subtle.RandomBytes(sec[:]) secHex := helpers.HexEncode(sec[:]) for i := range sec { sec[i] = 0 } signer.PubkeyFromSecret(secHex, func(pkHex string) { if pkHex == "" { dom.ConsoleLog("enc: PubkeyFromSecret failed") done() return } localstorage.SetItem(lsKey, pkHex) // ECDH(user_seckey, ephemeral_pubkey) via signer's active identity. signer.GetSharedSecret(pkHex, func(sharedHex string) { if sharedHex == "" { dom.ConsoleLog("enc: getSharedSecret failed") done() return } deriveAndSetEncKey(sharedHex, done) }) }) return } // Reload: ask signer for ECDH(user_seckey, ephemeral_pubkey). signer.GetSharedSecret(epkHex, func(sharedHex string) { if sharedHex == "" { dom.ConsoleLog("enc: getSharedSecret failed") done() return } deriveAndSetEncKey(sharedHex, done) }) } func deriveAndSetEncKey(sharedHex string, done func()) { shared := helpers.HexDecode(sharedHex) prk := hkdf.Extract(nil, shared) symKey := hkdf.Expand(prk[:], []byte("musiquay-idb-enc"), 32) appSt.encKeyHex = helpers.HexEncode(symKey) dom.IDBSetEncKey(appSt.encKeyHex) dom.ConsoleLog("enc: IDB encryption key set") done() } // sendEncKeyToSW sends the encryption key to the service worker. func sendEncKeyToSW() { if appSt.encKeyHex != "" { dom.PostToSW("[\"ENC_KEY\"," | jstr(appSt.encKeyHex) | "]") } }