aboutsummaryrefslogtreecommitdiff
path: root/src/test/model/csr/CertificationRequestTest.java
diff options
context:
space:
mode:
authorYuuta Liang <yuutaw@students.cs.ubc.ca>2023-10-12 12:10:33 +0800
committerYuuta Liang <yuutaw@students.cs.ubc.ca>2023-10-12 12:10:33 +0800
commitd342a45d98c4795b3a3fe1aaef5236ad4a782b55 (patch)
treef4ebc0ad962b138d9371413fcc71c97a559df506 /src/test/model/csr/CertificationRequestTest.java
parente60c9c76243cfe0a408af98dc60bedb973e815db (diff)
downloadjca-d342a45d98c4795b3a3fe1aaef5236ad4a782b55.tar
jca-d342a45d98c4795b3a3fe1aaef5236ad4a782b55.tar.gz
jca-d342a45d98c4795b3a3fe1aaef5236ad4a782b55.tar.bz2
jca-d342a45d98c4795b3a3fe1aaef5236ad4a782b55.zip
Implement data structures from X.680, X.501, X.509, and PKCS#10, with X.690 encoding / decoding support
The implementation took four days, and it is still a little bit rough. Updated version should arrive soon. Signed-off-by: Yuuta Liang <yuutaw@students.cs.ubc.ca>
Diffstat (limited to 'src/test/model/csr/CertificationRequestTest.java')
-rw-r--r--src/test/model/csr/CertificationRequestTest.java114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/test/model/csr/CertificationRequestTest.java b/src/test/model/csr/CertificationRequestTest.java
new file mode 100644
index 0000000..962e90b
--- /dev/null
+++ b/src/test/model/csr/CertificationRequestTest.java
@@ -0,0 +1,114 @@
+package model.csr;
+
+import model.TestConstants;
+import model.asn1.*;
+import model.asn1.exceptions.ParseException;
+import model.asn1.parsing.BytesReader;
+import model.pki.AlgorithmIdentifier;
+import model.pki.SubjectPublicKeyInfo;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Stream;
+
+import static model.TestConstants.mutate;
+import static org.junit.jupiter.api.Assertions.*;
+
+public class CertificationRequestTest {
+ private static final Byte[] CSR_1 = Stream.of(
+ // SEQUENCE (CertificationRequest)
+ Arrays.asList(new Byte[]{ 0x30, -126, 0x02, -102 }),
+ // SEQUENCE (CertificationRequestInfo)
+ Arrays.asList(CertificationRequestInfoTest.CSR_1),
+ // SEQUENCE (AlgorithmIdentifier)
+ Arrays.asList(new Byte[]{
+ 0x30, 0x0D, 0x06, 0x09, 0x2A, -122, 0x48, -122,
+ -9, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00
+ }),
+ // BIT STRING (Signature)
+ Arrays.asList(new Byte[]{
+ 0x03, -127, -127,
+ 0x00, 0x6F, 0x61, 0x5C, -25, 0x29, 0x48, 0x3F,
+ -78, 0x1B, -117, 0x2C, -93, -114, 0x7D, -77,
+ 0x62, 0x14, 0x21, 0x4B, -99, 0x74, -95, -93,
+ 0x16, 0x38, 0x31, 0x40, 0x5E, 0x72, -77, -55,
+ 0x6D, -69, 0x19, -108, 0x52, -95, 0x19, -121,
+ -81, -71, 0x74, -123, 0x6B, -27, -20, 0x4C,
+ -126, 0x42, -89, 0x66, 0x6A, 0x52, -34, 0x62,
+ 0x72, 0x40, 0x2C, -79, 0x78, -117, -100, -70,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7E,
+ })).flatMap(Collection::stream).toArray(Byte[]::new);
+
+ @Test
+ void testConstructor() {
+ final CertificationRequest request = new CertificationRequest(
+ ASN1Object.TAG_SEQUENCE, null,
+ new CertificationRequestInfo(
+ ASN1Object.TAG_SEQUENCE, null,
+ new Int(Int.TAG, null, CertificationRequestInfo.VERSION_V1),
+ TestConstants.NAME_2,
+ new SubjectPublicKeyInfo(ASN1Object.TAG_SEQUENCE, null,
+ new AlgorithmIdentifier(ASN1Object.TAG_SEQUENCE, null,
+ new ObjectIdentifier(ObjectIdentifier.TAG, null,
+ ObjectIdentifier.OID_SHA256_WITH_RSA_ENCRYPTION),
+ new Null(Null.TAG, null)),
+ new BitString(BitString.TAG, null,
+ 0, new Byte[]{ 1, 2, 3, 4, 5 })),
+ TestConstants.CSR_ATTRS_2),
+ new AlgorithmIdentifier(ASN1Object.TAG_SEQUENCE, null,
+ new ObjectIdentifier(ObjectIdentifier.TAG, null,
+ ObjectIdentifier.OID_SHA256_WITH_RSA_ENCRYPTION),
+ new Null(Null.TAG, null)),
+ new BitString(BitString.TAG, null,
+ 0, new Byte[]{ 2, 4, 6, 8, 10 }));
+
+ assertEquals(CertificationRequestInfo.VERSION_V1,
+ request.getCertificationRequestInfo().getVersion().getLong());
+ assertEquals(3,
+ request.getCertificationRequestInfo().getSubject().getRdnSequence().length);
+ assertArrayEquals(ObjectIdentifier.OID_SHA256_WITH_RSA_ENCRYPTION,
+ request.getSignatureAlgorithm().getType().getInts());
+ assertArrayEquals(new Byte[]{ 2, 4, 6, 8, 10 },
+ request.getSignature().getConvertedVal());
+ }
+
+ @Test
+ void testParse() throws ParseException {
+ final CertificationRequest parsed =
+ new CertificationRequest(new BytesReader(CSR_1), false);
+ assertEquals("CN=MIKU.AD.YUUTA.MOE",
+ parsed.getCertificationRequestInfo().getSubject().toString());
+ assertArrayEquals(ObjectIdentifier.OID_SHA256_WITH_RSA_ENCRYPTION,
+ parsed.getSignatureAlgorithm().getType().getInts());
+ }
+
+ @Test
+ void testParseFail() throws ParseException {
+ // Incorrect info tag
+ assertThrows(ParseException.class, () -> {
+ new CertificationRequest(new BytesReader(mutate(CSR_1, 4, 0x30, 0x31)), false);
+ });
+ // Incorrect algorithm info tag
+ assertThrows(ParseException.class, () -> {
+ new CertificationRequest(new BytesReader(mutate(CSR_1, 523, 0x30, 0x31)), false);
+ });
+ // Incorrect signature tag
+ assertThrows(ParseException.class, () -> {
+ new CertificationRequest(new BytesReader(mutate(CSR_1, 538, 0x3, 0x31)), false);
+ });
+ }
+
+ @Test
+ void testEncode() throws ParseException {
+ assertArrayEquals(CSR_1, new CertificationRequest(new BytesReader(CSR_1), false).encodeDER());
+ }
+}