diff --git a/ipns.go b/ipns.go index 2d67945e523113e4cd704394cdb283f797a1b4ca..be71edb7237d479425cd926a9d68ed79873b675e 100644 --- a/ipns.go +++ b/ipns.go @@ -68,6 +68,8 @@ func GetEOL(entry *pb.IpnsEntry) (time.Time, error) { // that don't embed their public keys as they may not be able to validate them // efficiently. func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { + // Try extracting the public key from the ID. If we can, *don't* embed + // it. id, err := peer.IDFromPublicKey(pk) if err != nil { return err @@ -79,6 +81,9 @@ func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { if extraced != nil { return nil } + + // We failed to extract the public key from the peer ID, embed it in the + // record. pkBytes, err := pk.Bytes() if err != nil { return err diff --git a/ipns_test.go b/ipns_test.go new file mode 100644 index 0000000000000000000000000000000000000000..d46423fefd33fdf32f882ba00599c522a82f0c97 --- /dev/null +++ b/ipns_test.go @@ -0,0 +1,43 @@ +package ipns + +import ( + "testing" + "time" + + u "github.com/ipfs/go-ipfs-util" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" +) + +func TestEmbedPublicKey(t *testing.T) { + + sr := u.NewTimeSeededRand() + priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) + if err != nil { + t.Fatal(err) + } + + pid, err := peer.IDFromPublicKey(pub) + if err != nil { + t.Fatal(err) + } + + e, err := Create(priv, []byte("/a/b"), 0, time.Now().Add(1*time.Hour)) + if err != nil { + t.Fatal(err) + } + if err := EmbedPublicKey(pub, e); err != nil { + t.Fatal(err) + } + embeddedPk, err := ci.UnmarshalPublicKey(e.PubKey) + if err != nil { + t.Fatal(err) + } + embeddedPid, err := peer.IDFromPublicKey(embeddedPk) + if err != nil { + t.Fatal(err) + } + if embeddedPid != pid { + t.Fatalf("pid mismatch: %s != %s", pid, embeddedPid) + } +}