diff --git a/sequoia-wot-vectors/src/test/kotlin/org/sequoia_pgp/wot/vectors/ExampleTest.kt b/sequoia-wot-vectors/src/test/kotlin/org/sequoia_pgp/wot/vectors/ExampleTest.kt index 7ba914b9..98053e44 100644 --- a/sequoia-wot-vectors/src/test/kotlin/org/sequoia_pgp/wot/vectors/ExampleTest.kt +++ b/sequoia-wot-vectors/src/test/kotlin/org/sequoia_pgp/wot/vectors/ExampleTest.kt @@ -4,7 +4,11 @@ package org.sequoia_pgp.wot.vectors +import org.bouncycastle.openpgp.PGPPublicKeyRingCollection import org.junit.jupiter.api.Test +import org.pgpainless.PGPainless +import org.pgpainless.key.OpenPgpFingerprint +import org.pgpainless.util.DateUtil import org.pgpainless.wot.network.ReferenceTime class ExampleTest { @@ -12,7 +16,16 @@ class ExampleTest { @Test fun test() { val vectors = BestViaRootVectors() - val network = vectors.getNetworkAt(ReferenceTime.now()) + val network = vectors.getNetworkAt(vectors.t1) println(network) } + + @Test + fun exp() { + val vectors = CertExpiredVectors() + val keys = PGPainless.readKeyRing().publicKeyRingCollection(vectors.keyRingInputStream()) + val bob = keys.getPublicKeyRing(OpenPgpFingerprint.parse(vectors.bobFpr.toString()).keyId) + val info = PGPainless.inspectKeyRing(bob, vectors.t1.timestamp) + println(DateUtil.formatUTCDate(info.primaryKeyExpirationDate)) + } } \ No newline at end of file diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/ArtifactVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/ArtifactVectors.kt index 900d9e39..b06792d9 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/ArtifactVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/ArtifactVectors.kt @@ -11,9 +11,31 @@ import org.pgpainless.wot.WebOfTrust import org.pgpainless.wot.network.Network import org.pgpainless.wot.network.ReferenceTime import java.io.InputStream +import java.lang.IllegalArgumentException +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.* interface ArtifactVectors { + private fun parseDate(string: String): Date { + return try { + SimpleDateFormat("yyyy-MM-dd HH:mm:ss z") + .apply { timeZone = TimeZone.getTimeZone("UTC") } + .parse(string) + } catch (e: ParseException) { + SimpleDateFormat("yyyy-MM-dd") + .apply {timeZone = TimeZone.getTimeZone("UTC") } + .parse(string) + } catch (e: ParseException) { + throw IllegalArgumentException(e) + } + } + + fun parseReferenceTime(string: String): ReferenceTime { + return ReferenceTime.timestamp(parseDate(string)) + } + fun getResourceName(): String fun getNetworkAt(referenceTime: ReferenceTime, policy: Policy = PGPainless.getPolicy()): Network { diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/BestViaRootVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/BestViaRootVectors.kt index 8a78fe73..11f80e48 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/BestViaRootVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/BestViaRootVectors.kt @@ -19,6 +19,10 @@ import org.pgpainless.wot.network.Fingerprint * * When the root is B, then the path that we find for A should be `A -> B * -> C -> Target`, not `A -> Y -> Z -> Target`. + * + * Timeline: + * - t0: keys are generated. + * - t1: third-party certifications are issued. */ class BestViaRootVectors: ArtifactVectors { @@ -46,6 +50,16 @@ class BestViaRootVectors: ArtifactVectors { val zebra_uid = "" // Certified by: 86CB4639D1FE096BA941D05822B8AF50198C49DD + /** + * Create A, B, C, Y, Z, Target. + */ + val t0 = parseReferenceTime("2021-09-27 12:51:50 UTC") + + /** + * Create certifications. + */ + val t1 = parseReferenceTime("2021-09-27 12:52:50 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/best-via-root.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertExpiredVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertExpiredVectors.kt index abafa15e..de581694 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertExpiredVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertExpiredVectors.kt @@ -43,6 +43,26 @@ class CertExpiredVectors: ArtifactVectors { val carolUid = "" // Certified by: B166B31AE5F95600B3F7184FE74C6CE62821686F + /** + * Create A, B, C. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * Create certifications (amount = 60). + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") + + /** + * B expires. + */ + val t2 = parseReferenceTime("2020-02-15 00:00:00 UTC") + + /** + * Create certifications (amount = 120). + */ + val t3 = parseReferenceTime("2020-04-01 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cert-expired.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedHardVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedHardVectors.kt index 30a1b276..031e63c0 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedHardVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedHardVectors.kt @@ -28,6 +28,30 @@ class CertRevokedHardVectors: ArtifactVectors { // Certified by: BF680710128E6BCCB2268154569F5F6BFB95C544 // Certified by: 90E02BFB03FAA04714D1D3D87543157EF3B12BE9 + /** + * A, B, C, D are generated. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * A certifies B - 2/120. + * B certifies D - 1/60. + * A certifies C - 2/30. + * C certifies D - 1/120. + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") + + /** + * B is hard revoked. + */ + val t2 = parseReferenceTime("2020-03-01 00:00:00 UTC") + + /** + * A certifies B (amount = 120). + * B certifies D (amount = 120). + */ + val t3 = parseReferenceTime("2020-04-01 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cert-revoked-hard.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedSoftVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedSoftVectors.kt index 033d92f7..13505067 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedSoftVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertRevokedSoftVectors.kt @@ -122,6 +122,32 @@ class CertRevokedSoftVectors: ArtifactVectors { // Certified by: AB4E3F8EE8BBD3459754D75ACE570F9B8C7DC75D // Certified by: 4CD8737F76C2B897C4F058DBF28C47540FA2C3B3 + + /** + * A, B, C, D are generated. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * A certifies B - 2/120. + * B certifies D - 1/60. + * A certifies C - 2/30. + * C certifies D - 1/120. + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") + + /** + * B is soft revoked. + */ + val t2 = parseReferenceTime("2020-03-01 00:00:00 UTC") + + /** + * A certifies B (amount = 120). + * B certifies D (amount = 120). + */ + val t3 = parseReferenceTime("2020-04-01 00:00:00 UTC") + + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cert-revoked-soft.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationLivenessVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationLivenessVectors.kt index 9351d57a..a206e787 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationLivenessVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationLivenessVectors.kt @@ -75,6 +75,26 @@ class CertificationLivenessVectors: ArtifactVectors { // Certified by: 840891562819D3A108C4DA1BB31438DE34F8CF69 // Certified by: 840891562819D3A108C4DA1BB31438DE34F8CF69 + /** + * Create A, B, C. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * A certifies B (2/60), B certifies C (1/60). + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") + + /** + * A certifies B (2/120, expires at t3), B certifies C (1/120). + */ + val t2 = parseReferenceTime("2020-03-01 00:00:00 UTC") + + /** + * A's certification of B at t2 expires. + */ + val t3 = parseReferenceTime("2020-04-01 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/certification-liveness.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationNetworkVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationNetworkVectors.kt index 671c06f2..237d474f 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationNetworkVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationNetworkVectors.kt @@ -4,6 +4,8 @@ package org.sequoia_pgp.wot.vectors +import org.pgpainless.wot.network.Fingerprint + /** * Four certificates that only make certifications (depth is always 0). * @@ -22,7 +24,22 @@ package org.sequoia_pgp.wot.vectors */ class CertificationNetworkVectors: ArtifactVectors { - // TODO: Extract Fingerprints, UIDs and timestamps + val aliceFpr = Fingerprint("B2B371214EF71AFD16E42C62D81360B4C0489225") + val aliceUid = "" + + val bobFpr = Fingerprint("A68DF00EB82F9C49C27CC7723C5F5BBE6B790C05") + val bobUid = "" + + val carolFpr = Fingerprint("AB9EF1C89631519842ED559697557DD147D99C97") + val carolUid = "" + + val daveFpr = Fingerprint("9A1AE937B5CB8BC46048AB63023CC01973ED9DF3") + val daveUid = "" + + /** + * A few minutes after the Network has been generated. + */ + val t0 = parseReferenceTime("2023-01-19 12:00:00 UTC") override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/certification-network.pgp" diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationRevokedVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationRevokedVectors.kt index e65a2b8e..b19e5359 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationRevokedVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CertificationRevokedVectors.kt @@ -56,6 +56,27 @@ class CertificationRevokedVectors: ArtifactVectors { val carolUid = "" // Certified by: 4258ACF6C3C8FCE130D6EBAB0CC5158AEA25F24A + /** + * A, B, C are created. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * A certifies B, B certifies C. + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") + + /** + * A revokes their certification of B. + * A should now no longer be able to authenticate B or C. + */ + val t2 = parseReferenceTime("2020-03-01 00:00:00 UTC") + + /** + * A re-certifies B. + */ + val t3 = parseReferenceTime("2020-04-01 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/certification-revoked.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptima2Vectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptima2Vectors.kt index 2840441b..470c05ac 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptima2Vectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptima2Vectors.kt @@ -6,6 +6,11 @@ package org.sequoia_pgp.wot.vectors class CliquesLocalOptima2Vectors: CliquesVectors() { + /** + * A few minutes after the network is fully generated. + */ + val t0 = parseReferenceTime("2021-02-14 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cliques-local-optima-2.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptimaVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptimaVectors.kt index cb5bb4ce..70c7dce0 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptimaVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesLocalOptimaVectors.kt @@ -6,6 +6,11 @@ package org.sequoia_pgp.wot.vectors class CliquesLocalOptimaVectors: CliquesVectors() { + /** + * A few minutes after the network is fully generated. + */ + val t0 = parseReferenceTime("2021-02-14 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cliques-local-optima.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesVectors.kt index 1338bbbc..4e93e550 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CliquesVectors.kt @@ -105,6 +105,11 @@ open class CliquesVectors: ArtifactVectors { val targetFpr = Fingerprint("CE22ECD282F219AA99598BA3B58A7DA61CA97F55") val targetUid = "" + /** + * A few minutes after the network is fully generated. + */ + val t0 = parseReferenceTime("2021-02-14 00:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cliques.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CycleVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CycleVectors.kt index 5832d149..765947ae 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CycleVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/CycleVectors.kt @@ -49,6 +49,11 @@ class CycleVectors: ArtifactVectors { val frankUid = "" // Certified by: 78C3814EFD16E68F4F1AB4B874E30AE11FFCFB1B + /** + * A few minutes after the network has been generated. + */ + val t0 = parseReferenceTime("2021-10-01 12:00:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/cycle.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/GpgTrustrootsVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/GpgTrustrootsVectors.kt index 84dd6197..d822cb70 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/GpgTrustrootsVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/GpgTrustrootsVectors.kt @@ -4,6 +4,8 @@ package org.sequoia_pgp.wot.vectors +import org.pgpainless.wot.network.Fingerprint + /** * How gpg interprets ownertrust is a bit complicated. For a certificate * that is marked as "fully trusted" or "partially trusted" to be @@ -28,7 +30,33 @@ package org.sequoia_pgp.wot.vectors */ class GpgTrustrootsVectors: ArtifactVectors { - // TODO: Extract fingerprints and UIDs + val rootFpr = Fingerprint("D8330354E99DB503729A68D4AAE7E9EC2129CEC3") + val rootUid = "" + + val a1Fpr = Fingerprint("80666EDD21A008D467243E47444D4C0F515D269A") + val a1Uid = "" + + val a2Fpr = Fingerprint("A6D2F50B1C9544A717B7625395FD89DA7093B735") + val a2Uid = "" + + val a3Fpr = Fingerprint("AFDD8AECD999F5CDC7027B23EECC4F0EA03A5F35") + val a3Uid = "" + + val dFpr = Fingerprint("BB0333A98A05430FF6A784A706D474BF36A3D4F9") + val dUid = "" + + val targetFpr = Fingerprint("30A185EA9319FF1D0BCBDBFCF2CD31DCC3DCAA02") + val targetUid = "" + + /** + * Certificates are generated. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * Certifications are made. + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/gpg-trustroots.pgp" diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/InfinityAndBeyondVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/InfinityAndBeyondVectors.kt index 1c5ca4a5..67908e37 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/InfinityAndBeyondVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/InfinityAndBeyondVectors.kt @@ -280,6 +280,11 @@ class InfinityAndBeyondVectors: ArtifactVectors { Fingerprint("B69A678AA242FA4F0BBF12205C0608799B0E3C51"), ) + /** + * A few minutes after the network has been generated. + */ + val t0 = parseReferenceTime("2022-01-28 15:18:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/infinity-and-beyond.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/IsolatedRootVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/IsolatedRootVectors.kt index 17be29cd..7b5677da 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/IsolatedRootVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/IsolatedRootVectors.kt @@ -18,6 +18,15 @@ class IsolatedRootVectors: ArtifactVectors { val aliceUid = "" val aliceOtherOrguid = "" + /** + * A is created. + */ + val t0 = parseReferenceTime("2020-01-01 00:00:00 UTC") + + /** + * A's UserID is revoked. + */ + val t1 = parseReferenceTime("2020-02-01 00:00:00 UTC") override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/isolated-root.pgp" diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/LocalOptimaVectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/LocalOptimaVectors.kt index f4210538..23bbc016 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/LocalOptimaVectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/LocalOptimaVectors.kt @@ -78,6 +78,11 @@ class LocalOptimaVectors: ArtifactVectors { val henryUid = "" // Certified by: 70507A9058A57FEAE18CC3CE6A398AC9051D9CA8 + /** + * A few minutes after the network has been generated. + */ + val t0 = parseReferenceTime("2021-10-01 10:27:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/local-optima.pgp" } diff --git a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/MultipleCertifications1Vectors.kt b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/MultipleCertifications1Vectors.kt index 90285e13..723a80f5 100644 --- a/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/MultipleCertifications1Vectors.kt +++ b/sequoia-wot-vectors/src/testFixtures/kotlin/org/sequoia_pgp/wot/vectors/MultipleCertifications1Vectors.kt @@ -43,6 +43,11 @@ class MultipleCertifications1Vectors: ArtifactVectors { val dave_uid = "" // Certified by: 853304031E7B0B116BBD0B398734F11945313904 + /** + * A few moments after the network has been generated. + */ + val t0 = parseReferenceTime("2021-10-06 12:20:00 UTC") + override fun getResourceName(): String { return "org/sequoia_pgp/wot/vectors/multiple-certifications-1.pgp" }