@tinfoilsh/passkey-kit 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/webauthn.d.ts.map +1 -1
- package/dist/webauthn.js +27 -2
- package/dist/webauthn.js.map +1 -1
- package/package.json +1 -1
- package/src/webauthn.ts +28 -3
package/dist/webauthn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;CAClC;AA2DD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAqD5B;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAwB5B"}
|
package/dist/webauthn.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { base64UrlToBytes,
|
|
1
|
+
import { base64UrlToBytes, bytesToBase64Url } from "./codec.js";
|
|
2
2
|
import { invalidInput, PasskeyKeyError } from "./errors.js";
|
|
3
3
|
const CHALLENGE_BYTES = 32;
|
|
4
4
|
const MAX_USER_HANDLE_BYTES = 64;
|
|
5
5
|
const PRF_OUTPUT_BYTES = 32;
|
|
6
|
+
const MAX_BYTE_VALUE = 255;
|
|
6
7
|
function extensionResults(credential) {
|
|
7
8
|
return credential.getClientExtensionResults();
|
|
8
9
|
}
|
|
@@ -17,7 +18,31 @@ function resultFromCredential(credential) {
|
|
|
17
18
|
if (!first) {
|
|
18
19
|
throw new PasskeyKeyError("unsupported", "the authenticator returned no PRF output");
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
let prfOutput;
|
|
22
|
+
if (Array.isArray(first)) {
|
|
23
|
+
// 1Password's browser extension can return a plain array instead of BufferSource.
|
|
24
|
+
if (first.length !== PRF_OUTPUT_BYTES) {
|
|
25
|
+
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
26
|
+
}
|
|
27
|
+
prfOutput = new Uint8Array(PRF_OUTPUT_BYTES);
|
|
28
|
+
for (let index = 0; index < PRF_OUTPUT_BYTES; index++) {
|
|
29
|
+
const byte = first[index];
|
|
30
|
+
if (!Object.prototype.hasOwnProperty.call(first, index) ||
|
|
31
|
+
!Number.isInteger(byte) || byte < 0 || byte > MAX_BYTE_VALUE) {
|
|
32
|
+
throw invalidInput("PRF output must contain only integer bytes");
|
|
33
|
+
}
|
|
34
|
+
prfOutput[index] = byte;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (first instanceof ArrayBuffer || ArrayBuffer.isView(first)) {
|
|
38
|
+
const bytes = first instanceof ArrayBuffer
|
|
39
|
+
? new Uint8Array(first)
|
|
40
|
+
: new Uint8Array(first.buffer, first.byteOffset, first.byteLength);
|
|
41
|
+
prfOutput = bytes.slice();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
throw invalidInput("PRF output must be a buffer or byte array");
|
|
45
|
+
}
|
|
21
46
|
if (prfOutput.length !== PRF_OUTPUT_BYTES) {
|
|
22
47
|
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
23
48
|
}
|
package/dist/webauthn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/webauthn.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { base64UrlToBytes,
|
|
1
|
+
import { base64UrlToBytes, bytesToBase64Url } from "./codec.js";
|
|
2
2
|
import { invalidInput, PasskeyKeyError } from "./errors.js";
|
|
3
3
|
import type { PasskeyUser } from "./types.js";
|
|
4
4
|
|
|
5
5
|
const CHALLENGE_BYTES = 32;
|
|
6
6
|
const MAX_USER_HANDLE_BYTES = 64;
|
|
7
7
|
const PRF_OUTPUT_BYTES = 32;
|
|
8
|
+
const MAX_BYTE_VALUE = 255;
|
|
8
9
|
|
|
9
10
|
export interface CeremonyContext {
|
|
10
11
|
rpId: string;
|
|
@@ -22,7 +23,7 @@ export interface InternalPrfResult {
|
|
|
22
23
|
interface PrfExtensionResults {
|
|
23
24
|
prf?: {
|
|
24
25
|
enabled?: boolean;
|
|
25
|
-
results?: { first?:
|
|
26
|
+
results?: { first?: unknown };
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
|
|
@@ -41,7 +42,31 @@ function resultFromCredential(credential: PublicKeyCredential): InternalPrfResul
|
|
|
41
42
|
if (!first) {
|
|
42
43
|
throw new PasskeyKeyError("unsupported", "the authenticator returned no PRF output");
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
+
let prfOutput: Uint8Array;
|
|
46
|
+
if (Array.isArray(first)) {
|
|
47
|
+
// 1Password's browser extension can return a plain array instead of BufferSource.
|
|
48
|
+
if (first.length !== PRF_OUTPUT_BYTES) {
|
|
49
|
+
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
50
|
+
}
|
|
51
|
+
prfOutput = new Uint8Array(PRF_OUTPUT_BYTES);
|
|
52
|
+
for (let index = 0; index < PRF_OUTPUT_BYTES; index++) {
|
|
53
|
+
const byte = first[index];
|
|
54
|
+
if (
|
|
55
|
+
!Object.prototype.hasOwnProperty.call(first, index) ||
|
|
56
|
+
!Number.isInteger(byte) || byte < 0 || byte > MAX_BYTE_VALUE
|
|
57
|
+
) {
|
|
58
|
+
throw invalidInput("PRF output must contain only integer bytes");
|
|
59
|
+
}
|
|
60
|
+
prfOutput[index] = byte;
|
|
61
|
+
}
|
|
62
|
+
} else if (first instanceof ArrayBuffer || ArrayBuffer.isView(first)) {
|
|
63
|
+
const bytes = first instanceof ArrayBuffer
|
|
64
|
+
? new Uint8Array(first)
|
|
65
|
+
: new Uint8Array(first.buffer, first.byteOffset, first.byteLength);
|
|
66
|
+
prfOutput = bytes.slice();
|
|
67
|
+
} else {
|
|
68
|
+
throw invalidInput("PRF output must be a buffer or byte array");
|
|
69
|
+
}
|
|
45
70
|
if (prfOutput.length !== PRF_OUTPUT_BYTES) {
|
|
46
71
|
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
47
72
|
}
|