Skip to content

Commit

Permalink
Merge pull request #1366 from oasisprotocol/kostko/fix/csdk-go-pk-equ…
Browse files Browse the repository at this point in the history
…al-ptr

client-sdk/go/crypto: Fix public key comparison for pointer variants
  • Loading branch information
kostko committed May 15, 2023
2 parents 8039a75 + 65d2158 commit ca293cb
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 9 deletions.
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# Default code owners.
* @kostko @pro-wh @ptrus @nhynes
* @kostko @pro-wh @ptrus
11 changes: 8 additions & 3 deletions client-sdk/go/crypto/signature/ed25519/ed25519.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,16 @@ func (pk PublicKey) String() string {

// Equal compares vs another public key for equality.
func (pk PublicKey) Equal(other sdkSignature.PublicKey) bool {
opk, ok := other.(PublicKey)
if !ok {
var opk *PublicKey
switch otherPk := other.(type) {
case PublicKey:
opk = &otherPk
case *PublicKey:
opk = otherPk
default:
return false
}
return (signature.PublicKey)(pk).Equal((signature.PublicKey)(opk))
return (signature.PublicKey)(pk).Equal((signature.PublicKey)(*opk))
}

// Verify returns true iff the signature is valid for the public key over the context and message.
Expand Down
27 changes: 27 additions & 0 deletions client-sdk/go/crypto/signature/ed25519/ed25519_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ed25519

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestEd25519Equal(t *testing.T) {
require := require.New(t)

pk1 := NewPublicKey("YgkEiVSR4SMQdfXw+ppuFYlqH0seutnCKk8KG8PyAx0=")
pk2 := NewPublicKey("NcPzNW3YU2T+ugNUtUWtoQnRvbOL9dYSaBfbjHLP1pE=")
pk3 := NewPublicKey("YgkEiVSR4SMQdfXw+ppuFYlqH0seutnCKk8KG8PyAx0=")

require.True(pk1.Equal(pk1)) //nolint: gocritic
require.True(pk1.Equal(&pk1))
require.True(pk1.Equal(pk3))
require.True(pk1.Equal(&pk3))
require.True(pk3.Equal(pk3)) //nolint: gocritic
require.True(pk3.Equal(&pk3))
require.True(pk3.Equal(pk1))
require.True(pk3.Equal(&pk1))

require.False(pk1.Equal(pk2))
require.False(pk1.Equal(&pk2))
}
11 changes: 8 additions & 3 deletions client-sdk/go/crypto/signature/secp256k1/secp256k1.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,16 @@ func (pk PublicKey) String() string {

// Equal compares vs another public key for equality.
func (pk PublicKey) Equal(other sdkSignature.PublicKey) bool {
opk, ok := other.(PublicKey)
if !ok {
var opk *PublicKey
switch otherPk := other.(type) {
case PublicKey:
opk = &otherPk
case *PublicKey:
opk = otherPk
default:
return false
}
obpk := btcec.PublicKey(opk)
obpk := btcec.PublicKey(*opk)
bpk := btcec.PublicKey(pk)
return bpk.IsEqual(&obpk)
}
Expand Down
20 changes: 20 additions & 0 deletions client-sdk/go/crypto/signature/secp256k1/secp256k1_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,23 @@ func TestSecp256k1Reset(t *testing.T) {
ver2 := s.Public().Verify(ctx1.Derive(), msg1, sig1)
require.False(ver2, "verification should fail after reset")
}

func TestSecp256k1Equal(t *testing.T) {
require := require.New(t)

pk1 := NewPublicKey("AwF6GNjbybMzhi3XRj5R1oTiMMkO1nAwB7NZAlH1X4BE")
pk2 := NewPublicKey("A9i0oSK+5sLSONbMYGmaFUA+Fb8zzqYEMUMspacIgO09")
pk3 := NewPublicKey("AwF6GNjbybMzhi3XRj5R1oTiMMkO1nAwB7NZAlH1X4BE")

require.True(pk1.Equal(pk1)) //nolint: gocritic
require.True(pk1.Equal(&pk1))
require.True(pk1.Equal(pk3))
require.True(pk1.Equal(&pk3))
require.True(pk3.Equal(pk3)) //nolint: gocritic
require.True(pk3.Equal(&pk3))
require.True(pk3.Equal(pk1))
require.True(pk3.Equal(&pk1))

require.False(pk1.Equal(pk2))
require.False(pk1.Equal(&pk2))
}
18 changes: 16 additions & 2 deletions client-sdk/go/crypto/signature/sr25519/sr25519.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,13 @@ func (pk PublicKey) String() string {

// Equal compares vs another public key for equality.
func (pk PublicKey) Equal(other signature.PublicKey) bool {
opk, ok := other.(PublicKey)
if !ok {
var opk *PublicKey
switch otherPk := other.(type) {
case PublicKey:
opk = &otherPk
case *PublicKey:
opk = otherPk
default:
return false
}
if pk.inner == nil && opk.inner != nil || pk.inner != nil && opk.inner == nil {
Expand Down Expand Up @@ -95,3 +100,12 @@ func newSigningTranscript(context, message []byte) *sr25519.SigningTranscript {

return signingContext.NewTranscriptHash(h)
}

// NewPublicKey creates a new public key from the given Base64 representation or
// panics.
func NewPublicKey(text string) (pk PublicKey) {
if err := pk.UnmarshalText([]byte(text)); err != nil {
panic(err)
}
return
}
27 changes: 27 additions & 0 deletions client-sdk/go/crypto/signature/sr25519/sr25519_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package sr25519

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestSr25519Equal(t *testing.T) {
require := require.New(t)

pk1 := NewPublicKey("ljm9ZwdAldhlyWM2B4C+3gQZis+ceaxnt6QA4rOcP0k=")
pk2 := NewPublicKey("0MHrNhjVTOFWmsOgpWcC3L8jIX3ZatKr0/yxMPtwckc=")
pk3 := NewPublicKey("ljm9ZwdAldhlyWM2B4C+3gQZis+ceaxnt6QA4rOcP0k=")

require.True(pk1.Equal(pk1)) //nolint: gocritic
require.True(pk1.Equal(&pk1))
require.True(pk1.Equal(pk3))
require.True(pk1.Equal(&pk3))
require.True(pk3.Equal(pk3)) //nolint: gocritic
require.True(pk3.Equal(&pk3))
require.True(pk3.Equal(pk1))
require.True(pk3.Equal(&pk1))

require.False(pk1.Equal(pk2))
require.False(pk1.Equal(&pk2))
}

0 comments on commit ca293cb

Please sign in to comment.