phygital-token-sdk 0.2.2 → 0.3.0

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.
Files changed (135) hide show
  1. package/dist/__tests__/nfc-cbor.test.d.ts +2 -0
  2. package/dist/__tests__/nfc-cbor.test.d.ts.map +1 -0
  3. package/dist/__tests__/nfc-cbor.test.js +72 -0
  4. package/dist/__tests__/nfc-cbor.test.js.map +1 -0
  5. package/dist/generated/accounts/asset.d.ts +14 -8
  6. package/dist/generated/accounts/asset.d.ts.map +1 -1
  7. package/dist/generated/accounts/asset.js +13 -5
  8. package/dist/generated/accounts/asset.js.map +1 -1
  9. package/dist/generated/accounts/index.d.ts +0 -1
  10. package/dist/generated/accounts/index.d.ts.map +1 -1
  11. package/dist/generated/accounts/index.js +0 -1
  12. package/dist/generated/accounts/index.js.map +1 -1
  13. package/dist/generated/errors/phygitalToken.d.ts +1 -4
  14. package/dist/generated/errors/phygitalToken.d.ts.map +1 -1
  15. package/dist/generated/errors/phygitalToken.js +0 -6
  16. package/dist/generated/errors/phygitalToken.js.map +1 -1
  17. package/dist/generated/instructions/executeTransfer.d.ts +7 -11
  18. package/dist/generated/instructions/executeTransfer.d.ts.map +1 -1
  19. package/dist/generated/instructions/executeTransfer.js +2 -7
  20. package/dist/generated/instructions/executeTransfer.js.map +1 -1
  21. package/dist/generated/instructions/index.d.ts +0 -2
  22. package/dist/generated/instructions/index.d.ts.map +1 -1
  23. package/dist/generated/instructions/index.js +0 -2
  24. package/dist/generated/instructions/index.js.map +1 -1
  25. package/dist/generated/instructions/mintToken.d.ts +20 -20
  26. package/dist/generated/instructions/mintToken.d.ts.map +1 -1
  27. package/dist/generated/instructions/mintToken.js +8 -11
  28. package/dist/generated/instructions/mintToken.js.map +1 -1
  29. package/dist/generated/programs/phygitalToken.d.ts +8 -18
  30. package/dist/generated/programs/phygitalToken.d.ts.map +1 -1
  31. package/dist/generated/programs/phygitalToken.js +7 -38
  32. package/dist/generated/programs/phygitalToken.js.map +1 -1
  33. package/dist/generated/types/assetType.d.ts +10 -0
  34. package/dist/generated/types/assetType.d.ts.map +1 -0
  35. package/dist/generated/types/assetType.js +16 -0
  36. package/dist/generated/types/assetType.js.map +1 -0
  37. package/dist/generated/types/credentialId.d.ts +7 -0
  38. package/dist/generated/types/credentialId.d.ts.map +1 -0
  39. package/dist/generated/types/credentialId.js +11 -0
  40. package/dist/generated/types/credentialId.js.map +1 -0
  41. package/dist/generated/types/index.d.ts +2 -0
  42. package/dist/generated/types/index.d.ts.map +1 -1
  43. package/dist/generated/types/index.js +2 -0
  44. package/dist/generated/types/index.js.map +1 -1
  45. package/dist/index.d.ts +3 -3
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +3 -3
  48. package/dist/index.js.map +1 -1
  49. package/dist/instructions/mint.d.ts +4 -2
  50. package/dist/instructions/mint.d.ts.map +1 -1
  51. package/dist/instructions/mint.js +19 -3
  52. package/dist/instructions/mint.js.map +1 -1
  53. package/dist/instructions/transfer.d.ts.map +1 -1
  54. package/dist/instructions/transfer.js +3 -4
  55. package/dist/instructions/transfer.js.map +1 -1
  56. package/dist/utils/consts.d.ts +0 -1
  57. package/dist/utils/consts.d.ts.map +1 -1
  58. package/dist/utils/consts.js +0 -1
  59. package/dist/utils/consts.js.map +1 -1
  60. package/dist/utils/metadata.d.ts +26 -10
  61. package/dist/utils/metadata.d.ts.map +1 -1
  62. package/dist/utils/metadata.js +85 -25
  63. package/dist/utils/metadata.js.map +1 -1
  64. package/dist/utils/passkey/internal.d.ts +1 -0
  65. package/dist/utils/passkey/internal.d.ts.map +1 -1
  66. package/dist/utils/passkey/internal.js +1 -0
  67. package/dist/utils/passkey/internal.js.map +1 -1
  68. package/dist/utils/passkey/nfc/apdu.d.ts +39 -0
  69. package/dist/utils/passkey/nfc/apdu.d.ts.map +1 -0
  70. package/dist/utils/passkey/nfc/apdu.js +191 -0
  71. package/dist/utils/passkey/nfc/apdu.js.map +1 -0
  72. package/dist/utils/passkey/nfc/authDataExtensions.d.ts +2 -0
  73. package/dist/utils/passkey/nfc/authDataExtensions.d.ts.map +1 -0
  74. package/dist/utils/passkey/nfc/authDataExtensions.js +176 -0
  75. package/dist/utils/passkey/nfc/authDataExtensions.js.map +1 -0
  76. package/dist/utils/passkey/nfc/authenticate.d.ts +4 -0
  77. package/dist/utils/passkey/nfc/authenticate.d.ts.map +1 -0
  78. package/dist/utils/passkey/nfc/authenticate.js +40 -0
  79. package/dist/utils/passkey/nfc/authenticate.js.map +1 -0
  80. package/dist/utils/passkey/nfc/base64url.d.ts +2 -0
  81. package/dist/utils/passkey/nfc/base64url.d.ts.map +1 -0
  82. package/dist/utils/passkey/nfc/base64url.js +13 -0
  83. package/dist/utils/passkey/nfc/base64url.js.map +1 -0
  84. package/dist/utils/passkey/nfc/cbor.d.ts +5 -0
  85. package/dist/utils/passkey/nfc/cbor.d.ts.map +1 -0
  86. package/dist/utils/passkey/nfc/cbor.js +267 -0
  87. package/dist/utils/passkey/nfc/cbor.js.map +1 -0
  88. package/dist/utils/passkey/nfc/clientData.d.ts +9 -0
  89. package/dist/utils/passkey/nfc/clientData.d.ts.map +1 -0
  90. package/dist/utils/passkey/nfc/clientData.js +15 -0
  91. package/dist/utils/passkey/nfc/clientData.js.map +1 -0
  92. package/dist/utils/passkey/nfc/constants.d.ts +6 -0
  93. package/dist/utils/passkey/nfc/constants.d.ts.map +1 -0
  94. package/dist/utils/passkey/nfc/constants.js +8 -0
  95. package/dist/utils/passkey/nfc/constants.js.map +1 -0
  96. package/dist/utils/passkey/nfc/errors.d.ts +7 -0
  97. package/dist/utils/passkey/nfc/errors.d.ts.map +1 -0
  98. package/dist/utils/passkey/nfc/errors.js +10 -0
  99. package/dist/utils/passkey/nfc/errors.js.map +1 -0
  100. package/dist/utils/passkey/nfc/fromWebAuthnJson.d.ts +4 -0
  101. package/dist/utils/passkey/nfc/fromWebAuthnJson.d.ts.map +1 -0
  102. package/dist/utils/passkey/nfc/fromWebAuthnJson.js +58 -0
  103. package/dist/utils/passkey/nfc/fromWebAuthnJson.js.map +1 -0
  104. package/dist/utils/passkey/nfc/getAssertion.d.ts +32 -0
  105. package/dist/utils/passkey/nfc/getAssertion.d.ts.map +1 -0
  106. package/dist/utils/passkey/nfc/getAssertion.js +97 -0
  107. package/dist/utils/passkey/nfc/getAssertion.js.map +1 -0
  108. package/dist/utils/passkey/nfc/index.d.ts +4 -0
  109. package/dist/utils/passkey/nfc/index.d.ts.map +1 -0
  110. package/dist/utils/passkey/nfc/index.js +3 -0
  111. package/dist/utils/passkey/nfc/index.js.map +1 -0
  112. package/dist/utils/passkey/nfc/parseResponses.d.ts +7 -0
  113. package/dist/utils/passkey/nfc/parseResponses.d.ts.map +1 -0
  114. package/dist/utils/passkey/nfc/parseResponses.js +18 -0
  115. package/dist/utils/passkey/nfc/parseResponses.js.map +1 -0
  116. package/dist/utils/passkey/nfc/types.d.ts +9 -0
  117. package/dist/utils/passkey/nfc/types.d.ts.map +1 -0
  118. package/dist/utils/passkey/nfc/types.js +2 -0
  119. package/dist/utils/passkey/nfc/types.js.map +1 -0
  120. package/dist/utils/passkey/nfc/webauthnResponses.d.ts +8 -0
  121. package/dist/utils/passkey/nfc/webauthnResponses.d.ts.map +1 -0
  122. package/dist/utils/passkey/nfc/webauthnResponses.js +29 -0
  123. package/dist/utils/passkey/nfc/webauthnResponses.js.map +1 -0
  124. package/dist/utils/passkey/secp256r1.d.ts.map +1 -1
  125. package/dist/utils/passkey/secp256r1.js +0 -1
  126. package/dist/utils/passkey/secp256r1.js.map +1 -1
  127. package/dist/utils/pdas/index.d.ts +0 -1
  128. package/dist/utils/pdas/index.d.ts.map +1 -1
  129. package/dist/utils/pdas/index.js +0 -1
  130. package/dist/utils/pdas/index.js.map +1 -1
  131. package/dist/utils/verify.d.ts +18 -4
  132. package/dist/utils/verify.d.ts.map +1 -1
  133. package/dist/utils/verify.js +113 -7
  134. package/dist/utils/verify.js.map +1 -1
  135. package/package.json +1 -1
