openvibers/openvibe.sdk Commits
Add blind fill Link Send test vector (#145)
Changes
nnew file mode 100644@@@ -0,0 +1,25 @@++'use strict';++++const assert = require('node:assert/strict');++const fs = require('node:fs');++const path = require('node:path');++const { run } = require('./helpers');++const locker = require('../src/locker');++const { PERSON, fixedRandom } = require('../src/locker/vectors');++++const vector = JSON.parse(fs.readFileSync(path.join(__dirname, '../testdata/blind-fill-link-send-v1.json'), 'utf8'));++++run([['Locker blind-fill Link Send vector is stable and opens in the SDK', async () => {++ const sealed = await locker.seal(vector.plaintext_json, {++ lock: 'people',++ keys: [{ subject: vector.recipient, publicKey: PERSON.ecdhPublic }],++ random: fixedRandom(0x4f565f46),++ ephemeral: { private: PERSON.ecdh },++ });++ assert.equal(Buffer.from(sealed.bytes).toString('base64'), vector.envelope_base64, 'SDK generation matches the cross-language fixture');++ const opened = await locker.open(Buffer.from(vector.envelope_base64, 'base64'), {++ privateKey: PERSON.ecdh,++ subject: vector.recipient,++ });++ assert.deepEqual(JSON.parse(new TextDecoder().decode(opened)), vector.expected);++}]]);nnew file mode 100644@@@ -0,0 +1,29 @@++{++ "format": "openvibe-locker-link-send-v1",++ "recipient": {++ "type": "node",++ "id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPQ"++ },++ "private_jwk": {++ "key_ops": [++ "deriveBits"++ ],++ "ext": true,++ "kty": "EC",++ "x": "pNngpTSE3X3C_CGzfpAtenjliLPFZ9arBVNtI0ctPXw",++ "y": "fXZT2JcDDiXEb6xH3LUrqlPakM3GQwe3aqbV_1vhVLI",++ "crv": "P-256",++ "d": "cG9YgmeoPeaI8lXZRpijV5--2sC4rYWSqWbyGCYKPu0"++ },++ "plaintext_json": "{\"request_id\":\"fr_01JAB2C3D4E5F6G7H8J9K0MNPQ\",\"origin\":\"https://example.org\",\"username\":\"vector-user\",\"password\":\"vector-password\",\"code\":\"123456\",\"submit\":true,\"exp\":1893456000000}",++ "envelope_base64": "T1ZMSwAAAnJ7ImNodW5rX3NpemUiOjEwNDg1NzYsImxvY2siOiJwZW9wbGUiLCJub25jZV9iYXNlIjoieDZFalZrUDBHSUk9IiwicGFkZGVkX3NpemUiOjI1Niwic2xvdHMiOnsicGVvcGxlIjpbeyJhbGdvcml0aG0iOiJFQ0RILVAyNTYvSEtERi1TSEEyNTYvQUVTLTI1Ni1HQ00iLCJlcGhlbWVyYWxfcHVibGljX2tleSI6eyJjcnYiOiJQLTI1NiIsImt0eSI6IkVDIiwieCI6InBObmdwVFNFM1gzQ19DR3pmcEF0ZW5qbGlMUEZaOWFyQlZOdEkwY3RQWHciLCJ5IjoiZlhaVDJKY0REaVhFYjZ4SDNMVXJxbFBha00zR1F3ZTNhcWJWXzF2aFZMSSJ9LCJub25jZSI6ImdkRHZ6MmI1aDdUM1NHS3EiLCJyZWNpcGllbnRfa2V5IjoiVENHaDJnSDZISXVUMC1BOUdlMGpPVHJGbVJYV1FrZEE2ZlpHOEp4aWtUQSIsInNhbHQiOiI1MXV5RmtBZkxmaUtQMEFjZWJ3eTdnPT0iLCJzdWJqZWN0Ijp7ImlkIjoibm9kXzAxSkFCMkMzRDRFNUY2RzdIOEo5SzBNTlBRIiwidHlwZSI6Im5vZGUifSwid3JhcHBlZF9rZXkiOiJYUy9wcDhtako5by90alpYOHNMcDBXcnA2RTVnTXNFeGFJYmJkalRBMXMxWXl5K290WFEzSFNtZDZGNWR1Mlp0In1dfSwic3VpdGUiOiJBRVMtMjU2LUdDTSIsInZlcnNpb24iOiJsb2NrZXIuZW52ZWxvcGUudjEifQAAARABx6EjVkP0GIIAAAAA69pYH8E0kbpjNaAex1w2c3LlQrxhh736ExhRmzg6br1BRsQhpfz6lnnj7HSwPHl9tokF8lFZ7B/StHSeKZjXlwIib6cK/v5ochfyGemSfYL5e7s9cNUjBJDWZ9SjuiZ9MGRdPJiHbP8BLvtToG4MrvRudpXHY5XfQKoZg1sNbSeW0HfrsGasGQcEjGdvrRUeYFDDBmTL1B5Dk9+X1eHRNTtiQJ5HWibwP+UocDmKrqLypSEsip1D8gjjuBkHgLy39yc0lvGcg14+4AD668aC8BgDHI/5AVL+FLCN7FceUKYuupW2x+B0PlsT9VQWy6EUuIcXd2s2Y/bP/p601ZkUi8WLrNmwl4hS7YT4pvPKJ70=",++ "expected": {++ "request_id": "fr_01JAB2C3D4E5F6G7H8J9K0MNPQ",++ "origin": "https://example.org",++ "username": "vector-user",++ "password": "vector-password",++ "code": "123456",++ "submit": true,++ "exp": 1893456000000++ }++}
new file mode 100644
new file mode 100644
@@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
+'use strict';
+
+const assert = require('node:assert/strict');
+const fs = require('node:fs');
+const path = require('node:path');
+const { run } = require('./helpers');
+const locker = require('../src/locker');
+const { PERSON, fixedRandom } = require('../src/locker/vectors');
+
+const vector = JSON.parse(fs.readFileSync(path.join(__dirname, '../testdata/blind-fill-link-send-v1.json'), 'utf8'));
+
+run([['Locker blind-fill Link Send vector is stable and opens in the SDK', async () => {
+ const sealed = await locker.seal(vector.plaintext_json, {
+ lock: 'people',
+ keys: [{ subject: vector.recipient, publicKey: PERSON.ecdhPublic }],
+ random: fixedRandom(0x4f565f46),
+ ephemeral: { private: PERSON.ecdh },
+ });
+ assert.equal(Buffer.from(sealed.bytes).toString('base64'), vector.envelope_base64, 'SDK generation matches the cross-language fixture');
+ const opened = await locker.open(Buffer.from(vector.envelope_base64, 'base64'), {
+ privateKey: PERSON.ecdh,
+ subject: vector.recipient,
+ });
+ assert.deepEqual(JSON.parse(new TextDecoder().decode(opened)), vector.expected);
+}]]);
new file mode 100644
new file mode 100644
@@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
+{
+ "format": "openvibe-locker-link-send-v1",
+ "recipient": {
+ "type": "node",
+ "id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPQ"
+ },
+ "private_jwk": {
+ "key_ops": [
+ "deriveBits"
+ ],
+ "ext": true,
+ "kty": "EC",
+ "x": "pNngpTSE3X3C_CGzfpAtenjliLPFZ9arBVNtI0ctPXw",
+ "y": "fXZT2JcDDiXEb6xH3LUrqlPakM3GQwe3aqbV_1vhVLI",
+ "crv": "P-256",
+ "d": "cG9YgmeoPeaI8lXZRpijV5--2sC4rYWSqWbyGCYKPu0"
+ },
+ "plaintext_json": "{\"request_id\":\"fr_01JAB2C3D4E5F6G7H8J9K0MNPQ\",\"origin\":\"https://example.org\",\"username\":\"vector-user\",\"password\":\"vector-password\",\"code\":\"123456\",\"submit\":true,\"exp\":1893456000000}",
+ "envelope_base64": "T1ZMSwAAAnJ7ImNodW5rX3NpemUiOjEwNDg1NzYsImxvY2siOiJwZW9wbGUiLCJub25jZV9iYXNlIjoieDZFalZrUDBHSUk9IiwicGFkZGVkX3NpemUiOjI1Niwic2xvdHMiOnsicGVvcGxlIjpbeyJhbGdvcml0aG0iOiJFQ0RILVAyNTYvSEtERi1TSEEyNTYvQUVTLTI1Ni1HQ00iLCJlcGhlbWVyYWxfcHVibGljX2tleSI6eyJjcnYiOiJQLTI1NiIsImt0eSI6IkVDIiwieCI6InBObmdwVFNFM1gzQ19DR3pmcEF0ZW5qbGlMUEZaOWFyQlZOdEkwY3RQWHciLCJ5IjoiZlhaVDJKY0REaVhFYjZ4SDNMVXJxbFBha00zR1F3ZTNhcWJWXzF2aFZMSSJ9LCJub25jZSI6ImdkRHZ6MmI1aDdUM1NHS3EiLCJyZWNpcGllbnRfa2V5IjoiVENHaDJnSDZISXVUMC1BOUdlMGpPVHJGbVJYV1FrZEE2ZlpHOEp4aWtUQSIsInNhbHQiOiI1MXV5RmtBZkxmaUtQMEFjZWJ3eTdnPT0iLCJzdWJqZWN0Ijp7ImlkIjoibm9kXzAxSkFCMkMzRDRFNUY2RzdIOEo5SzBNTlBRIiwidHlwZSI6Im5vZGUifSwid3JhcHBlZF9rZXkiOiJYUy9wcDhtako5by90alpYOHNMcDBXcnA2RTVnTXNFeGFJYmJkalRBMXMxWXl5K290WFEzSFNtZDZGNWR1Mlp0In1dfSwic3VpdGUiOiJBRVMtMjU2LUdDTSIsInZlcnNpb24iOiJsb2NrZXIuZW52ZWxvcGUudjEifQAAARABx6EjVkP0GIIAAAAA69pYH8E0kbpjNaAex1w2c3LlQrxhh736ExhRmzg6br1BRsQhpfz6lnnj7HSwPHl9tokF8lFZ7B/StHSeKZjXlwIib6cK/v5ochfyGemSfYL5e7s9cNUjBJDWZ9SjuiZ9MGRdPJiHbP8BLvtToG4MrvRudpXHY5XfQKoZg1sNbSeW0HfrsGasGQcEjGdvrRUeYFDDBmTL1B5Dk9+X1eHRNTtiQJ5HWibwP+UocDmKrqLypSEsip1D8gjjuBkHgLy39yc0lvGcg14+4AD668aC8BgDHI/5AVL+FLCN7FceUKYuupW2x+B0PlsT9VQWy6EUuIcXd2s2Y/bP/p601ZkUi8WLrNmwl4hS7YT4pvPKJ70=",
+ "expected": {
+ "request_id": "fr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
+ "origin": "https://example.org",
+ "username": "vector-user",
+ "password": "vector-password",
+ "code": "123456",
+ "submit": true,
+ "exp": 1893456000000
+ }
+}