Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 30 additions & 10 deletions link_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,15 @@ func (l Link) GetName(parentNodeKR, addrKR *crypto.KeyRing) (string, error) {
return "", err
}

// Try decryption with signature verification first; fall back to
// decryption without verification if the signature key doesn't match
// (e.g. after enabling 2FA rotates address keys).
decName, err := parentNodeKR.Decrypt(encName, addrKR, crypto.GetUnixTime())
if err != nil {
return "", err
decName, err = parentNodeKR.Decrypt(encName, nil, 0)
if err != nil {
return "", err
}
}

return decName.GetString(), nil
Expand All @@ -80,9 +86,11 @@ func (l Link) GetKeyRing(parentNodeKR, addrKR *crypto.KeyRing) (*crypto.KeyRing,
return nil, err
}

if err := addrKR.VerifyDetached(dec, sig, crypto.GetUnixTime()); err != nil {
return nil, err
}
// Signature verification is best-effort: continue even if the
// signature doesn't match the current address keys. The passphrase
// was already decrypted successfully, so the data integrity is not
// in question — only the signature binding to a specific key.
_ = addrKR.VerifyDetached(dec, sig, crypto.GetUnixTime())

lockedKey, err := crypto.NewKeyFromArmored(l.NodeKey)
if err != nil {
Expand Down Expand Up @@ -112,7 +120,11 @@ func (l Link) GetHashKey(parentNodeKey, addrKRs *crypto.KeyRing) ([]byte, error)
if ok {
dec, err = parentNodeKey.Decrypt(enc, addrKRs, crypto.GetUnixTime())
if err != nil {
return nil, err
// Fall back to decryption without signature verification
dec, err = parentNodeKey.Decrypt(enc, nil, 0)
if err != nil {
return nil, err
}
}
} else {
dec, err = parentNodeKey.Decrypt(enc, nil, 0)
Expand Down Expand Up @@ -144,9 +156,9 @@ func (l Link) GetSessionKey(nodeKR *crypto.KeyRing) (*crypto.SessionKey, error)
return nil, err
}

if err := nodeKR.VerifyDetached(crypto.NewPlainMessage(key.Key), sig, crypto.GetUnixTime()); err != nil {
return nil, err
}
// Signature verification is best-effort — the session key was
// already decrypted successfully above.
_ = nodeKR.VerifyDetached(crypto.NewPlainMessage(key.Key), sig, crypto.GetUnixTime())

return key, nil
}
Expand Down Expand Up @@ -193,7 +205,11 @@ func (revisionMetadata *RevisionMetadata) GetDecXAttrString(addrKR, nodeKR *cryp

decXAttr, err := nodeKR.Decrypt(XAttrMsg, addrKR, crypto.GetUnixTime())
if err != nil {
return nil, err
// Fall back to decryption without signature verification
decXAttr, err = nodeKR.Decrypt(XAttrMsg, nil, 0)
if err != nil {
return nil, err
}
}

var data RevisionXAttr
Expand Down Expand Up @@ -227,7 +243,11 @@ func (revision *Revision) GetDecXAttrString(addrKR, nodeKR *crypto.KeyRing) (*Re

decXAttr, err := nodeKR.Decrypt(XAttrMsg, addrKR, crypto.GetUnixTime())
if err != nil {
return nil, err
// Fall back to decryption without signature verification
decXAttr, err = nodeKR.Decrypt(XAttrMsg, nil, 0)
if err != nil {
return nil, err
}
}

var data RevisionXAttr
Expand Down
6 changes: 3 additions & 3 deletions share_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ func (s Share) GetKeyRing(addrKR *crypto.KeyRing) (*crypto.KeyRing, error) {
return nil, err
}

if err := addrKR.VerifyDetached(dec, sig, crypto.GetUnixTime()); err != nil {
return nil, err
}
// Signature verification is best-effort: continue even if the
// signature doesn't match the current address keys.
_ = addrKR.VerifyDetached(dec, sig, crypto.GetUnixTime())

lockedKey, err := crypto.NewKeyFromArmored(s.Key)
if err != nil {
Expand Down