diff --git a/lib/certUtils.js b/lib/certUtils.js index 6639bb12..a8b602fd 100644 --- a/lib/certUtils.js +++ b/lib/certUtils.js @@ -2,16 +2,20 @@ import { ab2str, coerceToArrayBuffer, isPem, pemToBase64, tools } from "./utils. class Certificate { constructor(cert) { - + let decoded; + // Clean up base64 string if (typeof cert === "string" || cert instanceof String) { - cert = cert.replace(/\r/g, ""); + cert = cert.replace(/\r/g, "").trim(); + decoded = ab2str(coerceToArrayBuffer(cert, "certificate")); } if (isPem(cert)) { cert = pemToBase64(cert); + } else if (decoded && isPem(decoded)) { + cert = pemToBase64(decoded); } - + // Clean up certificate if (typeof cert === "string" || cert instanceof String) { cert = cert.replace(/\n/g, ""); diff --git a/package.json b/package.json index 22feb223..e03f21a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fido2-lib", - "version": "3.4.3", + "version": "3.4.4", "description": "A library for performing FIDO 2.0 / WebAuthn functionality", "type": "module", "main": "dist/main.cjs", diff --git a/test/certUtils.test.js b/test/certUtils.test.js index 0209a7ff..dae0fdc9 100644 --- a/test/certUtils.test.js +++ b/test/certUtils.test.js @@ -29,6 +29,12 @@ describe("cert utils", function() { assert.isObject(cert._cert); }); + it("can decode base64 encoded cert", function() { + const cert = new Certificate(h.certs.truUCert); + assert.instanceOf(cert, Certificate); + assert.isObject(cert._cert); + }); + it("throws if no arg to constructor", function() { assert.throws(() => { new Certificate(); diff --git a/test/helpers/fido2-helpers.js b/test/helpers/fido2-helpers.js index 1b6e13da..0e4b358e 100644 --- a/test/helpers/fido2-helpers.js +++ b/test/helpers/fido2-helpers.js @@ -3782,11 +3782,14 @@ const tpmAttestation = new Uint8Array([ 0x3D, ]).buffer; +const truUCert = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNTekNDQWZLZ0F3SUJBZ0lVVzNYSzh5eXdiQVdsaWdsaXhJRjYzZHZxWXk4d0NnWUlLb1pJemowRUF3SXcKZkRFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRU52Ykc5eVlXUnZNUTh3RFFZRFZRUUhEQVpFWlc1MgpaWEl4RXpBUkJnTlZCQW9NQ2xSeWRWVXNJRWx1WXk0eElqQWdCZ05WQkFzTUdVRjFkR2hsYm5ScFkyRjBiM0lnClFYUjBaWE4wWVhScGIyNHhFREFPQmdOVkJBTU1CM1J5ZFhVdVlXa3dJQmNOTWpNeE1UQXpNakF6TmpVeFdoZ1AKTWpBMU16RXdNall5TURNMk5URmFNSHd4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaERiMnh2Y21GawpiekVQTUEwR0ExVUVCd3dHUkdWdWRtVnlNUk13RVFZRFZRUUtEQXBVY25WVkxDQkpibU11TVNJd0lBWURWUVFMCkRCbEJkWFJvWlc1MGFXTmhkRzl5SUVGMGRHVnpkR0YwYVc5dU1SQXdEZ1lEVlFRRERBZDBjblYxTG1GcE1Ga3cKRXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVOQXZidGNjTXI3ai9TUldtcUlFWlRSV05KeWo2bXNZcgo1bEdlQWdkU0d5QzlPMDM1NlJJZWN1YVZpT3F6MER4Z1MxZi81S1BiWnAxdDB5RDJmVlJYOTZOUU1FNHdIUVlEClZSME9CQllFRkE1dEwxMGc4OHQycVhsUGxoSVNJMmRJemxhVk1COEdBMVVkSXdRWU1CYUFGQTV0TDEwZzg4dDIKcVhsUGxoSVNJMmRJemxhVk1Bd0dBMVVkRXdFQi93UUNNQUF3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWGZ1dgpqc3ArNHY1aUdPcW5nVWdPZzFobWJnRlBGTWdJanlXeENLcXcvZDhDSUZpbUxOWExESXdBK29JYlAxeU9mcUU4CnhrNnE3LzRMV09WWWtSQUxvQkMyCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0="; + const certs = { yubiKeyAttestation, yubicoRoot, feitianFido2, tpmAttestation, + truUCert, }; /** ******************************************************************************