ox 0.0.1 → 0.1.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.
- package/Abi/package.json +6 -0
- package/Abi.ts +163 -0
- package/AbiConstructor/package.json +6 -0
- package/AbiConstructor.ts +413 -0
- package/AbiError/package.json +6 -0
- package/AbiError.ts +719 -0
- package/AbiEvent/package.json +6 -0
- package/AbiEvent.ts +1284 -0
- package/AbiFunction/package.json +6 -0
- package/AbiFunction.ts +813 -0
- package/AbiItem/package.json +6 -0
- package/AbiItem.ts +779 -0
- package/AbiParameters/package.json +6 -0
- package/AbiParameters.ts +712 -0
- package/AccessList/package.json +6 -0
- package/AccessList.ts +124 -0
- package/AccountProof/package.json +6 -0
- package/AccountProof.ts +35 -0
- package/Address/package.json +6 -0
- package/Address.ts +359 -0
- package/AesGcm/package.json +6 -0
- package/AesGcm.ts +220 -0
- package/Authorization/package.json +6 -0
- package/Authorization.ts +639 -0
- package/Base58/package.json +6 -0
- package/Base58.ts +180 -0
- package/Base64/package.json +6 -0
- package/Base64.ts +333 -0
- package/Blobs/package.json +6 -0
- package/Blobs.ts +982 -0
- package/Block/package.json +6 -0
- package/Block.ts +317 -0
- package/Bloom/package.json +6 -0
- package/Bloom.ts +80 -0
- package/Bls/package.json +6 -0
- package/Bls.ts +496 -0
- package/BlsPoint/package.json +6 -0
- package/BlsPoint.ts +232 -0
- package/Bytes/package.json +6 -0
- package/Bytes.ts +963 -0
- package/CHANGELOG.md +7 -0
- package/Caches/package.json +6 -0
- package/Caches.ts +21 -0
- package/ContractAddress/package.json +6 -0
- package/ContractAddress.ts +181 -0
- package/Ens/package.json +6 -0
- package/Ens.ts +116 -0
- package/Errors/package.json +6 -0
- package/Errors.ts +95 -0
- package/Fee/package.json +6 -0
- package/Fee.ts +57 -0
- package/Filter/package.json +6 -0
- package/Filter.ts +144 -0
- package/Hash/package.json +6 -0
- package/Hash.ts +210 -0
- package/HdKey/package.json +6 -0
- package/HdKey.ts +175 -0
- package/Hex/package.json +6 -0
- package/Hex.ts +1040 -0
- package/Json/package.json +6 -0
- package/Json.ts +84 -0
- package/Kzg/package.json +6 -0
- package/Kzg.ts +51 -0
- package/LICENSE +21 -0
- package/Log/package.json +6 -0
- package/Log.ts +248 -0
- package/Mnemonic/package.json +6 -0
- package/Mnemonic.ts +249 -0
- package/P256/package.json +6 -0
- package/P256.ts +230 -0
- package/PersonalMessage/package.json +6 -0
- package/PersonalMessage.ts +70 -0
- package/Provider/package.json +6 -0
- package/Provider.ts +354 -0
- package/PublicKey/package.json +6 -0
- package/PublicKey.ts +545 -0
- package/README.md +75 -26
- package/Rlp/package.json +6 -0
- package/Rlp.ts +390 -0
- package/RpcRequest/package.json +6 -0
- package/RpcRequest.ts +192 -0
- package/RpcResponse/package.json +6 -0
- package/RpcResponse.ts +389 -0
- package/RpcSchema/package.json +6 -0
- package/RpcSchema.ts +273 -0
- package/RpcTransport/package.json +6 -0
- package/RpcTransport.ts +198 -0
- package/Secp256k1/package.json +6 -0
- package/Secp256k1.ts +304 -0
- package/Signature/package.json +6 -0
- package/Signature.ts +909 -0
- package/Siwe/package.json +6 -0
- package/Siwe.ts +516 -0
- package/Solidity/package.json +6 -0
- package/Solidity.ts +109 -0
- package/Transaction/package.json +6 -0
- package/Transaction.ts +429 -0
- package/TransactionEnvelope/package.json +6 -0
- package/TransactionEnvelope.ts +205 -0
- package/TransactionEnvelopeEip1559/package.json +6 -0
- package/TransactionEnvelopeEip1559.ts +656 -0
- package/TransactionEnvelopeEip2930/package.json +6 -0
- package/TransactionEnvelopeEip2930.ts +624 -0
- package/TransactionEnvelopeEip4844/package.json +6 -0
- package/TransactionEnvelopeEip4844.ts +764 -0
- package/TransactionEnvelopeEip7702/package.json +6 -0
- package/TransactionEnvelopeEip7702.ts +639 -0
- package/TransactionEnvelopeLegacy/package.json +6 -0
- package/TransactionEnvelopeLegacy.ts +674 -0
- package/TransactionReceipt/package.json +6 -0
- package/TransactionReceipt.ts +341 -0
- package/TransactionRequest/package.json +6 -0
- package/TransactionRequest.ts +151 -0
- package/TypedData/package.json +6 -0
- package/TypedData.ts +931 -0
- package/ValidatorData/package.json +6 -0
- package/ValidatorData.ts +87 -0
- package/Value/package.json +6 -0
- package/Value.ts +242 -0
- package/WebAuthnP256/package.json +6 -0
- package/WebAuthnP256.ts +803 -0
- package/WebCryptoP256/package.json +6 -0
- package/WebCryptoP256.ts +190 -0
- package/Withdrawal/package.json +6 -0
- package/Withdrawal.ts +95 -0
- package/_cjs/Abi.js +17 -0
- package/_cjs/Abi.js.map +1 -0
- package/_cjs/AbiConstructor.js +42 -0
- package/_cjs/AbiConstructor.js.map +1 -0
- package/_cjs/AbiError.js +98 -0
- package/_cjs/AbiError.js.map +1 -0
- package/_cjs/AbiEvent.js +338 -0
- package/_cjs/AbiEvent.js.map +1 -0
- package/_cjs/AbiFunction.js +85 -0
- package/_cjs/AbiFunction.js.map +1 -0
- package/_cjs/AbiItem.js +180 -0
- package/_cjs/AbiItem.js.map +1 -0
- package/_cjs/AbiParameters.js +229 -0
- package/_cjs/AbiParameters.js.map +1 -0
- package/_cjs/AccessList.js +51 -0
- package/_cjs/AccessList.js.map +1 -0
- package/_cjs/AccountProof.js +3 -0
- package/_cjs/AccountProof.js.map +1 -0
- package/_cjs/Address.js +121 -0
- package/_cjs/Address.js.map +1 -0
- package/_cjs/AesGcm.js +55 -0
- package/_cjs/AesGcm.js.map +1 -0
- package/_cjs/Authorization.js +99 -0
- package/_cjs/Authorization.js.map +1 -0
- package/_cjs/Base58.js +52 -0
- package/_cjs/Base58.js.map +1 -0
- package/_cjs/Base64.js +76 -0
- package/_cjs/Base64.js.map +1 -0
- package/_cjs/Blobs.js +255 -0
- package/_cjs/Blobs.js.map +1 -0
- package/_cjs/Block.js +87 -0
- package/_cjs/Block.js.map +1 -0
- package/_cjs/Bloom.js +23 -0
- package/_cjs/Bloom.js.map +1 -0
- package/_cjs/Bls.js +79 -0
- package/_cjs/Bls.js.map +1 -0
- package/_cjs/BlsPoint.js +32 -0
- package/_cjs/BlsPoint.js.map +1 -0
- package/_cjs/Bytes.js +279 -0
- package/_cjs/Bytes.js.map +1 -0
- package/_cjs/Caches.js +14 -0
- package/_cjs/Caches.js.map +1 -0
- package/_cjs/ContractAddress.js +39 -0
- package/_cjs/ContractAddress.js.map +1 -0
- package/_cjs/Ens.js +37 -0
- package/_cjs/Ens.js.map +1 -0
- package/_cjs/Errors.js +99 -0
- package/_cjs/Errors.js.map +1 -0
- package/_cjs/Fee.js +3 -0
- package/_cjs/Fee.js.map +1 -0
- package/_cjs/Filter.js +43 -0
- package/_cjs/Filter.js.map +1 -0
- package/_cjs/Hash.js +40 -0
- package/_cjs/Hash.js.map +1 -0
- package/_cjs/HdKey.js +30 -0
- package/_cjs/HdKey.js.map +1 -0
- package/_cjs/Hex.js +324 -0
- package/_cjs/Hex.js.map +1 -0
- package/_cjs/Json.js +25 -0
- package/_cjs/Json.js.map +1 -0
- package/_cjs/Kzg.js +14 -0
- package/_cjs/Kzg.js.map +1 -0
- package/_cjs/Log.js +35 -0
- package/_cjs/Log.js.map +1 -0
- package/_cjs/Mnemonic.js +56 -0
- package/_cjs/Mnemonic.js.map +1 -0
- package/_cjs/P256.js +52 -0
- package/_cjs/P256.js.map +1 -0
- package/_cjs/PersonalMessage.js +16 -0
- package/_cjs/PersonalMessage.js.map +1 -0
- package/_cjs/Provider.js +90 -0
- package/_cjs/Provider.js.map +1 -0
- package/_cjs/PublicKey.js +192 -0
- package/_cjs/PublicKey.js.map +1 -0
- package/_cjs/Rlp.js +179 -0
- package/_cjs/Rlp.js.map +1 -0
- package/_cjs/RpcRequest.js +27 -0
- package/_cjs/RpcRequest.js.map +1 -0
- package/_cjs/RpcResponse.js +368 -0
- package/_cjs/RpcResponse.js.map +1 -0
- package/_cjs/RpcSchema.js +7 -0
- package/_cjs/RpcSchema.js.map +1 -0
- package/_cjs/RpcTransport.js +95 -0
- package/_cjs/RpcTransport.js.map +1 -0
- package/_cjs/Secp256k1.js +57 -0
- package/_cjs/Secp256k1.js.map +1 -0
- package/_cjs/Signature.js +305 -0
- package/_cjs/Signature.js.map +1 -0
- package/_cjs/Siwe.js +231 -0
- package/_cjs/Siwe.js.map +1 -0
- package/_cjs/Solidity.js +104 -0
- package/_cjs/Solidity.js.map +1 -0
- package/_cjs/Transaction.js +106 -0
- package/_cjs/Transaction.js.map +1 -0
- package/_cjs/TransactionEnvelope.js +80 -0
- package/_cjs/TransactionEnvelope.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip1559.js +182 -0
- package/_cjs/TransactionEnvelopeEip1559.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip2930.js +166 -0
- package/_cjs/TransactionEnvelopeEip2930.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip4844.js +224 -0
- package/_cjs/TransactionEnvelopeEip4844.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip7702.js +156 -0
- package/_cjs/TransactionEnvelopeEip7702.js.map +1 -0
- package/_cjs/TransactionEnvelopeLegacy.js +221 -0
- package/_cjs/TransactionEnvelopeLegacy.js.map +1 -0
- package/_cjs/TransactionReceipt.js +76 -0
- package/_cjs/TransactionReceipt.js.map +1 -0
- package/_cjs/TransactionRequest.js +51 -0
- package/_cjs/TransactionRequest.js.map +1 -0
- package/_cjs/TypedData.js +318 -0
- package/_cjs/TypedData.js.map +1 -0
- package/_cjs/ValidatorData.js +16 -0
- package/_cjs/ValidatorData.js.map +1 -0
- package/_cjs/Value.js +96 -0
- package/_cjs/Value.js.map +1 -0
- package/_cjs/WebAuthnP256.js +245 -0
- package/_cjs/WebAuthnP256.js.map +1 -0
- package/_cjs/WebCryptoP256.js +46 -0
- package/_cjs/WebCryptoP256.js.map +1 -0
- package/_cjs/Withdrawal.js +24 -0
- package/_cjs/Withdrawal.js.map +1 -0
- package/_cjs/index.js +66 -0
- package/_cjs/index.js.map +1 -0
- package/_cjs/internal/abi.js +11 -0
- package/_cjs/internal/abi.js.map +1 -0
- package/_cjs/internal/abiConstructor.js +3 -0
- package/_cjs/internal/abiConstructor.js.map +1 -0
- package/_cjs/internal/abiError.js +3 -0
- package/_cjs/internal/abiError.js.map +1 -0
- package/_cjs/internal/abiEvent.js +3 -0
- package/_cjs/internal/abiEvent.js.map +1 -0
- package/_cjs/internal/abiFunction.js +3 -0
- package/_cjs/internal/abiFunction.js.map +1 -0
- package/_cjs/internal/abiItem.js +110 -0
- package/_cjs/internal/abiItem.js.map +1 -0
- package/_cjs/internal/abiParameters.js +376 -0
- package/_cjs/internal/abiParameters.js.map +1 -0
- package/_cjs/internal/base58.js +89 -0
- package/_cjs/internal/base58.js.map +1 -0
- package/_cjs/internal/bytes.js +88 -0
- package/_cjs/internal/bytes.js.map +1 -0
- package/_cjs/internal/cursor.js +210 -0
- package/_cjs/internal/cursor.js.map +1 -0
- package/_cjs/internal/ens.js +43 -0
- package/_cjs/internal/ens.js.map +1 -0
- package/_cjs/internal/errors.js +28 -0
- package/_cjs/internal/errors.js.map +1 -0
- package/_cjs/internal/hdKey.js +19 -0
- package/_cjs/internal/hdKey.js.map +1 -0
- package/_cjs/internal/hex.js +66 -0
- package/_cjs/internal/hex.js.map +1 -0
- package/_cjs/internal/lru.js +34 -0
- package/_cjs/internal/lru.js.map +1 -0
- package/_cjs/internal/mnemonic/wordlists.js +24 -0
- package/_cjs/internal/mnemonic/wordlists.js.map +1 -0
- package/_cjs/internal/promise.js +49 -0
- package/_cjs/internal/promise.js.map +1 -0
- package/_cjs/internal/register.js +3 -0
- package/_cjs/internal/register.js.map +1 -0
- package/_cjs/internal/rpcSchema.js +3 -0
- package/_cjs/internal/rpcSchema.js.map +1 -0
- package/_cjs/internal/rpcSchemas/eth.js +3 -0
- package/_cjs/internal/rpcSchemas/eth.js.map +1 -0
- package/_cjs/internal/rpcSchemas/wallet.js +3 -0
- package/_cjs/internal/rpcSchemas/wallet.js.map +1 -0
- package/_cjs/internal/rpcTransport.js +19 -0
- package/_cjs/internal/rpcTransport.js.map +1 -0
- package/_cjs/internal/types.js +3 -0
- package/_cjs/internal/types.js.map +1 -0
- package/_cjs/internal/uid.js +17 -0
- package/_cjs/internal/uid.js.map +1 -0
- package/_cjs/internal/webauthn.js +28 -0
- package/_cjs/internal/webauthn.js.map +1 -0
- package/_cjs/package.json +1 -0
- package/_cjs/trusted-setups/Paths.js +6 -0
- package/_cjs/trusted-setups/Paths.js.map +1 -0
- package/_cjs/trusted-setups/index.js +5 -0
- package/_cjs/trusted-setups/index.js.map +1 -0
- package/_cjs/trusted-setups/internal/paths.js +11 -0
- package/_cjs/trusted-setups/internal/paths.js.map +1 -0
- package/_cjs/version.js +5 -0
- package/_cjs/version.js.map +1 -0
- package/_cjs/window/index.js +3 -0
- package/_cjs/window/index.js.map +1 -0
- package/_esm/Abi.js +19 -0
- package/_esm/Abi.js.map +1 -0
- package/_esm/AbiConstructor.js +102 -0
- package/_esm/AbiConstructor.js.map +1 -0
- package/_esm/AbiError.js +364 -0
- package/_esm/AbiError.js.map +1 -0
- package/_esm/AbiEvent.js +1038 -0
- package/_esm/AbiEvent.js.map +1 -0
- package/_esm/AbiFunction.js +549 -0
- package/_esm/AbiFunction.js.map +1 -0
- package/_esm/AbiItem.js +574 -0
- package/_esm/AbiItem.js.map +1 -0
- package/_esm/AbiParameters.js +543 -0
- package/_esm/AbiParameters.js.map +1 -0
- package/_esm/AccessList.js +105 -0
- package/_esm/AccessList.js.map +1 -0
- package/_esm/AccountProof.js +2 -0
- package/_esm/AccountProof.js.map +1 -0
- package/_esm/Address.js +268 -0
- package/_esm/Address.js.map +1 -0
- package/_esm/AesGcm.js +124 -0
- package/_esm/AesGcm.js.map +1 -0
- package/_esm/Authorization.js +441 -0
- package/_esm/Authorization.js.map +1 -0
- package/_esm/Base58.js +142 -0
- package/_esm/Base58.js.map +1 -0
- package/_esm/Base64.js +236 -0
- package/_esm/Base64.js.map +1 -0
- package/_esm/Blobs.js +624 -0
- package/_esm/Blobs.js.map +1 -0
- package/_esm/Block.js +177 -0
- package/_esm/Block.js.map +1 -0
- package/_esm/Bloom.js +57 -0
- package/_esm/Bloom.js.map +1 -0
- package/_esm/Bls.js +141 -0
- package/_esm/Bls.js.map +1 -0
- package/_esm/BlsPoint.js +59 -0
- package/_esm/BlsPoint.js.map +1 -0
- package/_esm/Bytes.js +719 -0
- package/_esm/Bytes.js.map +1 -0
- package/_esm/Caches.js +19 -0
- package/_esm/Caches.js.map +1 -0
- package/_esm/ContractAddress.js +110 -0
- package/_esm/ContractAddress.js.map +1 -0
- package/_esm/Ens.js +84 -0
- package/_esm/Ens.js.map +1 -0
- package/_esm/Errors.js +105 -0
- package/_esm/Errors.js.map +1 -0
- package/_esm/Fee.js +2 -0
- package/_esm/Fee.js.map +1 -0
- package/_esm/Filter.js +100 -0
- package/_esm/Filter.js.map +1 -0
- package/_esm/Hash.js +126 -0
- package/_esm/Hash.js.map +1 -0
- package/_esm/HdKey.js +107 -0
- package/_esm/HdKey.js.map +1 -0
- package/_esm/Hex.js +763 -0
- package/_esm/Hex.js.map +1 -0
- package/_esm/Json.js +62 -0
- package/_esm/Json.js.map +1 -0
- package/_esm/Kzg.js +30 -0
- package/_esm/Kzg.js.map +1 -0
- package/_esm/Log.js +181 -0
- package/_esm/Log.js.map +1 -0
- package/_esm/Mnemonic.js +154 -0
- package/_esm/Mnemonic.js.map +1 -0
- package/_esm/P256.js +131 -0
- package/_esm/P256.js.map +1 -0
- package/_esm/PersonalMessage.js +46 -0
- package/_esm/PersonalMessage.js.map +1 -0
- package/_esm/Provider.js +122 -0
- package/_esm/Provider.js.map +1 -0
- package/_esm/PublicKey.js +395 -0
- package/_esm/PublicKey.js.map +1 -0
- package/_esm/Rlp.js +267 -0
- package/_esm/Rlp.js.map +1 -0
- package/_esm/RpcRequest.js +131 -0
- package/_esm/RpcRequest.js.map +1 -0
- package/_esm/RpcResponse.js +457 -0
- package/_esm/RpcResponse.js.map +1 -0
- package/_esm/RpcSchema.js +46 -0
- package/_esm/RpcSchema.js.map +1 -0
- package/_esm/RpcTransport.js +110 -0
- package/_esm/RpcTransport.js.map +1 -0
- package/_esm/Secp256k1.js +173 -0
- package/_esm/Secp256k1.js.map +1 -0
- package/_esm/Signature.js +696 -0
- package/_esm/Signature.js.map +1 -0
- package/_esm/Siwe.js +374 -0
- package/_esm/Siwe.js.map +1 -0
- package/_esm/Solidity.js +104 -0
- package/_esm/Solidity.js.map +1 -0
- package/_esm/Transaction.js +176 -0
- package/_esm/Transaction.js.map +1 -0
- package/_esm/TransactionEnvelope.js +139 -0
- package/_esm/TransactionEnvelope.js.map +1 -0
- package/_esm/TransactionEnvelopeEip1559.js +455 -0
- package/_esm/TransactionEnvelopeEip1559.js.map +1 -0
- package/_esm/TransactionEnvelopeEip2930.js +439 -0
- package/_esm/TransactionEnvelopeEip2930.js.map +1 -0
- package/_esm/TransactionEnvelopeEip4844.js +542 -0
- package/_esm/TransactionEnvelopeEip4844.js.map +1 -0
- package/_esm/TransactionEnvelopeEip7702.js +442 -0
- package/_esm/TransactionEnvelopeEip7702.js.map +1 -0
- package/_esm/TransactionEnvelopeLegacy.js +495 -0
- package/_esm/TransactionEnvelopeLegacy.js.map +1 -0
- package/_esm/TransactionReceipt.js +229 -0
- package/_esm/TransactionReceipt.js.map +1 -0
- package/_esm/TransactionRequest.js +89 -0
- package/_esm/TransactionRequest.js.map +1 -0
- package/_esm/TypedData.js +635 -0
- package/_esm/TypedData.js.map +1 -0
- package/_esm/ValidatorData.js +52 -0
- package/_esm/ValidatorData.js.map +1 -0
- package/_esm/Value.js +196 -0
- package/_esm/Value.js.map +1 -0
- package/_esm/WebAuthnP256.js +471 -0
- package/_esm/WebAuthnP256.js.map +1 -0
- package/_esm/WebCryptoP256.js +116 -0
- package/_esm/WebCryptoP256.js.map +1 -0
- package/_esm/Withdrawal.js +72 -0
- package/_esm/Withdrawal.js.map +1 -0
- package/_esm/index.js +3366 -0
- package/_esm/index.js.map +1 -0
- package/_esm/internal/abi.js +9 -0
- package/_esm/internal/abi.js.map +1 -0
- package/_esm/internal/abiConstructor.js +2 -0
- package/_esm/internal/abiConstructor.js.map +1 -0
- package/_esm/internal/abiError.js +2 -0
- package/_esm/internal/abiError.js.map +1 -0
- package/_esm/internal/abiEvent.js +2 -0
- package/_esm/internal/abiEvent.js.map +1 -0
- package/_esm/internal/abiFunction.js +2 -0
- package/_esm/internal/abiFunction.js.map +1 -0
- package/_esm/internal/abiItem.js +122 -0
- package/_esm/internal/abiItem.js.map +1 -0
- package/_esm/internal/abiParameters.js +419 -0
- package/_esm/internal/abiParameters.js.map +1 -0
- package/_esm/internal/base58.js +91 -0
- package/_esm/internal/base58.js.map +1 -0
- package/_esm/internal/bytes.js +86 -0
- package/_esm/internal/bytes.js.map +1 -0
- package/_esm/internal/cursor.js +207 -0
- package/_esm/internal/cursor.js.map +1 -0
- package/_esm/internal/ens.js +47 -0
- package/_esm/internal/ens.js.map +1 -0
- package/_esm/internal/errors.js +26 -0
- package/_esm/internal/errors.js.map +1 -0
- package/_esm/internal/hdKey.js +17 -0
- package/_esm/internal/hdKey.js.map +1 -0
- package/_esm/internal/hex.js +64 -0
- package/_esm/internal/hex.js.map +1 -0
- package/_esm/internal/lru.js +36 -0
- package/_esm/internal/lru.js.map +1 -0
- package/_esm/internal/mnemonic/wordlists.js +11 -0
- package/_esm/internal/mnemonic/wordlists.js.map +1 -0
- package/_esm/internal/promise.js +52 -0
- package/_esm/internal/promise.js.map +1 -0
- package/_esm/internal/register.js +2 -0
- package/_esm/internal/register.js.map +1 -0
- package/_esm/internal/rpcSchema.js +2 -0
- package/_esm/internal/rpcSchema.js.map +1 -0
- package/_esm/internal/rpcSchemas/eth.js +2 -0
- package/_esm/internal/rpcSchemas/eth.js.map +1 -0
- package/_esm/internal/rpcSchemas/wallet.js +2 -0
- package/_esm/internal/rpcSchemas/wallet.js.map +1 -0
- package/_esm/internal/rpcTransport.js +20 -0
- package/_esm/internal/rpcTransport.js.map +1 -0
- package/_esm/internal/types.js +2 -0
- package/_esm/internal/types.js.map +1 -0
- package/_esm/internal/uid.js +15 -0
- package/_esm/internal/uid.js.map +1 -0
- package/_esm/internal/webauthn.js +35 -0
- package/_esm/internal/webauthn.js.map +1 -0
- package/_esm/package.json +1 -0
- package/_esm/trusted-setups/Paths.js +3 -0
- package/_esm/trusted-setups/Paths.js.map +1 -0
- package/_esm/trusted-setups/index.js +2 -0
- package/_esm/trusted-setups/index.js.map +1 -0
- package/_esm/trusted-setups/internal/paths.js +12 -0
- package/_esm/trusted-setups/internal/paths.js.map +1 -0
- package/_esm/version.js +3 -0
- package/_esm/version.js.map +1 -0
- package/_esm/window/index.js +2 -0
- package/_esm/window/index.js.map +1 -0
- package/_test/Abi.test-d/package.json +6 -0
- package/_test/AbiConstructor.test-d/package.json +6 -0
- package/_test/AbiError.test-d/package.json +6 -0
- package/_test/AbiEvent.snap-d/package.json +6 -0
- package/_test/AbiEvent.snap-d.ts +329 -0
- package/_test/AbiFunction.snap-d/package.json +6 -0
- package/_test/AbiFunction.snap-d.ts +262 -0
- package/_test/AbiItem.snap-d/package.json +6 -0
- package/_test/AbiItem.snap-d.ts +131 -0
- package/_test/AbiParameters.bench/package.json +6 -0
- package/_test/AbiParameters.snap-d/package.json +6 -0
- package/_test/AbiParameters.snap-d.ts +66 -0
- package/_test/Address.bench/package.json +6 -0
- package/_test/Base58.bench/package.json +6 -0
- package/_test/Hex.bench/package.json +6 -0
- package/_test/Hex.test-d/package.json +6 -0
- package/_test/PublicKey.test-d/package.json +6 -0
- package/_test/Rlp.bench/package.json +6 -0
- package/_test/Rlp.test-d/package.json +6 -0
- package/_test/Signature.snap-d/package.json +6 -0
- package/_test/Signature.snap-d.ts +96 -0
- package/_test/TransactionEnvelopeEip1559.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeEip2930.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeEip4844.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeEip7702.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeLegacy.test-d/package.json +6 -0
- package/_test/TypedData.test-d/package.json +6 -0
- package/_types/Abi.d.ts +137 -0
- package/_types/Abi.d.ts.map +1 -0
- package/_types/AbiConstructor.d.ts +305 -0
- package/_types/AbiConstructor.d.ts.map +1 -0
- package/_types/AbiError.d.ts +522 -0
- package/_types/AbiError.d.ts.map +1 -0
- package/_types/AbiEvent.d.ts +892 -0
- package/_types/AbiEvent.d.ts.map +1 -0
- package/_types/AbiFunction.d.ts +602 -0
- package/_types/AbiFunction.d.ts.map +1 -0
- package/_types/AbiItem.d.ts +544 -0
- package/_types/AbiItem.d.ts.map +1 -0
- package/_types/AbiParameters.d.ts +466 -0
- package/_types/AbiParameters.d.ts.map +1 -0
- package/_types/AccessList.d.ts +83 -0
- package/_types/AccessList.d.ts.map +1 -0
- package/_types/AccountProof.d.ts +32 -0
- package/_types/AccountProof.d.ts.map +1 -0
- package/_types/Address.d.ts +244 -0
- package/_types/Address.d.ts.map +1 -0
- package/_types/AesGcm.d.ts +116 -0
- package/_types/AesGcm.d.ts.map +1 -0
- package/_types/Authorization.d.ts +461 -0
- package/_types/Authorization.d.ts.map +1 -0
- package/_types/Base58.d.ts +131 -0
- package/_types/Base58.d.ts.map +1 -0
- package/_types/Base64.d.ts +244 -0
- package/_types/Base64.d.ts.map +1 -0
- package/_types/Blobs.d.ts +556 -0
- package/_types/Blobs.d.ts.map +1 -0
- package/_types/Block.d.ts +190 -0
- package/_types/Block.d.ts.map +1 -0
- package/_types/Bloom.d.ts +54 -0
- package/_types/Bloom.d.ts.map +1 -0
- package/_types/Bls.d.ts +365 -0
- package/_types/Bls.d.ts.map +1 -0
- package/_types/BlsPoint.d.ts +187 -0
- package/_types/BlsPoint.d.ts.map +1 -0
- package/_types/Bytes.d.ts +674 -0
- package/_types/Bytes.d.ts.map +1 -0
- package/_types/Caches.d.ts +13 -0
- package/_types/Caches.d.ts.map +1 -0
- package/_types/ContractAddress.d.ts +115 -0
- package/_types/ContractAddress.d.ts.map +1 -0
- package/_types/Ens.d.ts +72 -0
- package/_types/Ens.d.ts.map +1 -0
- package/_types/Errors.d.ts +33 -0
- package/_types/Errors.d.ts.map +1 -0
- package/_types/Fee.d.ts +41 -0
- package/_types/Fee.d.ts.map +1 -0
- package/_types/Filter.d.ts +100 -0
- package/_types/Filter.d.ts.map +1 -0
- package/_types/Hash.d.ts +135 -0
- package/_types/Hash.d.ts.map +1 -0
- package/_types/HdKey.d.ts +146 -0
- package/_types/HdKey.d.ts.map +1 -0
- package/_types/Hex.d.ts +711 -0
- package/_types/Hex.d.ts.map +1 -0
- package/_types/Json.d.ts +53 -0
- package/_types/Json.d.ts.map +1 -0
- package/_types/Kzg.d.ts +42 -0
- package/_types/Kzg.d.ts.map +1 -0
- package/_types/Log.d.ts +194 -0
- package/_types/Log.d.ts.map +1 -0
- package/_types/Mnemonic.d.ts +176 -0
- package/_types/Mnemonic.d.ts.map +1 -0
- package/_types/P256.d.ts +207 -0
- package/_types/P256.d.ts.map +1 -0
- package/_types/PersonalMessage.d.ts +49 -0
- package/_types/PersonalMessage.d.ts.map +1 -0
- package/_types/Provider.d.ts +268 -0
- package/_types/Provider.d.ts.map +1 -0
- package/_types/PublicKey.d.ts +327 -0
- package/_types/PublicKey.d.ts.map +1 -0
- package/_types/Rlp.d.ts +153 -0
- package/_types/Rlp.d.ts.map +1 -0
- package/_types/RpcRequest.d.ts +144 -0
- package/_types/RpcRequest.d.ts.map +1 -0
- package/_types/RpcResponse.d.ts +266 -0
- package/_types/RpcResponse.d.ts.map +1 -0
- package/_types/RpcSchema.d.ts +248 -0
- package/_types/RpcSchema.d.ts.map +1 -0
- package/_types/RpcTransport.d.ts +65 -0
- package/_types/RpcTransport.d.ts.map +1 -0
- package/_types/Secp256k1.d.ts +277 -0
- package/_types/Secp256k1.d.ts.map +1 -0
- package/_types/Signature.d.ts +601 -0
- package/_types/Signature.d.ts.map +1 -0
- package/_types/Siwe.d.ts +249 -0
- package/_types/Siwe.d.ts.map +1 -0
- package/_types/Solidity.d.ts +100 -0
- package/_types/Solidity.d.ts.map +1 -0
- package/_types/Transaction.d.ts +235 -0
- package/_types/Transaction.d.ts.map +1 -0
- package/_types/TransactionEnvelope.d.ts +141 -0
- package/_types/TransactionEnvelope.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip1559.d.ts +367 -0
- package/_types/TransactionEnvelopeEip1559.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip2930.d.ts +364 -0
- package/_types/TransactionEnvelopeEip2930.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip4844.d.ts +419 -0
- package/_types/TransactionEnvelopeEip4844.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip7702.d.ts +377 -0
- package/_types/TransactionEnvelopeEip7702.d.ts.map +1 -0
- package/_types/TransactionEnvelopeLegacy.d.ts +358 -0
- package/_types/TransactionEnvelopeLegacy.d.ts.map +1 -0
- package/_types/TransactionReceipt.d.ts +271 -0
- package/_types/TransactionReceipt.d.ts.map +1 -0
- package/_types/TransactionRequest.d.ts +92 -0
- package/_types/TransactionRequest.d.ts.map +1 -0
- package/_types/TypedData.d.ts +496 -0
- package/_types/TypedData.d.ts.map +1 -0
- package/_types/ValidatorData.d.ts +64 -0
- package/_types/ValidatorData.d.ts.map +1 -0
- package/_types/Value.d.ts +159 -0
- package/_types/Value.d.ts.map +1 -0
- package/_types/WebAuthnP256.d.ts +445 -0
- package/_types/WebAuthnP256.d.ts.map +1 -0
- package/_types/WebCryptoP256.d.ts +119 -0
- package/_types/WebCryptoP256.d.ts.map +1 -0
- package/_types/Withdrawal.d.ts +74 -0
- package/_types/Withdrawal.d.ts.map +1 -0
- package/_types/index.d.ts +3367 -0
- package/_types/index.d.ts.map +1 -0
- package/_types/internal/abi.d.ts +4 -0
- package/_types/internal/abi.d.ts.map +1 -0
- package/_types/internal/abiConstructor.d.ts +11 -0
- package/_types/internal/abiConstructor.d.ts.map +1 -0
- package/_types/internal/abiError.d.ts +11 -0
- package/_types/internal/abiError.d.ts.map +1 -0
- package/_types/internal/abiEvent.d.ts +60 -0
- package/_types/internal/abiEvent.d.ts.map +1 -0
- package/_types/internal/abiFunction.d.ts +11 -0
- package/_types/internal/abiFunction.d.ts.map +1 -0
- package/_types/internal/abiItem.d.ts +100 -0
- package/_types/internal/abiItem.d.ts.map +1 -0
- package/_types/internal/abiParameters.d.ts +169 -0
- package/_types/internal/abiParameters.d.ts.map +1 -0
- package/_types/internal/base58.d.ts +17 -0
- package/_types/internal/base58.d.ts.map +1 -0
- package/_types/internal/bytes.d.ts +52 -0
- package/_types/internal/bytes.d.ts.map +1 -0
- package/_types/internal/cursor.d.ts +70 -0
- package/_types/internal/cursor.d.ts.map +1 -0
- package/_types/internal/ens.d.ts +23 -0
- package/_types/internal/ens.d.ts.map +1 -0
- package/_types/internal/errors.d.ts +7 -0
- package/_types/internal/errors.d.ts.map +1 -0
- package/_types/internal/hdKey.d.ts +10 -0
- package/_types/internal/hdKey.d.ts.map +1 -0
- package/_types/internal/hex.d.ts +39 -0
- package/_types/internal/hex.d.ts.map +1 -0
- package/_types/internal/lru.d.ts +13 -0
- package/_types/internal/lru.d.ts.map +1 -0
- package/_types/internal/mnemonic/wordlists.d.ts +11 -0
- package/_types/internal/mnemonic/wordlists.d.ts.map +1 -0
- package/_types/internal/promise.d.ts +27 -0
- package/_types/internal/promise.d.ts.map +1 -0
- package/_types/internal/register.d.ts +13 -0
- package/_types/internal/register.d.ts.map +1 -0
- package/_types/internal/rpcSchema.d.ts +12 -0
- package/_types/internal/rpcSchema.d.ts.map +1 -0
- package/_types/internal/rpcSchemas/eth.d.ts +718 -0
- package/_types/internal/rpcSchemas/eth.d.ts.map +1 -0
- package/_types/internal/rpcSchemas/wallet.d.ts +416 -0
- package/_types/internal/rpcSchemas/wallet.d.ts.map +1 -0
- package/_types/internal/rpcTransport.d.ts +38 -0
- package/_types/internal/rpcTransport.d.ts.map +1 -0
- package/_types/internal/types.d.ts +284 -0
- package/_types/internal/types.d.ts.map +1 -0
- package/_types/internal/uid.d.ts +3 -0
- package/_types/internal/uid.d.ts.map +1 -0
- package/_types/internal/webauthn.d.ts +127 -0
- package/_types/internal/webauthn.d.ts.map +1 -0
- package/_types/trusted-setups/Paths.d.ts +2 -0
- package/_types/trusted-setups/Paths.d.ts.map +1 -0
- package/_types/trusted-setups/index.d.ts +2 -0
- package/_types/trusted-setups/index.d.ts.map +1 -0
- package/_types/trusted-setups/internal/paths.d.ts +3 -0
- package/_types/trusted-setups/internal/paths.d.ts.map +1 -0
- package/_types/version.d.ts +3 -0
- package/_types/version.d.ts.map +1 -0
- package/_types/window/index.d.ts +7 -0
- package/_types/window/index.d.ts.map +1 -0
- package/index.ts +3427 -0
- package/internal/abi.ts +11 -0
- package/internal/abiConstructor.ts +32 -0
- package/internal/abiError.ts +30 -0
- package/internal/abiEvent.ts +154 -0
- package/internal/abiFunction.ts +32 -0
- package/internal/abiItem.ts +593 -0
- package/internal/abiParameters.ts +741 -0
- package/internal/base58.ts +106 -0
- package/internal/bytes.ts +152 -0
- package/internal/cursor.ts +252 -0
- package/internal/ens.ts +64 -0
- package/internal/errors.ts +26 -0
- package/internal/hdKey.ts +25 -0
- package/internal/hex.ts +123 -0
- package/internal/lru.ts +34 -0
- package/internal/mnemonic/wordlists.ts +10 -0
- package/internal/promise.ts +66 -0
- package/internal/register.ts +15 -0
- package/internal/rpcSchema.ts +20 -0
- package/internal/rpcSchemas/eth.ts +727 -0
- package/internal/rpcSchemas/wallet.ts +428 -0
- package/internal/rpcTransport.ts +74 -0
- package/internal/types.ts +414 -0
- package/internal/uid.ts +15 -0
- package/internal/webauthn.ts +198 -0
- package/package.json +500 -20
- package/trusted-setups/Paths/package.json +6 -0
- package/trusted-setups/Paths.ts +3 -0
- package/trusted-setups/index.ts +1 -0
- package/trusted-setups/internal/paths.ts +13 -0
- package/trusted-setups/internal/setups/mainnet.json +8265 -0
- package/trusted-setups/internal/setups/mainnet.txt +4163 -0
- package/trusted-setups/package.json +6 -0
- package/tsdoc.json +4 -0
- package/version/package.json +6 -0
- package/version.ts +2 -0
- package/window/index.ts +7 -0
- package/window/package.json +6 -0
- package/cl/ansiesc.js +0 -25
- package/cl/deps.js +0 -7
- package/cl/editor.js +0 -141
- package/cl/index.html +0 -19
- package/cl/ox.js +0 -44
- package/cl/socket.io.js +0 -1922
- package/cl/style.css +0 -37
- package/srv/deps.js +0 -88
- package/srv/httpSrv.js +0 -82
- package/srv/ox.js +0 -44
- package/srv/remoteXtermReq.js +0 -70
package/WebAuthnP256.ts
ADDED
|
@@ -0,0 +1,803 @@
|
|
|
1
|
+
import * as Base64 from './Base64.js'
|
|
2
|
+
import * as Bytes from './Bytes.js'
|
|
3
|
+
import * as Errors from './Errors.js'
|
|
4
|
+
import * as Hash from './Hash.js'
|
|
5
|
+
import * as Hex from './Hex.js'
|
|
6
|
+
import * as P256 from './P256.js'
|
|
7
|
+
import type * as PublicKey from './PublicKey.js'
|
|
8
|
+
import type * as Signature from './Signature.js'
|
|
9
|
+
import type { Compute, OneOf } from './internal/types.js'
|
|
10
|
+
import * as internal from './internal/webauthn.js'
|
|
11
|
+
|
|
12
|
+
/** A WebAuthn-flavored P256 credential. */
|
|
13
|
+
export type P256Credential = {
|
|
14
|
+
id: string
|
|
15
|
+
publicKey: PublicKey.PublicKey
|
|
16
|
+
raw: internal.PublicKeyCredential
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Metadata for a WebAuthn P256 signature. */
|
|
20
|
+
export type SignMetadata = Compute<{
|
|
21
|
+
authenticatorData: Hex.Hex
|
|
22
|
+
challengeIndex: number
|
|
23
|
+
clientDataJSON: string
|
|
24
|
+
typeIndex: number
|
|
25
|
+
userVerificationRequired: boolean
|
|
26
|
+
}>
|
|
27
|
+
|
|
28
|
+
export const createChallenge = Uint8Array.from([
|
|
29
|
+
105, 171, 180, 181, 160, 222, 75, 198, 42, 42, 32, 31, 141, 37, 186, 233,
|
|
30
|
+
])
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new WebAuthn P256 Credential, which can be stored and later used for signing.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts twoslash
|
|
37
|
+
* import { WebAuthnP256 } from 'ox'
|
|
38
|
+
*
|
|
39
|
+
* const credential = await WebAuthnP256.createCredential({ name: 'Example' }) // [!code focus]
|
|
40
|
+
* // @log: {
|
|
41
|
+
* // @log: id: 'oZ48...',
|
|
42
|
+
* // @log: publicKey: { x: 51421...5123n, y: 12345...6789n },
|
|
43
|
+
* // @log: raw: PublicKeyCredential {},
|
|
44
|
+
* // @log: }
|
|
45
|
+
*
|
|
46
|
+
* const { metadata, signature } = await WebAuthnP256.sign({
|
|
47
|
+
* credentialId: credential.id,
|
|
48
|
+
* challenge: '0xdeadbeef',
|
|
49
|
+
* })
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @param options - Credential creation options.
|
|
53
|
+
* @returns A WebAuthn P256 credential.
|
|
54
|
+
*/
|
|
55
|
+
export async function createCredential(
|
|
56
|
+
options: createCredential.Options,
|
|
57
|
+
): Promise<P256Credential> {
|
|
58
|
+
const {
|
|
59
|
+
createFn = window.navigator.credentials.create.bind(
|
|
60
|
+
window.navigator.credentials,
|
|
61
|
+
),
|
|
62
|
+
...rest
|
|
63
|
+
} = options
|
|
64
|
+
const creationOptions = getCredentialCreationOptions(rest)
|
|
65
|
+
try {
|
|
66
|
+
const credential = (await createFn(
|
|
67
|
+
creationOptions,
|
|
68
|
+
)) as internal.PublicKeyCredential
|
|
69
|
+
if (!credential) throw new CredentialCreationFailedError()
|
|
70
|
+
const publicKey = await internal.parseCredentialPublicKey(
|
|
71
|
+
new Uint8Array((credential.response as any).getPublicKey()),
|
|
72
|
+
)
|
|
73
|
+
return {
|
|
74
|
+
id: credential.id,
|
|
75
|
+
publicKey,
|
|
76
|
+
raw: credential,
|
|
77
|
+
}
|
|
78
|
+
} catch (error) {
|
|
79
|
+
throw new CredentialCreationFailedError({
|
|
80
|
+
cause: error as Error,
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export declare namespace createCredential {
|
|
86
|
+
type Options = getCredentialCreationOptions.Options & {
|
|
87
|
+
/**
|
|
88
|
+
* Credential creation function. Useful for environments that do not support
|
|
89
|
+
* the WebAuthn API natively (i.e. React Native or testing environments).
|
|
90
|
+
*
|
|
91
|
+
* @default window.navigator.credentials.create
|
|
92
|
+
*/
|
|
93
|
+
createFn?:
|
|
94
|
+
| ((
|
|
95
|
+
options?: internal.CredentialCreationOptions | undefined,
|
|
96
|
+
) => Promise<internal.Credential | null>)
|
|
97
|
+
| undefined
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
type ErrorType =
|
|
101
|
+
| getCredentialCreationOptions.ErrorType
|
|
102
|
+
| Errors.GlobalErrorType
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
createCredential.parseError = (error: unknown) =>
|
|
106
|
+
/* v8 ignore next */
|
|
107
|
+
error as createCredential.ErrorType
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Gets the authenticator data which contains information about the
|
|
111
|
+
* processing of an authenticator request (ie. from `WebAuthnP256.sign`).
|
|
112
|
+
*
|
|
113
|
+
* :::warning
|
|
114
|
+
*
|
|
115
|
+
* This function is mainly for testing purposes or for manually constructing
|
|
116
|
+
* autenticator data. In most cases you will not need this function.
|
|
117
|
+
* `authenticatorData` is typically returned as part of the
|
|
118
|
+
* {@link ox#WebAuthnP256.(sign:function)} response (ie. an authenticator response).
|
|
119
|
+
*
|
|
120
|
+
* :::
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts twoslash
|
|
124
|
+
* import { WebAuthnP256 } from 'ox'
|
|
125
|
+
*
|
|
126
|
+
* const authenticatorData = WebAuthnP256.getAuthenticatorData({
|
|
127
|
+
* rpId: 'example.com',
|
|
128
|
+
* signCount: 420,
|
|
129
|
+
* })
|
|
130
|
+
* // @log: "0xa379a6f6eeafb9a55e378c118034e2751e682fab9f2d30ab13d2125586ce194705000001a4"
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @param options - Options to construct the authenticator data.
|
|
134
|
+
* @returns The authenticator data.
|
|
135
|
+
*/
|
|
136
|
+
export function getAuthenticatorData(
|
|
137
|
+
options: getAuthenticatorData.Options = {},
|
|
138
|
+
): Hex.Hex {
|
|
139
|
+
const { flag = 5, rpId = window.location.hostname, signCount = 0 } = options
|
|
140
|
+
const rpIdHash = Hash.sha256(Hex.fromString(rpId))
|
|
141
|
+
const flag_bytes = Hex.fromNumber(flag, { size: 1 })
|
|
142
|
+
const signCount_bytes = Hex.fromNumber(signCount, { size: 4 })
|
|
143
|
+
return Hex.concat(rpIdHash, flag_bytes, signCount_bytes)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export declare namespace getAuthenticatorData {
|
|
147
|
+
type Options = {
|
|
148
|
+
/** A bitfield that indicates various attributes that were asserted by the authenticator. [Read more](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Authenticator_data#flags) */
|
|
149
|
+
flag?: number | undefined
|
|
150
|
+
/** The [Relying Party ID](https://w3c.github.io/webauthn/#relying-party-identifier) that the credential is scoped to. */
|
|
151
|
+
rpId?: internal.PublicKeyCredentialRequestOptions['rpId'] | undefined
|
|
152
|
+
/** A signature counter, if supported by the authenticator (set to 0 otherwise). */
|
|
153
|
+
signCount?: number | undefined
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
type ErrorType = Errors.GlobalErrorType
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
getAuthenticatorData.parseError = (error: unknown) =>
|
|
160
|
+
/* v8 ignore next */
|
|
161
|
+
error as getAuthenticatorData.ErrorType
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Constructs the Client Data in stringified JSON format which represents client data that
|
|
165
|
+
* was passed to `credentials.get()` in {@link ox#WebAuthnP256.(sign:function)}.
|
|
166
|
+
*
|
|
167
|
+
* :::warning
|
|
168
|
+
*
|
|
169
|
+
* This function is mainly for testing purposes or for manually constructing
|
|
170
|
+
* client data. In most cases you will not need this function.
|
|
171
|
+
* `clientDataJSON` is typically returned as part of the
|
|
172
|
+
* {@link ox#WebAuthnP256.(sign:function)} response (ie. an authenticator response).
|
|
173
|
+
*
|
|
174
|
+
* :::
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```ts twoslash
|
|
178
|
+
* import { WebAuthnP256 } from 'ox'
|
|
179
|
+
*
|
|
180
|
+
* const clientDataJSON = WebAuthnP256.getClientDataJSON({
|
|
181
|
+
* challenge: '0xdeadbeef',
|
|
182
|
+
* origin: 'https://example.com',
|
|
183
|
+
* })
|
|
184
|
+
* // @log: "{"type":"webauthn.get","challenge":"3q2-7w","origin":"https://example.com","crossOrigin":false}"
|
|
185
|
+
* ```
|
|
186
|
+
*
|
|
187
|
+
* @param options - Options to construct the client data.
|
|
188
|
+
* @returns The client data.
|
|
189
|
+
*/
|
|
190
|
+
export function getClientDataJSON(options: getClientDataJSON.Options): string {
|
|
191
|
+
const {
|
|
192
|
+
challenge,
|
|
193
|
+
crossOrigin = false,
|
|
194
|
+
extraClientData,
|
|
195
|
+
origin = window.location.origin,
|
|
196
|
+
} = options
|
|
197
|
+
|
|
198
|
+
return JSON.stringify({
|
|
199
|
+
type: 'webauthn.get',
|
|
200
|
+
challenge: Base64.fromHex(challenge, { url: true, pad: false }),
|
|
201
|
+
origin,
|
|
202
|
+
crossOrigin,
|
|
203
|
+
...extraClientData,
|
|
204
|
+
})
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export declare namespace getClientDataJSON {
|
|
208
|
+
type Options = {
|
|
209
|
+
/** The challenge to sign. */
|
|
210
|
+
challenge: Hex.Hex
|
|
211
|
+
/** If set to `true`, it means that the calling context is an `<iframe>` that is not same origin with its ancestor frames. */
|
|
212
|
+
crossOrigin?: boolean | undefined
|
|
213
|
+
/** Additional client data to include in the client data JSON. */
|
|
214
|
+
extraClientData?: Record<string, unknown> | undefined
|
|
215
|
+
/** The fully qualified origin of the relying party which has been given by the client/browser to the authenticator. */
|
|
216
|
+
origin?: string | undefined
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
type ErrorType = Errors.GlobalErrorType
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
getClientDataJSON.parseError = (error: unknown) =>
|
|
223
|
+
/* v8 ignore next */
|
|
224
|
+
error as getClientDataJSON.ErrorType
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Returns the creation options for a P256 WebAuthn Credential to be used with
|
|
228
|
+
* the Web Authentication API.
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```ts twoslash
|
|
232
|
+
* import { WebAuthnP256 } from 'ox'
|
|
233
|
+
*
|
|
234
|
+
* const options = WebAuthnP256.getCredentialCreationOptions({ name: 'Example' })
|
|
235
|
+
*
|
|
236
|
+
* const credential = await window.navigator.credentials.create(options)
|
|
237
|
+
* ```
|
|
238
|
+
*
|
|
239
|
+
* @param options - Options.
|
|
240
|
+
* @returns The credential creation options.
|
|
241
|
+
*/
|
|
242
|
+
export function getCredentialCreationOptions(
|
|
243
|
+
options: getCredentialCreationOptions.Options,
|
|
244
|
+
): internal.CredentialCreationOptions {
|
|
245
|
+
const {
|
|
246
|
+
attestation = 'none',
|
|
247
|
+
authenticatorSelection = {
|
|
248
|
+
residentKey: 'preferred',
|
|
249
|
+
requireResidentKey: false,
|
|
250
|
+
userVerification: 'required',
|
|
251
|
+
},
|
|
252
|
+
challenge = createChallenge,
|
|
253
|
+
excludeCredentialIds,
|
|
254
|
+
name: name_,
|
|
255
|
+
rp = {
|
|
256
|
+
id: window.location.hostname,
|
|
257
|
+
name: window.document.title,
|
|
258
|
+
},
|
|
259
|
+
user,
|
|
260
|
+
extensions,
|
|
261
|
+
} = options
|
|
262
|
+
const name = (user?.name ?? name_)!
|
|
263
|
+
return {
|
|
264
|
+
publicKey: {
|
|
265
|
+
attestation,
|
|
266
|
+
authenticatorSelection,
|
|
267
|
+
challenge,
|
|
268
|
+
...(excludeCredentialIds
|
|
269
|
+
? {
|
|
270
|
+
excludeCredentials: excludeCredentialIds?.map((id) => ({
|
|
271
|
+
id: Base64.toBytes(id),
|
|
272
|
+
type: 'public-key',
|
|
273
|
+
})),
|
|
274
|
+
}
|
|
275
|
+
: {}),
|
|
276
|
+
pubKeyCredParams: [
|
|
277
|
+
{
|
|
278
|
+
type: 'public-key',
|
|
279
|
+
alg: -7, // p256
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
rp,
|
|
283
|
+
user: {
|
|
284
|
+
id: user?.id ?? Hash.keccak256(Bytes.fromString(name), { as: 'Bytes' }),
|
|
285
|
+
name,
|
|
286
|
+
displayName: user?.displayName ?? name,
|
|
287
|
+
},
|
|
288
|
+
extensions,
|
|
289
|
+
},
|
|
290
|
+
} as internal.CredentialCreationOptions
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export declare namespace getCredentialCreationOptions {
|
|
294
|
+
type Options = {
|
|
295
|
+
/**
|
|
296
|
+
* A string specifying the relying party's preference for how the attestation statement
|
|
297
|
+
* (i.e., provision of verifiable evidence of the authenticity of the authenticator and its data)
|
|
298
|
+
* is conveyed during credential creation.
|
|
299
|
+
*/
|
|
300
|
+
attestation?:
|
|
301
|
+
| internal.PublicKeyCredentialCreationOptions['attestation']
|
|
302
|
+
| undefined
|
|
303
|
+
/**
|
|
304
|
+
* An object whose properties are criteria used to filter out the potential authenticators
|
|
305
|
+
* for the credential creation operation.
|
|
306
|
+
*/
|
|
307
|
+
authenticatorSelection?:
|
|
308
|
+
| internal.PublicKeyCredentialCreationOptions['authenticatorSelection']
|
|
309
|
+
| undefined
|
|
310
|
+
/**
|
|
311
|
+
* An `ArrayBuffer`, `TypedArray`, or `DataView` used as a cryptographic challenge.
|
|
312
|
+
*/
|
|
313
|
+
challenge?:
|
|
314
|
+
| internal.PublicKeyCredentialCreationOptions['challenge']
|
|
315
|
+
| undefined
|
|
316
|
+
/**
|
|
317
|
+
* List of credential IDs to exclude from the creation. This property can be used
|
|
318
|
+
* to prevent creation of a credential if it already exists.
|
|
319
|
+
*/
|
|
320
|
+
excludeCredentialIds?: readonly string[] | undefined
|
|
321
|
+
/**
|
|
322
|
+
* List of Web Authentication API credentials to use during creation or authentication.
|
|
323
|
+
*/
|
|
324
|
+
extensions?:
|
|
325
|
+
| internal.PublicKeyCredentialCreationOptions['extensions']
|
|
326
|
+
| undefined
|
|
327
|
+
/**
|
|
328
|
+
* An object describing the relying party that requested the credential creation
|
|
329
|
+
*/
|
|
330
|
+
rp?:
|
|
331
|
+
| {
|
|
332
|
+
id: string
|
|
333
|
+
name: string
|
|
334
|
+
}
|
|
335
|
+
| undefined
|
|
336
|
+
/**
|
|
337
|
+
* A numerical hint, in milliseconds, which indicates the time the calling web app is willing to wait for the creation operation to complete.
|
|
338
|
+
*/
|
|
339
|
+
timeout?: internal.PublicKeyCredentialCreationOptions['timeout'] | undefined
|
|
340
|
+
} & OneOf<
|
|
341
|
+
| {
|
|
342
|
+
/** Name for the credential (user.name). */
|
|
343
|
+
name: string
|
|
344
|
+
}
|
|
345
|
+
| {
|
|
346
|
+
/**
|
|
347
|
+
* An object describing the user account for which the credential is generated.
|
|
348
|
+
*/
|
|
349
|
+
user: {
|
|
350
|
+
displayName?: string
|
|
351
|
+
id?: BufferSource
|
|
352
|
+
name: string
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
>
|
|
356
|
+
|
|
357
|
+
type ErrorType =
|
|
358
|
+
| Base64.toBytes.ErrorType
|
|
359
|
+
| Hash.keccak256.ErrorType
|
|
360
|
+
| Bytes.fromString.ErrorType
|
|
361
|
+
| Errors.GlobalErrorType
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
getCredentialCreationOptions.parseError = (error: unknown) =>
|
|
365
|
+
/* v8 ignore next */
|
|
366
|
+
error as getCredentialCreationOptions.ErrorType
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Returns the request options to sign a challenge with the Web Authentication API.
|
|
370
|
+
*
|
|
371
|
+
* @example
|
|
372
|
+
* ```ts twoslash
|
|
373
|
+
* import { WebAuthnP256 } from 'ox'
|
|
374
|
+
*
|
|
375
|
+
* const options = WebAuthnP256.getCredentialRequestOptions({
|
|
376
|
+
* challenge: '0xdeadbeef',
|
|
377
|
+
* })
|
|
378
|
+
*
|
|
379
|
+
* const credential = await window.navigator.credentials.get(options)
|
|
380
|
+
* ```
|
|
381
|
+
*
|
|
382
|
+
* @param options - Options.
|
|
383
|
+
* @returns The credential request options.
|
|
384
|
+
*/
|
|
385
|
+
export function getCredentialRequestOptions(
|
|
386
|
+
options: getCredentialRequestOptions.Options,
|
|
387
|
+
): internal.CredentialRequestOptions {
|
|
388
|
+
const {
|
|
389
|
+
credentialId,
|
|
390
|
+
challenge,
|
|
391
|
+
rpId = window.location.hostname,
|
|
392
|
+
userVerification = 'required',
|
|
393
|
+
} = options
|
|
394
|
+
return {
|
|
395
|
+
publicKey: {
|
|
396
|
+
...(credentialId
|
|
397
|
+
? {
|
|
398
|
+
allowCredentials: [
|
|
399
|
+
{
|
|
400
|
+
id: Base64.toBytes(credentialId),
|
|
401
|
+
type: 'public-key',
|
|
402
|
+
},
|
|
403
|
+
],
|
|
404
|
+
}
|
|
405
|
+
: {}),
|
|
406
|
+
challenge: Bytes.fromHex(challenge),
|
|
407
|
+
rpId,
|
|
408
|
+
userVerification,
|
|
409
|
+
},
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export declare namespace getCredentialRequestOptions {
|
|
414
|
+
type Options = {
|
|
415
|
+
/** The credential ID to use. */
|
|
416
|
+
credentialId?: string | undefined
|
|
417
|
+
/** The challenge to sign. */
|
|
418
|
+
challenge: Hex.Hex
|
|
419
|
+
/** The relying party identifier to use. */
|
|
420
|
+
rpId?: internal.PublicKeyCredentialRequestOptions['rpId'] | undefined
|
|
421
|
+
/** The user verification requirement. */
|
|
422
|
+
userVerification?:
|
|
423
|
+
| internal.PublicKeyCredentialRequestOptions['userVerification']
|
|
424
|
+
| undefined
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
type ErrorType =
|
|
428
|
+
| Bytes.fromHex.ErrorType
|
|
429
|
+
| Base64.toBytes.ErrorType
|
|
430
|
+
| Errors.GlobalErrorType
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
getCredentialRequestOptions.parseError = (error: unknown) =>
|
|
434
|
+
error as getCredentialRequestOptions.ErrorType
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Constructs the final digest that was signed and computed by the authenticator. This payload includes
|
|
438
|
+
* the cryptographic `challenge`, as well as authenticator metadata (`authenticatorData` + `clientDataJSON`).
|
|
439
|
+
* This value can be also used with raw P256 verification (such as {@link ox#P256.(verify:function)} or
|
|
440
|
+
* {@link ox#WebCryptoP256.(verify:function)}).
|
|
441
|
+
*
|
|
442
|
+
* :::warning
|
|
443
|
+
*
|
|
444
|
+
* This function is mainly for testing purposes or for manually constructing
|
|
445
|
+
* signing payloads. In most cases you will not need this function and
|
|
446
|
+
* instead use {@link ox#WebAuthnP256.(sign:function)}.
|
|
447
|
+
*
|
|
448
|
+
* :::
|
|
449
|
+
*
|
|
450
|
+
* @example
|
|
451
|
+
* ```ts twoslash
|
|
452
|
+
* import { WebAuthnP256, WebCryptoP256 } from 'ox'
|
|
453
|
+
*
|
|
454
|
+
* const { metadata, payload } = WebAuthnP256.getSignPayload({ // [!code focus]
|
|
455
|
+
* challenge: '0xdeadbeef', // [!code focus]
|
|
456
|
+
* }) // [!code focus]
|
|
457
|
+
* // @log: {
|
|
458
|
+
* // @log: metadata: {
|
|
459
|
+
* // @log: authenticatorData: "0x49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000",
|
|
460
|
+
* // @log: challengeIndex: 23,
|
|
461
|
+
* // @log: clientDataJSON: "{"type":"webauthn.get","challenge":"9jEFijuhEWrM4SOW-tChJbUEHEP44VcjcJ-Bqo1fTM8","origin":"http://localhost:5173","crossOrigin":false}",
|
|
462
|
+
* // @log: typeIndex: 1,
|
|
463
|
+
* // @log: userVerificationRequired: true,
|
|
464
|
+
* // @log: },
|
|
465
|
+
* // @log: payload: "0x49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d9763050000000045086dcb06a5f234db625bcdc94e657f86b76b6fd3eb9c30543eabc1e577a4b0",
|
|
466
|
+
* // @log: }
|
|
467
|
+
*
|
|
468
|
+
* const { publicKey, privateKey } = await WebCryptoP256.createKeyPair()
|
|
469
|
+
*
|
|
470
|
+
* const signature = await WebCryptoP256.sign({
|
|
471
|
+
* payload,
|
|
472
|
+
* privateKey,
|
|
473
|
+
* })
|
|
474
|
+
* ```
|
|
475
|
+
*
|
|
476
|
+
* @param options - Options to construct the signing payload.
|
|
477
|
+
* @returns The signing payload.
|
|
478
|
+
*/
|
|
479
|
+
export function getSignPayload(
|
|
480
|
+
options: getSignPayload.Options,
|
|
481
|
+
): getSignPayload.ReturnType {
|
|
482
|
+
const {
|
|
483
|
+
challenge,
|
|
484
|
+
crossOrigin,
|
|
485
|
+
extraClientData,
|
|
486
|
+
flag,
|
|
487
|
+
origin,
|
|
488
|
+
rpId,
|
|
489
|
+
signCount,
|
|
490
|
+
userVerification = 'required',
|
|
491
|
+
} = options
|
|
492
|
+
|
|
493
|
+
const authenticatorData = getAuthenticatorData({
|
|
494
|
+
flag,
|
|
495
|
+
rpId,
|
|
496
|
+
signCount,
|
|
497
|
+
})
|
|
498
|
+
const clientDataJSON = getClientDataJSON({
|
|
499
|
+
challenge,
|
|
500
|
+
crossOrigin,
|
|
501
|
+
extraClientData,
|
|
502
|
+
origin,
|
|
503
|
+
})
|
|
504
|
+
const clientDataJSONHash = Hash.sha256(Hex.fromString(clientDataJSON))
|
|
505
|
+
|
|
506
|
+
const challengeIndex = clientDataJSON.indexOf('"challenge"')
|
|
507
|
+
const typeIndex = clientDataJSON.indexOf('"type"')
|
|
508
|
+
|
|
509
|
+
const metadata = {
|
|
510
|
+
authenticatorData,
|
|
511
|
+
clientDataJSON,
|
|
512
|
+
challengeIndex,
|
|
513
|
+
typeIndex,
|
|
514
|
+
userVerificationRequired: userVerification === 'required',
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
const payload = Hex.concat(authenticatorData, clientDataJSONHash)
|
|
518
|
+
|
|
519
|
+
return { metadata, payload }
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
export declare namespace getSignPayload {
|
|
523
|
+
type Options = {
|
|
524
|
+
/** The challenge to sign. */
|
|
525
|
+
challenge: Hex.Hex
|
|
526
|
+
/** If set to `true`, it means that the calling context is an `<iframe>` that is not same origin with its ancestor frames. */
|
|
527
|
+
crossOrigin?: boolean | undefined
|
|
528
|
+
/** Additional client data to include in the client data JSON. */
|
|
529
|
+
extraClientData?: Record<string, unknown> | undefined
|
|
530
|
+
/** If set to `true`, the payload will be hashed before being returned. */
|
|
531
|
+
hash?: boolean | undefined
|
|
532
|
+
/** A bitfield that indicates various attributes that were asserted by the authenticator. [Read more](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Authenticator_data#flags) */
|
|
533
|
+
flag?: number | undefined
|
|
534
|
+
/** The fully qualified origin of the relying party which has been given by the client/browser to the authenticator. */
|
|
535
|
+
origin?: string | undefined
|
|
536
|
+
/** The [Relying Party ID](https://w3c.github.io/webauthn/#relying-party-identifier) that the credential is scoped to. */
|
|
537
|
+
rpId?: internal.PublicKeyCredentialRequestOptions['rpId'] | undefined
|
|
538
|
+
/** A signature counter, if supported by the authenticator (set to 0 otherwise). */
|
|
539
|
+
signCount?: number | undefined
|
|
540
|
+
/** The user verification requirement that the authenticator will enforce. */
|
|
541
|
+
userVerification?:
|
|
542
|
+
| internal.PublicKeyCredentialRequestOptions['userVerification']
|
|
543
|
+
| undefined
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
type ReturnType = {
|
|
547
|
+
metadata: SignMetadata
|
|
548
|
+
payload: Hex.Hex
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
type ErrorType =
|
|
552
|
+
| Hash.sha256.ErrorType
|
|
553
|
+
| Hex.concat.ErrorType
|
|
554
|
+
| Hex.fromString.ErrorType
|
|
555
|
+
| getAuthenticatorData.ErrorType
|
|
556
|
+
| getClientDataJSON.ErrorType
|
|
557
|
+
| Errors.GlobalErrorType
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
getSignPayload.parseError = (error: unknown) =>
|
|
561
|
+
/* v8 ignore next */
|
|
562
|
+
error as getSignPayload.ErrorType
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Signs a challenge using a stored WebAuthn P256 Credential. If no Credential is provided,
|
|
566
|
+
* a prompt will be displayed for the user to select an existing Credential
|
|
567
|
+
* that was previously registered.
|
|
568
|
+
*
|
|
569
|
+
* @example
|
|
570
|
+
* ```ts twoslash
|
|
571
|
+
* import { WebAuthnP256 } from 'ox'
|
|
572
|
+
*
|
|
573
|
+
* const credential = await WebAuthnP256.createCredential({
|
|
574
|
+
* name: 'Example',
|
|
575
|
+
* })
|
|
576
|
+
*
|
|
577
|
+
* const { metadata, signature } = await WebAuthnP256.sign({ // [!code focus]
|
|
578
|
+
* credentialId: credential.id, // [!code focus]
|
|
579
|
+
* challenge: '0xdeadbeef', // [!code focus]
|
|
580
|
+
* }) // [!code focus]
|
|
581
|
+
* // @log: {
|
|
582
|
+
* // @log: metadata: {
|
|
583
|
+
* // @log: authenticatorData: '0x49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000',
|
|
584
|
+
* // @log: clientDataJSON: '{"type":"webauthn.get","challenge":"9jEFijuhEWrM4SOW-tChJbUEHEP44VcjcJ-Bqo1fTM8","origin":"http://localhost:5173","crossOrigin":false}',
|
|
585
|
+
* // @log: challengeIndex: 23,
|
|
586
|
+
* // @log: typeIndex: 1,
|
|
587
|
+
* // @log: userVerificationRequired: true,
|
|
588
|
+
* // @log: },
|
|
589
|
+
* // @log: signature: { r: 51231...4215n, s: 12345...6789n },
|
|
590
|
+
* // @log: }
|
|
591
|
+
* ```
|
|
592
|
+
*
|
|
593
|
+
* @param options - Options.
|
|
594
|
+
* @returns The signature.
|
|
595
|
+
*/
|
|
596
|
+
export async function sign(options: sign.Options): Promise<sign.ReturnType> {
|
|
597
|
+
const {
|
|
598
|
+
getFn = window.navigator.credentials.get.bind(window.navigator.credentials),
|
|
599
|
+
...rest
|
|
600
|
+
} = options
|
|
601
|
+
const requestOptions = getCredentialRequestOptions(rest)
|
|
602
|
+
try {
|
|
603
|
+
const credential = (await getFn(
|
|
604
|
+
requestOptions,
|
|
605
|
+
)) as internal.PublicKeyCredential
|
|
606
|
+
if (!credential) throw new CredentialRequestFailedError()
|
|
607
|
+
const response = credential.response as AuthenticatorAssertionResponse
|
|
608
|
+
|
|
609
|
+
const clientDataJSON = String.fromCharCode(
|
|
610
|
+
...new Uint8Array(response.clientDataJSON),
|
|
611
|
+
)
|
|
612
|
+
const challengeIndex = clientDataJSON.indexOf('"challenge"')
|
|
613
|
+
const typeIndex = clientDataJSON.indexOf('"type"')
|
|
614
|
+
|
|
615
|
+
const signature = internal.parseAsn1Signature(
|
|
616
|
+
new Uint8Array(response.signature),
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
return {
|
|
620
|
+
metadata: {
|
|
621
|
+
authenticatorData: Hex.fromBytes(
|
|
622
|
+
new Uint8Array(response.authenticatorData),
|
|
623
|
+
),
|
|
624
|
+
clientDataJSON,
|
|
625
|
+
challengeIndex,
|
|
626
|
+
typeIndex,
|
|
627
|
+
userVerificationRequired:
|
|
628
|
+
requestOptions.publicKey!.userVerification === 'required',
|
|
629
|
+
},
|
|
630
|
+
signature,
|
|
631
|
+
raw: credential,
|
|
632
|
+
}
|
|
633
|
+
} catch (error) {
|
|
634
|
+
throw new CredentialRequestFailedError({
|
|
635
|
+
cause: error as Error,
|
|
636
|
+
})
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
export declare namespace sign {
|
|
641
|
+
type Options = getCredentialRequestOptions.Options & {
|
|
642
|
+
/**
|
|
643
|
+
* Credential request function. Useful for environments that do not support
|
|
644
|
+
* the WebAuthn API natively (i.e. React Native or testing environments).
|
|
645
|
+
*
|
|
646
|
+
* @default window.navigator.credentials.get
|
|
647
|
+
*/
|
|
648
|
+
getFn?:
|
|
649
|
+
| ((
|
|
650
|
+
options?: internal.CredentialRequestOptions | undefined,
|
|
651
|
+
) => Promise<internal.Credential | null>)
|
|
652
|
+
| undefined
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
type ReturnType = {
|
|
656
|
+
metadata: SignMetadata
|
|
657
|
+
raw: internal.PublicKeyCredential
|
|
658
|
+
signature: Signature.Signature<false>
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
type ErrorType =
|
|
662
|
+
| Hex.fromBytes.ErrorType
|
|
663
|
+
| getCredentialRequestOptions.ErrorType
|
|
664
|
+
| Errors.GlobalErrorType
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
sign.parseError = (error: unknown) =>
|
|
668
|
+
/* v8 ignore next */
|
|
669
|
+
error as sign.ErrorType
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Verifies a signature using the Credential's public key and the challenge which was signed.
|
|
673
|
+
*
|
|
674
|
+
* @example
|
|
675
|
+
* ```ts twoslash
|
|
676
|
+
* import { WebAuthnP256 } from 'ox'
|
|
677
|
+
*
|
|
678
|
+
* const credential = await WebAuthnP256.createCredential({
|
|
679
|
+
* name: 'Example',
|
|
680
|
+
* })
|
|
681
|
+
*
|
|
682
|
+
* const { metadata, signature } = await WebAuthnP256.sign({
|
|
683
|
+
* credentialId: credential.id,
|
|
684
|
+
* challenge: '0xdeadbeef',
|
|
685
|
+
* })
|
|
686
|
+
*
|
|
687
|
+
* const result = await WebAuthnP256.verify({ // [!code focus]
|
|
688
|
+
* metadata, // [!code focus]
|
|
689
|
+
* challenge: '0xdeadbeef', // [!code focus]
|
|
690
|
+
* publicKey: credential.publicKey, // [!code focus]
|
|
691
|
+
* signature, // [!code focus]
|
|
692
|
+
* }) // [!code focus]
|
|
693
|
+
* // @log: true
|
|
694
|
+
* ```
|
|
695
|
+
*
|
|
696
|
+
* @param options - Options.
|
|
697
|
+
* @returns Whether the signature is valid.
|
|
698
|
+
*/
|
|
699
|
+
export function verify(options: verify.Options): boolean {
|
|
700
|
+
const { challenge, hash = true, metadata, publicKey, signature } = options
|
|
701
|
+
const {
|
|
702
|
+
authenticatorData,
|
|
703
|
+
challengeIndex,
|
|
704
|
+
clientDataJSON,
|
|
705
|
+
typeIndex,
|
|
706
|
+
userVerificationRequired,
|
|
707
|
+
} = metadata
|
|
708
|
+
|
|
709
|
+
const authenticatorDataBytes = Bytes.fromHex(authenticatorData)
|
|
710
|
+
|
|
711
|
+
// Check length of `authenticatorData`.
|
|
712
|
+
if (authenticatorDataBytes.length < 37) return false
|
|
713
|
+
|
|
714
|
+
const flag = authenticatorDataBytes[32]!
|
|
715
|
+
|
|
716
|
+
// Verify that the UP bit of the flags in authData is set.
|
|
717
|
+
if ((flag & 0x01) !== 0x01) return false
|
|
718
|
+
|
|
719
|
+
// If user verification was determined to be required, verify that
|
|
720
|
+
// the UV bit of the flags in authData is set. Otherwise, ignore the
|
|
721
|
+
// value of the UV flag.
|
|
722
|
+
if (userVerificationRequired && (flag & 0x04) !== 0x04) return false
|
|
723
|
+
|
|
724
|
+
// If the BE bit of the flags in authData is not set, verify that
|
|
725
|
+
// the BS bit is not set.
|
|
726
|
+
if ((flag & 0x08) !== 0x08 && (flag & 0x10) === 0x10) return false
|
|
727
|
+
|
|
728
|
+
// Check that response is for an authentication assertion
|
|
729
|
+
const type = '"type":"webauthn.get"'
|
|
730
|
+
if (type !== clientDataJSON.slice(Number(typeIndex), type.length + 1))
|
|
731
|
+
return false
|
|
732
|
+
|
|
733
|
+
// Check that hash is in the clientDataJSON.
|
|
734
|
+
const match = clientDataJSON
|
|
735
|
+
.slice(Number(challengeIndex))
|
|
736
|
+
.match(/^"challenge":"(.*?)"/)
|
|
737
|
+
if (!match) return false
|
|
738
|
+
|
|
739
|
+
// Validate the challenge in the clientDataJSON.
|
|
740
|
+
const [_, challenge_extracted] = match
|
|
741
|
+
if (Hex.fromBytes(Base64.toBytes(challenge_extracted!)) !== challenge)
|
|
742
|
+
return false
|
|
743
|
+
|
|
744
|
+
const clientDataJSONHash = Hash.sha256(Bytes.fromString(clientDataJSON), {
|
|
745
|
+
as: 'Bytes',
|
|
746
|
+
})
|
|
747
|
+
const payload = Bytes.concat(authenticatorDataBytes, clientDataJSONHash)
|
|
748
|
+
|
|
749
|
+
return P256.verify({
|
|
750
|
+
hash,
|
|
751
|
+
payload,
|
|
752
|
+
publicKey,
|
|
753
|
+
signature,
|
|
754
|
+
})
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
export declare namespace verify {
|
|
758
|
+
type Options = {
|
|
759
|
+
/** The challenge to verify. */
|
|
760
|
+
challenge: Hex.Hex
|
|
761
|
+
/** If set to `true`, the payload will be hashed (sha256) before being verified. */
|
|
762
|
+
hash?: boolean | undefined
|
|
763
|
+
/** The public key to verify the signature with. */
|
|
764
|
+
publicKey: PublicKey.PublicKey
|
|
765
|
+
/** The signature to verify. */
|
|
766
|
+
signature: Signature.Signature<false>
|
|
767
|
+
/** The metadata to verify the signature with. */
|
|
768
|
+
metadata: SignMetadata
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
type ErrorType =
|
|
772
|
+
| Base64.toBytes.ErrorType
|
|
773
|
+
| Bytes.concat.ErrorType
|
|
774
|
+
| Bytes.fromHex.ErrorType
|
|
775
|
+
| P256.verify.ErrorType
|
|
776
|
+
| Errors.GlobalErrorType
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
verify.parseError = (error: unknown) =>
|
|
780
|
+
/* v8 ignore next */
|
|
781
|
+
error as verify.ErrorType
|
|
782
|
+
|
|
783
|
+
/** Thrown when a WebAuthn P256 credential creation fails. */
|
|
784
|
+
export class CredentialCreationFailedError extends Errors.BaseError<Error> {
|
|
785
|
+
override readonly name = 'WebAuthnP256.CredentialCreationFailedError'
|
|
786
|
+
|
|
787
|
+
constructor({ cause }: { cause?: Error | undefined } = {}) {
|
|
788
|
+
super('Failed to create credential.', {
|
|
789
|
+
cause,
|
|
790
|
+
})
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/** Thrown when a WebAuthn P256 credential request fails. */
|
|
795
|
+
export class CredentialRequestFailedError extends Errors.BaseError<Error> {
|
|
796
|
+
override readonly name = 'WebAuthnP256.CredentialRequestFailedError'
|
|
797
|
+
|
|
798
|
+
constructor({ cause }: { cause?: Error | undefined } = {}) {
|
|
799
|
+
super('Failed to request credential.', {
|
|
800
|
+
cause,
|
|
801
|
+
})
|
|
802
|
+
}
|
|
803
|
+
}
|