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'); } }