nip46: support decrypting with nip44.

This commit is contained in:
fiatjaf 2024-05-20 09:20:39 -03:00
parent abe84f9089
commit 7578bf6c71
3 changed files with 21 additions and 4 deletions

View File

@ -104,6 +104,12 @@ func (p *DynamicSigner) HandleRequest(event *nostr.Event) (
if err != nil { if err != nil {
return req, resp, eventResponse, fmt.Errorf("failed to compute shared secret: %w", err) return req, resp, eventResponse, fmt.Errorf("failed to compute shared secret: %w", err)
} }
session.SharedKey, err = nip04.ComputeSharedSecret(event.PubKey, privateKey)
if err != nil {
return req, resp, eventResponse, fmt.Errorf("failed to compute shared secret: %w", err)
}
p.setSession(event.PubKey, session) p.setSession(event.PubKey, session)
req, err = session.ParseRequest(event) req, err = session.ParseRequest(event)

View File

@ -7,6 +7,7 @@ import (
"github.com/nbd-wtf/go-nostr" "github.com/nbd-wtf/go-nostr"
"github.com/nbd-wtf/go-nostr/nip04" "github.com/nbd-wtf/go-nostr/nip04"
"github.com/nbd-wtf/go-nostr/nip44"
) )
var BUNKER_REGEX = regexp.MustCompile(`^bunker:\/\/([0-9a-f]{64})\??([?\/\w:.=&%]*)$`) var BUNKER_REGEX = regexp.MustCompile(`^bunker:\/\/([0-9a-f]{64})\??([?\/\w:.=&%]*)$`)
@ -29,7 +30,8 @@ type Signer interface {
} }
type Session struct { type Session struct {
SharedKey []byte SharedKey []byte // nip04
ConversationKey []byte // nip44
} }
type RelayReadWrite struct { type RelayReadWrite struct {
@ -40,10 +42,13 @@ type RelayReadWrite struct {
func (s Session) ParseRequest(event *nostr.Event) (Request, error) { func (s Session) ParseRequest(event *nostr.Event) (Request, error) {
var req Request var req Request
plain, err := nip04.Decrypt(event.Content, s.SharedKey) plain, err := nip44.Decrypt(event.Content, s.ConversationKey)
if err != nil {
plain, err = nip04.Decrypt(event.Content, s.SharedKey)
if err != nil { if err != nil {
return req, fmt.Errorf("failed to decrypt event from %s: %w", event.PubKey, err) return req, fmt.Errorf("failed to decrypt event from %s: %w", event.PubKey, err)
} }
}
err = json.Unmarshal([]byte(plain), &req) err = json.Unmarshal([]byte(plain), &req)
return req, err return req, err

View File

@ -56,8 +56,14 @@ func (p *StaticKeySigner) getOrCreateSession(clientPubkey string) (Session, erro
return Session{}, fmt.Errorf("failed to compute shared secret: %w", err) return Session{}, fmt.Errorf("failed to compute shared secret: %w", err)
} }
ck, err := nip44.GenerateConversationKey(clientPubkey, p.secretKey)
if err != nil {
return Session{}, fmt.Errorf("failed to compute shared secret: %w", err)
}
session := Session{ session := Session{
SharedKey: shared, SharedKey: shared,
ConversationKey: ck,
} }
// add to pool // add to pool