From f3045c685ded18c2ed1158d731f590a581c5018e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:18:02 +0100 Subject: [PATCH 1/8] Add Booleans utility class --- .../java/org/bouncycastle/util/Booleans.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core/src/main/java/org/bouncycastle/util/Booleans.java diff --git a/core/src/main/java/org/bouncycastle/util/Booleans.java b/core/src/main/java/org/bouncycastle/util/Booleans.java new file mode 100644 index 0000000000..c3970c9a01 --- /dev/null +++ b/core/src/main/java/org/bouncycastle/util/Booleans.java @@ -0,0 +1,44 @@ +package org.bouncycastle.util; + +public class Booleans { + + /** + * Convert the given boolean value into a one-entry byte array, where true is represented by a 1 and false is a 0. + * @param bool boolean value + * @return byte array + */ + public static byte[] toByteArray(boolean bool) + { + byte[] bytes = new byte[1]; + if (bool) + { + bytes[0] = 1; + } + return bytes; + } + + /** + * Convert a one-entry byte array into a boolean. + * If the byte array doesn't have one entry, or if this entry is neither a 0 nor 1, this method throws an + * {@link IllegalArgumentException}. + * A 1 is translated into true, a 0 into false. + * @param bytes byte array + * @return boolean + */ + public static boolean fromByteArray(byte[] bytes) + { + if (bytes.length != 1) + { + throw new IllegalArgumentException("Byte array has unexpected length. Expected length 1, got " + bytes.length); + } + if (bytes[0] == 0) + { + return false; + } + else if (bytes[0] == 1) + { + return true; + } + else throw new IllegalArgumentException("Unexpected byte value for boolean encoding: " + bytes[0]); + } +} From 241485ed3cb9773d298dea256554155cf33677f2 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:18:43 +0100 Subject: [PATCH 2/8] Fix documentation of PrimaryUserID class --- pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java b/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java index eff6e90d92..4cff611f77 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java @@ -4,7 +4,7 @@ import org.bouncycastle.bcpg.SignatureSubpacketTags; /** - * packet giving whether or not the signature is signed using the primary user ID for the key. + * Signature Subpacket indicating, whether the signed User-ID is marked as the primary user ID for the key. */ public class PrimaryUserID extends SignatureSubpacket From 6aa79b168a08c18f9c970fe7e1279b55094a9305 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:18:58 +0100 Subject: [PATCH 3/8] Reuse new Booleans methods in PrimaryUserID class --- .../bouncycastle/bcpg/sig/PrimaryUserID.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java b/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java index 4cff611f77..0230e2477d 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/sig/PrimaryUserID.java @@ -2,29 +2,14 @@ import org.bouncycastle.bcpg.SignatureSubpacket; import org.bouncycastle.bcpg.SignatureSubpacketTags; +import org.bouncycastle.util.Booleans; /** * Signature Subpacket indicating, whether the signed User-ID is marked as the primary user ID for the key. */ public class PrimaryUserID extends SignatureSubpacket -{ - private static byte[] booleanToByteArray( - boolean value) - { - byte[] data = new byte[1]; - - if (value) - { - data[0] = 1; - return data; - } - else - { - return data; - } - } - +{ public PrimaryUserID( boolean critical, boolean isLongLength, @@ -37,11 +22,11 @@ public PrimaryUserID( boolean critical, boolean isPrimaryUserID) { - super(SignatureSubpacketTags.PRIMARY_USER_ID, critical, false, booleanToByteArray(isPrimaryUserID)); + super(SignatureSubpacketTags.PRIMARY_USER_ID, critical, false, Booleans.toByteArray(isPrimaryUserID)); } public boolean isPrimaryUserID() { - return data[0] != 0; + return Booleans.fromByteArray(data); } } From 9a03f9ee5fedbb1b2c149fa40c5b5dd769ad7ef2 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:30:31 +0100 Subject: [PATCH 4/8] Add BytesTest --- .../bouncycastle/util/utiltest/BytesTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 core/src/test/java/org/bouncycastle/util/utiltest/BytesTest.java diff --git a/core/src/test/java/org/bouncycastle/util/utiltest/BytesTest.java b/core/src/test/java/org/bouncycastle/util/utiltest/BytesTest.java new file mode 100644 index 0000000000..fa7abb29d9 --- /dev/null +++ b/core/src/test/java/org/bouncycastle/util/utiltest/BytesTest.java @@ -0,0 +1,41 @@ +package org.bouncycastle.util.utiltest; + +import junit.framework.TestCase; +import org.bouncycastle.util.Booleans; + +public class BytesTest extends TestCase { + + public void testParseFalse() { + byte[] bFalse = Booleans.toByteArray(false); + assertEquals(1, bFalse.length); + assertEquals(0, bFalse[0]); + assertFalse(Booleans.fromByteArray(bFalse)); + } + + public void testParseTrue() { + byte[] bTrue = Booleans.toByteArray(true); + assertEquals(1, bTrue.length); + assertEquals(1, bTrue[1]); + assertTrue(Booleans.fromByteArray(bTrue)); + } + + public void testParseTooShort() { + byte[] bTooShort = new byte[0]; + try { + Booleans.fromByteArray(bTooShort); + fail("Should throw."); + } catch (IllegalArgumentException e) { + // expected. + } + } + + public void testParseTooLong() { + byte[] bTooLong = new byte[42]; + try { + Booleans.fromByteArray(bTooLong); + fail("Should throw."); + } catch (IllegalArgumentException e) { + // expected. + } + } +} From d84673cd9c6300ab2574f9afc9928505ab8bf215 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:56:54 +0100 Subject: [PATCH 5/8] Fix documentation of Exportable --- pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java b/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java index 476b4eaec4..46a8f212d8 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java @@ -4,7 +4,7 @@ import org.bouncycastle.bcpg.SignatureSubpacketTags; /** - * packet giving signature creation time. + * Signature subpacket indicating, whether the carrying signature is intended to be exportable. */ public class Exportable extends SignatureSubpacket From cd4efecf9d2003456b686a8eab882d19b96e5d6d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:57:13 +0100 Subject: [PATCH 6/8] Reuse Booleans methods in Exportable signature subpacket --- .../org/bouncycastle/bcpg/sig/Exportable.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java b/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java index 46a8f212d8..020c93a870 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/sig/Exportable.java @@ -2,29 +2,14 @@ import org.bouncycastle.bcpg.SignatureSubpacket; import org.bouncycastle.bcpg.SignatureSubpacketTags; +import org.bouncycastle.util.Booleans; /** * Signature subpacket indicating, whether the carrying signature is intended to be exportable. */ public class Exportable extends SignatureSubpacket -{ - private static byte[] booleanToByteArray( - boolean value) - { - byte[] data = new byte[1]; - - if (value) - { - data[0] = 1; - return data; - } - else - { - return data; - } - } - +{ public Exportable( boolean critical, boolean isLongLength, @@ -37,11 +22,11 @@ public Exportable( boolean critical, boolean isExportable) { - super(SignatureSubpacketTags.EXPORTABLE, critical, false, booleanToByteArray(isExportable)); + super(SignatureSubpacketTags.EXPORTABLE, critical, false, Booleans.toByteArray(isExportable)); } public boolean isExportable() { - return data[0] != 0; + return Booleans.fromByteArray(data); } } From cb1f989e96becb32b1547c56db3785c2ebe5e2ab Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:58:45 +0100 Subject: [PATCH 7/8] Fix documentation of Revocable signature subpacket --- pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java b/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java index 86f4cef462..5843b11c0b 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java @@ -4,7 +4,7 @@ import org.bouncycastle.bcpg.SignatureSubpacketTags; /** - * packet giving whether or not is revocable. + * Signature subpacket indicating, whether the carrying signature can be revoked. */ public class Revocable extends SignatureSubpacket From ce31e738b2c453df4ba206320522c913bdc99f5a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Jan 2024 18:59:00 +0100 Subject: [PATCH 8/8] Reuse Booleans methods in Revocable signature subpacket --- .../org/bouncycastle/bcpg/sig/Revocable.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java b/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java index 5843b11c0b..0f9d6b8d98 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/sig/Revocable.java @@ -2,29 +2,14 @@ import org.bouncycastle.bcpg.SignatureSubpacket; import org.bouncycastle.bcpg.SignatureSubpacketTags; +import org.bouncycastle.util.Booleans; /** * Signature subpacket indicating, whether the carrying signature can be revoked. */ public class Revocable extends SignatureSubpacket -{ - private static byte[] booleanToByteArray( - boolean value) - { - byte[] data = new byte[1]; - - if (value) - { - data[0] = 1; - return data; - } - else - { - return data; - } - } - +{ public Revocable( boolean critical, boolean isLongLength, @@ -37,11 +22,11 @@ public Revocable( boolean critical, boolean isRevocable) { - super(SignatureSubpacketTags.REVOCABLE, critical, false, booleanToByteArray(isRevocable)); + super(SignatureSubpacketTags.REVOCABLE, critical, false, Booleans.toByteArray(isRevocable)); } public boolean isRevocable() { - return data[0] != 0; + return Booleans.fromByteArray(data); } }