aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuuta Liang <yuutaw@student.cs.ubc.ca>2023-11-28 21:08:03 -0800
committerYuuta Liang <yuutaw@student.cs.ubc.ca>2023-11-28 21:08:03 -0800
commitf8e05e4376e1d5f00c93307605eb768281ad240b (patch)
tree5683cfe5c5c612452723f44d3eee114f27498fcf
parent2a9c2e3abf57a5d92e311c07679ff62be7275f02 (diff)
downloadjca-f8e05e4376e1d5f00c93307605eb768281ad240b.tar
jca-f8e05e4376e1d5f00c93307605eb768281ad240b.tar.gz
jca-f8e05e4376e1d5f00c93307605eb768281ad240b.tar.bz2
jca-f8e05e4376e1d5f00c93307605eb768281ad240b.zip
Add association tags and generate UML
Signed-off-by: Yuuta Liang <yuutaw@student.cs.ubc.ca>
-rw-r--r--img/uml.all.pdfbin0 -> 35510 bytes
-rw-r--r--img/uml.assoc.pdfbin0 -> 31783 bytes
-rw-r--r--img/uml.type.pdfbin0 -> 24371 bytes
-rw-r--r--src/main/model/GroupObserver.java3
-rw-r--r--src/main/model/asn1/ASN1Object.java3
-rw-r--r--src/main/model/asn1/Encodable.java3
-rw-r--r--src/main/model/asn1/Tag.java2
-rw-r--r--src/main/model/ca/CertificationAuthority.java9
-rw-r--r--src/main/model/ca/Template.java2
-rw-r--r--src/main/model/csr/Attribute.java3
-rw-r--r--src/main/model/csr/Attributes.java2
-rw-r--r--src/main/model/csr/CertificationRequest.java4
-rw-r--r--src/main/model/csr/CertificationRequestInfo.java8
-rw-r--r--src/main/model/csr/Values.java5
-rw-r--r--src/main/model/pki/AlgorithmIdentifier.java3
-rw-r--r--src/main/model/pki/SubjectPublicKeyInfo.java3
-rw-r--r--src/main/model/pki/cert/Certificate.java4
-rw-r--r--src/main/model/pki/cert/Extension.java4
-rw-r--r--src/main/model/pki/cert/Extensions.java5
-rw-r--r--src/main/model/pki/cert/TbsCertificate.java12
-rw-r--r--src/main/model/pki/cert/Validity.java3
-rw-r--r--src/main/model/pki/crl/CertificateList.java4
-rw-r--r--src/main/model/pki/crl/CertificateListContent.java6
-rw-r--r--src/main/model/pki/crl/RevokedCertificate.java4
-rw-r--r--src/main/model/x501/AttributeTypeAndValue.java3
-rw-r--r--src/main/model/x501/Name.java2
-rw-r--r--src/main/model/x501/RelativeDistinguishedName.java2
-rw-r--r--src/main/ui/gui/IssueDialog.java4
-rw-r--r--src/main/ui/gui/MainUI.java34
-rw-r--r--src/main/ui/gui/RevokeDialog.java7
-rw-r--r--src/main/ui/gui/TemplateEditDialog.java2
-rw-r--r--src/main/ui/gui/widgets/CertEditDialog.java6
-rw-r--r--src/main/ui/gui/widgets/CertTableModel.java3
-rw-r--r--src/main/ui/gui/widgets/LogTableModel.java2
-rw-r--r--src/main/ui/gui/widgets/QRPanel.java2
-rw-r--r--src/main/ui/gui/widgets/TemplateTableModel.java2
36 files changed, 161 insertions, 0 deletions
diff --git a/img/uml.all.pdf b/img/uml.all.pdf
new file mode 100644
index 0000000..5cd8cd5
--- /dev/null
+++ b/img/uml.all.pdf
Binary files differ
diff --git a/img/uml.assoc.pdf b/img/uml.assoc.pdf
new file mode 100644
index 0000000..39d5908
--- /dev/null
+++ b/img/uml.assoc.pdf
Binary files differ
diff --git a/img/uml.type.pdf b/img/uml.type.pdf
new file mode 100644
index 0000000..75855bf
--- /dev/null
+++ b/img/uml.type.pdf
Binary files differ
diff --git a/src/main/model/GroupObserver.java b/src/main/model/GroupObserver.java
index 41a9aac..8bef502 100644
--- a/src/main/model/GroupObserver.java
+++ b/src/main/model/GroupObserver.java
@@ -1,5 +1,7 @@
package model;
+import annotations.Assoc;
+
import java.util.HashMap;
import java.util.Map;
@@ -10,6 +12,7 @@ public class GroupObserver implements Observer {
/**
* The map. Because Java doesn't have dependent maps, they are left here as unchecked.
*/
+ @Assoc(partOf = true)
private final Map<Class, Observer> map = new HashMap<>();
/**
diff --git a/src/main/model/asn1/ASN1Object.java b/src/main/model/asn1/ASN1Object.java
index ca10fa6..1e4d600 100644
--- a/src/main/model/asn1/ASN1Object.java
+++ b/src/main/model/asn1/ASN1Object.java
@@ -1,5 +1,6 @@
package model.asn1;
+import annotations.Assoc;
import model.asn1.exceptions.ParseException;
import model.asn1.parsing.BytesReader;
@@ -28,6 +29,7 @@ public class ASN1Object implements Encodable {
public static final Tag TAG_SET = new Tag(TagClass.UNIVERSAL, true, 0x11);
// The ASN.1 type tag.
+ @Assoc(partOf = true)
private final Tag tag;
// The value length for implementation parsing purposes (only available if the object is parsed)
@@ -37,6 +39,7 @@ public class ASN1Object implements Encodable {
private final Byte[] value;
// The parent ASN.1 type tag, if required for EXPLICIT tagging with a CONTEXT SPECIFIC tag number.
+ @Assoc(lowerBond = 0, partOf = true)
private final Tag parentTag;
/**
diff --git a/src/main/model/asn1/Encodable.java b/src/main/model/asn1/Encodable.java
index 547029c..64d5f60 100644
--- a/src/main/model/asn1/Encodable.java
+++ b/src/main/model/asn1/Encodable.java
@@ -5,5 +5,8 @@ package model.asn1;
*/
@FunctionalInterface
public interface Encodable {
+ /**
+ * EFFECTS: Encode the object into DER bytes.
+ */
Byte[] encodeDER();
}
diff --git a/src/main/model/asn1/Tag.java b/src/main/model/asn1/Tag.java
index 7fb8ae4..9b6a480 100644
--- a/src/main/model/asn1/Tag.java
+++ b/src/main/model/asn1/Tag.java
@@ -1,5 +1,6 @@
package model.asn1;
+import annotations.Assoc;
import model.asn1.exceptions.ParseException;
import model.asn1.parsing.BytesReader;
@@ -7,6 +8,7 @@ import model.asn1.parsing.BytesReader;
* Represents the metadata (tag) of an ASN.1 type.
*/
public class Tag implements Encodable {
+ @Assoc(partOf = true)
private final TagClass cls;
private final boolean constructive;
private final int number;
diff --git a/src/main/model/ca/CertificationAuthority.java b/src/main/model/ca/CertificationAuthority.java
index b118637..b724e83 100644
--- a/src/main/model/ca/CertificationAuthority.java
+++ b/src/main/model/ca/CertificationAuthority.java
@@ -1,5 +1,6 @@
package model.ca;
+import annotations.Assoc;
import model.Event;
import model.EventLog;
import model.Observer;
@@ -44,21 +45,25 @@ public class CertificationAuthority {
/**
* The RSA2048 private key.
*/
+ @Assoc(partOf = true, lowerBond = 0)
private RSAPrivateKey key;
/**
* The public key.
*/
+ @Assoc(partOf = true, lowerBond = 0)
private RSAPublicKey publicKey;
/**
* The signed certificate.
*/
+ @Assoc(partOf = true, lowerBond = 0)
private Certificate certificate;
/**
* Signed certificates.
*/
+ @Assoc(lowerBond = 0)
private final List<Certificate> signed;
/**
@@ -69,16 +74,19 @@ public class CertificationAuthority {
/**
* Revoked certs.
*/
+ @Assoc(lowerBond = 0)
private final List<RevokedCertificate> revoked;
/**
* Certificate templates.
*/
+ @Assoc(lowerBond = 0)
private final List<Template> templates;
/**
* Audit logs.
*/
+ @Assoc(lowerBond = 0)
private final List<AuditLogEntry> logs;
/**
@@ -89,6 +97,7 @@ public class CertificationAuthority {
/**
* Data observers.
*/
+ @Assoc(lowerBond = 0)
private final List<Observer> observers;
/**
diff --git a/src/main/model/ca/Template.java b/src/main/model/ca/Template.java
index 44de676..d2df360 100644
--- a/src/main/model/ca/Template.java
+++ b/src/main/model/ca/Template.java
@@ -1,5 +1,6 @@
package model.ca;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.ObjectIdentifier;
import model.asn1.PrintableString;
@@ -26,6 +27,7 @@ public class Template {
/**
* Subject of the issued certs. Null -> unspecified
*/
+ @Assoc(partOf = true, lowerBond = 0)
private final Name subject;
/**
diff --git a/src/main/model/csr/Attribute.java b/src/main/model/csr/Attribute.java
index 2daa000..26c3271 100644
--- a/src/main/model/csr/Attribute.java
+++ b/src/main/model/csr/Attribute.java
@@ -1,5 +1,6 @@
package model.csr;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.ObjectIdentifier;
import model.asn1.Tag;
@@ -26,11 +27,13 @@ public class Attribute extends ASN1Object {
* The type of that attribute. For example, <pre>2.5.29.14</pre> is subjectKeyIdentifier.
* It determines the format of the value.
*/
+ @Assoc(partOf = true)
private final ObjectIdentifier type;
/**
* Value set.
*/
+ @Assoc(partOf = true)
private final Values values;
/**
diff --git a/src/main/model/csr/Attributes.java b/src/main/model/csr/Attributes.java
index 302741d..ae64434 100644
--- a/src/main/model/csr/Attributes.java
+++ b/src/main/model/csr/Attributes.java
@@ -1,5 +1,6 @@
package model.csr;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.Encodable;
import model.asn1.Tag;
@@ -18,6 +19,7 @@ import java.util.stream.Stream;
* </pre>
*/
public class Attributes extends ASN1Object {
+ @Assoc(partOf = true)
private final Attribute[] array;
/**
diff --git a/src/main/model/csr/CertificationRequest.java b/src/main/model/csr/CertificationRequest.java
index 64203f9..fc22228 100644
--- a/src/main/model/csr/CertificationRequest.java
+++ b/src/main/model/csr/CertificationRequest.java
@@ -1,5 +1,6 @@
package model.csr;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.BitString;
import model.asn1.Tag;
@@ -36,16 +37,19 @@ public class CertificationRequest extends ASN1Object {
* All info of that CSR, excluding the signature.
* It will be signed, and the signature is in <pre>signature</pre>.
*/
+ @Assoc(partOf = true)
private final CertificationRequestInfo certificationRequestInfo;
/**
* The algorithm used for <pre>signature</pre>.
*/
+ @Assoc(partOf = true)
private final AlgorithmIdentifier signatureAlgorithm;
/**
* The signature.
*/
+ @Assoc(partOf = true)
private final BitString signature;
/**
diff --git a/src/main/model/csr/CertificationRequestInfo.java b/src/main/model/csr/CertificationRequestInfo.java
index 8f68ac8..4834813 100644
--- a/src/main/model/csr/CertificationRequestInfo.java
+++ b/src/main/model/csr/CertificationRequestInfo.java
@@ -1,5 +1,6 @@
package model.csr;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.Int;
import model.asn1.Tag;
@@ -38,18 +39,25 @@ public class CertificationRequestInfo extends ASN1Object {
/**
* Version of the CRL. Always {@link CertificationRequestInfo#VERSION_V1} (0).
*/
+ @Assoc(partOf = true)
private final Int version;
/**
* Subject of the requested certificate
*/
+ @Assoc(partOf = true)
private final Name subject;
/**
* The public key to request.
*/
+ @Assoc(partOf = true)
private final SubjectPublicKeyInfo subjectPKInfo;
+ /**
+ * The request attributes.
+ */
+ @Assoc(partOf = true)
private final Attributes attributes;
/**
diff --git a/src/main/model/csr/Values.java b/src/main/model/csr/Values.java
index f461686..1f9423c 100644
--- a/src/main/model/csr/Values.java
+++ b/src/main/model/csr/Values.java
@@ -1,5 +1,6 @@
package model.csr;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.Encodable;
import model.asn1.Tag;
@@ -22,6 +23,10 @@ import java.util.stream.Stream;
* Values can be none or any length. Parsing and decoding the values are handled in specific types.
*/
public class Values extends ASN1Object {
+ /**
+ * The values array.
+ */
+ @Assoc(partOf = true, lowerBond = 1)
private final ASN1Object[] array;
/**
diff --git a/src/main/model/pki/AlgorithmIdentifier.java b/src/main/model/pki/AlgorithmIdentifier.java
index f7df59f..4e4fab3 100644
--- a/src/main/model/pki/AlgorithmIdentifier.java
+++ b/src/main/model/pki/AlgorithmIdentifier.java
@@ -1,5 +1,6 @@
package model.pki;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.ObjectIdentifier;
import model.asn1.Tag;
@@ -24,6 +25,7 @@ public class AlgorithmIdentifier extends ASN1Object {
/**
* The type of that attribute. For example, <pre>1.2.840.113549.1.1.11</pre> is sha256WithRSAEncryption.
*/
+ @Assoc(partOf = true)
private final ObjectIdentifier type;
/**
@@ -48,6 +50,7 @@ public class AlgorithmIdentifier extends ASN1Object {
* }
* </pre>
*/
+ @Assoc(partOf = true, lowerBond = 0)
private final ASN1Object parameters;
/**
diff --git a/src/main/model/pki/SubjectPublicKeyInfo.java b/src/main/model/pki/SubjectPublicKeyInfo.java
index ca3b997..2f2a514 100644
--- a/src/main/model/pki/SubjectPublicKeyInfo.java
+++ b/src/main/model/pki/SubjectPublicKeyInfo.java
@@ -1,5 +1,6 @@
package model.pki;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.BitString;
import model.asn1.Tag;
@@ -24,11 +25,13 @@ public class SubjectPublicKeyInfo extends ASN1Object {
/**
* The algorithm used.
*/
+ @Assoc(partOf = true)
private final AlgorithmIdentifier algorithm;
/**
* The public key.
*/
+ @Assoc(partOf = true)
private final BitString subjectPublicKey;
/**
diff --git a/src/main/model/pki/cert/Certificate.java b/src/main/model/pki/cert/Certificate.java
index 25499e3..f9d61bb 100644
--- a/src/main/model/pki/cert/Certificate.java
+++ b/src/main/model/pki/cert/Certificate.java
@@ -1,5 +1,6 @@
package model.pki.cert;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.BitString;
import model.asn1.Tag;
@@ -53,16 +54,19 @@ public class Certificate extends ASN1Object {
* All info of that cert, excluding the signature.
* It will be signed, and the signature is in <pre>signature</pre>.
*/
+ @Assoc(partOf = true)
private final TbsCertificate certificate;
/**
* The algorithm used for <pre>signature</pre>.
*/
+ @Assoc(partOf = true)
private final AlgorithmIdentifier signatureAlgorithm;
/**
* The signature.
*/
+ @Assoc(partOf = true)
private final BitString signature;
/**
diff --git a/src/main/model/pki/cert/Extension.java b/src/main/model/pki/cert/Extension.java
index 9db83b2..a856086 100644
--- a/src/main/model/pki/cert/Extension.java
+++ b/src/main/model/pki/cert/Extension.java
@@ -1,5 +1,6 @@
package model.pki.cert;
+import annotations.Assoc;
import model.asn1.*;
import model.asn1.exceptions.ParseException;
import model.asn1.parsing.BytesReader;
@@ -28,6 +29,7 @@ public class Extension extends ASN1Object {
/**
* The ID of the type of that extension.
*/
+ @Assoc(partOf = true)
private final ObjectIdentifier extnId;
/**
@@ -37,11 +39,13 @@ public class Extension extends ASN1Object {
* behaviour is undefined.
* Marking an extension critical reduces compatibility.
*/
+ @Assoc(partOf = true)
private final Bool critical;
/**
* The DER-encoded ASN.1 content of that extension.
*/
+ @Assoc(partOf = true)
private final OctetString extnValue;
/**
diff --git a/src/main/model/pki/cert/Extensions.java b/src/main/model/pki/cert/Extensions.java
index 72d641f..8c636b0 100644
--- a/src/main/model/pki/cert/Extensions.java
+++ b/src/main/model/pki/cert/Extensions.java
@@ -1,5 +1,6 @@
package model.pki.cert;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.Encodable;
import model.asn1.Tag;
@@ -18,6 +19,10 @@ import java.util.stream.Stream;
* </pre>
*/
public class Extensions extends ASN1Object {
+ /**
+ * The extension array.
+ */
+ @Assoc(partOf = true)
private final Extension[] extensions;
/**
diff --git a/src/main/model/pki/cert/TbsCertificate.java b/src/main/model/pki/cert/TbsCertificate.java
index 26b30f4..6ad15e7 100644
--- a/src/main/model/pki/cert/TbsCertificate.java
+++ b/src/main/model/pki/cert/TbsCertificate.java
@@ -1,5 +1,6 @@
package model.pki.cert;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.Int;
import model.asn1.Tag;
@@ -63,6 +64,7 @@ public class TbsCertificate extends ASN1Object {
* [0] Version DEFAULT v1
* </pre>
*/
+ @Assoc(partOf = true)
private final Int version;
/**
@@ -72,8 +74,10 @@ public class TbsCertificate extends ASN1Object {
* CertificateSerialNumber ::= INTEGER
* </pre>
*/
+ @Assoc(partOf = true)
private final Int serialNumber;
+ @Assoc(partOf = true)
private final AlgorithmIdentifier signature;
/**
@@ -83,24 +87,32 @@ public class TbsCertificate extends ASN1Object {
* subject Name
* </pre>
*/
+ @Assoc(partOf = true)
private final Name issuer;
/**
* The validity period of that certificate.
* Validity ::= SEQUENCE { notBefore Time, notAfter Time, ... }
*/
+ @Assoc(partOf = true)
private final Validity validity;
/**
* See the comments on issuer.
*/
+ @Assoc(partOf = true)
private final Name subject;
+ /**
+ * The public key of the certificate's holder.
+ */
+ @Assoc(partOf = true)
private final SubjectPublicKeyInfo subjectPublicKeyInfo;
/**
* [3] Optional.
*/
+ @Assoc(partOf = true, lowerBond = 0)
private final Extensions extensions;
/**
diff --git a/src/main/model/pki/cert/Validity.java b/src/main/model/pki/cert/Validity.java
index e83d326..190b469 100644
--- a/src/main/model/pki/cert/Validity.java
+++ b/src/main/model/pki/cert/Validity.java
@@ -1,5 +1,6 @@
package model.pki.cert;
+import annotations.Assoc;
import model.asn1.*;
import model.asn1.exceptions.ParseException;
import model.asn1.parsing.BytesReader;
@@ -28,11 +29,13 @@ public class Validity extends ASN1Object {
/**
* The certificate is not valid before that time.
*/
+ @Assoc(partOf = true)
private final ASN1Time notBefore;
/**
* The certificate is not valid after that time.
*/
+ @Assoc(partOf = true)
private final ASN1Time notAfter;
/**
diff --git a/src/main/model/pki/crl/CertificateList.java b/src/main/model/pki/crl/CertificateList.java
index 8729561..8f4b98b 100644
--- a/src/main/model/pki/crl/CertificateList.java
+++ b/src/main/model/pki/crl/CertificateList.java
@@ -1,5 +1,6 @@
package model.pki.crl;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.BitString;
import model.asn1.Tag;
@@ -20,16 +21,19 @@ public class CertificateList extends ASN1Object {
* All info of that CRL, excluding the signature.
* It will be signed, and the signature is in <pre>signature</pre>.
*/
+ @Assoc(partOf = true)
private final CertificateListContent crl;
/**
* The algorithm used for <pre>signature</pre>.
*/
+ @Assoc(partOf = true)
private final AlgorithmIdentifier signatureAlgorithm;
/**
* The signature.
*/
+ @Assoc(partOf = true)
private final BitString signature;
/**
diff --git a/src/main/model/pki/crl/CertificateListContent.java b/src/main/model/pki/crl/CertificateListContent.java
index 4cc96fb..80d8fc1 100644
--- a/src/main/model/pki/crl/CertificateListContent.java
+++ b/src/main/model/pki/crl/CertificateListContent.java
@@ -1,5 +1,6 @@
package model.pki.crl;
+import annotations.Assoc;
import model.asn1.*;
import model.pki.AlgorithmIdentifier;
import model.x501.Name;
@@ -39,10 +40,15 @@ import java.util.stream.Stream;
*/
public class CertificateListContent extends ASN1Object {
private final Int version = new Int(Int.TAG, null, 1);
+ @Assoc(partOf = true)
private final Name issuer;
+ @Assoc(partOf = true)
private final AlgorithmIdentifier signature;
+ @Assoc(partOf = true)
private final ASN1Time thisUpdate;
+ @Assoc(partOf = true)
private final ASN1Time nextUpdate;
+ @Assoc(partOf = true, lowerBond = 0)
private final RevokedCertificate[] revokedCertificates;
/**
diff --git a/src/main/model/pki/crl/RevokedCertificate.java b/src/main/model/pki/crl/RevokedCertificate.java
index 1f0afc1..5acb2ed 100644
--- a/src/main/model/pki/crl/RevokedCertificate.java
+++ b/src/main/model/pki/crl/RevokedCertificate.java
@@ -1,5 +1,6 @@
package model.pki.crl;
+import annotations.Assoc;
import model.asn1.*;
import java.util.Arrays;
@@ -17,8 +18,11 @@ import java.util.stream.Stream;
* </pre>
*/
public class RevokedCertificate extends ASN1Object {
+ @Assoc(partOf = true)
private final Int serialNumber;
+ @Assoc(partOf = true)
private final ASN1Time revocationDate;
+ @Assoc(partOf = true)
private final Reason reason;
/**
diff --git a/src/main/model/x501/AttributeTypeAndValue.java b/src/main/model/x501/AttributeTypeAndValue.java
index 179d6ff..c79ff77 100644
--- a/src/main/model/x501/AttributeTypeAndValue.java
+++ b/src/main/model/x501/AttributeTypeAndValue.java
@@ -1,5 +1,6 @@
package model.x501;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.ObjectIdentifier;
import model.asn1.Tag;
@@ -24,11 +25,13 @@ public class AttributeTypeAndValue extends ASN1Object {
* The type of that attribute. For example, <pre>2.5.4.10</pre> is OU.
* It determines the format of the value.
*/
+ @Assoc(partOf = true)
private final ObjectIdentifier type;
/**
* Value corresponding to type.
*/
+ @Assoc(partOf = true)
private final ASN1Object value;
/**
diff --git a/src/main/model/x501/Name.java b/src/main/model/x501/Name.java
index 7477005..b00109d 100644
--- a/src/main/model/x501/Name.java
+++ b/src/main/model/x501/Name.java
@@ -1,5 +1,6 @@
package model.x501;
+import annotations.Assoc;
import model.asn1.*;
import model.asn1.exceptions.ParseException;
import model.asn1.parsing.BytesReader;
@@ -19,6 +20,7 @@ import java.util.stream.Stream;
* </pre>
*/
public class Name extends ASN1Object {
+ @Assoc(partOf = true)
private final RelativeDistinguishedName[] rdnSequence;
/**
diff --git a/src/main/model/x501/RelativeDistinguishedName.java b/src/main/model/x501/RelativeDistinguishedName.java
index c431f12..b9f6a0c 100644
--- a/src/main/model/x501/RelativeDistinguishedName.java
+++ b/src/main/model/x501/RelativeDistinguishedName.java
@@ -1,5 +1,6 @@
package model.x501;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.Encodable;
import model.asn1.Tag;
@@ -20,6 +21,7 @@ import java.util.stream.Stream;
* For more information on DN, see {@link Name}.
*/
public class RelativeDistinguishedName extends ASN1Object {
+ @Assoc(partOf = true, lowerBond = 1)
private final AttributeTypeAndValue[] array;
/**
diff --git a/src/main/ui/gui/IssueDialog.java b/src/main/ui/gui/IssueDialog.java
index 8dcd6a8..23312eb 100644
--- a/src/main/ui/gui/IssueDialog.java
+++ b/src/main/ui/gui/IssueDialog.java
@@ -1,5 +1,6 @@
package ui.gui;
+import annotations.Assoc;
import model.asn1.exceptions.ParseException;
import model.ca.Template;
import model.csr.CertificationRequest;
@@ -19,6 +20,7 @@ public class IssueDialog extends CertEditDialog<Template> {
/**
* The list of templates.
*/
+ @Assoc(lowerBond = 1)
private final List<Template> templates;
/**
@@ -29,11 +31,13 @@ public class IssueDialog extends CertEditDialog<Template> {
/**
* Combo box to choose template.
*/
+ @Assoc(partOf = true)
private JComboBox<String> componentTemp;
/**
* The selected template, immutable.
*/
+ @Assoc(partOf = true)
private Template selectedTemplate;
/**
diff --git a/src/main/ui/gui/MainUI.java b/src/main/ui/gui/MainUI.java
index 9fa65ef..9a7f3f2 100644
--- a/src/main/ui/gui/MainUI.java
+++ b/src/main/ui/gui/MainUI.java
@@ -1,5 +1,6 @@
package ui.gui;
+import annotations.Assoc;
import model.GroupObserver;
import model.ObservedData;
import model.Observer;
@@ -67,75 +68,108 @@ public class MainUI extends JFrame {
/**
* The root panel (Box layout).
*/
+ @Assoc(partOf = true)
private final JPanel rootPanel = new JPanel(new BoxLayout(rootPane, BoxLayout.PAGE_AXIS));
/**
* Common toolbar buttons
*/
+ @Assoc(partOf = true)
private final JButton buttonToolbarLoad = btn("Load", "open.png", this::onLoad);
+ @Assoc(partOf = true)
private final JButton buttonToolbarSave = btn("Save", "saveall.png", this::onSave);
/**
* Toolbar that switches with the tab.
*/
+ @Assoc(partOf = true)
private final JPanel panelContextAwareToolbar = new JPanel(new CardLayout(0, 0));
/**
* Tab root.
*/
+ @Assoc(partOf = true)
private final JTabbedPane tabbedPane = new JTabbedPane();
/**
* CA tab
*/
+ @Assoc(partOf = true)
private final JLabel labelCACertificate = new JLabel();
+ @Assoc(partOf = true)
private final JLabel labelPrivateKey = new JLabel();
+ @Assoc(partOf = true)
private final JButton buttonGenPrivKey = btn("Generate", 'G', this::onGeneratePrivateKey);
+ @Assoc(partOf = true)
private final JButton buttonInstallCA = btn("Install", 'I', this::onInstallCA);
+ @Assoc(partOf = true)
private final JButton buttonGenCSR = btn("CSR", this::onSignCSR);
+ @Assoc(partOf = true)
private final QRPanel panelQR = new QRPanel(256);
+ @Assoc(partOf = true)
private final JToolBar toolbarCA = new JToolBar();
+ @Assoc(partOf = true)
private final JButton buttonCAToolbarCRL = btn("CRL", "publisher.png", this::onCRL);
/**
* Certs tab
*/
+ @Assoc(partOf = true)
private JPanel panelCertsTab;
+ @Assoc(partOf = true)
private final JTable tableCerts = new JTable();
+ @Assoc(partOf = true)
private final CertTableModel modelCerts = new CertTableModel();
+ @Assoc(partOf = true)
private final JToolBar toolbarCerts = new JToolBar();
+ @Assoc(partOf = true)
private final JButton buttonCertsToolbarNew = btn("Sign", "new.png", this::onIssue);
+ @Assoc(partOf = true)
private final JButton buttonCertsToolbarRevoke = btn("Revoke", "deletetest.png", this::onRevokeCert);
+ @Assoc(partOf = true)
private final JButton buttonCertsToolbarExport = btn("Export", "export.png", this::onExportCert);
/**
* Templates tab
*/
+ @Assoc(partOf = true)
private JPanel panelTmpTab;
+ @Assoc(partOf = true)
private final JTable tableTemplates = new JTable();
+ @Assoc(partOf = true)
private final TemplateTableModel modelTemplates = new TemplateTableModel();
+ @Assoc(partOf = true)
private final JToolBar toolbarTemplates = new JToolBar();
+ @Assoc(partOf = true)
private final JButton buttonTemplatesToolbarNew = btn("New", "new.png", this::onNewTemplate);
+ @Assoc(partOf = true)
private final JButton buttonTemplatesToolbarEnable = btn("Enable", "enable.png", this::onEnableTemplate);
+ @Assoc(partOf = true)
private final JButton buttonTemplatesToolbarDisable = btn("Disable", "disable.png", this::onDisableTemplate);
+ @Assoc(partOf = true)
private final JButton buttonTemplatesToolbarDelete = btn("Delete", "deletetest.png", this::onDeleteTemplate);
/**
* Logs region
*/
+ @Assoc(partOf = true)
private final JPanel panelLogs;
+ @Assoc(partOf = true)
private final JTable tableAuditLogs = new JTable();
+ @Assoc(partOf = true)
private final LogTableModel modelAuditLogs = new LogTableModel();
/**
* Status region
*/
+ @Assoc(partOf = true)
private final JLabel labelStatus = new JLabel();
private ObservedData<Boolean> unsaved = new ObservedData<>(false, this::acceptUnsaved);
/**
* CA and observers
*/
+ @Assoc(partOf = true)
private CertificationAuthority ca;
private final GroupObserver obs = new GroupObserver();
diff --git a/src/main/ui/gui/RevokeDialog.java b/src/main/ui/gui/RevokeDialog.java
index 9cebc74..19c7f1b 100644
--- a/src/main/ui/gui/RevokeDialog.java
+++ b/src/main/ui/gui/RevokeDialog.java
@@ -1,5 +1,6 @@
package ui.gui;
+import annotations.Assoc;
import model.asn1.ASN1Object;
import model.asn1.UtcTime;
import model.pki.cert.Certificate;
@@ -54,31 +55,37 @@ public class RevokeDialog extends JDialog {
/**
* Root pane
*/
+ @Assoc(partOf = true)
private JPanel contentPane;
/**
* OK button
*/
+ @Assoc(partOf = true)
private JButton buttonOK;
/**
* Cancel button
*/
+ @Assoc(partOf = true)
private JButton buttonCancel;
/**
* Reason
*/
+ @Assoc(partOf = true)
private JComboBox<String> comboBoxReason;
/**
* Subject (not editable)
*/
+ @Assoc(partOf = true)
private JTextField textFieldSubject;
/**
* Time
*/
+ @Assoc(partOf = true)
private JFormattedTextField formattedTextFieldTime;
/**
diff --git a/src/main/ui/gui/TemplateEditDialog.java b/src/main/ui/gui/TemplateEditDialog.java
index 557d207..9037956 100644
--- a/src/main/ui/gui/TemplateEditDialog.java
+++ b/src/main/ui/gui/TemplateEditDialog.java
@@ -1,5 +1,6 @@
package ui.gui;
+import annotations.Assoc;
import model.asn1.exceptions.ParseException;
import model.ca.Template;
import model.x501.Name;
@@ -23,6 +24,7 @@ public class TemplateEditDialog extends CertEditDialog<Template> {
/**
* Text field for name.
*/
+ @Assoc(partOf = true)
private JTextField templateComponent;
/**
diff --git a/src/main/ui/gui/widgets/CertEditDialog.java b/src/main/ui/gui/widgets/CertEditDialog.java
index 6c440a3..a928053 100644
--- a/src/main/ui/gui/widgets/CertEditDialog.java
+++ b/src/main/ui/gui/widgets/CertEditDialog.java
@@ -1,5 +1,7 @@
package ui.gui.widgets;
+import annotations.Assoc;
+
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
@@ -32,9 +34,13 @@ public abstract class CertEditDialog<T> extends JDialog {
/**
* Root pane.
*/
+ @Assoc(partOf = true)
protected JPanel contentPane = new JPanel();
+ @Assoc(partOf = true)
protected JButton buttonOK = UIUtils.btn("", this::onOK);
+ @Assoc(partOf = true)
protected JTextField textFieldSubject = new JTextField();
+ @Assoc(partOf = true)
protected JSpinner spinnerValidity =
new JSpinner(new SpinnerNumberModel(60, 1, null, 0));
diff --git a/src/main/ui/gui/widgets/CertTableModel.java b/src/main/ui/gui/widgets/CertTableModel.java
index f10d621..aa3f808 100644
--- a/src/main/ui/gui/widgets/CertTableModel.java
+++ b/src/main/ui/gui/widgets/CertTableModel.java
@@ -1,5 +1,6 @@
package ui.gui.widgets;
+import annotations.Assoc;
import model.ca.CertificationAuthority;
import model.pki.cert.Certificate;
import model.pki.crl.RevokedCertificate;
@@ -39,11 +40,13 @@ public class CertTableModel extends AbstractTableModel {
/**
* Pointer to {@link CertificationAuthority#getSigned()}
*/
+ @Assoc(lowerBond = 0)
private List<Certificate> ptrData;
/**
* Pointer to {@link CertificationAuthority#getRevoked()}
*/
+ @Assoc(lowerBond = 0)
private List<RevokedCertificate> ptrRevokedData;
/**
diff --git a/src/main/ui/gui/widgets/LogTableModel.java b/src/main/ui/gui/widgets/LogTableModel.java
index a7b52ac..2f91dd0 100644
--- a/src/main/ui/gui/widgets/LogTableModel.java
+++ b/src/main/ui/gui/widgets/LogTableModel.java
@@ -1,5 +1,6 @@
package ui.gui.widgets;
+import annotations.Assoc;
import model.ca.AuditLogEntry;
import model.ca.CertificationAuthority;
@@ -23,6 +24,7 @@ public class LogTableModel extends AbstractTableModel {
/**
* Pointer to the {@link CertificationAuthority#getLogs()}.
*/
+ @Assoc(lowerBond = 0)
private List<AuditLogEntry> ptrData;
/**
diff --git a/src/main/ui/gui/widgets/QRPanel.java b/src/main/ui/gui/widgets/QRPanel.java
index ebd70af..334f921 100644
--- a/src/main/ui/gui/widgets/QRPanel.java
+++ b/src/main/ui/gui/widgets/QRPanel.java
@@ -1,5 +1,6 @@
package ui.gui.widgets;
+import annotations.Assoc;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
@@ -18,6 +19,7 @@ import static com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L;
public class QRPanel extends JPanel {
private final int size;
+ @Assoc(partOf = true, lowerBond = 0)
private BitMatrix data;
/**
diff --git a/src/main/ui/gui/widgets/TemplateTableModel.java b/src/main/ui/gui/widgets/TemplateTableModel.java
index de23b54..93e9bcf 100644
--- a/src/main/ui/gui/widgets/TemplateTableModel.java
+++ b/src/main/ui/gui/widgets/TemplateTableModel.java
@@ -1,5 +1,6 @@
package ui.gui.widgets;
+import annotations.Assoc;
import model.ca.CertificationAuthority;
import model.ca.Template;
@@ -36,6 +37,7 @@ public class TemplateTableModel extends AbstractTableModel {
/**
* Pointer to the {@link CertificationAuthority#getTemplates()}.
*/
+ @Assoc(lowerBond = 0)
private List<Template> ptrData;
/**