Mercurial > prosody-hg
comparison spec/util_paseto_spec.lua @ 12840:33d902b093f0
util.paseto: Add support for v3.local tokens
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 13 Jan 2023 14:38:05 +0000 |
| parents | 52eead170bb8 |
| children | 8b06d7c73090 |
comparison
equal
deleted
inserted
replaced
| 12839:7db1c1da7bfd | 12840:33d902b093f0 |
|---|---|
| 2 --luacheck: ignore 631 | 2 --luacheck: ignore 631 |
| 3 | 3 |
| 4 describe("util.paseto", function () | 4 describe("util.paseto", function () |
| 5 local paseto = require "util.paseto"; | 5 local paseto = require "util.paseto"; |
| 6 local json = require "util.json"; | 6 local json = require "util.json"; |
| 7 | 7 local hex = require "util.hex"; |
| 8 local function parse_test_cases(json_test_cases) | 8 |
| 9 local input_cases = json.decode(json_test_cases); | 9 describe("v3.local", function () |
| 10 local output_cases = {}; | 10 local function parse_test_cases(json_test_cases) |
| 11 for _, case in ipairs(input_cases) do | 11 local input_cases = json.decode(json_test_cases); |
| 12 assert.is_string(case.name, "Bad test case: expected name"); | 12 local output_cases = {}; |
| 13 assert.is_nil(output_cases[case.name], "Bad test case: duplicate name"); | 13 for _, case in ipairs(input_cases) do |
| 14 output_cases[case.name] = function () | 14 assert.is_string(case.name, "Bad test case: expected name"); |
| 15 local verify_key = paseto.v4_public.import_public_key(case["public-key-pem"]); | 15 assert.is_nil(output_cases[case.name], "Bad test case: duplicate name"); |
| 16 local payload, err = paseto.v4_public.verify(case.token, verify_key, case.footer, case["implicit-assertion"]); | 16 output_cases[case.name] = function () |
| 17 if case["expect-fail"] then | 17 local key = hex.decode(case.key); |
| 18 assert.is_nil(payload); | 18 local payload, err = paseto.v3_local.decrypt(case.token, key, case.footer, case["implicit-assertion"]); |
| 19 else | 19 if case["expect-fail"] then |
| 20 assert.is_nil(err); | 20 assert.is_nil(payload); |
| 21 assert.same(json.decode(case.payload), payload); | 21 else |
| 22 end | 22 assert.is_nil(err); |
| 23 end; | 23 assert.same(json.decode(case.payload), payload); |
| 24 end | 24 end |
| 25 return output_cases; | 25 end; |
| 26 end | 26 end |
| 27 return output_cases; | |
| 28 end | |
| 29 | |
| 30 local test_cases = parse_test_cases [=[[ | |
| 31 { | |
| 32 "name": "3-E-1", | |
| 33 "expect-fail": false, | |
| 34 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 35 "nonce": "0000000000000000000000000000000000000000000000000000000000000000", | |
| 36 "token": "v3.local.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbfcIURX_0pVZVU1mAESUzrKZAsRm2EsD6yBoZYn6cpVZNzSJOhSDN-sRaWjfLU-yn9OJH1J_B8GKtOQ9gSQlb8yk9Iza7teRdkiR89ZFyvPPsVjjFiepFUVcMa-LP18zV77f_crJrVXWa5PDNRkCSeHfBBeg", | |
| 37 "payload": "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 38 "footer": "", | |
| 39 "implicit-assertion": "" | |
| 40 }, | |
| 41 { | |
| 42 "name": "3-E-2", | |
| 43 "expect-fail": false, | |
| 44 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 45 "nonce": "0000000000000000000000000000000000000000000000000000000000000000", | |
| 46 "token": "v3.local.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbfcIURX_0pVZVU1mAESUzrKZAqhWxBMDgyBoZYn6cpVZNzSJOhSDN-sRaWjfLU-yn9OJH1J_B8GKtOQ9gSQlb8yk9IzZfaZpReVpHlDSwfuygx1riVXYVs-UjcrG_apl9oz3jCVmmJbRuKn5ZfD8mHz2db0A", | |
| 47 "payload": "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 48 "footer": "", | |
| 49 "implicit-assertion": "" | |
| 50 }, | |
| 51 { | |
| 52 "name": "3-E-3", | |
| 53 "expect-fail": false, | |
| 54 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 55 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 56 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0ROIIykcrGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJlxnt5xyhQjFJomwnt7WW_7r2VT0G704ifult011-TgLCyQ2X8imQhniG_hAQ4BydM", | |
| 57 "payload": "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 58 "footer": "", | |
| 59 "implicit-assertion": "" | |
| 60 }, | |
| 61 { | |
| 62 "name": "3-E-4", | |
| 63 "expect-fail": false, | |
| 64 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 65 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 66 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0X-4P3EcxGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJlBZa_gOpVj4gv0M9lV6Pwjp8JS_MmaZaTA1LLTULXybOBZ2S4xMbYqYmDRhh3IgEk", | |
| 67 "payload": "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 68 "footer": "", | |
| 69 "implicit-assertion": "" | |
| 70 }, | |
| 71 { | |
| 72 "name": "3-E-5", | |
| 73 "expect-fail": false, | |
| 74 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 75 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 76 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0ROIIykcrGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJlkYSIbXOgVuIQL65UMdW9WcjOpmqvjqD40NNzed-XPqn1T3w-bJvitYpUJL_rmihc.eyJraWQiOiJVYmtLOFk2aXY0R1poRnA2VHgzSVdMV0xmTlhTRXZKY2RUM3pkUjY1WVp4byJ9", | |
| 77 "payload": "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 78 "footer": "{\"kid\":\"UbkK8Y6iv4GZhFp6Tx3IWLWLfNXSEvJcdT3zdR65YZxo\"}", | |
| 79 "implicit-assertion": "" | |
| 80 }, | |
| 81 { | |
| 82 "name": "3-E-6", | |
| 83 "expect-fail": false, | |
| 84 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 85 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 86 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0X-4P3EcxGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJmSeEMphEWHiwtDKJftg41O1F8Hat-8kQ82ZIAMFqkx9q5VkWlxZke9ZzMBbb3Znfo.eyJraWQiOiJVYmtLOFk2aXY0R1poRnA2VHgzSVdMV0xmTlhTRXZKY2RUM3pkUjY1WVp4byJ9", | |
| 87 "payload": "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 88 "footer": "{\"kid\":\"UbkK8Y6iv4GZhFp6Tx3IWLWLfNXSEvJcdT3zdR65YZxo\"}", | |
| 89 "implicit-assertion": "" | |
| 90 }, | |
| 91 { | |
| 92 "name": "3-E-7", | |
| 93 "expect-fail": false, | |
| 94 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 95 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 96 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0ROIIykcrGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJkzWACWAIoVa0bz7EWSBoTEnS8MvGBYHHo6t6mJunPrFR9JKXFCc0obwz5N-pxFLOc.eyJraWQiOiJVYmtLOFk2aXY0R1poRnA2VHgzSVdMV0xmTlhTRXZKY2RUM3pkUjY1WVp4byJ9", | |
| 97 "payload": "{\"data\":\"this is a secret message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 98 "footer": "{\"kid\":\"UbkK8Y6iv4GZhFp6Tx3IWLWLfNXSEvJcdT3zdR65YZxo\"}", | |
| 99 "implicit-assertion": "{\"test-vector\":\"3-E-7\"}" | |
| 100 }, | |
| 101 { | |
| 102 "name": "3-E-8", | |
| 103 "expect-fail": false, | |
| 104 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 105 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 106 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0X-4P3EcxGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJmZHSSKYR6AnPYJV6gpHtx6dLakIG_AOPhu8vKexNyrv5_1qoom6_NaPGecoiz6fR8.eyJraWQiOiJVYmtLOFk2aXY0R1poRnA2VHgzSVdMV0xmTlhTRXZKY2RUM3pkUjY1WVp4byJ9", | |
| 107 "payload": "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 108 "footer": "{\"kid\":\"UbkK8Y6iv4GZhFp6Tx3IWLWLfNXSEvJcdT3zdR65YZxo\"}", | |
| 109 "implicit-assertion": "{\"test-vector\":\"3-E-8\"}" | |
| 110 }, | |
| 111 { | |
| 112 "name": "3-E-9", | |
| 113 "expect-fail": false, | |
| 114 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 115 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 116 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0X-4P3EcxGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJlk1nli0_wijTH_vCuRwckEDc82QWK8-lG2fT9wQF271sgbVRVPjm0LwMQZkvvamqU.YXJiaXRyYXJ5LXN0cmluZy10aGF0LWlzbid0LWpzb24", | |
| 117 "payload": "{\"data\":\"this is a hidden message\",\"exp\":\"2022-01-01T00:00:00+00:00\"}", | |
| 118 "footer": "arbitrary-string-that-isn't-json", | |
| 119 "implicit-assertion": "{\"test-vector\":\"3-E-9\"}" | |
| 120 }, | |
| 121 { | |
| 122 "name": "3-F-3", | |
| 123 "expect-fail": true, | |
| 124 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 125 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 126 "token": "v4.local.1JgN1UG8TFAYS49qsx8rxlwh-9E4ONUm3slJXYi5EibmzxpF0Q-du6gakjuyKCBX8TvnSLOKqCPu8Yh3WSa5yJWigPy33z9XZTJF2HQ9wlLDPtVn_Mu1pPxkTU50ZaBKblJBufRA.YXJiaXRyYXJ5LXN0cmluZy10aGF0LWlzbid0LWpzb24", | |
| 127 "payload": null, | |
| 128 "footer": "arbitrary-string-that-isn't-json", | |
| 129 "implicit-assertion": "{\"test-vector\":\"3-F-3\"}" | |
| 130 }, | |
| 131 { | |
| 132 "name": "3-F-4", | |
| 133 "expect-fail": true, | |
| 134 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 135 "nonce": "0000000000000000000000000000000000000000000000000000000000000000", | |
| 136 "token": "v3.local.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbfcIURX_0pVZVU1mAESUzrKZAsRm2EsD6yBoZYn6cpVZNzSJOhSDN-sRaWjfLU-yn9OJH1J_B8GKtOQ9gSQlb8yk9Iza7teRdkiR89ZFyvPPsVjjFiepFUVcMa-LP18zV77f_crJrVXWa5PDNRkCSeHfBBeh", | |
| 137 "payload": null, | |
| 138 "footer": "", | |
| 139 "implicit-assertion": "" | |
| 140 }, | |
| 141 { | |
| 142 "name": "3-F-5", | |
| 143 "expect-fail": true, | |
| 144 "nonce": "26f7553354482a1d91d4784627854b8da6b8042a7966523c2b404e8dbbe7f7f2", | |
| 145 "key": "707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f", | |
| 146 "token": "v3.local.JvdVM1RIKh2R1HhGJ4VLjaa4BCp5ZlI8K0BOjbvn9_LwY78vQnDait-Q-sjhF88dG2B0ROIIykcrGHn8wzPbTrqObHhyoKpjy3cwZQzLdiwRsdEK5SDvl02_HjWKJW2oqGMOQJlkYSIbXOgVuIQL65UMdW9WcjOpmqvjqD40NNzed-XPqn1T3w-bJvitYpUJL_rmihc=.eyJraWQiOiJVYmtLOFk2aXY0R1poRnA2VHgzSVdMV0xmTlhTRXZKY2RUM3pkUjY1WVp4byJ9", | |
| 147 "payload": null, | |
| 148 "footer": "{\"kid\":\"UbkK8Y6iv4GZhFp6Tx3IWLWLfNXSEvJcdT3zdR65YZxo\"}", | |
| 149 "implicit-assertion": "" | |
| 150 } | |
| 151 ]]=]; | |
| 152 for name, test in pairs(test_cases) do | |
| 153 it("test case "..name, test); | |
| 154 end | |
| 155 | |
| 156 describe("basic sign/verify", function () | |
| 157 local key = paseto.v3_local.new_key(); | |
| 158 local sign, verify = paseto.v3_local.init(key); | |
| 159 | |
| 160 local key2 = paseto.v3_local.new_key(); | |
| 161 local sign2, verify2 = paseto.v3_local.init(key2); | |
| 162 | |
| 163 it("works", function () | |
| 164 local payload = { foo = "hello world", b = { 1, 2, 3 } }; | |
| 165 | |
| 166 local tok = sign(payload); | |
| 167 assert.same(payload, verify(tok)); | |
| 168 assert.is_nil(verify2(tok)); | |
| 169 end); | |
| 170 | |
| 171 it("rejects tokens if implicit assertion fails", function () | |
| 172 local payload = { foo = "hello world", b = { 1, 2, 3 } }; | |
| 173 local tok = sign(payload, nil, "my-custom-assertion"); | |
| 174 assert.is_nil(verify(tok, nil, "my-incorrect-assertion")); | |
| 175 assert.is_nil(verify(tok, nil, nil)); | |
| 176 assert.same(payload, verify(tok, nil, "my-custom-assertion")); | |
| 177 end); | |
| 178 end); | |
| 179 end); | |
| 27 | 180 |
| 28 describe("v4.public", function () | 181 describe("v4.public", function () |
| 182 local function parse_test_cases(json_test_cases) | |
| 183 local input_cases = json.decode(json_test_cases); | |
| 184 local output_cases = {}; | |
| 185 for _, case in ipairs(input_cases) do | |
| 186 assert.is_string(case.name, "Bad test case: expected name"); | |
| 187 assert.is_nil(output_cases[case.name], "Bad test case: duplicate name"); | |
| 188 output_cases[case.name] = function () | |
| 189 local verify_key = paseto.v4_public.import_public_key(case["public-key-pem"]); | |
| 190 local payload, err = paseto.v4_public.verify(case.token, verify_key, case.footer, case["implicit-assertion"]); | |
| 191 if case["expect-fail"] then | |
| 192 assert.is_nil(payload); | |
| 193 else | |
| 194 assert.is_nil(err); | |
| 195 assert.same(json.decode(case.payload), payload); | |
| 196 end | |
| 197 end; | |
| 198 end | |
| 199 return output_cases; | |
| 200 end | |
| 201 | |
| 29 local test_cases = parse_test_cases [=[[ | 202 local test_cases = parse_test_cases [=[[ |
| 30 { | 203 { |
| 31 "name": "4-S-1", | 204 "name": "4-S-1", |
| 32 "expect-fail": false, | 205 "expect-fail": false, |
| 33 "public-key": "1eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2", | 206 "public-key": "1eb9dbbbbc047c03fd70604e0071f0987e16b28b757225c11f00415d0e20b1a2", |
