@opentdf/sdk 0.1.0-beta.1701
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/README.md +52 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/src/access.js +155 -0
- package/dist/cjs/src/auth/Eas.js +60 -0
- package/dist/cjs/src/auth/auth.js +79 -0
- package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +26 -0
- package/dist/cjs/src/auth/oidc-externaljwt-provider.js +33 -0
- package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +34 -0
- package/dist/cjs/src/auth/oidc.js +222 -0
- package/dist/cjs/src/auth/providers.js +143 -0
- package/dist/cjs/src/encodings/base64.js +154 -0
- package/dist/cjs/src/encodings/hex.js +70 -0
- package/dist/cjs/src/encodings/index.js +29 -0
- package/dist/cjs/src/errors.js +138 -0
- package/dist/cjs/src/index.js +344 -0
- package/dist/cjs/src/nanotdf/Client.js +296 -0
- package/dist/cjs/src/nanotdf/NanoTDF.js +94 -0
- package/dist/cjs/src/nanotdf/browser-entry.js +19 -0
- package/dist/cjs/src/nanotdf/constants.js +5 -0
- package/dist/cjs/src/nanotdf/decrypt.js +17 -0
- package/dist/cjs/src/nanotdf/encrypt-dataset.js +38 -0
- package/dist/cjs/src/nanotdf/encrypt.js +132 -0
- package/dist/cjs/src/nanotdf/enum/CipherEnum.js +13 -0
- package/dist/cjs/src/nanotdf/enum/CurveNameEnum.js +15 -0
- package/dist/cjs/src/nanotdf/enum/EncodingEnum.js +8 -0
- package/dist/cjs/src/nanotdf/enum/PolicyTypeEnum.js +11 -0
- package/dist/cjs/src/nanotdf/enum/ProtocolEnum.js +10 -0
- package/dist/cjs/src/nanotdf/enum/ResourceLocatorIdentifierEnum.js +11 -0
- package/dist/cjs/src/nanotdf/helpers/calculateByCurve.js +29 -0
- package/dist/cjs/src/nanotdf/helpers/getHkdfSalt.js +11 -0
- package/dist/cjs/src/nanotdf/index.js +25 -0
- package/dist/cjs/src/nanotdf/interfaces/PolicyInterface.js +3 -0
- package/dist/cjs/src/nanotdf/models/Ciphers.js +61 -0
- package/dist/cjs/src/nanotdf/models/DefaultParams.js +27 -0
- package/dist/cjs/src/nanotdf/models/EcCurves.js +39 -0
- package/dist/cjs/src/nanotdf/models/Header.js +255 -0
- package/dist/cjs/src/nanotdf/models/Payload.js +158 -0
- package/dist/cjs/src/nanotdf/models/Policy/AbstractPolicy.js +73 -0
- package/dist/cjs/src/nanotdf/models/Policy/EmbeddedPolicy.js +82 -0
- package/dist/cjs/src/nanotdf/models/Policy/PolicyFactory.js +38 -0
- package/dist/cjs/src/nanotdf/models/Policy/RemotePolicy.js +62 -0
- package/dist/cjs/src/nanotdf/models/ResourceLocator.js +211 -0
- package/dist/cjs/src/nanotdf/models/Signature.js +77 -0
- package/dist/cjs/src/nanotdf-crypto/ciphers.js +17 -0
- package/dist/cjs/src/nanotdf-crypto/decrypt.js +24 -0
- package/dist/cjs/src/nanotdf-crypto/digest.js +7 -0
- package/dist/cjs/src/nanotdf-crypto/ecdsaSignature.js +83 -0
- package/dist/cjs/src/nanotdf-crypto/encrypt.js +24 -0
- package/dist/cjs/src/nanotdf-crypto/enums.js +52 -0
- package/dist/cjs/src/nanotdf-crypto/exportCryptoKey.js +20 -0
- package/dist/cjs/src/nanotdf-crypto/generateKeyPair.js +13 -0
- package/dist/cjs/src/nanotdf-crypto/generateRandomNumber.js +12 -0
- package/dist/cjs/src/nanotdf-crypto/importRawKey.js +18 -0
- package/dist/cjs/src/nanotdf-crypto/index.js +52 -0
- package/dist/cjs/src/nanotdf-crypto/keyAgreement.js +91 -0
- package/dist/cjs/src/nanotdf-crypto/pemPublicToCrypto.js +225 -0
- package/dist/cjs/src/policy/api.js +58 -0
- package/dist/cjs/src/policy/attributes.js +3 -0
- package/dist/cjs/src/policy/granter.js +146 -0
- package/dist/cjs/src/tdf/AttributeObject.js +15 -0
- package/dist/cjs/src/tdf/AttributeObjectJwt.js +3 -0
- package/dist/cjs/src/tdf/Crypto.js +47 -0
- package/dist/cjs/src/tdf/EntityObject.js +3 -0
- package/dist/cjs/src/tdf/NanoTDF/NanoTDF.js +38 -0
- package/dist/cjs/src/tdf/Policy.js +50 -0
- package/dist/cjs/src/tdf/PolicyObject.js +3 -0
- package/dist/cjs/src/tdf/TypedArray.js +3 -0
- package/dist/cjs/src/tdf/index.js +35 -0
- package/dist/cjs/src/types/index.js +3 -0
- package/dist/cjs/src/utils.js +147 -0
- package/dist/cjs/src/version.js +12 -0
- package/dist/cjs/tdf3/index.js +57 -0
- package/dist/cjs/tdf3/src/assertions.js +118 -0
- package/dist/cjs/tdf3/src/binary.js +153 -0
- package/dist/cjs/tdf3/src/ciphers/aes-gcm-cipher.js +56 -0
- package/dist/cjs/tdf3/src/ciphers/algorithms.js +8 -0
- package/dist/cjs/tdf3/src/ciphers/index.js +8 -0
- package/dist/cjs/tdf3/src/ciphers/symmetric-cipher-base.js +22 -0
- package/dist/cjs/tdf3/src/client/DecoratedReadableStream.js +116 -0
- package/dist/cjs/tdf3/src/client/builders.js +561 -0
- package/dist/cjs/tdf3/src/client/index.js +460 -0
- package/dist/cjs/tdf3/src/client/validation.js +63 -0
- package/dist/cjs/tdf3/src/crypto/crypto-utils.js +116 -0
- package/dist/cjs/tdf3/src/crypto/declarations.js +8 -0
- package/dist/cjs/tdf3/src/crypto/index.js +315 -0
- package/dist/cjs/tdf3/src/index.js +34 -0
- package/dist/cjs/tdf3/src/models/attribute-set.js +122 -0
- package/dist/cjs/tdf3/src/models/encryption-information.js +90 -0
- package/dist/cjs/tdf3/src/models/index.js +25 -0
- package/dist/cjs/tdf3/src/models/key-access.js +103 -0
- package/dist/cjs/tdf3/src/models/manifest.js +3 -0
- package/dist/cjs/tdf3/src/models/payload.js +3 -0
- package/dist/cjs/tdf3/src/models/policy.js +24 -0
- package/dist/cjs/tdf3/src/models/upsert-response.js +3 -0
- package/dist/cjs/tdf3/src/tdf.js +907 -0
- package/dist/cjs/tdf3/src/templates/default.html.js +98 -0
- package/dist/cjs/tdf3/src/templates/escaper.js +15 -0
- package/dist/cjs/tdf3/src/templates/index.js +12 -0
- package/dist/cjs/tdf3/src/utils/buffer-crc32.js +48 -0
- package/dist/cjs/tdf3/src/utils/chunkers.js +106 -0
- package/dist/cjs/tdf3/src/utils/index.js +296 -0
- package/dist/cjs/tdf3/src/utils/keysplit.js +61 -0
- package/dist/cjs/tdf3/src/utils/zip-reader.js +253 -0
- package/dist/cjs/tdf3/src/utils/zip-writer.js +308 -0
- package/dist/cjs/tdf3/src/version.js +6 -0
- package/dist/types/src/access.d.ts +47 -0
- package/dist/types/src/access.d.ts.map +1 -0
- package/dist/types/src/auth/Eas.d.ts +34 -0
- package/dist/types/src/auth/Eas.d.ts.map +1 -0
- package/dist/types/src/auth/auth.d.ts +86 -0
- package/dist/types/src/auth/auth.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts +9 -0
- package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-externaljwt-provider.d.ts +10 -0
- package/dist/types/src/auth/oidc-externaljwt-provider.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts +10 -0
- package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts.map +1 -0
- package/dist/types/src/auth/oidc.d.ts +104 -0
- package/dist/types/src/auth/oidc.d.ts.map +1 -0
- package/dist/types/src/auth/providers.d.ts +67 -0
- package/dist/types/src/auth/providers.d.ts.map +1 -0
- package/dist/types/src/encodings/base64.d.ts +18 -0
- package/dist/types/src/encodings/base64.d.ts.map +1 -0
- package/dist/types/src/encodings/hex.d.ts +5 -0
- package/dist/types/src/encodings/hex.d.ts.map +1 -0
- package/dist/types/src/encodings/index.d.ts +3 -0
- package/dist/types/src/encodings/index.d.ts.map +1 -0
- package/dist/types/src/errors.d.ts +72 -0
- package/dist/types/src/errors.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +138 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/nanotdf/Client.d.ts +95 -0
- package/dist/types/src/nanotdf/Client.d.ts.map +1 -0
- package/dist/types/src/nanotdf/NanoTDF.d.ts +25 -0
- package/dist/types/src/nanotdf/NanoTDF.d.ts.map +1 -0
- package/dist/types/src/nanotdf/browser-entry.d.ts +17 -0
- package/dist/types/src/nanotdf/browser-entry.d.ts.map +1 -0
- package/dist/types/src/nanotdf/constants.d.ts +2 -0
- package/dist/types/src/nanotdf/constants.d.ts.map +1 -0
- package/dist/types/src/nanotdf/decrypt.d.ts +9 -0
- package/dist/types/src/nanotdf/decrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf/encrypt-dataset.d.ts +12 -0
- package/dist/types/src/nanotdf/encrypt-dataset.d.ts.map +1 -0
- package/dist/types/src/nanotdf/encrypt.d.ts +14 -0
- package/dist/types/src/nanotdf/encrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/CipherEnum.d.ts +10 -0
- package/dist/types/src/nanotdf/enum/CipherEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/CurveNameEnum.d.ts +12 -0
- package/dist/types/src/nanotdf/enum/CurveNameEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/EncodingEnum.d.ts +5 -0
- package/dist/types/src/nanotdf/enum/EncodingEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts +8 -0
- package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/ProtocolEnum.d.ts +7 -0
- package/dist/types/src/nanotdf/enum/ProtocolEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/ResourceLocatorIdentifierEnum.d.ts +8 -0
- package/dist/types/src/nanotdf/enum/ResourceLocatorIdentifierEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/helpers/calculateByCurve.d.ts +20 -0
- package/dist/types/src/nanotdf/helpers/calculateByCurve.d.ts.map +1 -0
- package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts +9 -0
- package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts.map +1 -0
- package/dist/types/src/nanotdf/index.d.ts +9 -0
- package/dist/types/src/nanotdf/index.d.ts.map +1 -0
- package/dist/types/src/nanotdf/interfaces/PolicyInterface.d.ts +17 -0
- package/dist/types/src/nanotdf/interfaces/PolicyInterface.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Ciphers.d.ts +14 -0
- package/dist/types/src/nanotdf/models/Ciphers.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/DefaultParams.d.ts +21 -0
- package/dist/types/src/nanotdf/models/DefaultParams.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/EcCurves.d.ts +15 -0
- package/dist/types/src/nanotdf/models/EcCurves.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Header.d.ts +73 -0
- package/dist/types/src/nanotdf/models/Header.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Payload.d.ts +47 -0
- package/dist/types/src/nanotdf/models/Payload.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/AbstractPolicy.d.ts +52 -0
- package/dist/types/src/nanotdf/models/Policy/AbstractPolicy.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/EmbeddedPolicy.d.ts +35 -0
- package/dist/types/src/nanotdf/models/Policy/EmbeddedPolicy.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/PolicyFactory.d.ts +11 -0
- package/dist/types/src/nanotdf/models/Policy/PolicyFactory.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/RemotePolicy.d.ts +31 -0
- package/dist/types/src/nanotdf/models/Policy/RemotePolicy.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/ResourceLocator.d.ts +65 -0
- package/dist/types/src/nanotdf/models/ResourceLocator.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Signature.d.ts +33 -0
- package/dist/types/src/nanotdf/models/Signature.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/ciphers.d.ts +8 -0
- package/dist/types/src/nanotdf-crypto/ciphers.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/decrypt.d.ts +14 -0
- package/dist/types/src/nanotdf-crypto/decrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/digest.d.ts +3 -0
- package/dist/types/src/nanotdf-crypto/digest.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/ecdsaSignature.d.ts +35 -0
- package/dist/types/src/nanotdf-crypto/ecdsaSignature.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/encrypt.d.ts +14 -0
- package/dist/types/src/nanotdf-crypto/encrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/enums.d.ts +42 -0
- package/dist/types/src/nanotdf-crypto/enums.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/exportCryptoKey.d.ts +7 -0
- package/dist/types/src/nanotdf-crypto/exportCryptoKey.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts +10 -0
- package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts +5 -0
- package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/importRawKey.d.ts +13 -0
- package/dist/types/src/nanotdf-crypto/importRawKey.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/index.d.ts +12 -0
- package/dist/types/src/nanotdf-crypto/index.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/keyAgreement.d.ts +28 -0
- package/dist/types/src/nanotdf-crypto/keyAgreement.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/pemPublicToCrypto.d.ts +28 -0
- package/dist/types/src/nanotdf-crypto/pemPublicToCrypto.d.ts.map +1 -0
- package/dist/types/src/policy/api.d.ts +4 -0
- package/dist/types/src/policy/api.d.ts.map +1 -0
- package/dist/types/src/policy/attributes.d.ts +95 -0
- package/dist/types/src/policy/attributes.d.ts.map +1 -0
- package/dist/types/src/policy/granter.d.ts +23 -0
- package/dist/types/src/policy/granter.d.ts.map +1 -0
- package/dist/types/src/tdf/AttributeObject.d.ts +13 -0
- package/dist/types/src/tdf/AttributeObject.d.ts.map +1 -0
- package/dist/types/src/tdf/AttributeObjectJwt.d.ts +4 -0
- package/dist/types/src/tdf/AttributeObjectJwt.d.ts.map +1 -0
- package/dist/types/src/tdf/Crypto.d.ts +37 -0
- package/dist/types/src/tdf/Crypto.d.ts.map +1 -0
- package/dist/types/src/tdf/EntityObject.d.ts +18 -0
- package/dist/types/src/tdf/EntityObject.d.ts.map +1 -0
- package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts +99 -0
- package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts.map +1 -0
- package/dist/types/src/tdf/Policy.d.ts +28 -0
- package/dist/types/src/tdf/Policy.d.ts.map +1 -0
- package/dist/types/src/tdf/PolicyObject.d.ts +11 -0
- package/dist/types/src/tdf/PolicyObject.d.ts.map +1 -0
- package/dist/types/src/tdf/TypedArray.d.ts +3 -0
- package/dist/types/src/tdf/TypedArray.d.ts.map +1 -0
- package/dist/types/src/tdf/index.d.ts +7 -0
- package/dist/types/src/tdf/index.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +45 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/utils.d.ts +45 -0
- package/dist/types/src/utils.d.ts.map +1 -0
- package/dist/types/src/version.d.ts +9 -0
- package/dist/types/src/version.d.ts.map +1 -0
- package/dist/types/tdf3/index.d.ts +16 -0
- package/dist/types/tdf3/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/assertions.d.ts +63 -0
- package/dist/types/tdf3/src/assertions.d.ts.map +1 -0
- package/dist/types/tdf3/src/binary.d.ts +38 -0
- package/dist/types/tdf3/src/binary.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts +18 -0
- package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/algorithms.d.ts +4 -0
- package/dist/types/tdf3/src/ciphers/algorithms.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/index.d.ts +3 -0
- package/dist/types/tdf3/src/ciphers/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts +14 -0
- package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts +53 -0
- package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/builders.d.ts +436 -0
- package/dist/types/tdf3/src/client/builders.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/index.d.ts +139 -0
- package/dist/types/tdf3/src/client/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/validation.d.ts +8 -0
- package/dist/types/tdf3/src/client/validation.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts +34 -0
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/declarations.d.ts +60 -0
- package/dist/types/tdf3/src/crypto/declarations.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/index.d.ts +103 -0
- package/dist/types/tdf3/src/crypto/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/index.d.ts +5 -0
- package/dist/types/tdf3/src/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/attribute-set.d.ts +65 -0
- package/dist/types/tdf3/src/models/attribute-set.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/encryption-information.d.ts +49 -0
- package/dist/types/tdf3/src/models/encryption-information.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/index.d.ts +9 -0
- package/dist/types/tdf3/src/models/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/key-access.d.ts +42 -0
- package/dist/types/tdf3/src/models/key-access.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/manifest.d.ts +9 -0
- package/dist/types/tdf3/src/models/manifest.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/payload.d.ts +7 -0
- package/dist/types/tdf3/src/models/payload.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/policy.d.ts +13 -0
- package/dist/types/tdf3/src/models/policy.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/upsert-response.d.ts +16 -0
- package/dist/types/tdf3/src/models/upsert-response.d.ts.map +1 -0
- package/dist/types/tdf3/src/tdf.d.ts +152 -0
- package/dist/types/tdf3/src/tdf.d.ts.map +1 -0
- package/dist/types/tdf3/src/templates/default.html.d.ts +8 -0
- package/dist/types/tdf3/src/templates/default.html.d.ts.map +1 -0
- package/dist/types/tdf3/src/templates/escaper.d.ts +6 -0
- package/dist/types/tdf3/src/templates/escaper.d.ts.map +1 -0
- package/dist/types/tdf3/src/templates/index.d.ts +3 -0
- package/dist/types/tdf3/src/templates/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/buffer-crc32.d.ts +2 -0
- package/dist/types/tdf3/src/utils/buffer-crc32.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/chunkers.d.ts +29 -0
- package/dist/types/tdf3/src/utils/chunkers.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/index.d.ts +36 -0
- package/dist/types/tdf3/src/utils/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/keysplit.d.ts +19 -0
- package/dist/types/tdf3/src/utils/keysplit.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/zip-reader.d.ts +63 -0
- package/dist/types/tdf3/src/utils/zip-reader.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/zip-writer.d.ts +35 -0
- package/dist/types/tdf3/src/utils/zip-writer.d.ts.map +1 -0
- package/dist/types/tdf3/src/version.d.ts +3 -0
- package/dist/types/tdf3/src/version.d.ts.map +1 -0
- package/dist/web/package.json +3 -0
- package/dist/web/src/access.js +147 -0
- package/dist/web/src/auth/Eas.js +55 -0
- package/dist/web/src/auth/auth.js +71 -0
- package/dist/web/src/auth/oidc-clientcredentials-provider.js +22 -0
- package/dist/web/src/auth/oidc-externaljwt-provider.js +29 -0
- package/dist/web/src/auth/oidc-refreshtoken-provider.js +30 -0
- package/dist/web/src/auth/oidc.js +215 -0
- package/dist/web/src/auth/providers.js +119 -0
- package/dist/web/src/encodings/base64.js +147 -0
- package/dist/web/src/encodings/hex.js +63 -0
- package/dist/web/src/encodings/index.js +3 -0
- package/dist/web/src/errors.js +123 -0
- package/dist/web/src/index.js +313 -0
- package/dist/web/src/nanotdf/Client.js +268 -0
- package/dist/web/src/nanotdf/NanoTDF.js +89 -0
- package/dist/web/src/nanotdf/browser-entry.js +14 -0
- package/dist/web/src/nanotdf/constants.js +2 -0
- package/dist/web/src/nanotdf/decrypt.js +14 -0
- package/dist/web/src/nanotdf/encrypt-dataset.js +32 -0
- package/dist/web/src/nanotdf/encrypt.js +126 -0
- package/dist/web/src/nanotdf/enum/CipherEnum.js +11 -0
- package/dist/web/src/nanotdf/enum/CurveNameEnum.js +13 -0
- package/dist/web/src/nanotdf/enum/EncodingEnum.js +6 -0
- package/dist/web/src/nanotdf/enum/PolicyTypeEnum.js +9 -0
- package/dist/web/src/nanotdf/enum/ProtocolEnum.js +8 -0
- package/dist/web/src/nanotdf/enum/ResourceLocatorIdentifierEnum.js +9 -0
- package/dist/web/src/nanotdf/helpers/calculateByCurve.js +24 -0
- package/dist/web/src/nanotdf/helpers/getHkdfSalt.js +8 -0
- package/dist/web/src/nanotdf/index.js +11 -0
- package/dist/web/src/nanotdf/interfaces/PolicyInterface.js +2 -0
- package/dist/web/src/nanotdf/models/Ciphers.js +54 -0
- package/dist/web/src/nanotdf/models/DefaultParams.js +22 -0
- package/dist/web/src/nanotdf/models/EcCurves.js +32 -0
- package/dist/web/src/nanotdf/models/Header.js +250 -0
- package/dist/web/src/nanotdf/models/Payload.js +156 -0
- package/dist/web/src/nanotdf/models/Policy/AbstractPolicy.js +71 -0
- package/dist/web/src/nanotdf/models/Policy/EmbeddedPolicy.js +77 -0
- package/dist/web/src/nanotdf/models/Policy/PolicyFactory.js +33 -0
- package/dist/web/src/nanotdf/models/Policy/RemotePolicy.js +57 -0
- package/dist/web/src/nanotdf/models/ResourceLocator.js +206 -0
- package/dist/web/src/nanotdf/models/Signature.js +74 -0
- package/dist/web/src/nanotdf-crypto/ciphers.js +14 -0
- package/dist/web/src/nanotdf-crypto/decrypt.js +21 -0
- package/dist/web/src/nanotdf-crypto/digest.js +4 -0
- package/dist/web/src/nanotdf-crypto/ecdsaSignature.js +77 -0
- package/dist/web/src/nanotdf-crypto/encrypt.js +21 -0
- package/dist/web/src/nanotdf-crypto/enums.js +49 -0
- package/dist/web/src/nanotdf-crypto/exportCryptoKey.js +17 -0
- package/dist/web/src/nanotdf-crypto/generateKeyPair.js +10 -0
- package/dist/web/src/nanotdf-crypto/generateRandomNumber.js +9 -0
- package/dist/web/src/nanotdf-crypto/importRawKey.js +15 -0
- package/dist/web/src/nanotdf-crypto/index.js +12 -0
- package/dist/web/src/nanotdf-crypto/keyAgreement.js +87 -0
- package/dist/web/src/nanotdf-crypto/pemPublicToCrypto.js +197 -0
- package/dist/web/src/policy/api.js +54 -0
- package/dist/web/src/policy/attributes.js +2 -0
- package/dist/web/src/policy/granter.js +141 -0
- package/dist/web/src/tdf/AttributeObject.js +11 -0
- package/dist/web/src/tdf/AttributeObjectJwt.js +2 -0
- package/dist/web/src/tdf/Crypto.js +44 -0
- package/dist/web/src/tdf/EntityObject.js +2 -0
- package/dist/web/src/tdf/NanoTDF/NanoTDF.js +35 -0
- package/dist/web/src/tdf/Policy.js +48 -0
- package/dist/web/src/tdf/PolicyObject.js +2 -0
- package/dist/web/src/tdf/TypedArray.js +2 -0
- package/dist/web/src/tdf/index.js +4 -0
- package/dist/web/src/types/index.js +2 -0
- package/dist/web/src/utils.js +133 -0
- package/dist/web/src/version.js +9 -0
- package/dist/web/tdf3/index.js +13 -0
- package/dist/web/tdf3/src/assertions.js +111 -0
- package/dist/web/tdf3/src/binary.js +149 -0
- package/dist/web/tdf3/src/ciphers/aes-gcm-cipher.js +52 -0
- package/dist/web/tdf3/src/ciphers/algorithms.js +5 -0
- package/dist/web/tdf3/src/ciphers/index.js +3 -0
- package/dist/web/tdf3/src/ciphers/symmetric-cipher-base.js +18 -0
- package/dist/web/tdf3/src/client/DecoratedReadableStream.js +107 -0
- package/dist/web/tdf3/src/client/builders.js +557 -0
- package/dist/web/tdf3/src/client/index.js +423 -0
- package/dist/web/tdf3/src/client/validation.js +58 -0
- package/dist/web/tdf3/src/crypto/crypto-utils.js +107 -0
- package/dist/web/tdf3/src/crypto/declarations.js +5 -0
- package/dist/web/tdf3/src/crypto/index.js +296 -0
- package/dist/web/tdf3/src/index.js +5 -0
- package/dist/web/tdf3/src/models/attribute-set.js +118 -0
- package/dist/web/tdf3/src/models/encryption-information.js +86 -0
- package/dist/web/tdf3/src/models/index.js +9 -0
- package/dist/web/tdf3/src/models/key-access.js +74 -0
- package/dist/web/tdf3/src/models/manifest.js +2 -0
- package/dist/web/tdf3/src/models/payload.js +2 -0
- package/dist/web/tdf3/src/models/policy.js +20 -0
- package/dist/web/tdf3/src/models/upsert-response.js +2 -0
- package/dist/web/tdf3/src/tdf.js +866 -0
- package/dist/web/tdf3/src/templates/default.html.js +96 -0
- package/dist/web/tdf3/src/templates/escaper.js +10 -0
- package/dist/web/tdf3/src/templates/index.js +3 -0
- package/dist/web/tdf3/src/utils/buffer-crc32.js +44 -0
- package/dist/web/tdf3/src/utils/chunkers.js +96 -0
- package/dist/web/tdf3/src/utils/index.js +248 -0
- package/dist/web/tdf3/src/utils/keysplit.js +55 -0
- package/dist/web/tdf3/src/utils/zip-reader.js +247 -0
- package/dist/web/tdf3/src/utils/zip-writer.js +302 -0
- package/dist/web/tdf3/src/version.js +3 -0
- package/package.json +126 -0
- package/src/access.ts +198 -0
- package/src/auth/Eas.ts +79 -0
- package/src/auth/auth.ts +141 -0
- package/src/auth/oidc-clientcredentials-provider.ts +32 -0
- package/src/auth/oidc-externaljwt-provider.ts +41 -0
- package/src/auth/oidc-refreshtoken-provider.ts +41 -0
- package/src/auth/oidc.ts +307 -0
- package/src/auth/providers.ts +139 -0
- package/src/encodings/base64.ts +160 -0
- package/src/encodings/hex.ts +69 -0
- package/src/encodings/index.ts +2 -0
- package/src/errors.ts +113 -0
- package/src/index.ts +441 -0
- package/src/nanotdf/Client.ts +349 -0
- package/src/nanotdf/NanoTDF.ts +121 -0
- package/src/nanotdf/browser-entry.ts +20 -0
- package/src/nanotdf/constants.ts +1 -0
- package/src/nanotdf/decrypt.ts +19 -0
- package/src/nanotdf/encrypt-dataset.ts +52 -0
- package/src/nanotdf/encrypt.ts +197 -0
- package/src/nanotdf/enum/CipherEnum.ts +10 -0
- package/src/nanotdf/enum/CurveNameEnum.ts +12 -0
- package/src/nanotdf/enum/EncodingEnum.ts +5 -0
- package/src/nanotdf/enum/PolicyTypeEnum.ts +8 -0
- package/src/nanotdf/enum/ProtocolEnum.ts +7 -0
- package/src/nanotdf/enum/ResourceLocatorIdentifierEnum.ts +8 -0
- package/src/nanotdf/helpers/calculateByCurve.ts +26 -0
- package/src/nanotdf/helpers/getHkdfSalt.ts +15 -0
- package/src/nanotdf/index.ts +10 -0
- package/src/nanotdf/interfaces/PolicyInterface.ts +27 -0
- package/src/nanotdf/models/Ciphers.ts +67 -0
- package/src/nanotdf/models/DefaultParams.ts +24 -0
- package/src/nanotdf/models/EcCurves.ts +40 -0
- package/src/nanotdf/models/Header.ts +322 -0
- package/src/nanotdf/models/Payload.ts +196 -0
- package/src/nanotdf/models/Policy/AbstractPolicy.ts +90 -0
- package/src/nanotdf/models/Policy/EmbeddedPolicy.ts +101 -0
- package/src/nanotdf/models/Policy/PolicyFactory.ts +48 -0
- package/src/nanotdf/models/Policy/RemotePolicy.ts +74 -0
- package/src/nanotdf/models/ResourceLocator.ts +212 -0
- package/src/nanotdf/models/Signature.ts +85 -0
- package/src/nanotdf-crypto/ciphers.ts +13 -0
- package/src/nanotdf-crypto/decrypt.ts +30 -0
- package/src/nanotdf-crypto/digest.ts +8 -0
- package/src/nanotdf-crypto/ecdsaSignature.ts +109 -0
- package/src/nanotdf-crypto/encrypt.ts +30 -0
- package/src/nanotdf-crypto/enums.ts +47 -0
- package/src/nanotdf-crypto/exportCryptoKey.ts +17 -0
- package/src/nanotdf-crypto/generateKeyPair.ts +19 -0
- package/src/nanotdf-crypto/generateRandomNumber.ts +8 -0
- package/src/nanotdf-crypto/importRawKey.ts +19 -0
- package/src/nanotdf-crypto/index.ts +11 -0
- package/src/nanotdf-crypto/keyAgreement.ts +139 -0
- package/src/nanotdf-crypto/pemPublicToCrypto.ts +232 -0
- package/src/package-lock.json +6 -0
- package/src/package.json +3 -0
- package/src/platform/authorization/authorization_connect.d.ts +44 -0
- package/src/platform/authorization/authorization_connect.js +44 -0
- package/src/platform/authorization/authorization_pb.d.ts +707 -0
- package/src/platform/authorization/authorization_pb.js +372 -0
- package/src/platform/common/common_pb.d.ts +129 -0
- package/src/platform/common/common_pb.js +58 -0
- package/src/platform/entityresolution/entity_resolution_connect.d.ts +35 -0
- package/src/platform/entityresolution/entity_resolution_connect.js +35 -0
- package/src/platform/entityresolution/entity_resolution_pb.d.ts +242 -0
- package/src/platform/entityresolution/entity_resolution_pb.js +139 -0
- package/src/platform/kas/kas_connect.d.ts +59 -0
- package/src/platform/kas/kas_connect.js +59 -0
- package/src/platform/kas/kas_pb.d.ts +200 -0
- package/src/platform/kas/kas_pb.js +84 -0
- package/src/platform/policy/attributes/attributes_connect.d.ts +168 -0
- package/src/platform/policy/attributes/attributes_connect.js +168 -0
- package/src/platform/policy/attributes/attributes_pb.d.ts +929 -0
- package/src/platform/policy/attributes/attributes_pb.js +363 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_connect.d.ts +62 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_connect.js +62 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_pb.d.ts +283 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_pb.js +113 -0
- package/src/platform/policy/namespaces/namespaces_connect.d.ts +62 -0
- package/src/platform/policy/namespaces/namespaces_connect.js +62 -0
- package/src/platform/policy/namespaces/namespaces_pb.d.ts +270 -0
- package/src/platform/policy/namespaces/namespaces_pb.js +110 -0
- package/src/platform/policy/objects_pb.d.ts +725 -0
- package/src/platform/policy/objects_pb.js +288 -0
- package/src/platform/policy/resourcemapping/resource_mapping_connect.d.ts +259 -0
- package/src/platform/policy/resourcemapping/resource_mapping_connect.js +259 -0
- package/src/platform/policy/resourcemapping/resource_mapping_pb.d.ts +314 -0
- package/src/platform/policy/resourcemapping/resource_mapping_pb.js +142 -0
- package/src/platform/policy/selectors_pb.d.ts +269 -0
- package/src/platform/policy/selectors_pb.js +110 -0
- package/src/platform/policy/subjectmapping/subject_mapping_connect.d.ts +118 -0
- package/src/platform/policy/subjectmapping/subject_mapping_connect.js +118 -0
- package/src/platform/policy/subjectmapping/subject_mapping_pb.d.ts +672 -0
- package/src/platform/policy/subjectmapping/subject_mapping_pb.js +260 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_connect.d.ts +26 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_connect.js +26 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_pb.d.ts +75 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_pb.js +35 -0
- package/src/policy/api.ts +61 -0
- package/src/policy/attributes.ts +117 -0
- package/src/policy/granter.ts +181 -0
- package/src/tdf/AttributeObject.ts +27 -0
- package/src/tdf/AttributeObjectJwt.ts +3 -0
- package/src/tdf/Crypto.ts +42 -0
- package/src/tdf/EntityObject.ts +18 -0
- package/src/tdf/NanoTDF/NanoTDF.ts +120 -0
- package/src/tdf/Policy.ts +51 -0
- package/src/tdf/PolicyObject.ts +12 -0
- package/src/tdf/TypedArray.ts +12 -0
- package/src/tdf/index.ts +6 -0
- package/src/types/index.ts +55 -0
- package/src/utils.ts +149 -0
- package/src/version.ts +9 -0
- package/tdf3/index.ts +91 -0
- package/tdf3/package-lock.json +6 -0
- package/tdf3/package.json +3 -0
- package/tdf3/src/assertions.ts +191 -0
- package/tdf3/src/binary.ts +195 -0
- package/tdf3/src/ciphers/aes-gcm-cipher.ts +76 -0
- package/tdf3/src/ciphers/algorithms.ts +9 -0
- package/tdf3/src/ciphers/index.ts +2 -0
- package/tdf3/src/ciphers/symmetric-cipher-base.ts +38 -0
- package/tdf3/src/client/DecoratedReadableStream.ts +148 -0
- package/tdf3/src/client/builders.ts +701 -0
- package/tdf3/src/client/index.ts +637 -0
- package/tdf3/src/client/validation.ts +79 -0
- package/tdf3/src/crypto/crypto-utils.ts +119 -0
- package/tdf3/src/crypto/declarations.ts +89 -0
- package/tdf3/src/crypto/index.ts +394 -0
- package/tdf3/src/index.ts +4 -0
- package/tdf3/src/models/attribute-set.ts +142 -0
- package/tdf3/src/models/encryption-information.ts +172 -0
- package/tdf3/src/models/index.ts +8 -0
- package/tdf3/src/models/key-access.ts +128 -0
- package/tdf3/src/models/manifest.ts +9 -0
- package/tdf3/src/models/payload.ts +6 -0
- package/tdf3/src/models/policy.ts +35 -0
- package/tdf3/src/models/upsert-response.ts +17 -0
- package/tdf3/src/tdf.ts +1351 -0
- package/tdf3/src/templates/default.html.ts +105 -0
- package/tdf3/src/templates/escaper.ts +10 -0
- package/tdf3/src/templates/index.ts +2 -0
- package/tdf3/src/utils/buffer-crc32.ts +46 -0
- package/tdf3/src/utils/chunkers.ts +118 -0
- package/tdf3/src/utils/index.ts +309 -0
- package/tdf3/src/utils/keysplit.ts +63 -0
- package/tdf3/src/utils/zip-reader.ts +341 -0
- package/tdf3/src/utils/zip-writer.ts +375 -0
- package/tdf3/src/version.ts +2 -0
- package/tdf3/types.d.ts +14 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import AbstractPolicy from './AbstractPolicy.js';
|
|
2
|
+
import { EmbeddedPolicyInterface } from '../../interfaces/PolicyInterface.js';
|
|
3
|
+
import PolicyTypes from '../../enum/PolicyTypeEnum.js';
|
|
4
|
+
import { ConfigurationError } from '../../../errors.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Embedded Policy
|
|
8
|
+
*
|
|
9
|
+
* These policy types allow for creation and binding of arbitrary policies.
|
|
10
|
+
*
|
|
11
|
+
* | Section | Minimum Length (B) | Maximum Length (B) |
|
|
12
|
+
* |------------------------------|--------------------|--------------------|
|
|
13
|
+
* | Content Length | 2 | 2 |
|
|
14
|
+
* | Plaintext/Ciphertext | 1 | 255 |
|
|
15
|
+
* | (Optional) Policy Key Access | 36 | 136 |
|
|
16
|
+
*/
|
|
17
|
+
class EmbeddedPolicy extends AbstractPolicy implements EmbeddedPolicyInterface {
|
|
18
|
+
static MAX_POLICY_SIZE = 65535; // 2 bytes unsigned int.
|
|
19
|
+
readonly content: Uint8Array;
|
|
20
|
+
|
|
21
|
+
static override parse(
|
|
22
|
+
buff: Uint8Array,
|
|
23
|
+
useEcdsaBinding: boolean,
|
|
24
|
+
type: PolicyTypes
|
|
25
|
+
): { offset: number; policy: EmbeddedPolicy } {
|
|
26
|
+
let offset = 0;
|
|
27
|
+
|
|
28
|
+
// TODO: May not work on Big Endian systems. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16
|
|
29
|
+
// Also http://calculist.org/blog/2012/04/24/the-little-endian-web/
|
|
30
|
+
const length = new DataView(buff.slice(offset, 2).buffer).getUint16(0);
|
|
31
|
+
offset += 2;
|
|
32
|
+
|
|
33
|
+
const content = buff.subarray(offset, offset + length);
|
|
34
|
+
offset += length;
|
|
35
|
+
|
|
36
|
+
const { binding, newOffset: bindingOffset } = this.parseBinding(buff, useEcdsaBinding, offset);
|
|
37
|
+
offset = bindingOffset;
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
policy: new EmbeddedPolicy(type, binding, content),
|
|
41
|
+
offset,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
constructor(type: PolicyTypes, binding: Uint8Array, content: Uint8Array) {
|
|
46
|
+
super(type, binding);
|
|
47
|
+
this.content = content;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Length of policy
|
|
52
|
+
*
|
|
53
|
+
* @returns { number } length
|
|
54
|
+
*/
|
|
55
|
+
override getLength(): number {
|
|
56
|
+
return (
|
|
57
|
+
// Type length
|
|
58
|
+
1 +
|
|
59
|
+
// Policy length
|
|
60
|
+
2 +
|
|
61
|
+
// Content length
|
|
62
|
+
this.content.length +
|
|
63
|
+
// Binding length
|
|
64
|
+
this.binding.length
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Return the content of the policy
|
|
70
|
+
*/
|
|
71
|
+
override toBuffer(): Uint8Array {
|
|
72
|
+
const target = new Uint8Array(this.getLength());
|
|
73
|
+
|
|
74
|
+
if (this.content.length > EmbeddedPolicy.MAX_POLICY_SIZE) {
|
|
75
|
+
throw new ConfigurationError("TDF Policy can't be more that 2^16");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
target.set([this.type], 0);
|
|
79
|
+
|
|
80
|
+
// Write the policy length, assuming the host system is little endian
|
|
81
|
+
// TODO: There should be better way to convert to big endian
|
|
82
|
+
const lengthAsUint16 = new Uint16Array(1);
|
|
83
|
+
lengthAsUint16[0] = this.content.length;
|
|
84
|
+
|
|
85
|
+
const temp = new Uint8Array(lengthAsUint16.buffer);
|
|
86
|
+
const policyContentSizeAsBg = new Uint8Array(2);
|
|
87
|
+
policyContentSizeAsBg[0] = temp[1];
|
|
88
|
+
policyContentSizeAsBg[1] = temp[0];
|
|
89
|
+
target.set(policyContentSizeAsBg, 1);
|
|
90
|
+
|
|
91
|
+
// Write the policy content
|
|
92
|
+
target.set(this.content, policyContentSizeAsBg.length + 1);
|
|
93
|
+
|
|
94
|
+
// Write the binding.
|
|
95
|
+
target.set(this.binding, this.content.length + policyContentSizeAsBg.length + 1);
|
|
96
|
+
|
|
97
|
+
return target;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export default EmbeddedPolicy;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import AbstractPolicy from './AbstractPolicy.js';
|
|
2
|
+
import EmbeddedPolicy from './EmbeddedPolicy.js';
|
|
3
|
+
import RemotePolicy from './RemotePolicy.js';
|
|
4
|
+
import PolicyTypeEnum from '../../enum/PolicyTypeEnum.js';
|
|
5
|
+
import { UnsupportedFeatureError } from '../../../errors.js';
|
|
6
|
+
import CurveNameEnum from '../../enum/CurveNameEnum.js';
|
|
7
|
+
|
|
8
|
+
function parse(
|
|
9
|
+
buff: Uint8Array,
|
|
10
|
+
useEcdsaBinding: boolean,
|
|
11
|
+
curve: CurveNameEnum
|
|
12
|
+
): { policy: AbstractPolicy; offset: number } | never {
|
|
13
|
+
const type = buff[AbstractPolicy.TYPE_BYTE_OFF];
|
|
14
|
+
let policy: AbstractPolicy;
|
|
15
|
+
let offset: number;
|
|
16
|
+
|
|
17
|
+
// Check if remote policy
|
|
18
|
+
if (type === PolicyTypeEnum.Remote) {
|
|
19
|
+
({ policy, offset } = RemotePolicy.parse(
|
|
20
|
+
buff.subarray(AbstractPolicy.TYPE_BYTE_LEN),
|
|
21
|
+
useEcdsaBinding
|
|
22
|
+
));
|
|
23
|
+
} else if (
|
|
24
|
+
[
|
|
25
|
+
// Check if is an embedded policy
|
|
26
|
+
PolicyTypeEnum.EmbeddedEncrypted,
|
|
27
|
+
PolicyTypeEnum.EmbeddedEncryptedPKA,
|
|
28
|
+
PolicyTypeEnum.EmbeddedText,
|
|
29
|
+
].includes(type)
|
|
30
|
+
) {
|
|
31
|
+
({ policy, offset } = EmbeddedPolicy.parse(
|
|
32
|
+
buff.subarray(AbstractPolicy.TYPE_BYTE_LEN),
|
|
33
|
+
useEcdsaBinding,
|
|
34
|
+
type
|
|
35
|
+
));
|
|
36
|
+
} else {
|
|
37
|
+
throw new UnsupportedFeatureError(`unsupported policy type: ${type}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
policy,
|
|
42
|
+
offset: offset + AbstractPolicy.TYPE_BYTE_LEN,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default {
|
|
47
|
+
parse,
|
|
48
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import AbstractPolicy from './AbstractPolicy.js';
|
|
2
|
+
import ResourceLocator from '../ResourceLocator.js';
|
|
3
|
+
import { RemotePolicyInterface } from '../../interfaces/PolicyInterface.js';
|
|
4
|
+
import PolicyTypeEnum from '../../enum/PolicyTypeEnum.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Set remote policy body
|
|
8
|
+
*
|
|
9
|
+
* If the policy type is set to use a Remote Policy, then the Resource Locator object described in Section 3.4.1 is
|
|
10
|
+
* used to describe the remote policy.
|
|
11
|
+
*/
|
|
12
|
+
class RemotePolicy extends AbstractPolicy implements RemotePolicyInterface {
|
|
13
|
+
override readonly type: PolicyTypeEnum = PolicyTypeEnum.Remote;
|
|
14
|
+
readonly remotePolicy: ResourceLocator;
|
|
15
|
+
|
|
16
|
+
static override parse(
|
|
17
|
+
buff: Uint8Array,
|
|
18
|
+
useEcdsaBinding: boolean
|
|
19
|
+
): { offset: number; policy: RemotePolicy } {
|
|
20
|
+
let offset = 0;
|
|
21
|
+
const resource = ResourceLocator.parse(buff);
|
|
22
|
+
offset += resource.offset;
|
|
23
|
+
|
|
24
|
+
const { binding, newOffset: bindingOffset } = this.parseBinding(buff, useEcdsaBinding, offset);
|
|
25
|
+
offset = bindingOffset;
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
policy: new RemotePolicy(PolicyTypeEnum.Remote, binding, resource),
|
|
29
|
+
offset,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
constructor(type: PolicyTypeEnum, binding: Uint8Array, resource: ResourceLocator) {
|
|
34
|
+
super(type, binding);
|
|
35
|
+
this.type = PolicyTypeEnum.Remote;
|
|
36
|
+
this.remotePolicy = resource;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Length of policy
|
|
41
|
+
*
|
|
42
|
+
* @returns { number } length
|
|
43
|
+
*/
|
|
44
|
+
override getLength(): number {
|
|
45
|
+
return (
|
|
46
|
+
// Type length
|
|
47
|
+
1 +
|
|
48
|
+
// Resource locator length
|
|
49
|
+
this.remotePolicy.length +
|
|
50
|
+
// Binding length
|
|
51
|
+
this.binding.length
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Return the content of the policy
|
|
57
|
+
*/
|
|
58
|
+
override toBuffer(): Uint8Array {
|
|
59
|
+
const target = new Uint8Array(this.getLength());
|
|
60
|
+
|
|
61
|
+
target.set([PolicyTypeEnum.Remote], 0);
|
|
62
|
+
|
|
63
|
+
// Write the remote policy location
|
|
64
|
+
const resourceLocatorAsBuf = this.remotePolicy.toBuffer();
|
|
65
|
+
target.set(resourceLocatorAsBuf, 1);
|
|
66
|
+
|
|
67
|
+
// Write the binding.
|
|
68
|
+
target.set(this.binding, resourceLocatorAsBuf.length + 1);
|
|
69
|
+
|
|
70
|
+
return target;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export default RemotePolicy;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { ConfigurationError, InvalidFileError } from '../../errors.js';
|
|
2
|
+
import ProtocolEnum from '../enum/ProtocolEnum.js';
|
|
3
|
+
import ResourceLocatorIdentifierEnum from '../enum/ResourceLocatorIdentifierEnum.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* The Resource Locator is a way for the nanotdf to represent references to external resources in as succinct a format
|
|
8
|
+
* as possible.
|
|
9
|
+
*
|
|
10
|
+
* | Section | Minimum Length (B) | Maximum Length (B) |
|
|
11
|
+
* |---------------|--------------------|--------------------|
|
|
12
|
+
* | Protocol Enum | 1 | 1 |
|
|
13
|
+
* | Body Length | 1 | 1 |
|
|
14
|
+
* | Body | 1 | 255 |
|
|
15
|
+
* | Identifier | 0 | n |
|
|
16
|
+
*
|
|
17
|
+
* @link https://github.com/virtru/nanotdf/blob/master/spec/index.md#3312-kas
|
|
18
|
+
* @link https://github.com/virtru/nanotdf/blob/master/spec/index.md#341-resource-locator
|
|
19
|
+
*/
|
|
20
|
+
export default class ResourceLocator {
|
|
21
|
+
static readonly PROTOCOL_OFFSET = 0;
|
|
22
|
+
static readonly PROTOCOL_LENGTH = 1;
|
|
23
|
+
static readonly LENGTH_OFFSET = 1;
|
|
24
|
+
static readonly LENGTH_LENGTH = 1;
|
|
25
|
+
static readonly BODY_OFFSET = 2;
|
|
26
|
+
static readonly IDENTIFIER_0_BYTE: number = 0 << 4; // 0
|
|
27
|
+
static readonly IDENTIFIER_2_BYTE: number = 1 << 4; // 16
|
|
28
|
+
static readonly IDENTIFIER_8_BYTE: number = 2 << 4; // 32
|
|
29
|
+
static readonly IDENTIFIER_32_BYTE: number = 3 << 4; // 48
|
|
30
|
+
|
|
31
|
+
constructor(
|
|
32
|
+
readonly protocol: ProtocolEnum,
|
|
33
|
+
readonly lengthOfBody: number,
|
|
34
|
+
readonly body: string,
|
|
35
|
+
readonly offset: number,
|
|
36
|
+
readonly id?: string,
|
|
37
|
+
readonly idType: ResourceLocatorIdentifierEnum = ResourceLocatorIdentifierEnum.None
|
|
38
|
+
) {}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Construct a new URL or URL + identifier pair, for use with NanoTDF envelopes.
|
|
42
|
+
* @param url The URL to encrypt; `http` and `https` schemes are supported
|
|
43
|
+
* @param identifier An optional identifier.
|
|
44
|
+
* For KAS URLs, this is usually a public key identifier (kid). Limit 32 characters
|
|
45
|
+
* @returns a value representing the URL and identifier, if present.
|
|
46
|
+
* This method throws an Error if the URL is invalid or of the wrong schema,
|
|
47
|
+
* or if the identifier is an unsupported value.
|
|
48
|
+
*/
|
|
49
|
+
static fromURL(url: string, identifier?: string): ResourceLocator {
|
|
50
|
+
const [protocolStr, body] = url.split('://');
|
|
51
|
+
|
|
52
|
+
let protocol: ProtocolEnum;
|
|
53
|
+
|
|
54
|
+
// Validate and set protocol identifier byte
|
|
55
|
+
switch (protocolStr.toLowerCase()) {
|
|
56
|
+
case 'http':
|
|
57
|
+
protocol = ProtocolEnum.Http;
|
|
58
|
+
break;
|
|
59
|
+
case 'https':
|
|
60
|
+
protocol = ProtocolEnum.Https;
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
throw new ConfigurationError(`resource locator protocol [${protocolStr}] unsupported`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Set identifier padded length and protocol identifier byte
|
|
67
|
+
const identifierType = (() => {
|
|
68
|
+
if (!identifier) {
|
|
69
|
+
return ResourceLocatorIdentifierEnum.None;
|
|
70
|
+
}
|
|
71
|
+
const identifierLength = new TextEncoder().encode(identifier).length;
|
|
72
|
+
if (identifierLength <= 2) {
|
|
73
|
+
return ResourceLocatorIdentifierEnum.TwoBytes;
|
|
74
|
+
} else if (identifierLength <= 8) {
|
|
75
|
+
return ResourceLocatorIdentifierEnum.EightBytes;
|
|
76
|
+
} else if (identifierLength <= 32) {
|
|
77
|
+
return ResourceLocatorIdentifierEnum.ThirtyTwoBytes;
|
|
78
|
+
}
|
|
79
|
+
throw new ConfigurationError(`unsupported identifier length: ${identifier.length}`);
|
|
80
|
+
})();
|
|
81
|
+
|
|
82
|
+
// Create buffer to hold protocol, body length, body, and identifier
|
|
83
|
+
const lengthOfBody = new TextEncoder().encode(body).length;
|
|
84
|
+
if (lengthOfBody == 0) {
|
|
85
|
+
throw new ConfigurationError('url body empty');
|
|
86
|
+
}
|
|
87
|
+
const identifierLength = identifierType.valueOf();
|
|
88
|
+
const offset = ResourceLocator.BODY_OFFSET + lengthOfBody + identifierLength;
|
|
89
|
+
return new ResourceLocator(protocol, lengthOfBody, body, offset, identifier, identifierType);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static parse(buff: Uint8Array) {
|
|
93
|
+
// Protocol
|
|
94
|
+
const protocolAndIdentifierType = buff[ResourceLocator.PROTOCOL_OFFSET];
|
|
95
|
+
// Length of body
|
|
96
|
+
const lengthOfBody = buff[ResourceLocator.LENGTH_OFFSET];
|
|
97
|
+
if (lengthOfBody == 0) {
|
|
98
|
+
throw new InvalidFileError('url body empty');
|
|
99
|
+
}
|
|
100
|
+
// Body as utf8 string
|
|
101
|
+
const decoder = new TextDecoder();
|
|
102
|
+
let offset = ResourceLocator.BODY_OFFSET + lengthOfBody;
|
|
103
|
+
if (offset > buff.length) {
|
|
104
|
+
throw new InvalidFileError('url parser: out of bounds error');
|
|
105
|
+
}
|
|
106
|
+
const body = decoder.decode(buff.subarray(ResourceLocator.BODY_OFFSET, offset));
|
|
107
|
+
const protocol = protocolAndIdentifierType & 0xf;
|
|
108
|
+
switch (protocol) {
|
|
109
|
+
case ProtocolEnum.Http:
|
|
110
|
+
case ProtocolEnum.Https:
|
|
111
|
+
break;
|
|
112
|
+
default:
|
|
113
|
+
throw new InvalidFileError(`url parser: unsupported protocol type [${protocol}]`);
|
|
114
|
+
}
|
|
115
|
+
// identifier
|
|
116
|
+
const identifierTypeNibble = protocolAndIdentifierType & 0xf0;
|
|
117
|
+
let identifierType = ResourceLocatorIdentifierEnum.None;
|
|
118
|
+
if (identifierTypeNibble === ResourceLocator.IDENTIFIER_2_BYTE) {
|
|
119
|
+
identifierType = ResourceLocatorIdentifierEnum.TwoBytes;
|
|
120
|
+
} else if (identifierTypeNibble === ResourceLocator.IDENTIFIER_8_BYTE) {
|
|
121
|
+
identifierType = ResourceLocatorIdentifierEnum.EightBytes;
|
|
122
|
+
} else if (identifierTypeNibble === ResourceLocator.IDENTIFIER_32_BYTE) {
|
|
123
|
+
identifierType = ResourceLocatorIdentifierEnum.ThirtyTwoBytes;
|
|
124
|
+
} else if (identifierTypeNibble !== ResourceLocator.IDENTIFIER_0_BYTE) {
|
|
125
|
+
throw new InvalidFileError(`url parser: unsupported fragment type [${identifierTypeNibble}]`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
let identifier: string | undefined = undefined;
|
|
129
|
+
|
|
130
|
+
switch (identifierType) {
|
|
131
|
+
case ResourceLocatorIdentifierEnum.None:
|
|
132
|
+
// noop
|
|
133
|
+
break;
|
|
134
|
+
case ResourceLocatorIdentifierEnum.TwoBytes:
|
|
135
|
+
case ResourceLocatorIdentifierEnum.EightBytes:
|
|
136
|
+
case ResourceLocatorIdentifierEnum.ThirtyTwoBytes: {
|
|
137
|
+
const kidStart = offset;
|
|
138
|
+
offset = kidStart + identifierType.valueOf();
|
|
139
|
+
if (offset > buff.length) {
|
|
140
|
+
throw new InvalidFileError('url parser: out of bounds error');
|
|
141
|
+
}
|
|
142
|
+
const kidSubarray = buff.subarray(kidStart, offset);
|
|
143
|
+
// Remove padding (assuming the padding is null bytes, 0x00)
|
|
144
|
+
const zeroIndex = kidSubarray.indexOf(0);
|
|
145
|
+
if (zeroIndex >= 0) {
|
|
146
|
+
const trimmedSubarray = kidSubarray.subarray(0, zeroIndex);
|
|
147
|
+
identifier = decoder.decode(trimmedSubarray);
|
|
148
|
+
} else {
|
|
149
|
+
identifier = decoder.decode(kidSubarray);
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return new ResourceLocator(protocol, lengthOfBody, body, offset, identifier, identifierType);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Length
|
|
159
|
+
*
|
|
160
|
+
* @returns { number } Length of resource locator
|
|
161
|
+
*/
|
|
162
|
+
get length(): number {
|
|
163
|
+
return this.offset;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
get url(): string | never {
|
|
167
|
+
switch (this.protocol) {
|
|
168
|
+
case ProtocolEnum.Http:
|
|
169
|
+
return 'http://' + this.body;
|
|
170
|
+
case ProtocolEnum.Https:
|
|
171
|
+
return 'https://' + this.body;
|
|
172
|
+
default:
|
|
173
|
+
throw new ConfigurationError(`resource locator protocol unsupported [${this.protocol}]`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Return the contents of the Resource Locator in buffer
|
|
179
|
+
*/
|
|
180
|
+
toBuffer(): Uint8Array {
|
|
181
|
+
const target = new Uint8Array(ResourceLocator.BODY_OFFSET + this.body.length + this.idType);
|
|
182
|
+
let idTypeNibble = 0;
|
|
183
|
+
switch (this.idType) {
|
|
184
|
+
case ResourceLocatorIdentifierEnum.TwoBytes:
|
|
185
|
+
idTypeNibble = ResourceLocator.IDENTIFIER_2_BYTE;
|
|
186
|
+
break;
|
|
187
|
+
case ResourceLocatorIdentifierEnum.EightBytes:
|
|
188
|
+
idTypeNibble = ResourceLocator.IDENTIFIER_8_BYTE;
|
|
189
|
+
break;
|
|
190
|
+
case ResourceLocatorIdentifierEnum.ThirtyTwoBytes:
|
|
191
|
+
idTypeNibble = ResourceLocator.IDENTIFIER_32_BYTE;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
target.set([this.protocol | idTypeNibble], ResourceLocator.PROTOCOL_OFFSET);
|
|
195
|
+
target.set([this.lengthOfBody], ResourceLocator.LENGTH_OFFSET);
|
|
196
|
+
target.set(new TextEncoder().encode(this.body), ResourceLocator.BODY_OFFSET);
|
|
197
|
+
if (this.id) {
|
|
198
|
+
target.set(new TextEncoder().encode(this.id), ResourceLocator.BODY_OFFSET + this.body.length);
|
|
199
|
+
}
|
|
200
|
+
return target;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get Identifier
|
|
205
|
+
*
|
|
206
|
+
* Returns the identifier of the ResourceLocator or an empty string if no identifier is present.
|
|
207
|
+
* @returns { string } Identifier of the resource locator.
|
|
208
|
+
*/
|
|
209
|
+
get identifier(): string {
|
|
210
|
+
return this.id ?? '';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import Header from './Header.js';
|
|
2
|
+
import { lengthOfPublicKey, lengthOfSignature } from '../helpers/calculateByCurve.js';
|
|
3
|
+
import { ConfigurationError } from '../../errors.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* NanoTDF Signature
|
|
7
|
+
*
|
|
8
|
+
* The signature section is an optional section that contains an ECDSA signature used to cryptographically bind the Header and Payload to a creator of the nanotdf. The key used for signing is the private key of the creator of the nanotdf. The ECC Params used for the signature are described in Section 3.3.1.4.2. The private key used for this signature is distinctly different than the ephemeral private key. This is a persistent key belonging to an individual, entity, or device that creates nanotdfs. The signature is used to authenticate the entire nanotdf and contains both the public key related to the creators private key and the resulting signature. The structure of this section:
|
|
9
|
+
*
|
|
10
|
+
* | Section | Minimum Length (B) | Maximum Length (B) |
|
|
11
|
+
* |------------|--------------------|--------------------|
|
|
12
|
+
* | Public Key | 33 | 67 |
|
|
13
|
+
* | Signature | 64 | 132 |
|
|
14
|
+
*
|
|
15
|
+
* @link https://github.com/virtru/nanotdf/blob/master/spec/index.md#333-signature
|
|
16
|
+
*/
|
|
17
|
+
export default class Signature {
|
|
18
|
+
public publicKey: Uint8Array;
|
|
19
|
+
public signature: Uint8Array;
|
|
20
|
+
|
|
21
|
+
static parse(header: Header, buff: Uint8Array): { signature: Signature; offset: number } | never {
|
|
22
|
+
let offset = 0;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Parse the public key
|
|
26
|
+
*
|
|
27
|
+
* This section contains the compressed public key of the private key used to sign the message.
|
|
28
|
+
*/
|
|
29
|
+
// TODO: Resolve where offset is missing 1 byte
|
|
30
|
+
const publicKeyLength = lengthOfPublicKey(header.signatureCurveName) + 1;
|
|
31
|
+
const publicKey = buff.subarray(offset, offset + publicKeyLength);
|
|
32
|
+
offset += publicKeyLength;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parse signature
|
|
36
|
+
*
|
|
37
|
+
* This section contains the encoded `r` and `s` values of the ECDSA signature.
|
|
38
|
+
*
|
|
39
|
+
* ECDSA signatures are big endian encodings of the `r` and `s` values of an ECDSA signature.The length of `r` and `s`
|
|
40
|
+
* values is determined by the ECC Mode used for the signature. The encoding for the signature is the big endian
|
|
41
|
+
* encodings of R and S concatenated to each other. For example, `r = 1` and `s = 2` for an ECDSA signature of a
|
|
42
|
+
* ecp256k1 key would be (line breaks and spaces are added for easier visualization):
|
|
43
|
+
*
|
|
44
|
+
* ```
|
|
45
|
+
* 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
46
|
+
* 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
|
|
47
|
+
* 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
48
|
+
* 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @link https://github.com/virtru/nanotdf/blob/master/spec/index.md#52-ecdsa-signature-encoding
|
|
52
|
+
*/
|
|
53
|
+
const signatureLength = lengthOfSignature(header.signatureCurveName);
|
|
54
|
+
const signature = buff.subarray(offset, offset + signatureLength);
|
|
55
|
+
offset += signatureLength;
|
|
56
|
+
|
|
57
|
+
return { signature: new Signature(publicKey, signature), offset };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
constructor(publicKey: Uint8Array, signature: Uint8Array) {
|
|
61
|
+
this.publicKey = publicKey;
|
|
62
|
+
this.signature = signature;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Length
|
|
67
|
+
*
|
|
68
|
+
* @returns { number } Length of signature
|
|
69
|
+
*/
|
|
70
|
+
get length(): number {
|
|
71
|
+
return this.publicKey.length + this.signature.length;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Copy the contents of the signature to buffer
|
|
76
|
+
*/
|
|
77
|
+
copyToBuffer(target: Uint8Array): void {
|
|
78
|
+
if (this.length > target.length) {
|
|
79
|
+
throw new ConfigurationError('Invalid buffer size to copy signature');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
target.set(this.publicKey, 0);
|
|
83
|
+
target.set(this.signature, this.publicKey.length);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Ciphers, CipherTagLengths } from './ciphers.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Decrypt plaintext buffer to plaintext buffer
|
|
5
|
+
*
|
|
6
|
+
* Only supports AES-GCM
|
|
7
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt
|
|
8
|
+
*
|
|
9
|
+
* @param key Encryption key
|
|
10
|
+
* @param ciphertext Encrypted buffer
|
|
11
|
+
* @param iv Initialization vector
|
|
12
|
+
* @param tagLength Size (bits) of authentication tag
|
|
13
|
+
* @returns Resolves plaintext buffer
|
|
14
|
+
*/
|
|
15
|
+
export default async function decrypt(
|
|
16
|
+
key: CryptoKey,
|
|
17
|
+
ciphertext: Uint8Array,
|
|
18
|
+
iv: Uint8Array,
|
|
19
|
+
tagLength?: number
|
|
20
|
+
): Promise<ArrayBuffer> {
|
|
21
|
+
return crypto.subtle.decrypt(
|
|
22
|
+
{
|
|
23
|
+
name: Ciphers.AesGcm,
|
|
24
|
+
iv,
|
|
25
|
+
tagLength: tagLength || CipherTagLengths.AesGcm,
|
|
26
|
+
},
|
|
27
|
+
key,
|
|
28
|
+
ciphertext
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ConfigurationError } from '../errors.js';
|
|
2
|
+
import { AlgorithmName } from './../nanotdf-crypto/enums.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Computes an ECDSA signature for the given data using the provided private key.
|
|
6
|
+
*
|
|
7
|
+
* This function uses the Web Crypto API to generate a digital signature
|
|
8
|
+
* for the input data using the ECDSA algorithm with SHA-256 as the hash function.
|
|
9
|
+
*
|
|
10
|
+
* @param {CryptoKey} privateKey - The ECDSA private key used for signing.
|
|
11
|
+
* @param {Uint8Array} data - The data to be signed.
|
|
12
|
+
* @returns {Promise<ArrayBuffer>} - A promise that resolves to the generated signature.
|
|
13
|
+
*/
|
|
14
|
+
export async function computeECDSASig(
|
|
15
|
+
privateKey: CryptoKey,
|
|
16
|
+
data: Uint8Array
|
|
17
|
+
): Promise<ArrayBuffer> {
|
|
18
|
+
const signature = await crypto.subtle.sign(
|
|
19
|
+
{
|
|
20
|
+
name: AlgorithmName.ECDSA,
|
|
21
|
+
hash: { name: 'SHA-256' },
|
|
22
|
+
},
|
|
23
|
+
privateKey,
|
|
24
|
+
data
|
|
25
|
+
);
|
|
26
|
+
return signature;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Verifies an ECDSA signature using the provided public key and data.
|
|
31
|
+
*
|
|
32
|
+
* This function uses the Web Crypto API to verify the digital signature
|
|
33
|
+
* for the input data using the ECDSA algorithm with SHA-256 as the hash function.
|
|
34
|
+
*
|
|
35
|
+
* @param {CryptoKey} publicKey - The ECDSA public key used for verification.
|
|
36
|
+
* @param {Uint8Array} signature - The signature to be verified.
|
|
37
|
+
* @param {Uint8Array} data - The data that was signed.
|
|
38
|
+
* @returns {Promise<boolean>} - A promise that resolves to a boolean indicating whether the signature is valid.
|
|
39
|
+
*/
|
|
40
|
+
export async function verifyECDSASignature(
|
|
41
|
+
publicKey: CryptoKey,
|
|
42
|
+
signature: Uint8Array,
|
|
43
|
+
data: Uint8Array
|
|
44
|
+
): Promise<boolean> {
|
|
45
|
+
const isValid = await crypto.subtle.verify(
|
|
46
|
+
{
|
|
47
|
+
name: AlgorithmName.ECDSA,
|
|
48
|
+
hash: { name: 'SHA-256' },
|
|
49
|
+
},
|
|
50
|
+
publicKey,
|
|
51
|
+
signature,
|
|
52
|
+
data
|
|
53
|
+
);
|
|
54
|
+
return isValid;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Extracts the r and s values from a given ECDSA signature.
|
|
59
|
+
*
|
|
60
|
+
* @param {Uint8Array} signatureBytes - The raw ECDSA signature bytes.
|
|
61
|
+
* @returns {{ r: Uint8Array; s: Uint8Array }} An object containing the r and s values as Uint8Arrays.
|
|
62
|
+
* @throws {Error} If the validation of the signature fails.
|
|
63
|
+
*/
|
|
64
|
+
export function extractRSValuesFromSignature(signatureBytes: Uint8Array): {
|
|
65
|
+
r: Uint8Array;
|
|
66
|
+
s: Uint8Array;
|
|
67
|
+
} {
|
|
68
|
+
// Split the raw signature into r and s values
|
|
69
|
+
const halfLength = Math.floor(signatureBytes.length / 2);
|
|
70
|
+
const rValue = signatureBytes.slice(0, halfLength);
|
|
71
|
+
const sValue = signatureBytes.slice(halfLength);
|
|
72
|
+
|
|
73
|
+
// Correct validation
|
|
74
|
+
if (!concatAndCompareUint8Arrays(rValue, sValue, signatureBytes)) {
|
|
75
|
+
throw new ConfigurationError('invalid ECDSA signature');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
r: rValue,
|
|
80
|
+
s: sValue,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function concatAndCompareUint8Arrays(
|
|
85
|
+
arr1: Uint8Array,
|
|
86
|
+
arr2: Uint8Array,
|
|
87
|
+
arr3: Uint8Array
|
|
88
|
+
): boolean {
|
|
89
|
+
// Create a new Uint8Array with the combined length of arr1 and arr2
|
|
90
|
+
const concatenated = new Uint8Array(arr1.length + arr2.length);
|
|
91
|
+
|
|
92
|
+
// Copy arr1 and arr2 into the new array
|
|
93
|
+
concatenated.set(arr1, 0);
|
|
94
|
+
concatenated.set(arr2, arr1.length);
|
|
95
|
+
|
|
96
|
+
// Check if the lengths are the same
|
|
97
|
+
if (concatenated.length !== arr3.length) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Compare each element
|
|
102
|
+
for (let i = 0; i < concatenated.length; i++) {
|
|
103
|
+
if (concatenated[i] !== arr3[i]) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return true;
|
|
109
|
+
}
|