Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.google.common.io.BaseEncoding;
import com.google.common.primitives.UnsignedInteger;
import org.bouncycastle.crypto.digests.RIPEMD160Digest;
import org.immutables.value.Value.Default;
import org.immutables.value.Value.Derived;
import org.immutables.value.Value.Immutable;
import org.immutables.value.Value.Lazy;
Expand Down Expand Up @@ -66,6 +67,8 @@ public interface PublicKey {
*/
PublicKey MULTI_SIGN_PUBLIC_KEY = PublicKey.builder().value(UnsignedByteArray.empty()).build();

PublicKey EMPTY_PUBLIC_KEY = PublicKey.builder().build();

/**
* Instantiates a new builder.
*
Expand Down Expand Up @@ -118,7 +121,10 @@ static PublicKey fromBase16EncodedPublicKey(final String base16EncodedPublicKey)
*
* @return An instance of {@link UnsignedByteArray}.
*/
UnsignedByteArray value();
@Default
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After considering this further, we should remove the empty builder so that developers don't accidentally omit an actual value. Instead, we should update EMPTY_PUBLIC_KEY to be this:

PublicKey EMPTY_PUBLIC_KEY = PublicKey.builder().value(UnsignedByteArray.empty()).build();

That way, if someone wants to overtly use an empty public key, it will be obvious they are do as much.

default UnsignedByteArray value() {
return UnsignedByteArray.empty();
}

/**
* The public-key, as a base-58 encoded {@link String}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import static org.xrpl.xrpl4j.crypto.TestConstants.ED_PUBLIC_KEY;
import static org.xrpl.xrpl4j.crypto.TestConstants.ED_PUBLIC_KEY_B58;
import static org.xrpl.xrpl4j.crypto.TestConstants.ED_PUBLIC_KEY_HEX;
import static org.xrpl.xrpl4j.crypto.keys.PublicKey.EMPTY_PUBLIC_KEY;

import com.fasterxml.jackson.core.JsonProcessingException;
import org.junit.jupiter.api.Test;
Expand All @@ -42,6 +43,50 @@
*/
public class PublicKeyTest {

private static final Address ADDRESS_DERIVED_FROM_EMPTY_PUBLIC_KEY = Address.of("rHTfx7p4ge8CfDhyoczpSwc84LWfiK3dhN");

@Test
void testEmptyPublicKey() {

// fromBase58EncodedPublicKey
assertThat(PublicKey.fromBase58EncodedPublicKey("").value()).isEqualTo(UnsignedByteArray.empty());
assertThat(PublicKey.fromBase58EncodedPublicKey("").base16Value()).isEqualTo("");
assertThat(PublicKey.fromBase58EncodedPublicKey("").base58Value()).isEqualTo("");
assertThat(PublicKey.fromBase58EncodedPublicKey("").deriveAddress()).isEqualTo(
ADDRESS_DERIVED_FROM_EMPTY_PUBLIC_KEY
);

// fromBase16EncodedPublicKey
assertThat(PublicKey.fromBase16EncodedPublicKey("").value()).isEqualTo(UnsignedByteArray.empty());
assertThat(PublicKey.fromBase16EncodedPublicKey("").base16Value()).isEqualTo("");
assertThat(PublicKey.fromBase16EncodedPublicKey("").base58Value()).isEqualTo("");
assertThat(PublicKey.fromBase16EncodedPublicKey("").deriveAddress()).isEqualTo(
ADDRESS_DERIVED_FROM_EMPTY_PUBLIC_KEY
);

// UnsignedByteArray.empty()
assertThat(PublicKey.builder().value(UnsignedByteArray.empty()).build().value()).isEqualTo(
UnsignedByteArray.empty()
);
assertThat(PublicKey.builder().value(UnsignedByteArray.empty()).build().base16Value()).isEqualTo("");
assertThat(PublicKey.builder().value(UnsignedByteArray.empty()).build().base58Value()).isEqualTo("");
assertThat(PublicKey.builder().value(UnsignedByteArray.empty()).build().deriveAddress()).isEqualTo(
ADDRESS_DERIVED_FROM_EMPTY_PUBLIC_KEY
);

// PublicKey.builder().build()
assertThat(PublicKey.builder().build().value()).isEqualTo(UnsignedByteArray.empty());
assertThat(PublicKey.builder().build().base16Value()).isEqualTo("");
assertThat(PublicKey.builder().build().base58Value()).isEqualTo("");
assertThat(PublicKey.builder().build().deriveAddress()).isEqualTo(ADDRESS_DERIVED_FROM_EMPTY_PUBLIC_KEY);

// EMPTY_PUBLIC_KEY
assertThat(EMPTY_PUBLIC_KEY.value()).isEqualTo(UnsignedByteArray.empty());
assertThat(EMPTY_PUBLIC_KEY.base16Value()).isEqualTo("");
assertThat(EMPTY_PUBLIC_KEY.base58Value()).isEqualTo("");
assertThat(EMPTY_PUBLIC_KEY.deriveAddress()).isEqualTo(ADDRESS_DERIVED_FROM_EMPTY_PUBLIC_KEY);
}

@Test
public void fromBase58EncodedStringEd25519WithTooFewBytes() {
UnsignedByteArray twoBytes = UnsignedByteArray.of(new byte[] {(byte) 0xED, (byte) 0xFF});
Expand Down Expand Up @@ -225,7 +270,8 @@ void deriveAddress() {

///////////////////
// Constants
///////////////////

/// ////////////////

@Test
void testConstants() {
Expand Down
Loading