| // Licensed to the Software Freedom Conservancy (SFC) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The SFC licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| 'use strict' |
| |
| const assert = require('node:assert') |
| const virtualAuthenticatorCredential = require('selenium-webdriver/lib/virtual_authenticator').Credential |
| |
| describe('Credentials', function () { |
| const BASE64_ENCODED_PK = `MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDbBOu5Lhs4vpowbCnmCyLUpIE7JM9sm9QXzye2G+jr+Kr |
| MsinWohEce47BFPJlTaDzHSvOW2eeunBO89ZcvvVc8RLz4qyQ8rO98xS1jtgqi1NcBPETDrtzthODu/gd0sjB2Tk3TLuBGV |
| oPXt54a+Oo4JbBJ6h3s0+5eAfGplCbSNq6hN3Jh9YOTw5ZA6GCEy5l8zBaOgjXytd2v2OdSVoEDNiNQRkjJd2rmS2oi9AyQ |
| FR3B7BrPSiDlCcITZFOWgLF5C31Wp/PSHwQhlnh7/6YhnE2y9tzsUvzx0wJXrBADW13+oMxrneDK3WGbxTNYgIi1PvSqXlq |
| GjHtCK+R2QkXAgMBAAECggEAVc6bu7VAnP6v0gDOeX4razv4FX/adCao9ZsHZ+WPX8PQxtmWYqykH5CY4TSfsuizAgyPuQ0 |
| +j4Vjssr9VODLqFoanspT6YXsvaKanncUYbasNgUJnfnLnw3an2XpU2XdmXTNYckCPRX9nsAAURWT3/n9ljc/XYY22ecYxM |
| 8sDWnHu2uKZ1B7M3X60bQYL5T/lVXkKdD6xgSNLeP4AkRx0H4egaop68hoW8FIwmDPVWYVAvo8etzWCtibRXz5FcNld9MgD |
| /Ai7ycKy4Q1KhX5GBFI79MVVaHkSQfxPHpr7/XcmpQOEAr+BMPon4s4vnKqAGdGB3j/E3d/+4F2swykoQKBgQD8hCsp6FIQ |
| 5umJlk9/j/nGsMl85LgLaNVYpWlPRKPc54YNumtvj5vx1BG+zMbT7qIE3nmUPTCHP7qb5ERZG4CdMCS6S64/qzZEqijLCqe |
| pwj6j4fV5SyPWEcpxf6ehNdmcfgzVB3Wolfwh1ydhx/96L1jHJcTKchdJJzlfTvq8wwKBgQDeCnKws1t5GapfE1rmC/h4ol |
| L2qZTth9oQmbrXYohVnoqNFslDa43ePZwL9Jmd9kYb0axOTNMmyrP0NTj41uCfgDS0cJnNTc63ojKjegxHIyYDKRZNVUR/d |
| xAYB/vPfBYZUS7M89pO6LLsHhzS3qpu3/hppo/Uc/AM/r8PSflNHQKBgDnWgBh6OQncChPUlOLv9FMZPR1ZOfqLCYrjYEqi |
| uzGm6iKM13zXFO4AGAxu1P/IAd5BovFcTpg79Z8tWqZaUUwvscnl+cRlj+mMXAmdqCeO8VASOmqM1ml667axeZDIR867ZG8 |
| K5V029Wg+4qtX5uFypNAAi6GfHkxIKrD04yOHAoGACdh4wXESi0oiDdkz3KOHPwIjn6BhZC7z8mx+pnJODU3cYukxv3WTct |
| lUhAsyjJiQ/0bK1yX87ulqFVgO0Knmh+wNajrb9wiONAJTMICG7tiWJOm7fW5cfTJwWkBwYADmkfTRmHDvqzQSSvoC2S7aa |
| 9QulbC3C/qgGFNrcWgcT9kCgYAZTa1P9bFCDU7hJc2mHwJwAW7/FQKEJg8SL33KINpLwcR8fqaYOdAHWWz636osVEqosRrH |
| zJOGpf9x2RSWzQJ+dq8+6fACgfFZOVpN644+sAHfNPAI/gnNKU5OfUv+eav8fBnzlf1A3y3GIkyMyzFN3DE7e0n/lyqxE4H |
| BYGpI8g==` |
| |
| const data = { |
| _id: new Uint8Array([1, 2, 3, 4]), |
| rpId: 'localhost', |
| userHandle: new Uint8Array([1]), |
| privateKey: Buffer.from(BASE64_ENCODED_PK, 'base64').toString('binary'), |
| signCount: 0, |
| } |
| |
| it('can testRkEnabledCredential', function () { |
| const { _id, rpId, userHandle, privateKey, signCount } = data |
| const credential = virtualAuthenticatorCredential.createResidentCredential( |
| _id, |
| rpId, |
| userHandle, |
| privateKey, |
| signCount, |
| ) |
| |
| let testCredentialId = new Uint8Array([1, 2, 3, 4]) |
| |
| /** |
| * Checking if credential.id() matches with testCredentialId. Both values are |
| * arrays so we check if the lengths of both are equal and if one array has |
| * all its elements in the other array and vice-versa. |
| */ |
| assert.equal( |
| credential.id().length == testCredentialId.length && |
| credential.id().every((item) => testCredentialId.includes(item)) && |
| testCredentialId.every((item) => credential.id().includes(item)), |
| true, |
| ) |
| if (credential.isResidentCredential() == true) { |
| assert(true) |
| } else { |
| assert(false) |
| } |
| assert.equal(credential.rpId(), 'localhost') |
| |
| let testUserHandle = new Uint8Array([1]) |
| |
| /** |
| * Checking if credential.userHandle() matches with testUserHandle. Both values are |
| * arrays so we check if the lengths of both are equal and if one array has |
| * all its elements in the other array and vice-versa. |
| */ |
| assert.equal( |
| credential.userHandle().length == testUserHandle.length && |
| credential.userHandle().every((item) => testUserHandle.includes(item)) && |
| testUserHandle.every((item) => credential.userHandle().includes(item)), |
| true, |
| ) |
| assert.equal(credential.privateKey(), Buffer.from(BASE64_ENCODED_PK, 'base64url').toString('binary')) |
| assert.equal(credential.signCount(), 0) |
| }) |
| |
| it('can testRkDisabledCredential', function () { |
| const { _id, rpId, privateKey, signCount } = data |
| const credential = virtualAuthenticatorCredential.createNonResidentCredential(_id, rpId, privateKey, signCount) |
| |
| let testCredentialId = new Uint8Array([1, 2, 3, 4]) |
| |
| /** |
| * Checking if credential.id() matches with testCredentialId. Both values are |
| * arrays so we check if the lengths of both are equal and if one array has |
| * all its elements in the other array and vice-versa. |
| */ |
| assert.equal( |
| credential.id().length == testCredentialId.length && |
| credential.id().every((item) => testCredentialId.includes(item)) && |
| testCredentialId.every((item) => credential.id().includes(item)), |
| true, |
| ) |
| |
| if (credential.isResidentCredential() == false) { |
| assert(true) |
| } else { |
| assert(false) |
| } |
| |
| if (credential.userHandle() == null) { |
| assert(true) |
| } else { |
| assert(false) |
| } |
| }) |
| |
| it('can testToDict', function () { |
| const { _id, rpId, userHandle, privateKey, signCount } = data |
| const credential = virtualAuthenticatorCredential.createResidentCredential( |
| _id, |
| rpId, |
| userHandle, |
| privateKey, |
| signCount, |
| ) |
| |
| let credential_dict = credential.toDict() |
| assert.equal(credential_dict['credentialId'], Buffer.from(new Uint8Array([1, 2, 3, 4])).toString('base64url')) |
| |
| if (credential_dict['isResidentCredential'] == true) { |
| assert(true) |
| } else { |
| assert(false) |
| } |
| |
| assert.equal(credential_dict['rpId'], 'localhost') |
| assert.equal(credential_dict['userHandle'], Buffer.from(new Uint8Array([1])).toString('base64url')) |
| assert.equal(credential_dict['privateKey'], Buffer.from(privateKey, 'binary').toString('base64url')) |
| assert.equal(credential_dict['signCount'], 0) |
| }) |
| |
| it('can testFromDict', function () { |
| let credential_data = { |
| credentialId: Buffer.from(new Uint8Array([1, 2, 3, 4])).toString('base64url'), |
| isResidentCredential: true, |
| rpId: 'localhost', |
| userHandle: Buffer.from(new Uint8Array([1])).toString('base64url'), |
| privateKey: BASE64_ENCODED_PK, |
| signCount: 0, |
| } |
| |
| let credential = new virtualAuthenticatorCredential().fromDict(credential_data) |
| let testCredentialId = new Uint8Array([1, 2, 3, 4]) |
| assert.equal( |
| credential.id().length == testCredentialId.length && |
| credential.id().every((item) => testCredentialId.includes(item)) && |
| testCredentialId.every((item) => credential.id().includes(item)), |
| true, |
| ) |
| |
| if (credential.isResidentCredential() == true) { |
| assert(true) |
| } else { |
| assert(false) |
| } |
| |
| assert.equal(credential.rpId(), 'localhost') |
| |
| let testUserHandle = new Uint8Array([1]) |
| |
| /** |
| * Checking if credential.userHandle() matches with testUserHandle. Both values are |
| * arrays so we check if the lengths of both are equal and if one array has |
| * all its elements in the other array and vice-versa. |
| */ |
| assert.equal( |
| credential.userHandle().length == testUserHandle.length && |
| credential.userHandle().every((item) => testUserHandle.includes(item)) && |
| testUserHandle.every((item) => credential.userHandle().includes(item)), |
| true, |
| ) |
| |
| assert.equal(credential.privateKey(), Buffer.from(BASE64_ENCODED_PK, 'base64url').toString('binary')) |
| assert.equal(credential.signCount(), 0) |
| }) |
| }) |