aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/unit/Lib/JcsEddsa2022Test.php174
1 files changed, 174 insertions, 0 deletions
diff --git a/tests/unit/Lib/JcsEddsa2022Test.php b/tests/unit/Lib/JcsEddsa2022Test.php
new file mode 100644
index 000000000..d18ad01ce
--- /dev/null
+++ b/tests/unit/Lib/JcsEddsa2022Test.php
@@ -0,0 +1,174 @@
+<?php
+
+namespace Zotlabs\Tests\Unit\Lib;
+
+use Zotlabs\Lib\JcsEddsa2022;
+use Zotlabs\Tests\Unit\UnitTestCase;
+
+class JcsEddsa2022Test extends UnitTestCase {
+
+ public function testVerifyFromSpec() {
+ $publicKey = 'z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2';
+ $privateKey = 'z3u2en7t5LR2WtQH5PfFqMqwVHBeXouLzo6haApm8XHqvjxq';
+
+ $document = '{
+ "@context": [
+ "https://www.w3.org/ns/credentials/v2",
+ "https://www.w3.org/ns/credentials/examples/v2"
+ ],
+ "id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
+ "type": [
+ "VerifiableCredential",
+ "AlumniCredential"
+ ],
+ "name": "Alumni Credential",
+ "description": "A minimum viable example of an Alumni Credential.",
+ "issuer": "https://vc.example/issuers/5678",
+ "validFrom": "2023-01-01T00:00:00Z",
+ "credentialSubject": {
+ "id": "did:example:abcdefgh",
+ "alumniOf": "The School of Examples"
+ },
+ "proof": {
+ "type": "DataIntegrityProof",
+ "cryptosuite": "eddsa-jcs-2022",
+ "created": "2023-02-24T23:36:38Z",
+ "verificationMethod": "https://vc.example/issuers/5678#z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
+ "proofPurpose": "assertionMethod",
+ "proofValue": "z3P6rHMUaWG6e3Ac6xYFht8aEvoVXndgKTtEY8kzWYXzk8dKmAo2GJeZiJw4qoZ2PGp4ugdaHx3oQiLpeFBLDqP2M"
+ }
+ }';
+
+ $verified = (new JcsEddsa2022())->verify(json_decode($document, true), $publicKey);
+ $this->assertTrue($verified, 'Verify eddsa-jcs-2022 (from specification)');
+
+ }
+
+ public function testSignAndVerify() {
+ $publicKey = 'z6MkfpucGTDbMZADwM6vEa8pS3s8Z9xqSEn6HihijZ4fVs9d';
+ $channel = [
+ 'channel_url' => 'https://example.com/channel/klingon',
+ 'channel_epubkey' => 'FGdbYgr526Swuyya3e8epCBdHahlWNg9I0sBhMKCzpw',
+ 'channel_eprvkey' => 'StLRo8xb7VJ5XdR10OUYQM/uooP7D7fMlgvQFa1wrZIUZ1tiCvnbpLC7LJrd7x6kIF0dqGVY2D0jSwGEwoLOnA',
+ 'channel_address' => 'klingon@example.com',
+ 'channel_system' => false,
+ ];
+
+ $document = '{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ "https://www.w3.org/ns/did/v1",
+ "https://w3id.org/security/multikey/v1",
+ {
+ "nomad": "https://example.com/apschema#",
+ "toot": "http://joinmastodon.org/ns#",
+ "litepub": "http://litepub.social/ns#",
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "oauthRegistrationEndpoint": "litepub:oauthRegistrationEndpoint",
+ "sensitive": "as:sensitive",
+ "movedTo": "as:movedTo",
+ "discoverable": "toot:discoverable",
+ "indexable": "toot:indexable",
+ "capabilities": "litepub:capabilities",
+ "acceptsJoins": "litepub:acceptsJoins",
+ "Hashtag": "as:Hashtag",
+ "canReply": "toot:canReply",
+ "canSearch": "nomad:canSearch",
+ "approval": "toot:approval",
+ "expires": "nomad:expires",
+ "directMessage": "nomad:directMessage",
+ "Category": "nomad:Category",
+ "copiedTo": "nomad:copiedTo",
+ "searchContent": "nomad:searchContent",
+ "searchTags": "nomad:searchTags"
+ }
+ ],
+ "type": "Person",
+ "id": "https://example.com/channel/klingon",
+ "preferredUsername": "klingon",
+ "name": "klingon",
+ "created": "2023-07-13T20:23:32Z",
+ "updated": "2023-07-13T20:23:32Z",
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/png",
+ "updated": "2023-07-13T20:23:32Z",
+ "url": "https://example.com/photo/profile/l/2",
+ "height": 300,
+ "width": 300
+ },
+ "url": "https://example.com/channel/klingon",
+ "tag": [
+ {
+ "type": "Note",
+ "name": "Protocol",
+ "content": "zot6"
+ },
+ {
+ "type": "Note",
+ "name": "Protocol",
+ "content": "nomad"
+ },
+ {
+ "type": "Note",
+ "name": "Protocol",
+ "content": "activitypub"
+ }
+ ],
+ "inbox": "https://example.com/inbox/klingon",
+ "outbox": "https://example.com/outbox/klingon",
+ "followers": "https://example.com/followers/klingon",
+ "following": "https://example.com/following/klingon",
+ "wall": "https://example.com/outbox/klingon",
+ "endpoints": {
+ "sharedInbox": "https://example.com/inbox",
+ "oauthRegistrationEndpoint": "https://example.com/api/client/register",
+ "oauthAuthorizationEndpoint": "https://example.com/authorize",
+ "oauthTokenEndpoint": "https://example.com/token",
+ "searchContent": "https://example.com/search/klingon?search={}",
+ "searchTags": "https://example.com/search/klingon?tag={}"
+ },
+ "discoverable": true,
+ "canSearch": [],
+ "indexable": false,
+ "publicKey": {
+ "id": "https://example.com/channel/klingon?operation=rsakey",
+ "owner": "https://example.com/channel/klingon",
+ "signatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----
+ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA+LXyOD/bzzVgM/nUOJ5m
+ c4WrQPMlhKqWJvKrumdQw9JJYcyaZp/jmMxDx/w/EwVw+wnV5wZcD0yBVhC7NPRa
+ nYc5OfNhS4MO74xgZrj+VWSTzNo3YooS/dEIIvsu6bhxfooHj17SA6pMRnZkkVpk
+ ykpPRYwJw+NvKcRwzpF06rxMqjZ+Bp0ea/X37j4cHaosRoQTJiHmMKKnpByKdImF
+ TR1juJ69ASh6nh8YVGcz6fz1jBQZPMx05tfNdyN5oZRTr8Nug2CiF3V7yKKS14HD
+ kE9eeFeTMt58Qi+8kprATYxKrlIuTZmI4YdIRgtM+tPQsosKTFmjzbef4dYooutv
+ T7XfrE+wYVZlx2pkaeFiKrJVacpmmFJe8zCIFXrofq1aOagU1kpwnXgjneCttA+M
+ OJ3Y+cPamdfRQDtsBcokJUD40RTwux6OGW9zqkJIpniVB+CZu4nTOHCzMJwbxF0p
+ JmGZd9kc3PR6Uf/IHAb1xeyTi4FyyYTbRDYuJyqRKbe880QUwgCBcogIbNy4xxsH
+ UTMy0ucWaDSBRahKUIHl3FRglvnI754NJSXBDIQOwC9oRRH27Vmm1Jy8sltmFLFr
+ ENJCGgOH8Bhpk+y1jtw1jpTig76wIvw+6zQtgNSfPnrNGIHt5mcoy4pFFXLv2lK2
+ /u26hUGQAq71Ra0DwgXIWFECAwEAAQ==
+ -----END PUBLIC KEY-----
+ "
+ },
+ "assertionMethod": [
+ {
+ "id": "https://example.com/channel/klingon#z6MkfpucGTDbMZADwM6vEa8pS3s8Z9xqSEn6HihijZ4fVs9d",
+ "type": "Multikey",
+ "controller": "https://example.com/channel/klingon",
+ "publicKeyMultibase": "z6MkfpucGTDbMZADwM6vEa8pS3s8Z9xqSEn6HihijZ4fVs9d"
+ }
+ ],
+ "manuallyApprovesFollowers": true
+ }';
+
+ $algorithm = new JcsEddsa2022();
+ $documentArray = json_decode($document,true);
+ $documentArray['proof'] = $algorithm->sign($documentArray, $channel);
+
+ $verified = (new JcsEddsa2022())->verify($documentArray, $publicKey);
+ $this->assertTrue($verified, 'Verify encode and decode eddsa-jcs-2022');
+
+ }
+}