@@ -0,0 +1,191 @@
1
+ import { FIDO_AID, NFC_TX_CHUNK_SIZE, SW1_MORE_DATA, SW_NO_ERROR, } from "./constants.js";
2
+ import { ApduError } from "./errors.js";
3
+ const CLA_CHAIN = 0x10;
4
+ function formatCtapErrorMessage(code) {
5
+ const hex = `0x${code.toString(16).padStart(2, "0")}`;
6
+ const names = {
7
+ 0x01: "INVALID_COMMAND",
8
+ 0x02: "INVALID_PARAMETER",
9
+ 0x03: "INVALID_LENGTH",
10
+ 0x11: "CBOR_UNEXPECTED_TYPE",
11
+ 0x12: "INVALID_CBOR",
12
+ 0x14: "MISSING_PARAMETER",
13
+ 0x2e: "NO_CREDENTIALS",
14
+ 0x30: "NOT_ALLOWED",
15
+ };
16
+ const name = names[code];
17
+ return name ? `CTAP error ${hex} (${name})` : `CTAP error code ${hex}`;
18
+ }
19
+ export function encodeExtendedCase3e(cla, ins, p1, p2, data) {
20
+ const n = data.length;
21
+ if (n > 65535) {
22
+ throw new ApduError("APDU data field exceeds 65535 bytes");
23
+ }
24
+ const out = new Uint8Array(7 + n + 2);
25
+ out[0] = cla & 0xff;
26
+ out[1] = ins & 0xff;
27
+ out[2] = p1 & 0xff;
28
+ out[3] = p2 & 0xff;
29
+ out[4] = 0x00;
30
+ out[5] = (n >> 8) & 0xff;
31
+ out[6] = n & 0xff;
32
+ out.set(data, 7);
33
+ out[7 + n] = 0x00;
34
+ out[7 + n + 1] = 0x00;
35
+ return out;
36
+ }
37
+ export function encodeShortApdu(cla, ins, p1, p2, payload, options) {
38
+ const lc = payload.length;
39
+ if (lc > 255) {
40
+ throw new ApduError("short APDU payload must be ≤ 255 bytes");
41
+ }
42
+ const withLe = !options.chained;
43
+ const out = new Uint8Array(5 + lc + (withLe ? 1 : 0));
44
+ out[0] = (cla & 0xff) | (options.chained ? CLA_CHAIN : 0);
45
+ out[1] = ins & 0xff;
46
+ out[2] = p1 & 0xff;
47
+ out[3] = p2 & 0xff;
48
+ out[4] = lc & 0xff;
49
+ out.set(payload, 5);
50
+ if (withLe) {
51
+ out[5 + lc] = 0x00;
52
+ }
53
+ return out;
54
+ }
55
+ export async function transmitCborApduSegments(segments, transceive) {
56
+ let last;
57
+ for (const seg of segments) {
58
+ const resp = await transceive(seg.bytes);
59
+ if (resp.length < 2) {
60
+ throw new ApduError(`APDU response too short for status word (${resp.length} byte(s))`);
61
+ }
62
+ const sw = (resp[resp.length - 2] << 8) | resp[resp.length - 1];
63
+ if (seg.chained) {
64
+ if (sw !== SW_NO_ERROR) {
65
+ throw new ApduError(`ISO7816 status 0x${sw.toString(16).padStart(4, "0")}`);
66
+ }
67
+ }
68
+ else {
69
+ last = resp;
70
+ }
71
+ }
72
+ if (!last) {
73
+ throw new ApduError("no final APDU response");
74
+ }
75
+ return last;
76
+ }
77
+ const GET_RESPONSE_MAX_CHAIN = 256;
78
+ export async function collectCborApduResponse(firstResponse, transceive) {
79
+ const chunks = [];
80
+ let cur = firstResponse;
81
+ for (let i = 0; i < GET_RESPONSE_MAX_CHAIN; i++) {
82
+ if (cur.length < 2) {
83
+ throw new ApduError("APDU response too short");
84
+ }
85
+ const sw1 = cur[cur.length - 2];
86
+ const sw2 = cur[cur.length - 1];
87
+ chunks.push(cur.slice(0, -2));
88
+ if (sw1 !== SW1_MORE_DATA) {
89
+ const totalLen = chunks.reduce((a, c) => a + c.length, 0) + 2;
90
+ const out = new Uint8Array(totalLen);
91
+ let o = 0;
92
+ for (const c of chunks) {
93
+ out.set(c, o);
94
+ o += c.length;
95
+ }
96
+ out[o] = sw1;
97
+ out[o + 1] = sw2;
98
+ return out;
99
+ }
100
+ cur = await transceive(buildGetResponseApdu(sw2, true));
101
+ }
102
+ throw new ApduError("GET RESPONSE chain exceeded limit");
103
+ }
104
+ export async function transceiveNfcCtap2Command(segments, transceive) {
105
+ return collectCborApduResponse(await transmitCborApduSegments(segments, transceive), transceive);
106
+ }
107
+ export function splitExtendedApduForNfcTransmit(extended, chunkSize = NFC_TX_CHUNK_SIZE) {
108
+ if (extended.length < 9) {
109
+ throw new ApduError("extended APDU too short");
110
+ }
111
+ const cla = extended[0];
112
+ const ins = extended[1];
113
+ const p1 = extended[2];
114
+ const p2 = extended[3];
115
+ const data = extended.slice(7, extended.length - 2);
116
+ const segments = [];
117
+ let off = 0;
118
+ while (data.length - off > chunkSize) {
119
+ const chunk = data.subarray(off, off + chunkSize);
120
+ segments.push({
121
+ bytes: encodeShortApdu(cla, ins, p1, p2, chunk, { chained: true }),
122
+ chained: true,
123
+ });
124
+ off += chunkSize;
125
+ }
126
+ const rest = data.subarray(off);
127
+ segments.push({
128
+ bytes: encodeShortApdu(cla, ins, p1, p2, rest, { chained: false }),
129
+ chained: false,
130
+ });
131
+ return segments;
132
+ }
133
+ export function buildSelectFidoApdu() {
134
+ return encodeExtendedCase3e(0x00, 0xa4, 0x04, 0x00, FIDO_AID);
135
+ }
136
+ export function buildSelectFidoApduSegments() {
137
+ return splitExtendedApduForNfcTransmit(buildSelectFidoApdu());
138
+ }
139
+ export function buildCborCommandApdu(cborPayload) {
140
+ return encodeExtendedCase3e(0x80, 0x10, 0x00, 0x00, cborPayload);
141
+ }
142
+ export function buildGetResponseApdu(le, cbor) {
143
+ const apdu = new Uint8Array(5);
144
+ apdu[0] = cbor ? 0x80 : 0x00;
145
+ apdu[1] = 0xc0;
146
+ apdu[2] = 0x00;
147
+ apdu[3] = 0x00;
148
+ apdu[4] = le & 0xff;
149
+ return apdu;
150
+ }
151
+ export function parseIso7816Response(buf) {
152
+ if (buf.length < 2) {
153
+ throw new ApduError("response must include SW1 and SW2");
154
+ }
155
+ const sw1 = buf[buf.length - 2];
156
+ const sw2 = buf[buf.length - 1];
157
+ const statusWord = (sw1 << 8) | sw2;
158
+ return {
159
+ data: buf.slice(0, -2),
160
+ sw1,
161
+ sw2,
162
+ statusWord,
163
+ };
164
+ }
165
+ function isSuccessStatus(statusWord) {
166
+ return statusWord === SW_NO_ERROR;
167
+ }
168
+ export function parseCtaphidCborFromApduResponse(apduResponseIncludingSw) {
169
+ const { data, statusWord } = parseIso7816Response(apduResponseIncludingSw);
170
+ if (!isSuccessStatus(statusWord)) {
171
+ return { ok: false, layer: "iso7816", statusWord };
172
+ }
173
+ if (data.length < 1) {
174
+ throw new ApduError("empty CTAP payload after ISO7816 success");
175
+ }
176
+ const status = data[0];
177
+ if (status !== 0) {
178
+ return { ok: false, layer: "ctap", errorCode: status };
179
+ }
180
+ return { ok: true, cborMapBytes: data.subarray(1) };
181
+ }
182
+ export function unwrapCtaphidCborBody(parsed) {
183
+ if (!parsed.ok) {
184
+ if (parsed.layer === "iso7816") {
185
+ throw new ApduError(`ISO7816 status 0x${parsed.statusWord.toString(16).padStart(4, "0")}`);
186
+ }
187
+ throw new ApduError(formatCtapErrorMessage(parsed.errorCode));
188
+ }
189
+ return parsed.cborMapBytes;
190
+ }
191
+ //# sourceMappingURL=apdu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apdu.js","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/apdu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function parseAuthenticatorDataExtensions(authData: Uint8Array): Record<string, unknown>;
2
+ //# sourceMappingURL=authDataExtensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authDataExtensions.d.ts","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/authDataExtensions.ts"],"names":[],"mappings":"AAyMA,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,UAAU,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
@@ -0,0 +1,176 @@
1
+ import { decodeCbor } from "./cbor.js";
2
+ const FLAG_AT = 0x40;
3
+ const FLAG_ED = 0x80;
4
+ function skipOneCborItem(buf, i) {
5
+ const first = buf[i];
6
+ const mt = first >> 5;
7
+ const ai = first & 0x1f;
8
+ let p = i + 1;
9
+ if (mt === 0 || mt === 1) {
10
+ if (ai < 24) {
11
+ return p;
12
+ }
13
+ if (ai === 24) {
14
+ return p + 1;
15
+ }
16
+ if (ai === 25) {
17
+ return p + 2;
18
+ }
19
+ if (ai === 26) {
20
+ return p + 4;
21
+ }
22
+ if (ai === 27) {
23
+ return p + 8;
24
+ }
25
+ throw new Error("CBOR: invalid integer encoding");
26
+ }
27
+ if (mt === 2 || mt === 3) {
28
+ const { len, next } = readLength(ai, buf, p);
29
+ return next + len;
30
+ }
31
+ if (mt === 4) {
32
+ if (ai === 31) {
33
+ throw new Error("CBOR: indefinite array not supported in authData");
34
+ }
35
+ const { len, next } = readLength(ai, buf, p);
36
+ let q = next;
37
+ for (let k = 0; k < len; k++) {
38
+ q = skipOneCborItem(buf, q);
39
+ }
40
+ return q;
41
+ }
42
+ if (mt === 5) {
43
+ if (ai === 31) {
44
+ throw new Error("CBOR: indefinite map not supported in authData");
45
+ }
46
+ const { len, next } = readLength(ai, buf, p);
47
+ let q = next;
48
+ for (let k = 0; k < len; k++) {
49
+ q = skipOneCborItem(buf, q);
50
+ q = skipOneCborItem(buf, q);
51
+ }
52
+ return q;
53
+ }
54
+ if (mt === 6) {
55
+ const { next } = readTagNumber(ai, buf, p);
56
+ return skipOneCborItem(buf, next);
57
+ }
58
+ if (mt === 7) {
59
+ if (ai < 24) {
60
+ return p;
61
+ }
62
+ if (ai === 24) {
63
+ return p + 1;
64
+ }
65
+ if (ai === 25) {
66
+ return p + 2;
67
+ }
68
+ if (ai === 26) {
69
+ return p + 5;
70
+ }
71
+ if (ai === 27) {
72
+ return p + 9;
73
+ }
74
+ throw new Error("CBOR: invalid simple/float encoding");
75
+ }
76
+ throw new Error("CBOR: unknown major type");
77
+ }
78
+ function readLength(ai, buf, p) {
79
+ if (ai < 24) {
80
+ return { len: ai, next: p };
81
+ }
82
+ if (ai === 24) {
83
+ return { len: buf[p], next: p + 1 };
84
+ }
85
+ if (ai === 25) {
86
+ return { len: (buf[p] << 8) | buf[p + 1], next: p + 2 };
87
+ }
88
+ if (ai === 26) {
89
+ const len = ((buf[p] << 24) |
90
+ (buf[p + 1] << 16) |
91
+ (buf[p + 2] << 8) |
92
+ buf[p + 3]) >>>
93
+ 0;
94
+ return { len, next: p + 4 };
95
+ }
96
+ if (ai === 27) {
97
+ const hi = (buf[p] << 24) | (buf[p + 1] << 16) | (buf[p + 2] << 8) | buf[p + 3];
98
+ const lo = (buf[p + 4] << 24) |
99
+ (buf[p + 5] << 16) |
100
+ (buf[p + 6] << 8) |
101
+ buf[p + 7];
102
+ const n = (BigInt(hi >>> 0) << 32n) | BigInt(lo >>> 0);
103
+ if (n > BigInt(Number.MAX_SAFE_INTEGER)) {
104
+ throw new Error("CBOR: length too large");
105
+ }
106
+ return { len: Number(n), next: p + 8 };
107
+ }
108
+ throw new Error("CBOR: invalid length encoding");
109
+ }
110
+ function readTagNumber(ai, buf, p) {
111
+ if (ai < 24) {
112
+ return { next: p };
113
+ }
114
+ if (ai === 24) {
115
+ return { next: p + 1 };
116
+ }
117
+ if (ai === 25) {
118
+ return { next: p + 2 };
119
+ }
120
+ if (ai === 26) {
121
+ return { next: p + 4 };
122
+ }
123
+ if (ai === 27) {
124
+ return { next: p + 8 };
125
+ }
126
+ throw new Error("CBOR: invalid tag encoding");
127
+ }
128
+ function skipAttestedCredentialData(authData, start) {
129
+ if (authData.length < start + 18) {
130
+ throw new Error("authData: truncated attested credential data header");
131
+ }
132
+ let off = start + 16;
133
+ const credIdLen = (authData[off] << 8) | authData[off + 1];
134
+ off += 2 + credIdLen;
135
+ if (off > authData.length) {
136
+ throw new Error("authData: credential id out of range");
137
+ }
138
+ return skipOneCborItem(authData, off);
139
+ }
140
+ function cborExtensionsToRecord(decoded) {
141
+ if (decoded instanceof Map) {
142
+ const o = {};
143
+ for (const [k, v] of decoded) {
144
+ if (typeof k === "string") {
145
+ o[k] = v;
146
+ }
147
+ }
148
+ return o;
149
+ }
150
+ if (decoded !== null &&
151
+ typeof decoded === "object" &&
152
+ !Array.isArray(decoded)) {
153
+ return { ...decoded };
154
+ }
155
+ return {};
156
+ }
157
+ export function parseAuthenticatorDataExtensions(authData) {
158
+ if (authData.length < 37) {
159
+ return {};
160
+ }
161
+ const flags = authData[32];
162
+ let offset = 37;
163
+ if (flags & FLAG_AT) {
164
+ offset = skipAttestedCredentialData(authData, offset);
165
+ }
166
+ if ((flags & FLAG_ED) === 0) {
167
+ return {};
168
+ }
169
+ if (offset >= authData.length) {
170
+ return {};
171
+ }
172
+ const extBytes = authData.subarray(offset);
173
+ const decoded = decodeCbor(extBytes);
174
+ return cborExtensionsToRecord(decoded);
175
+ }
176
+ //# sourceMappingURL=authDataExtensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authDataExtensions.js","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/authDataExtensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
2
+ import type { PublicKeyCredentialRequestOptionsJSONWithNfc } from "./types.js";
3
+ export declare function authenticateWithNfc(args: PublicKeyCredentialRequestOptionsJSONWithNfc, transceive: (apdu: Uint8Array) => Promise<Uint8Array>): Promise<AuthenticationResponseJSON>;
4
+ //# sourceMappingURL=authenticate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.d.ts","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/authenticate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAW1E,OAAO,KAAK,EAAE,4CAA4C,EAAE,MAAM,YAAY,CAAC;AA8D/E,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,4CAA4C,EAClD,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,GACpD,OAAO,CAAC,0BAA0B,CAAC,CAYrC"}
@@ -0,0 +1,40 @@
1
+ import { buildCborCommandApdu, buildSelectFidoApduSegments, splitExtendedApduForNfcTransmit, transceiveNfcCtap2Command, } from "./apdu.js";
2
+ import { encodeAuthenticatorGetAssertionRequest } from "./getAssertion.js";
3
+ import { authenticatorGetAssertionRequestFromPublicKeyCredentialRequestOptionsJSON } from "./fromWebAuthnJson.js";
4
+ import { parseApduToAuthenticationResponse } from "./parseResponses.js";
5
+ import { ApduError } from "./errors.js";
6
+ function nfcTransceiveFor(transceive, phase) {
7
+ const label = `authenticateWithNfc (${phase})`;
8
+ return async (apdu) => {
9
+ try {
10
+ const resp = await transceive(apdu);
11
+ if (resp.length < 2) {
12
+ throw new ApduError(`${label}: response must include SW1/SW2 (got ${resp.length} byte(s))`);
13
+ }
14
+ return resp;
15
+ }
16
+ catch (e) {
17
+ if (e instanceof ApduError) {
18
+ throw e;
19
+ }
20
+ throw new ApduError(`${label}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
21
+ }
22
+ };
23
+ }
24
+ async function runAuthenticateWithNfc(args, transceive) {
25
+ await transceiveNfcCtap2Command(buildSelectFidoApduSegments(), nfcTransceiveFor(transceive, "SELECT FIDO"));
26
+ const apduResponse = await transceiveNfcCtap2Command(splitExtendedApduForNfcTransmit(buildCborCommandApdu(encodeAuthenticatorGetAssertionRequest(authenticatorGetAssertionRequestFromPublicKeyCredentialRequestOptionsJSON(args)))), nfcTransceiveFor(transceive, "getAssertion"));
27
+ return parseApduToAuthenticationResponse({ apduResponse, request: args });
28
+ }
29
+ export async function authenticateWithNfc(args, transceive) {
30
+ try {
31
+ return await runAuthenticateWithNfc(args, transceive);
32
+ }
33
+ catch (e) {
34
+ if (e instanceof ApduError) {
35
+ throw e;
36
+ }
37
+ throw new ApduError(`authenticateWithNfc: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
38
+ }
39
+ }
40
+ //# sourceMappingURL=authenticate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.js","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/authenticate.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,GAC1B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,sCAAsC,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,yEAAyE,EAAE,MAAM,uBAAuB,CAAC;AAClH,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,SAAS,gBAAgB,CACvB,UAAqD,EACrD,KAAa;IAEb,MAAM,KAAK,GAAG,wBAAwB,KAAK,GAAG,CAAC;IAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,wCAAwC,IAAI,CAAC,MAAM,WAAW,CACvE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC;gBAC3B,MAAM,CAAC,CAAC;YACV,CAAC;YACD,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EACzD,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAAkD,EAClD,UAAqD;IAErD,MAAM,yBAAyB,CAC7B,2BAA2B,EAAE,EAC7B,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAC5C,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAClD,+BAA+B,CAC7B,oBAAoB,CAClB,sCAAsC,CACpC,yEAAyE,CACvE,IAAI,CACL,CACF,CACF,CACF,EACD,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAC7C,CAAC;IACF,OAAO,iCAAiC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5E,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAkD,EAClD,UAAqD;IAErD,IAAI,CAAC;QACH,OAAO,MAAM,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,CAAC;QACV,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EACpE,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function bufferToBase64URLString(buffer: Uint8Array): string;
2
+ //# sourceMappingURL=base64url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/base64url.ts"],"names":[],"mappings":"AACA,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAWlE"}
@@ -0,0 +1,13 @@
1
+ export function bufferToBase64URLString(buffer) {
2
+ const bytes = new Uint8Array(buffer);
3
+ let str = "";
4
+ for (const charCode of bytes) {
5
+ str += String.fromCharCode(charCode);
6
+ }
7
+ const base64String = btoa(str);
8
+ return base64String
9
+ .replace(/\+/g, "-")
10
+ .replace(/\//g, "_")
11
+ .replace(/=/g, "");
12
+ }
13
+ //# sourceMappingURL=base64url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/base64url.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,uBAAuB,CAAC,MAAkB;IACxD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,YAAY;SAChB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function encodeCtapCbor(value: unknown): Uint8Array;
2
+ export declare function decodeCbor(buf: Uint8Array): unknown;
3
+ export declare function bytesView(v: unknown): Uint8Array | undefined;
4
+ export declare function cborMapGet(map: Map<number, unknown> | object, key: number): unknown;
5
+ //# sourceMappingURL=cbor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cbor.d.ts","sourceRoot":"","sources":["../../../../src/utils/passkey/nfc/cbor.ts"],"names":[],"mappings":"AAiKA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAIzD;AA0GD,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAGnD;AAMD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAQ5D;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAClC,GAAG,EAAE,MAAM,GACV,OAAO,CAeT"}