@opentdf/sdk 0.1.0-beta.1718 → 0.2.0-beta.1941
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 +45 -38
- package/dist/cjs/src/access.js +99 -62
- package/dist/cjs/src/auth/auth.js +5 -26
- package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +1 -1
- package/dist/cjs/src/auth/oidc-externaljwt-provider.js +1 -1
- package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +1 -1
- package/dist/cjs/src/auth/oidc.js +1 -1
- package/dist/cjs/src/auth/providers.js +1 -1
- package/dist/cjs/src/concurrency.js +3 -4
- package/dist/cjs/src/encodings/base64.js +4 -4
- package/dist/cjs/src/encodings/hex.js +5 -6
- package/dist/cjs/src/encodings/index.js +18 -8
- package/dist/cjs/src/errors.js +1 -1
- package/dist/cjs/src/index.js +28 -320
- package/dist/cjs/src/nanoclients.js +285 -0
- package/dist/cjs/src/nanoindex.js +47 -0
- package/dist/cjs/src/nanotdf/Client.js +35 -30
- package/dist/cjs/src/nanotdf/NanoTDF.js +1 -1
- package/dist/cjs/src/nanotdf/decrypt.js +2 -2
- package/dist/cjs/src/nanotdf/encrypt-dataset.js +2 -2
- package/dist/cjs/src/nanotdf/encrypt.js +2 -2
- package/dist/cjs/src/nanotdf/helpers/calculateByCurve.js +3 -4
- package/dist/cjs/src/nanotdf/helpers/getHkdfSalt.js +2 -2
- package/dist/cjs/src/nanotdf/models/Ciphers.js +3 -3
- package/dist/cjs/src/nanotdf/models/EcCurves.js +3 -3
- package/dist/cjs/src/nanotdf/models/Header.js +1 -1
- package/dist/cjs/src/nanotdf/models/Payload.js +1 -1
- package/dist/cjs/src/nanotdf/models/Policy/AbstractPolicy.js +1 -1
- package/dist/cjs/src/nanotdf/models/Policy/EmbeddedPolicy.js +1 -1
- package/dist/cjs/src/nanotdf/models/Policy/PolicyFactory.js +1 -1
- package/dist/cjs/src/nanotdf/models/ResourceLocator.js +1 -1
- package/dist/cjs/src/nanotdf/models/Signature.js +1 -1
- package/dist/cjs/src/nanotdf-crypto/ciphers.js +1 -1
- package/dist/cjs/src/nanotdf-crypto/decrypt.js +2 -2
- package/dist/cjs/src/nanotdf-crypto/digest.js +2 -2
- package/dist/cjs/src/nanotdf-crypto/ecdsaSignature.js +4 -5
- package/dist/cjs/src/nanotdf-crypto/encrypt.js +2 -2
- package/dist/cjs/src/nanotdf-crypto/exportCryptoKey.js +2 -2
- package/dist/cjs/src/nanotdf-crypto/generateKeyPair.js +2 -2
- package/dist/cjs/src/nanotdf-crypto/generateRandomNumber.js +2 -2
- package/dist/cjs/src/nanotdf-crypto/index.js +21 -13
- package/dist/cjs/src/nanotdf-crypto/keyAgreement.js +10 -8
- package/dist/cjs/src/nanotdf-crypto/pemPublicToCrypto.js +20 -11
- package/dist/cjs/src/opentdf.js +243 -0
- package/dist/cjs/src/policy/api.js +2 -3
- package/dist/cjs/src/policy/granter.js +3 -4
- package/dist/cjs/src/seekable.js +157 -0
- package/dist/cjs/src/tdf/AttributeObject.js +2 -4
- package/dist/cjs/src/tdf/Policy.js +3 -3
- package/dist/cjs/src/utils.js +13 -21
- package/dist/cjs/src/version.js +7 -3
- package/dist/cjs/tdf3/index.js +27 -16
- package/dist/cjs/tdf3/src/assertions.js +25 -11
- package/dist/cjs/tdf3/src/binary.js +1 -1
- package/dist/cjs/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
- package/dist/cjs/tdf3/src/ciphers/symmetric-cipher-base.js +1 -1
- package/dist/cjs/tdf3/src/client/DecoratedReadableStream.js +7 -74
- package/dist/cjs/tdf3/src/client/builders.js +26 -22
- package/dist/cjs/tdf3/src/client/index.js +91 -117
- package/dist/cjs/tdf3/src/client/validation.js +3 -3
- package/dist/cjs/tdf3/src/crypto/crypto-utils.js +1 -1
- package/dist/cjs/tdf3/src/crypto/index.js +18 -18
- package/dist/cjs/tdf3/src/index.js +22 -11
- package/dist/cjs/tdf3/src/models/attribute-set.js +1 -1
- package/dist/cjs/tdf3/src/models/encryption-information.js +3 -3
- package/dist/cjs/tdf3/src/models/index.js +1 -2
- package/dist/cjs/tdf3/src/models/key-access.js +67 -35
- package/dist/cjs/tdf3/src/models/policy.js +3 -3
- package/dist/cjs/tdf3/src/tdf.js +180 -395
- package/dist/cjs/tdf3/src/utils/buffer-crc32.js +2 -3
- package/dist/cjs/tdf3/src/utils/index.js +48 -38
- package/dist/cjs/tdf3/src/utils/keysplit.js +4 -5
- package/dist/cjs/tdf3/src/utils/unwrap.js +21 -0
- package/dist/cjs/tdf3/src/utils/zip-reader.js +4 -4
- package/dist/cjs/tdf3/src/utils/zip-writer.js +4 -4
- package/dist/types/src/access.d.ts +10 -4
- package/dist/types/src/access.d.ts.map +1 -1
- package/dist/types/src/auth/auth.d.ts +1 -28
- package/dist/types/src/auth/auth.d.ts.map +1 -1
- package/dist/types/src/auth/providers.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +5 -136
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/nanoclients.d.ts +107 -0
- package/dist/types/src/nanoclients.d.ts.map +1 -0
- package/dist/types/src/nanoindex.d.ts +5 -0
- package/dist/types/src/nanoindex.d.ts.map +1 -0
- package/dist/types/src/nanotdf/Client.d.ts +1 -13
- package/dist/types/src/nanotdf/Client.d.ts.map +1 -1
- package/dist/types/src/nanotdf/NanoTDF.d.ts +1 -1
- package/dist/types/src/nanotdf/NanoTDF.d.ts.map +1 -1
- package/dist/types/src/nanotdf/encrypt-dataset.d.ts +1 -1
- package/dist/types/src/nanotdf/encrypt-dataset.d.ts.map +1 -1
- package/dist/types/src/nanotdf/encrypt.d.ts +1 -1
- package/dist/types/src/nanotdf/encrypt.d.ts.map +1 -1
- package/dist/types/src/nanotdf/enum/CipherEnum.d.ts +1 -1
- package/dist/types/src/nanotdf/enum/CipherEnum.d.ts.map +1 -1
- package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts +1 -1
- package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts.map +1 -1
- package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts +1 -1
- package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts.map +1 -1
- package/dist/types/src/nanotdf/models/DefaultParams.d.ts +1 -1
- package/dist/types/src/nanotdf/models/ResourceLocator.d.ts.map +1 -1
- package/dist/types/src/nanotdf-crypto/digest.d.ts +1 -1
- package/dist/types/src/nanotdf-crypto/digest.d.ts.map +1 -1
- package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts +1 -1
- package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts.map +1 -1
- package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts +1 -1
- package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts.map +1 -1
- package/dist/types/src/nanotdf-crypto/index.d.ts +2 -3
- package/dist/types/src/nanotdf-crypto/index.d.ts.map +1 -1
- package/dist/types/src/nanotdf-crypto/keyAgreement.d.ts.map +1 -1
- package/dist/types/src/opentdf.d.ts +106 -0
- package/dist/types/src/opentdf.d.ts.map +1 -0
- package/dist/types/src/seekable.d.ts +39 -0
- package/dist/types/src/seekable.d.ts.map +1 -0
- package/dist/types/src/tdf/AttributeObject.d.ts +0 -2
- package/dist/types/src/tdf/AttributeObject.d.ts.map +1 -1
- package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts +2 -2
- package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts.map +1 -1
- package/dist/types/src/tdf/Policy.d.ts +1 -1
- package/dist/types/src/tdf/Policy.d.ts.map +1 -1
- package/dist/types/src/tdf/PolicyObject.d.ts +1 -2
- package/dist/types/src/tdf/PolicyObject.d.ts.map +1 -1
- package/dist/types/src/tdf/TypedArray.d.ts +1 -2
- package/dist/types/src/tdf/TypedArray.d.ts.map +1 -1
- package/dist/types/src/utils.d.ts +1 -3
- package/dist/types/src/utils.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +5 -1
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/types/tdf3/index.d.ts +5 -4
- package/dist/types/tdf3/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/assertions.d.ts +3 -3
- package/dist/types/tdf3/src/assertions.d.ts.map +1 -1
- package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts +2 -15
- package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts.map +1 -1
- package/dist/types/tdf3/src/client/builders.d.ts +43 -42
- package/dist/types/tdf3/src/client/builders.d.ts.map +1 -1
- package/dist/types/tdf3/src/client/index.d.ts +12 -17
- package/dist/types/tdf3/src/client/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/client/validation.d.ts +3 -3
- package/dist/types/tdf3/src/client/validation.d.ts.map +1 -1
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts.map +1 -1
- package/dist/types/tdf3/src/index.d.ts +1 -1
- package/dist/types/tdf3/src/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/models/index.d.ts +0 -1
- package/dist/types/tdf3/src/models/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/models/key-access.d.ts +63 -15
- package/dist/types/tdf3/src/models/key-access.d.ts.map +1 -1
- package/dist/types/tdf3/src/models/manifest.d.ts +2 -0
- package/dist/types/tdf3/src/models/manifest.d.ts.map +1 -1
- package/dist/types/tdf3/src/models/policy.d.ts +0 -1
- package/dist/types/tdf3/src/models/policy.d.ts.map +1 -1
- package/dist/types/tdf3/src/tdf.d.ts +24 -37
- package/dist/types/tdf3/src/tdf.d.ts.map +1 -1
- package/dist/types/tdf3/src/utils/index.d.ts +0 -4
- package/dist/types/tdf3/src/utils/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/utils/unwrap.d.ts +2 -0
- package/dist/types/tdf3/src/utils/unwrap.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/zip-reader.d.ts +1 -1
- package/dist/types/tdf3/src/utils/zip-reader.d.ts.map +1 -1
- package/dist/types/tdf3/src/utils/zip-writer.d.ts +2 -2
- package/dist/web/src/access.js +93 -58
- package/dist/web/src/auth/auth.js +1 -21
- package/dist/web/src/auth/oidc-clientcredentials-provider.js +1 -1
- package/dist/web/src/auth/oidc-externaljwt-provider.js +1 -1
- package/dist/web/src/auth/oidc-refreshtoken-provider.js +1 -1
- package/dist/web/src/auth/oidc.js +1 -1
- package/dist/web/src/auth/providers.js +1 -1
- package/dist/web/src/concurrency.js +1 -1
- package/dist/web/src/encodings/base64.js +1 -1
- package/dist/web/src/encodings/hex.js +1 -1
- package/dist/web/src/errors.js +1 -1
- package/dist/web/src/index.js +6 -312
- package/dist/web/src/nanoclients.js +280 -0
- package/dist/web/src/nanoindex.js +5 -0
- package/dist/web/src/nanotdf/Client.js +18 -23
- package/dist/web/src/nanotdf/NanoTDF.js +1 -1
- package/dist/web/src/nanotdf/encrypt-dataset.js +1 -1
- package/dist/web/src/nanotdf/encrypt.js +1 -1
- package/dist/web/src/nanotdf/models/Ciphers.js +1 -1
- package/dist/web/src/nanotdf/models/EcCurves.js +1 -1
- package/dist/web/src/nanotdf/models/Header.js +1 -1
- package/dist/web/src/nanotdf/models/Payload.js +1 -1
- package/dist/web/src/nanotdf/models/Policy/AbstractPolicy.js +1 -1
- package/dist/web/src/nanotdf/models/Policy/EmbeddedPolicy.js +1 -1
- package/dist/web/src/nanotdf/models/Policy/PolicyFactory.js +1 -1
- package/dist/web/src/nanotdf/models/ResourceLocator.js +1 -1
- package/dist/web/src/nanotdf/models/Signature.js +1 -1
- package/dist/web/src/nanotdf-crypto/ciphers.js +1 -1
- package/dist/web/src/nanotdf-crypto/ecdsaSignature.js +1 -1
- package/dist/web/src/nanotdf-crypto/generateKeyPair.js +2 -2
- package/dist/web/src/nanotdf-crypto/generateRandomNumber.js +2 -2
- package/dist/web/src/nanotdf-crypto/index.js +3 -4
- package/dist/web/src/nanotdf-crypto/keyAgreement.js +9 -6
- package/dist/web/src/nanotdf-crypto/pemPublicToCrypto.js +1 -1
- package/dist/web/src/opentdf.js +234 -0
- package/dist/web/src/policy/api.js +1 -1
- package/dist/web/src/policy/granter.js +1 -1
- package/dist/web/src/seekable.js +148 -0
- package/dist/web/src/tdf/AttributeObject.js +1 -2
- package/dist/web/src/tdf/Policy.js +2 -4
- package/dist/web/src/utils.js +3 -10
- package/dist/web/src/version.js +6 -2
- package/dist/web/tdf3/index.js +5 -4
- package/dist/web/tdf3/src/assertions.js +21 -6
- package/dist/web/tdf3/src/binary.js +1 -1
- package/dist/web/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
- package/dist/web/tdf3/src/ciphers/symmetric-cipher-base.js +1 -1
- package/dist/web/tdf3/src/client/DecoratedReadableStream.js +4 -68
- package/dist/web/tdf3/src/client/builders.js +26 -22
- package/dist/web/tdf3/src/client/index.js +74 -105
- package/dist/web/tdf3/src/client/validation.js +1 -1
- package/dist/web/tdf3/src/crypto/crypto-utils.js +1 -1
- package/dist/web/tdf3/src/crypto/index.js +1 -1
- package/dist/web/tdf3/src/index.js +2 -2
- package/dist/web/tdf3/src/models/attribute-set.js +1 -1
- package/dist/web/tdf3/src/models/encryption-information.js +3 -3
- package/dist/web/tdf3/src/models/index.js +1 -2
- package/dist/web/tdf3/src/models/key-access.js +47 -24
- package/dist/web/tdf3/src/models/policy.js +1 -1
- package/dist/web/tdf3/src/tdf.js +153 -371
- package/dist/web/tdf3/src/utils/buffer-crc32.js +1 -1
- package/dist/web/tdf3/src/utils/index.js +19 -14
- package/dist/web/tdf3/src/utils/keysplit.js +1 -1
- package/dist/web/tdf3/src/utils/unwrap.js +18 -0
- package/dist/web/tdf3/src/utils/zip-reader.js +1 -1
- package/dist/web/tdf3/src/utils/zip-writer.js +1 -1
- package/package.json +45 -45
- package/src/access.ts +111 -54
- package/src/auth/auth.ts +1 -31
- package/src/index.ts +5 -440
- package/src/nanoclients.ts +405 -0
- package/src/nanoindex.ts +4 -0
- package/src/nanotdf/Client.ts +18 -25
- package/src/nanotdf/NanoTDF.ts +1 -1
- package/src/nanotdf/encrypt-dataset.ts +1 -1
- package/src/nanotdf/encrypt.ts +1 -1
- package/src/nanotdf/helpers/getHkdfSalt.ts +1 -1
- package/src/nanotdf-crypto/digest.ts +1 -1
- package/src/nanotdf-crypto/generateKeyPair.ts +1 -1
- package/src/nanotdf-crypto/generateRandomNumber.ts +1 -1
- package/src/nanotdf-crypto/index.ts +2 -3
- package/src/nanotdf-crypto/keyAgreement.ts +14 -7
- package/src/opentdf.ts +441 -0
- package/src/seekable.ts +180 -0
- package/src/tdf/AttributeObject.ts +0 -3
- package/src/tdf/Policy.ts +1 -2
- package/src/tdf/PolicyObject.ts +1 -2
- package/src/tdf/TypedArray.ts +1 -3
- package/src/utils.ts +3 -11
- package/src/version.ts +6 -1
- package/tdf3/index.ts +15 -10
- package/tdf3/src/assertions.ts +33 -8
- package/tdf3/src/client/DecoratedReadableStream.ts +3 -80
- package/tdf3/src/client/builders.ts +44 -28
- package/tdf3/src/client/index.ts +109 -165
- package/tdf3/src/index.ts +1 -1
- package/tdf3/src/models/encryption-information.ts +2 -2
- package/tdf3/src/models/index.ts +0 -1
- package/tdf3/src/models/key-access.ts +120 -38
- package/tdf3/src/models/manifest.ts +3 -0
- package/tdf3/src/models/policy.ts +0 -1
- package/tdf3/src/tdf.ts +266 -522
- package/tdf3/src/utils/index.ts +19 -18
- package/tdf3/src/utils/unwrap.ts +17 -0
- package/tdf3/src/utils/zip-reader.ts +1 -1
- package/dist/cjs/src/auth/Eas.js +0 -60
- package/dist/cjs/src/nanotdf-crypto/importRawKey.js +0 -18
- package/dist/cjs/src/tdf/Crypto.js +0 -47
- package/dist/cjs/src/tdf/EntityObject.js +0 -3
- package/dist/cjs/src/tdf/index.js +0 -35
- package/dist/cjs/tdf3/src/models/upsert-response.js +0 -3
- package/dist/cjs/tdf3/src/templates/default.html.js +0 -98
- package/dist/cjs/tdf3/src/templates/escaper.js +0 -15
- package/dist/cjs/tdf3/src/templates/index.js +0 -12
- package/dist/cjs/tdf3/src/utils/chunkers.js +0 -106
- package/dist/cjs/tdf3/src/version.js +0 -6
- package/dist/types/src/auth/Eas.d.ts +0 -34
- package/dist/types/src/auth/Eas.d.ts.map +0 -1
- package/dist/types/src/nanotdf-crypto/importRawKey.d.ts +0 -13
- package/dist/types/src/nanotdf-crypto/importRawKey.d.ts.map +0 -1
- package/dist/types/src/tdf/Crypto.d.ts +0 -37
- package/dist/types/src/tdf/Crypto.d.ts.map +0 -1
- package/dist/types/src/tdf/EntityObject.d.ts +0 -18
- package/dist/types/src/tdf/EntityObject.d.ts.map +0 -1
- package/dist/types/src/tdf/index.d.ts +0 -7
- package/dist/types/src/tdf/index.d.ts.map +0 -1
- package/dist/types/tdf3/src/models/upsert-response.d.ts +0 -16
- package/dist/types/tdf3/src/models/upsert-response.d.ts.map +0 -1
- package/dist/types/tdf3/src/templates/default.html.d.ts +0 -8
- package/dist/types/tdf3/src/templates/default.html.d.ts.map +0 -1
- package/dist/types/tdf3/src/templates/escaper.d.ts +0 -6
- package/dist/types/tdf3/src/templates/escaper.d.ts.map +0 -1
- package/dist/types/tdf3/src/templates/index.d.ts +0 -3
- package/dist/types/tdf3/src/templates/index.d.ts.map +0 -1
- package/dist/types/tdf3/src/utils/chunkers.d.ts +0 -29
- package/dist/types/tdf3/src/utils/chunkers.d.ts.map +0 -1
- package/dist/types/tdf3/src/version.d.ts +0 -3
- package/dist/types/tdf3/src/version.d.ts.map +0 -1
- package/dist/web/src/auth/Eas.js +0 -55
- package/dist/web/src/nanotdf-crypto/importRawKey.js +0 -15
- package/dist/web/src/tdf/Crypto.js +0 -44
- package/dist/web/src/tdf/EntityObject.js +0 -2
- package/dist/web/src/tdf/index.js +0 -4
- package/dist/web/tdf3/src/models/upsert-response.js +0 -2
- package/dist/web/tdf3/src/templates/default.html.js +0 -96
- package/dist/web/tdf3/src/templates/escaper.js +0 -10
- package/dist/web/tdf3/src/templates/index.js +0 -3
- package/dist/web/tdf3/src/utils/chunkers.js +0 -96
- package/dist/web/tdf3/src/version.js +0 -3
- package/src/auth/Eas.ts +0 -79
- package/src/nanotdf-crypto/importRawKey.ts +0 -19
- package/src/tdf/Crypto.ts +0 -42
- package/src/tdf/EntityObject.ts +0 -18
- package/src/tdf/index.ts +0 -6
- package/tdf3/src/models/upsert-response.ts +0 -17
- package/tdf3/src/templates/default.html.ts +0 -105
- package/tdf3/src/templates/escaper.ts +0 -10
- package/tdf3/src/templates/index.ts +0 -2
- package/tdf3/src/utils/chunkers.ts +0 -118
- package/tdf3/src/version.ts +0 -2
package/dist/cjs/tdf3/src/tdf.js
CHANGED
|
@@ -15,174 +15,81 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
28
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
exports.fetchKasPublicKey = fetchKasPublicKey;
|
|
37
|
+
exports.extractPemFromKeyString = extractPemFromKeyString;
|
|
38
|
+
exports.buildKeyAccess = buildKeyAccess;
|
|
39
|
+
exports.validatePolicyObject = validatePolicyObject;
|
|
40
|
+
exports.writeStream = writeStream;
|
|
41
|
+
exports.loadTDFStream = loadTDFStream;
|
|
42
|
+
exports.splitLookupTableFactory = splitLookupTableFactory;
|
|
43
|
+
exports.sliceAndDecrypt = sliceAndDecrypt;
|
|
44
|
+
exports.readStream = readStream;
|
|
32
45
|
const jose_1 = require("jose");
|
|
33
|
-
const DecoratedReadableStream_js_1 = require("./client/DecoratedReadableStream.js");
|
|
34
|
-
const utils_js_1 = require("../../src/utils.js");
|
|
35
|
-
const assertions = __importStar(require("./assertions.js"));
|
|
36
|
-
const index_js_1 = require("./models/index.js");
|
|
37
|
-
const index_js_2 = require("../../src/encodings/index.js");
|
|
38
|
-
const index_js_3 = require("./utils/index.js");
|
|
39
|
-
const binary_js_1 = require("./binary.js");
|
|
40
46
|
const access_js_1 = require("../../src/access.js");
|
|
41
|
-
const errors_js_1 = require("../../src/errors.js");
|
|
42
|
-
const index_js_4 = require("./templates/index.js");
|
|
43
|
-
// configurable
|
|
44
|
-
// TODO: remove dependencies from ciphers so that we can open-source instead of relying on other Virtru libs
|
|
45
|
-
const index_js_5 = require("./ciphers/index.js");
|
|
46
47
|
const auth_js_1 = require("../../src/auth/auth.js");
|
|
47
48
|
const concurrency_js_1 = require("../../src/concurrency.js");
|
|
49
|
+
const index_js_1 = require("../../src/encodings/index.js");
|
|
50
|
+
const errors_js_1 = require("../../src/errors.js");
|
|
51
|
+
const generateKeyPair_js_1 = require("../../src/nanotdf-crypto/generateKeyPair.js");
|
|
52
|
+
const keyAgreement_js_1 = require("../../src/nanotdf-crypto/keyAgreement.js");
|
|
53
|
+
const pemPublicToCrypto_js_1 = require("../../src/nanotdf-crypto/pemPublicToCrypto.js");
|
|
54
|
+
const version_js_1 = require("../../src/version.js");
|
|
55
|
+
const assertions = __importStar(require("./assertions.js"));
|
|
56
|
+
const binary_js_1 = require("./binary.js");
|
|
57
|
+
const aes_gcm_cipher_js_1 = require("./ciphers/aes-gcm-cipher.js");
|
|
58
|
+
const DecoratedReadableStream_js_1 = require("./client/DecoratedReadableStream.js");
|
|
59
|
+
const index_js_2 = require("./models/index.js");
|
|
60
|
+
const buffer_crc32_js_1 = require("./utils/buffer-crc32.js");
|
|
61
|
+
const index_js_3 = require("./utils/index.js");
|
|
48
62
|
// TODO: input validation on manifest JSON
|
|
49
63
|
const DEFAULT_SEGMENT_SIZE = 1024 * 1024;
|
|
64
|
+
function mailbox() {
|
|
65
|
+
let set;
|
|
66
|
+
let reject;
|
|
67
|
+
const promise = new Promise((resolve, rejectFn) => {
|
|
68
|
+
set = resolve;
|
|
69
|
+
reject = rejectFn;
|
|
70
|
+
});
|
|
71
|
+
promise.set = set;
|
|
72
|
+
promise.reject = reject;
|
|
73
|
+
return promise;
|
|
74
|
+
}
|
|
50
75
|
/**
|
|
51
76
|
* If we have KAS url but not public key we can fetch it from KAS, fetching
|
|
52
77
|
* the value from `${kas}/kas_public_key`.
|
|
53
78
|
*/
|
|
54
79
|
async function fetchKasPublicKey(kas, algorithm) {
|
|
55
|
-
|
|
56
|
-
throw new errors_js_1.ConfigurationError('KAS definition not found');
|
|
57
|
-
}
|
|
58
|
-
// Logs insecure KAS. Secure is enforced in constructor
|
|
59
|
-
(0, utils_js_1.validateSecureUrl)(kas);
|
|
60
|
-
const infoStatic = { url: kas, algorithm: algorithm || 'rsa:2048' };
|
|
61
|
-
const params = {};
|
|
62
|
-
if (algorithm) {
|
|
63
|
-
params.algorithm = algorithm;
|
|
64
|
-
}
|
|
65
|
-
const v2Url = `${kas}/v2/kas_public_key`;
|
|
66
|
-
try {
|
|
67
|
-
const response = await axios_1.default.get(v2Url, {
|
|
68
|
-
params: {
|
|
69
|
-
...params,
|
|
70
|
-
v: '2',
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
const publicKey = typeof response.data === 'string'
|
|
74
|
-
? await extractPemFromKeyString(response.data)
|
|
75
|
-
: response.data.publicKey;
|
|
76
|
-
return {
|
|
77
|
-
publicKey,
|
|
78
|
-
key: (0, utils_js_1.pemToCryptoPublicKey)(publicKey),
|
|
79
|
-
...infoStatic,
|
|
80
|
-
...(typeof response.data !== 'string' && response.data.kid && { kid: response.data.kid }),
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
catch (cause) {
|
|
84
|
-
const status = cause?.response?.status;
|
|
85
|
-
switch (status) {
|
|
86
|
-
case 400:
|
|
87
|
-
case 404:
|
|
88
|
-
// KAS does not yet implement v2, maybe
|
|
89
|
-
break;
|
|
90
|
-
case 401:
|
|
91
|
-
throw new errors_js_1.UnauthenticatedError(`[${v2Url}] requires auth`, cause);
|
|
92
|
-
case 403:
|
|
93
|
-
throw new errors_js_1.PermissionDeniedError(`[${v2Url}] permission denied`, cause);
|
|
94
|
-
default:
|
|
95
|
-
if (status && status >= 400 && status < 500) {
|
|
96
|
-
throw new errors_js_1.ConfigurationError(`[${v2Url}] request error [${status}] [${cause.name}] [${cause.message}]`, cause);
|
|
97
|
-
}
|
|
98
|
-
throw new errors_js_1.NetworkError(`[${v2Url}] error [${status}] [${cause.name}] [${cause.message}]`, cause);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Retry with v1 params
|
|
102
|
-
const v1Url = `${kas}/kas_public_key`;
|
|
103
|
-
try {
|
|
104
|
-
const response = await axios_1.default.get(v1Url, {
|
|
105
|
-
params,
|
|
106
|
-
});
|
|
107
|
-
const publicKey = typeof response.data === 'string'
|
|
108
|
-
? await extractPemFromKeyString(response.data)
|
|
109
|
-
: response.data.publicKey;
|
|
110
|
-
// future proof: allow v2 response even if not specified.
|
|
111
|
-
return {
|
|
112
|
-
publicKey,
|
|
113
|
-
key: (0, utils_js_1.pemToCryptoPublicKey)(publicKey),
|
|
114
|
-
...infoStatic,
|
|
115
|
-
...(typeof response.data !== 'string' && response.data.kid && { kid: response.data.kid }),
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
catch (cause) {
|
|
119
|
-
const status = cause?.response?.status;
|
|
120
|
-
switch (status) {
|
|
121
|
-
case 401:
|
|
122
|
-
throw new errors_js_1.UnauthenticatedError(`[${v1Url}] requires auth`, cause);
|
|
123
|
-
case 403:
|
|
124
|
-
throw new errors_js_1.PermissionDeniedError(`[${v1Url}] permission denied`, cause);
|
|
125
|
-
default:
|
|
126
|
-
if (status && status >= 400 && status < 500) {
|
|
127
|
-
throw new errors_js_1.ConfigurationError(`[${v2Url}] request error [${status}] [${cause.name}] [${cause.message}]`, cause);
|
|
128
|
-
}
|
|
129
|
-
throw new errors_js_1.NetworkError(`[${v1Url}] error [${status}] [${cause.name}] [${cause.message}]`, cause);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
exports.fetchKasPublicKey = fetchKasPublicKey;
|
|
134
|
-
/**
|
|
135
|
-
*
|
|
136
|
-
* @param payload The TDF content to encode in HTML
|
|
137
|
-
* @param manifest A copy of the manifest
|
|
138
|
-
* @param transferUrl reader web-service start page
|
|
139
|
-
* @return utf-8 encoded HTML data
|
|
140
|
-
*/
|
|
141
|
-
function wrapHtml(payload, manifest, transferUrl) {
|
|
142
|
-
const { origin } = new URL(transferUrl);
|
|
143
|
-
const exportManifest = typeof manifest === 'string' ? manifest : JSON.stringify(manifest);
|
|
144
|
-
const fullHtmlString = (0, index_js_4.htmlWrapperTemplate)({
|
|
145
|
-
transferUrl,
|
|
146
|
-
transferBaseUrl: origin,
|
|
147
|
-
manifest: index_js_2.base64.encode(exportManifest),
|
|
148
|
-
payload: (0, index_js_3.buffToString)(payload, 'base64'),
|
|
149
|
-
});
|
|
150
|
-
return new TextEncoder().encode(fullHtmlString);
|
|
151
|
-
}
|
|
152
|
-
exports.wrapHtml = wrapHtml;
|
|
153
|
-
function unwrapHtml(htmlPayload) {
|
|
154
|
-
let html;
|
|
155
|
-
if (htmlPayload instanceof ArrayBuffer || ArrayBuffer.isView(htmlPayload)) {
|
|
156
|
-
html = new TextDecoder().decode(htmlPayload);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
html = htmlPayload.toString();
|
|
160
|
-
}
|
|
161
|
-
const payloadRe = /<input id=['"]?data-input['"]?[^>]*?value=['"]?([a-zA-Z0-9+/=]+)['"]?/;
|
|
162
|
-
const reResult = payloadRe.exec(html);
|
|
163
|
-
if (reResult === null) {
|
|
164
|
-
throw new errors_js_1.InvalidFileError('Payload is missing');
|
|
165
|
-
}
|
|
166
|
-
const base64Payload = reResult[1];
|
|
167
|
-
try {
|
|
168
|
-
return (0, index_js_3.base64ToBuffer)(base64Payload);
|
|
169
|
-
}
|
|
170
|
-
catch (e) {
|
|
171
|
-
throw new errors_js_1.InvalidFileError('There was a problem extracting the TDF3 payload', e);
|
|
172
|
-
}
|
|
80
|
+
return (0, access_js_1.fetchKasPubKey)(kas, algorithm || 'rsa:2048');
|
|
173
81
|
}
|
|
174
|
-
|
|
175
|
-
async function extractPemFromKeyString(keyString) {
|
|
82
|
+
async function extractPemFromKeyString(keyString, alg) {
|
|
176
83
|
let pem = keyString;
|
|
177
84
|
// Skip the public key extraction if we find that the KAS url provides a
|
|
178
85
|
// PEM-encoded key instead of certificate
|
|
179
86
|
if (keyString.includes('CERTIFICATE')) {
|
|
180
|
-
const
|
|
87
|
+
const a = (0, access_js_1.publicKeyAlgorithmToJwa)(alg);
|
|
88
|
+
const cert = await (0, jose_1.importX509)(keyString, a, { extractable: true });
|
|
181
89
|
pem = await (0, jose_1.exportSPKI)(cert);
|
|
182
90
|
}
|
|
183
91
|
return pem;
|
|
184
92
|
}
|
|
185
|
-
exports.extractPemFromKeyString = extractPemFromKeyString;
|
|
186
93
|
/**
|
|
187
94
|
* Build a key access object and add it to the list. Can specify either
|
|
188
95
|
* a (url, publicKey) pair (legacy, deprecated) or an attribute URL (future).
|
|
@@ -190,48 +97,39 @@ exports.extractPemFromKeyString = extractPemFromKeyString;
|
|
|
190
97
|
* is missing it throws an error.
|
|
191
98
|
* @param {Object} options
|
|
192
99
|
* @param {String} options.type - enum representing how the object key is treated
|
|
193
|
-
* @param {String} options.attributeUrl - URL of the attribute to use for pubKey and kasUrl. Omit to use default.
|
|
194
100
|
* @param {String} options.url - directly set the KAS URL
|
|
195
101
|
* @param {String} options.publicKey - directly set the (KAS) public key
|
|
196
102
|
* @param {String?} options.kid - Key identifier of KAS public key
|
|
197
103
|
* @param {String? Object?} options.metadata - Metadata. Appears to be dead code.
|
|
198
104
|
* @return {KeyAccess}- the key access object loaded
|
|
199
105
|
*/
|
|
200
|
-
async function buildKeyAccess({
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
case 'wrapped':
|
|
205
|
-
return new index_js_1.Wrapped(kasUrl, kasKeyIdentifier, pubKey, metadata, sid);
|
|
206
|
-
case 'remote':
|
|
207
|
-
return new index_js_1.Remote(kasUrl, kasKeyIdentifier, pubKey, metadata, sid);
|
|
208
|
-
default:
|
|
209
|
-
throw new errors_js_1.ConfigurationError(`buildKeyAccess: Key access type ${type} is unknown`);
|
|
210
|
-
}
|
|
106
|
+
async function buildKeyAccess({ type, url, publicKey, kid, metadata, sid = '', alg = 'rsa:2048', }) {
|
|
107
|
+
// if url and pulicKey are specified load the key access object with them
|
|
108
|
+
if (!url && !publicKey) {
|
|
109
|
+
throw new errors_js_1.ConfigurationError('TDF.buildKeyAccess: No source for kasUrl or pubKey');
|
|
211
110
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const attr = attributeSet.get(attributeUrl);
|
|
215
|
-
if (attr && attr.kasUrl && attr.pubKey) {
|
|
216
|
-
return createKeyAccess(type, attr.kasUrl, attr.kid, attr.pubKey, metadata);
|
|
217
|
-
}
|
|
111
|
+
else if (!url) {
|
|
112
|
+
throw new errors_js_1.ConfigurationError('TDF.buildKeyAccess: No kasUrl');
|
|
218
113
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
114
|
+
else if (!publicKey) {
|
|
115
|
+
throw new errors_js_1.ConfigurationError('TDF.buildKeyAccess: No kas public key');
|
|
116
|
+
}
|
|
117
|
+
let pubKey;
|
|
118
|
+
try {
|
|
119
|
+
pubKey = await extractPemFromKeyString(publicKey, alg);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
throw new errors_js_1.ConfigurationError(`TDF.buildKeyAccess: Invalid public key [${publicKey}], caused by [${e}]`, e);
|
|
123
|
+
}
|
|
124
|
+
switch (type) {
|
|
125
|
+
case 'wrapped':
|
|
126
|
+
return new index_js_2.Wrapped(url, kid, pubKey, metadata, sid);
|
|
127
|
+
case 'ec-wrapped':
|
|
128
|
+
return new index_js_2.ECWrapped(url, kid, pubKey, metadata, sid);
|
|
129
|
+
default:
|
|
130
|
+
throw new errors_js_1.ConfigurationError(`buildKeyAccess: Key access type [${type}] is unsupported`);
|
|
230
131
|
}
|
|
231
|
-
// All failed. Raise an error.
|
|
232
|
-
throw new errors_js_1.ConfigurationError('TDF.buildKeyAccess: No source for kasUrl or pubKey');
|
|
233
132
|
}
|
|
234
|
-
exports.buildKeyAccess = buildKeyAccess;
|
|
235
133
|
function validatePolicyObject(policy) {
|
|
236
134
|
const missingFields = [];
|
|
237
135
|
if (!policy.uuid)
|
|
@@ -244,7 +142,6 @@ function validatePolicyObject(policy) {
|
|
|
244
142
|
throw new errors_js_1.ConfigurationError(`The given policy object requires the following properties: ${missingFields}`);
|
|
245
143
|
}
|
|
246
144
|
}
|
|
247
|
-
exports.validatePolicyObject = validatePolicyObject;
|
|
248
145
|
async function _generateManifest(keyInfo, encryptionInformation, policy, mimeType) {
|
|
249
146
|
// (maybe) Fields are quoted to avoid renaming
|
|
250
147
|
const payload = {
|
|
@@ -252,7 +149,6 @@ async function _generateManifest(keyInfo, encryptionInformation, policy, mimeTyp
|
|
|
252
149
|
url: '0.payload',
|
|
253
150
|
protocol: 'zip',
|
|
254
151
|
isEncrypted: true,
|
|
255
|
-
schemaVersion: '3.0.0',
|
|
256
152
|
...(mimeType && { mimeType }),
|
|
257
153
|
};
|
|
258
154
|
const encryptionInformationStr = await encryptionInformation.write(policy, keyInfo);
|
|
@@ -262,111 +158,27 @@ async function _generateManifest(keyInfo, encryptionInformation, policy, mimeTyp
|
|
|
262
158
|
// generate the manifest first, then insert integrity information into it
|
|
263
159
|
encryptionInformation: encryptionInformationStr,
|
|
264
160
|
assertions: assertions,
|
|
161
|
+
schemaVersion: version_js_1.tdfSpecVersion,
|
|
265
162
|
};
|
|
266
163
|
}
|
|
267
|
-
async function getSignature(
|
|
164
|
+
async function getSignature(unwrappedKey, content, algorithmType) {
|
|
268
165
|
switch (algorithmType.toUpperCase()) {
|
|
269
166
|
case 'GMAC':
|
|
270
167
|
// use the auth tag baked into the encrypted payload
|
|
271
|
-
return
|
|
272
|
-
case 'HS256':
|
|
168
|
+
return content.slice(-16);
|
|
169
|
+
case 'HS256': {
|
|
273
170
|
// simple hmac is the default
|
|
274
|
-
|
|
171
|
+
const cryptoKey = await crypto.subtle.importKey('raw', unwrappedKey, {
|
|
172
|
+
name: 'HMAC',
|
|
173
|
+
hash: { name: 'SHA-256' },
|
|
174
|
+
}, true, ['sign', 'verify']);
|
|
175
|
+
const signature = await crypto.subtle.sign('HMAC', cryptoKey, content);
|
|
176
|
+
return new Uint8Array(signature);
|
|
177
|
+
}
|
|
275
178
|
default:
|
|
276
179
|
throw new errors_js_1.ConfigurationError(`Unsupported signature alg [${algorithmType}]`);
|
|
277
180
|
}
|
|
278
181
|
}
|
|
279
|
-
function buildRequest(method, url, body) {
|
|
280
|
-
return {
|
|
281
|
-
headers: {},
|
|
282
|
-
method: method,
|
|
283
|
-
url: url,
|
|
284
|
-
body,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
async function upsert({ allowedKases, allowList, authProvider, entity, privateKey, unsavedManifest, ignoreType, }) {
|
|
288
|
-
const allowed = (() => {
|
|
289
|
-
if (allowList) {
|
|
290
|
-
return allowList;
|
|
291
|
-
}
|
|
292
|
-
if (!allowedKases) {
|
|
293
|
-
throw new errors_js_1.ConfigurationError('Upsert cannot be done without allowlist');
|
|
294
|
-
}
|
|
295
|
-
return new access_js_1.OriginAllowList(allowedKases);
|
|
296
|
-
})();
|
|
297
|
-
const { keyAccess, policy } = unsavedManifest.encryptionInformation;
|
|
298
|
-
const isAppIdProvider = authProvider && (0, index_js_3.isAppIdProviderCheck)(authProvider);
|
|
299
|
-
if (authProvider === undefined) {
|
|
300
|
-
throw new errors_js_1.ConfigurationError('Upsert cannot be done without auth provider');
|
|
301
|
-
}
|
|
302
|
-
return Promise.all(keyAccess.map(async (keyAccessObject) => {
|
|
303
|
-
// We only care about remote key access objects for the policy sync portion
|
|
304
|
-
const isRemote = (0, index_js_1.isRemote)(keyAccessObject);
|
|
305
|
-
if (!ignoreType && !isRemote) {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
if (!allowed.allows(keyAccessObject.url)) {
|
|
309
|
-
throw new errors_js_1.UnsafeUrlError(`Unexpected KAS url: [${keyAccessObject.url}]`);
|
|
310
|
-
}
|
|
311
|
-
const url = `${keyAccessObject.url}/${isAppIdProvider ? '' : 'v2/'}upsert`;
|
|
312
|
-
//TODO I dont' think we need a body at all for KAS requests
|
|
313
|
-
// Do we need ANY of this if it's already embedded in the EO in the Bearer OIDC token?
|
|
314
|
-
const body = {
|
|
315
|
-
keyAccess: keyAccessObject,
|
|
316
|
-
policy: unsavedManifest.encryptionInformation.policy,
|
|
317
|
-
entity: (0, index_js_3.isAppIdProviderCheck)(authProvider) ? entity : undefined,
|
|
318
|
-
authToken: undefined,
|
|
319
|
-
clientPayloadSignature: undefined,
|
|
320
|
-
};
|
|
321
|
-
if ((0, index_js_3.isAppIdProviderCheck)(authProvider)) {
|
|
322
|
-
body.authToken = await (0, auth_js_1.reqSignature)({}, privateKey);
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
body.clientPayloadSignature = await (0, auth_js_1.reqSignature)(body, privateKey);
|
|
326
|
-
}
|
|
327
|
-
const httpReq = await authProvider.withCreds(buildRequest('POST', url, body));
|
|
328
|
-
try {
|
|
329
|
-
const response = await axios_1.default.post(httpReq.url, httpReq.body, {
|
|
330
|
-
headers: httpReq.headers,
|
|
331
|
-
});
|
|
332
|
-
// Remove additional properties which were needed to sync, but not that we want to save to
|
|
333
|
-
// the manifest
|
|
334
|
-
delete keyAccessObject.wrappedKey;
|
|
335
|
-
delete keyAccessObject.encryptedMetadata;
|
|
336
|
-
delete keyAccessObject.policyBinding;
|
|
337
|
-
if (isRemote) {
|
|
338
|
-
// Decode the policy and extract only the required info to save -- the uuid
|
|
339
|
-
const decodedPolicy = JSON.parse(index_js_2.base64.decode(policy));
|
|
340
|
-
unsavedManifest.encryptionInformation.policy = index_js_2.base64.encode(JSON.stringify({ uuid: decodedPolicy.uuid }));
|
|
341
|
-
}
|
|
342
|
-
return response.data;
|
|
343
|
-
}
|
|
344
|
-
catch (e) {
|
|
345
|
-
if (e.response) {
|
|
346
|
-
if (e.response.status >= 500) {
|
|
347
|
-
throw new errors_js_1.ServiceError('upsert failure', e);
|
|
348
|
-
}
|
|
349
|
-
else if (e.response.status === 403) {
|
|
350
|
-
throw new errors_js_1.PermissionDeniedError('upsert failure', e);
|
|
351
|
-
}
|
|
352
|
-
else if (e.response.status === 401) {
|
|
353
|
-
throw new errors_js_1.UnauthenticatedError('upsert auth failure', e);
|
|
354
|
-
}
|
|
355
|
-
else if (e.response.status === 400) {
|
|
356
|
-
throw new errors_js_1.ConfigurationError('upsert bad request; likely a configuration error', e);
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
throw new errors_js_1.NetworkError('upsert server error', e);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
else if (e.request) {
|
|
363
|
-
throw new errors_js_1.NetworkError('upsert request failure', e);
|
|
364
|
-
}
|
|
365
|
-
throw new errors_js_1.TdfError(`Unable to perform upsert operation on the KAS: [${e.name}: ${e.message}], response: [${e?.response?.body}]`, e);
|
|
366
|
-
}
|
|
367
|
-
}));
|
|
368
|
-
}
|
|
369
|
-
exports.upsert = upsert;
|
|
370
182
|
async function writeStream(cfg) {
|
|
371
183
|
if (!cfg.authProvider) {
|
|
372
184
|
throw new errors_js_1.ConfigurationError('No authorization middleware defined');
|
|
@@ -390,23 +202,13 @@ async function writeStream(cfg) {
|
|
|
390
202
|
let bytesProcessed = 0;
|
|
391
203
|
let crcCounter = 0;
|
|
392
204
|
let fileByteCount = 0;
|
|
393
|
-
|
|
205
|
+
const segmentHashList = [];
|
|
394
206
|
const zipWriter = new index_js_3.ZipWriter();
|
|
395
207
|
const manifest = await _generateManifest(cfg.keyForManifest, cfg.encryptionInformation, cfg.policy, cfg.mimeType);
|
|
396
208
|
if (!manifest) {
|
|
397
209
|
// Set in encrypt; should never be reached.
|
|
398
210
|
throw new errors_js_1.ConfigurationError('internal: please use "loadTDFStream" first to load a manifest.');
|
|
399
211
|
}
|
|
400
|
-
const pkKeyLike = cfg.dpopKeys.privateKey;
|
|
401
|
-
// For all remote key access objects, sync its policy
|
|
402
|
-
const upsertResponse = await upsert({
|
|
403
|
-
allowedKases: cfg.allowList ? undefined : cfg.allowedKases,
|
|
404
|
-
allowList: cfg.allowList,
|
|
405
|
-
authProvider: cfg.authProvider,
|
|
406
|
-
entity: cfg.entity,
|
|
407
|
-
privateKey: pkKeyLike,
|
|
408
|
-
unsavedManifest: manifest,
|
|
409
|
-
});
|
|
410
212
|
// determine default segment size by writing empty buffer
|
|
411
213
|
const { segmentSizeDefault } = cfg;
|
|
412
214
|
const encryptedBlargh = await cfg.encryptionInformation.encrypt(binary_js_1.Binary.fromArrayBuffer(new ArrayBuffer(segmentSizeDefault)), cfg.keyForEncryption.unwrappedKeyBinary);
|
|
@@ -468,9 +270,10 @@ async function writeStream(cfg) {
|
|
|
468
270
|
crcCounter = 0;
|
|
469
271
|
fileByteCount = 0;
|
|
470
272
|
// hash the concat of all hashes
|
|
471
|
-
const
|
|
472
|
-
|
|
473
|
-
|
|
273
|
+
const aggregateHash = await concatenateUint8Array(segmentHashList);
|
|
274
|
+
const payloadSig = await getSignature(new Uint8Array(cfg.keyForEncryption.unwrappedKeyBinary.asArrayBuffer()), aggregateHash, cfg.integrityAlgorithm);
|
|
275
|
+
const rootSig = index_js_1.base64.encodeArrayBuffer(payloadSig);
|
|
276
|
+
manifest.encryptionInformation.integrityInformation.rootSignature.sig = rootSig;
|
|
474
277
|
manifest.encryptionInformation.integrityInformation.rootSignature.alg =
|
|
475
278
|
cfg.integrityAlgorithm;
|
|
476
279
|
manifest.encryptionInformation.integrityInformation.segmentSizeDefault = segmentSizeDefault;
|
|
@@ -524,11 +327,6 @@ async function writeStream(cfg) {
|
|
|
524
327
|
};
|
|
525
328
|
const plaintextStream = new DecoratedReadableStream_js_1.DecoratedReadableStream(underlingSource);
|
|
526
329
|
plaintextStream.manifest = manifest;
|
|
527
|
-
if (upsertResponse) {
|
|
528
|
-
plaintextStream.upsertResponse = upsertResponse;
|
|
529
|
-
plaintextStream.tdfSize = totalByteCount;
|
|
530
|
-
plaintextStream.algorithm = manifest.encryptionInformation.method.algorithm;
|
|
531
|
-
}
|
|
532
330
|
return plaintextStream;
|
|
533
331
|
// nested helper fn's
|
|
534
332
|
function getHeader(filename) {
|
|
@@ -552,11 +350,10 @@ async function writeStream(cfg) {
|
|
|
552
350
|
// Don't pass in an IV here. The encrypt function will generate one for you, ensuring that each segment has a unique IV.
|
|
553
351
|
const encryptedResult = await cfg.encryptionInformation.encrypt(binary_js_1.Binary.fromArrayBuffer(chunk.buffer), cfg.keyForEncryption.unwrappedKeyBinary);
|
|
554
352
|
const payloadBuffer = new Uint8Array(encryptedResult.payload.asByteArray());
|
|
555
|
-
const
|
|
556
|
-
|
|
557
|
-
aggregateHash += payloadSigStr;
|
|
353
|
+
const payloadSig = await getSignature(new Uint8Array(cfg.keyForEncryption.unwrappedKeyBinary.asArrayBuffer()), new Uint8Array(encryptedResult.payload.asArrayBuffer()), cfg.segmentIntegrityAlgorithm);
|
|
354
|
+
segmentHashList.push(new Uint8Array(payloadSig));
|
|
558
355
|
segmentInfos.push({
|
|
559
|
-
hash:
|
|
356
|
+
hash: index_js_1.base64.encodeArrayBuffer(payloadSig),
|
|
560
357
|
segmentSize: chunk.length === segmentSizeDefault ? undefined : chunk.length,
|
|
561
358
|
encryptedSegmentSize: payloadBuffer.length === encryptedSegmentSizeDefault ? undefined : payloadBuffer.length,
|
|
562
359
|
});
|
|
@@ -565,7 +362,6 @@ async function writeStream(cfg) {
|
|
|
565
362
|
return result;
|
|
566
363
|
}
|
|
567
364
|
}
|
|
568
|
-
exports.writeStream = writeStream;
|
|
569
365
|
// load the TDF as a stream in memory, for further use in reading and key syncing
|
|
570
366
|
async function loadTDFStream(chunker) {
|
|
571
367
|
const zipReader = new index_js_3.ZipReader(chunker);
|
|
@@ -573,7 +369,6 @@ async function loadTDFStream(chunker) {
|
|
|
573
369
|
const manifest = await zipReader.getManifest(centralDirectory, '0.manifest.json');
|
|
574
370
|
return { manifest, zipReader, centralDirectory };
|
|
575
371
|
}
|
|
576
|
-
exports.loadTDFStream = loadTDFStream;
|
|
577
372
|
function splitLookupTableFactory(keyAccess, allowedKases) {
|
|
578
373
|
const allowed = (k) => allowedKases.allows(k.url);
|
|
579
374
|
const splitIds = new Set(keyAccess.map(({ sid }) => sid ?? ''));
|
|
@@ -596,17 +391,27 @@ function splitLookupTableFactory(keyAccess, allowedKases) {
|
|
|
596
391
|
}
|
|
597
392
|
return splitPotentials;
|
|
598
393
|
}
|
|
599
|
-
|
|
600
|
-
async function unwrapKey({ manifest, allowedKases, authProvider, dpopKeys, concurrencyLimit, entity, cryptoService, }) {
|
|
394
|
+
async function unwrapKey({ manifest, allowedKases, authProvider, dpopKeys, concurrencyLimit, cryptoService, wrappingKeyAlgorithm, }) {
|
|
601
395
|
if (authProvider === undefined) {
|
|
602
|
-
throw new errors_js_1.ConfigurationError('
|
|
396
|
+
throw new errors_js_1.ConfigurationError('rewrap requires auth provider; must be configured in client constructor');
|
|
603
397
|
}
|
|
604
398
|
const { keyAccess } = manifest.encryptionInformation;
|
|
605
399
|
const splitPotentials = splitLookupTableFactory(keyAccess, allowedKases);
|
|
606
|
-
const isAppIdProvider = authProvider && (0, index_js_3.isAppIdProviderCheck)(authProvider);
|
|
607
400
|
async function tryKasRewrap(keySplitInfo) {
|
|
608
|
-
const url = `${keySplitInfo.url}
|
|
609
|
-
|
|
401
|
+
const url = `${keySplitInfo.url}/v2/rewrap`;
|
|
402
|
+
let ephemeralEncryptionKeysRaw;
|
|
403
|
+
let ephemeralEncryptionKeys;
|
|
404
|
+
if (wrappingKeyAlgorithm === 'ec:secp256r1') {
|
|
405
|
+
ephemeralEncryptionKeysRaw = await (0, generateKeyPair_js_1.generateKeyPair)();
|
|
406
|
+
ephemeralEncryptionKeys = await cryptoService.cryptoToPemPair(ephemeralEncryptionKeysRaw);
|
|
407
|
+
}
|
|
408
|
+
else if (wrappingKeyAlgorithm === 'rsa:2048' || !wrappingKeyAlgorithm) {
|
|
409
|
+
ephemeralEncryptionKeysRaw = await cryptoService.generateKeyPair();
|
|
410
|
+
ephemeralEncryptionKeys = await cryptoService.cryptoToPemPair(ephemeralEncryptionKeysRaw);
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
throw new errors_js_1.ConfigurationError(`Unsupported wrapping key algorithm [${wrappingKeyAlgorithm}]`);
|
|
414
|
+
}
|
|
610
415
|
const clientPublicKey = ephemeralEncryptionKeys.publicKey;
|
|
611
416
|
const requestBodyStr = JSON.stringify({
|
|
612
417
|
algorithm: 'RS256',
|
|
@@ -615,27 +420,25 @@ async function unwrapKey({ manifest, allowedKases, authProvider, dpopKeys, concu
|
|
|
615
420
|
clientPublicKey,
|
|
616
421
|
});
|
|
617
422
|
const jwtPayload = { requestBody: requestBodyStr };
|
|
618
|
-
const signedRequestToken = await (0, auth_js_1.reqSignature)(
|
|
619
|
-
|
|
620
|
-
if (
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
423
|
+
const signedRequestToken = await (0, auth_js_1.reqSignature)(jwtPayload, dpopKeys.privateKey);
|
|
424
|
+
const { entityWrappedKey, metadata, sessionPublicKey } = await (0, access_js_1.fetchWrappedKey)(url, { signedRequestToken }, authProvider, '0.0.1');
|
|
425
|
+
if (wrappingKeyAlgorithm === 'ec:secp256r1') {
|
|
426
|
+
const serverEphemeralKey = await (0, pemPublicToCrypto_js_1.pemPublicToCrypto)(sessionPublicKey);
|
|
427
|
+
const ekr = ephemeralEncryptionKeysRaw;
|
|
428
|
+
const kek = await (0, keyAgreement_js_1.keyAgreement)(ekr.privateKey, serverEphemeralKey, {
|
|
429
|
+
hkdfSalt: new TextEncoder().encode('salt'),
|
|
430
|
+
hkdfHash: 'SHA-256',
|
|
431
|
+
});
|
|
432
|
+
const wrappedKeyAndNonce = index_js_1.base64.decodeArrayBuffer(entityWrappedKey);
|
|
433
|
+
const iv = wrappedKeyAndNonce.slice(0, 12);
|
|
434
|
+
const wrappedKey = wrappedKeyAndNonce.slice(12);
|
|
435
|
+
const dek = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, kek, wrappedKey);
|
|
436
|
+
return {
|
|
437
|
+
key: new Uint8Array(dek),
|
|
438
|
+
metadata,
|
|
634
439
|
};
|
|
635
440
|
}
|
|
636
|
-
const
|
|
637
|
-
const { data: { entityWrappedKey, metadata }, } = await axios_1.default.post(httpReq.url, httpReq.body, { headers: httpReq.headers });
|
|
638
|
-
const key = binary_js_1.Binary.fromString(index_js_2.base64.decode(entityWrappedKey));
|
|
441
|
+
const key = binary_js_1.Binary.fromString(index_js_1.base64.decode(entityWrappedKey));
|
|
639
442
|
const decryptedKeyBinary = await cryptoService.decryptWithPrivateKey(key, ephemeralEncryptionKeys.privateKey);
|
|
640
443
|
return {
|
|
641
444
|
key: new Uint8Array(decryptedKeyBinary.asByteArray()),
|
|
@@ -685,40 +488,25 @@ async function unwrapKey({ manifest, allowedKases, authProvider, dpopKeys, concu
|
|
|
685
488
|
}
|
|
686
489
|
}
|
|
687
490
|
function handleRewrapError(error) {
|
|
688
|
-
if (
|
|
689
|
-
|
|
690
|
-
return new errors_js_1.ServiceError('rewrap failure', error);
|
|
691
|
-
}
|
|
692
|
-
else if (error.response?.status === 403) {
|
|
693
|
-
return new errors_js_1.PermissionDeniedError('rewrap failure', error);
|
|
694
|
-
}
|
|
695
|
-
else if (error.response?.status === 401) {
|
|
696
|
-
return new errors_js_1.UnauthenticatedError('rewrap auth failure', error);
|
|
697
|
-
}
|
|
698
|
-
else if (error.response?.status === 400) {
|
|
699
|
-
return new errors_js_1.InvalidFileError('rewrap bad request; could indicate an invalid policy binding or a configuration error', error);
|
|
700
|
-
}
|
|
701
|
-
else {
|
|
702
|
-
return new errors_js_1.NetworkError('rewrap server error', error);
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
else {
|
|
706
|
-
if (error.name === 'InvalidAccessError' || error.name === 'OperationError') {
|
|
707
|
-
return new errors_js_1.DecryptError('unable to unwrap key from kas', error);
|
|
708
|
-
}
|
|
709
|
-
return new errors_js_1.InvalidFileError(`Unable to decrypt the response from KAS: [${error.name}: ${error.message}]`, error);
|
|
491
|
+
if (error.name === 'InvalidAccessError' || error.name === 'OperationError') {
|
|
492
|
+
return new errors_js_1.DecryptError('unable to unwrap key from kas', error);
|
|
710
493
|
}
|
|
494
|
+
return error;
|
|
711
495
|
}
|
|
712
|
-
async function decryptChunk(encryptedChunk, reconstructedKeyBinary, hash, cipher, segmentIntegrityAlgorithm,
|
|
496
|
+
async function decryptChunk(encryptedChunk, reconstructedKeyBinary, hash, cipher, segmentIntegrityAlgorithm, isLegacyTDF) {
|
|
713
497
|
if (segmentIntegrityAlgorithm !== 'GMAC' && segmentIntegrityAlgorithm !== 'HS256') {
|
|
498
|
+
throw new errors_js_1.UnsupportedFeatureError(`Unsupported integrity alg [${segmentIntegrityAlgorithm}]`);
|
|
714
499
|
}
|
|
715
|
-
const
|
|
716
|
-
|
|
500
|
+
const segmentSig = await getSignature(new Uint8Array(reconstructedKeyBinary.asArrayBuffer()), encryptedChunk, segmentIntegrityAlgorithm);
|
|
501
|
+
const segmentHash = isLegacyTDF
|
|
502
|
+
? index_js_1.base64.encode(index_js_1.hex.encodeArrayBuffer(segmentSig))
|
|
503
|
+
: index_js_1.base64.encodeArrayBuffer(segmentSig);
|
|
504
|
+
if (hash !== segmentHash) {
|
|
717
505
|
throw new errors_js_1.IntegrityError('Failed integrity check on segment hash');
|
|
718
506
|
}
|
|
719
507
|
return await cipher.decrypt(encryptedChunk, reconstructedKeyBinary);
|
|
720
508
|
}
|
|
721
|
-
async function updateChunkQueue(chunkMap, centralDirectory, zipReader, reconstructedKeyBinary, cipher, segmentIntegrityAlgorithm, cryptoService) {
|
|
509
|
+
async function updateChunkQueue(chunkMap, centralDirectory, zipReader, reconstructedKeyBinary, cipher, segmentIntegrityAlgorithm, cryptoService, isLegacyTDF) {
|
|
722
510
|
const chunksInOneDownload = 500;
|
|
723
511
|
let requests = [];
|
|
724
512
|
const maxLength = 3;
|
|
@@ -748,34 +536,32 @@ async function updateChunkQueue(chunkMap, centralDirectory, zipReader, reconstru
|
|
|
748
536
|
slice,
|
|
749
537
|
cipher,
|
|
750
538
|
segmentIntegrityAlgorithm,
|
|
539
|
+
isLegacyTDF,
|
|
751
540
|
});
|
|
752
541
|
}
|
|
753
542
|
})());
|
|
754
543
|
}
|
|
755
544
|
}
|
|
756
|
-
async function sliceAndDecrypt({ buffer, reconstructedKeyBinary, slice, cipher,
|
|
545
|
+
async function sliceAndDecrypt({ buffer, reconstructedKeyBinary, slice, cipher, segmentIntegrityAlgorithm, isLegacyTDF, }) {
|
|
757
546
|
for (const index in slice) {
|
|
758
|
-
const { encryptedOffset, encryptedSegmentSize,
|
|
547
|
+
const { encryptedOffset, encryptedSegmentSize, plainSegmentSize } = slice[index];
|
|
759
548
|
const offset = slice[0].encryptedOffset === 0 ? encryptedOffset : encryptedOffset % slice[0].encryptedOffset;
|
|
760
549
|
const encryptedChunk = new Uint8Array(buffer.slice(offset, offset + encryptedSegmentSize));
|
|
550
|
+
if (encryptedChunk.length !== encryptedSegmentSize) {
|
|
551
|
+
throw new errors_js_1.DecryptError('Failed to fetch entire segment');
|
|
552
|
+
}
|
|
761
553
|
try {
|
|
762
|
-
const result = await decryptChunk(encryptedChunk, reconstructedKeyBinary, slice[index]['hash'], cipher, segmentIntegrityAlgorithm,
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
_resolve(null);
|
|
554
|
+
const result = await decryptChunk(encryptedChunk, reconstructedKeyBinary, slice[index]['hash'], cipher, segmentIntegrityAlgorithm, isLegacyTDF);
|
|
555
|
+
if (plainSegmentSize && result.payload.length() !== plainSegmentSize) {
|
|
556
|
+
throw new errors_js_1.DecryptError(`incorrect segment size: found [${result.payload.length()}], expected [${plainSegmentSize}]`);
|
|
766
557
|
}
|
|
558
|
+
slice[index].decryptedChunk.set(result);
|
|
767
559
|
}
|
|
768
560
|
catch (e) {
|
|
769
|
-
|
|
770
|
-
_reject(e);
|
|
771
|
-
}
|
|
772
|
-
else {
|
|
773
|
-
throw e;
|
|
774
|
-
}
|
|
561
|
+
slice[index].decryptedChunk.reject(e);
|
|
775
562
|
}
|
|
776
563
|
}
|
|
777
564
|
}
|
|
778
|
-
exports.sliceAndDecrypt = sliceAndDecrypt;
|
|
779
565
|
async function readStream(cfg) {
|
|
780
566
|
let { allowList } = cfg;
|
|
781
567
|
if (!allowList) {
|
|
@@ -789,29 +575,29 @@ async function readStream(cfg) {
|
|
|
789
575
|
throw new errors_js_1.InvalidFileError('Missing manifest data');
|
|
790
576
|
}
|
|
791
577
|
cfg.keyMiddleware ??= async (key) => key;
|
|
792
|
-
const { encryptedSegmentSizeDefault: defaultSegmentSize, rootSignature, segmentHashAlg, segments, } = manifest.encryptionInformation.integrityInformation;
|
|
578
|
+
const { encryptedSegmentSizeDefault: defaultSegmentSize, rootSignature, segmentHashAlg, segmentSizeDefault, segments, } = manifest.encryptionInformation.integrityInformation;
|
|
793
579
|
const { metadata, reconstructedKeyBinary } = await unwrapKey({
|
|
794
580
|
manifest,
|
|
795
581
|
authProvider: cfg.authProvider,
|
|
796
582
|
allowedKases: allowList,
|
|
797
583
|
dpopKeys: cfg.dpopKeys,
|
|
798
|
-
entity: cfg.entity,
|
|
799
584
|
cryptoService: cfg.cryptoService,
|
|
800
585
|
});
|
|
801
586
|
// async function unwrapKey(manifest: Manifest, allowedKases: string[], authProvider: AuthProvider | AppIdAuthProvider, publicKey: string, privateKey: string, entity: EntityObject) {
|
|
802
587
|
const keyForDecryption = await cfg.keyMiddleware(reconstructedKeyBinary);
|
|
803
588
|
const encryptedSegmentSizeDefault = defaultSegmentSize || DEFAULT_SEGMENT_SIZE;
|
|
804
|
-
// check the
|
|
805
|
-
const
|
|
589
|
+
// check if the TDF is a legacy TDF
|
|
590
|
+
const specVersion = manifest.schemaVersion || manifest.tdf_spec_version;
|
|
591
|
+
const isLegacyTDF = !specVersion || specVersion.startsWith('3.');
|
|
592
|
+
// Decode each hash and store it in an array of Uint8Array
|
|
593
|
+
const segmentHashList = segments.map(({ hash }) => new Uint8Array(index_js_1.base64.decodeArrayBuffer(hash)));
|
|
594
|
+
// Concatenate all segment hashes into a single Uint8Array
|
|
595
|
+
const aggregateHash = await concatenateUint8Array(segmentHashList);
|
|
806
596
|
const integrityAlgorithm = rootSignature.alg;
|
|
807
597
|
if (integrityAlgorithm !== 'GMAC' && integrityAlgorithm !== 'HS256') {
|
|
808
598
|
throw new errors_js_1.UnsupportedFeatureError(`Unsupported integrity alg [${integrityAlgorithm}]`);
|
|
809
599
|
}
|
|
810
|
-
const
|
|
811
|
-
if (manifest.encryptionInformation.integrityInformation.rootSignature.sig !==
|
|
812
|
-
index_js_2.base64.encode(payloadSigStr)) {
|
|
813
|
-
throw new errors_js_1.IntegrityError('Failed integrity check on root signature');
|
|
814
|
-
}
|
|
600
|
+
const payloadSig = await getSignature(new Uint8Array(keyForDecryption.asArrayBuffer()), aggregateHash, integrityAlgorithm);
|
|
815
601
|
if (!cfg.noVerifyAssertions) {
|
|
816
602
|
for (const assertion of manifest.assertions || []) {
|
|
817
603
|
// Create a default assertion key
|
|
@@ -825,36 +611,37 @@ async function readStream(cfg) {
|
|
|
825
611
|
assertionKey = foundKey;
|
|
826
612
|
}
|
|
827
613
|
}
|
|
828
|
-
await assertions.verify(assertion, aggregateHash, assertionKey);
|
|
614
|
+
await assertions.verify(assertion, aggregateHash, assertionKey, isLegacyTDF);
|
|
829
615
|
}
|
|
830
616
|
}
|
|
617
|
+
const rootSig = isLegacyTDF
|
|
618
|
+
? index_js_1.base64.encode(index_js_1.hex.encodeArrayBuffer(payloadSig))
|
|
619
|
+
: index_js_1.base64.encodeArrayBuffer(payloadSig);
|
|
620
|
+
if (manifest.encryptionInformation.integrityInformation.rootSignature.sig !== rootSig) {
|
|
621
|
+
throw new errors_js_1.IntegrityError('Failed integrity check on root signature');
|
|
622
|
+
}
|
|
831
623
|
let mapOfRequestsOffset = 0;
|
|
832
|
-
const chunkMap = new Map(segments.map(({ hash, encryptedSegmentSize = encryptedSegmentSizeDefault }) => {
|
|
624
|
+
const chunkMap = new Map(segments.map(({ hash, encryptedSegmentSize = encryptedSegmentSizeDefault, segmentSize = segmentSizeDefault, }) => {
|
|
833
625
|
const result = (() => {
|
|
834
|
-
let _resolve, _reject;
|
|
835
626
|
const chunk = {
|
|
836
627
|
hash,
|
|
837
628
|
encryptedOffset: mapOfRequestsOffset,
|
|
838
629
|
encryptedSegmentSize,
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
_reject = reject;
|
|
842
|
-
}),
|
|
630
|
+
decryptedChunk: mailbox(),
|
|
631
|
+
plainSegmentSize: segmentSize,
|
|
843
632
|
};
|
|
844
|
-
chunk._resolve = _resolve;
|
|
845
|
-
chunk._reject = _reject;
|
|
846
633
|
return chunk;
|
|
847
634
|
})();
|
|
848
|
-
mapOfRequestsOffset += encryptedSegmentSize
|
|
635
|
+
mapOfRequestsOffset += encryptedSegmentSize;
|
|
849
636
|
return [hash, result];
|
|
850
637
|
}));
|
|
851
|
-
const cipher = new
|
|
638
|
+
const cipher = new aes_gcm_cipher_js_1.AesGcmCipher(cfg.cryptoService);
|
|
852
639
|
const segmentIntegrityAlg = segmentHashAlg || integrityAlgorithm;
|
|
853
640
|
if (segmentIntegrityAlg !== 'GMAC' && segmentIntegrityAlg !== 'HS256') {
|
|
854
641
|
throw new errors_js_1.UnsupportedFeatureError(`Unsupported segment hash alg [${segmentIntegrityAlg}]`);
|
|
855
642
|
}
|
|
856
643
|
// Not waiting for Promise to resolve
|
|
857
|
-
updateChunkQueue(Array.from(chunkMap.values()), centralDirectory, zipReader, keyForDecryption, cipher, segmentIntegrityAlg, cfg.cryptoService);
|
|
644
|
+
updateChunkQueue(Array.from(chunkMap.values()), centralDirectory, zipReader, keyForDecryption, cipher, segmentIntegrityAlg, cfg.cryptoService, isLegacyTDF);
|
|
858
645
|
let progress = 0;
|
|
859
646
|
const underlyingSource = {
|
|
860
647
|
pull: async (controller) => {
|
|
@@ -863,24 +650,22 @@ async function readStream(cfg) {
|
|
|
863
650
|
return;
|
|
864
651
|
}
|
|
865
652
|
const [hash, chunk] = chunkMap.entries().next().value;
|
|
866
|
-
|
|
867
|
-
await chunk.promise;
|
|
868
|
-
}
|
|
869
|
-
const decryptedSegment = chunk.decryptedChunk;
|
|
653
|
+
const decryptedSegment = await chunk.decryptedChunk;
|
|
870
654
|
controller.enqueue(new Uint8Array(decryptedSegment.payload.asByteArray()));
|
|
871
655
|
progress += chunk.encryptedSegmentSize;
|
|
872
656
|
cfg.progressHandler?.(progress);
|
|
873
|
-
chunk.decryptedChunk = null;
|
|
874
657
|
chunkMap.delete(hash);
|
|
875
658
|
},
|
|
876
659
|
...(cfg.fileStreamServiceWorker && { fileStreamServiceWorker: cfg.fileStreamServiceWorker }),
|
|
877
660
|
};
|
|
878
661
|
const outputStream = new DecoratedReadableStream_js_1.DecoratedReadableStream(underlyingSource);
|
|
879
662
|
outputStream.manifest = manifest;
|
|
880
|
-
outputStream.emit('manifest', manifest);
|
|
881
663
|
outputStream.metadata = metadata;
|
|
882
|
-
outputStream.emit('rewrap', metadata);
|
|
883
664
|
return outputStream;
|
|
884
665
|
}
|
|
885
|
-
|
|
886
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGRmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGRmMy9zcmMvdGRmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQTBDO0FBQzFDLDZEQUFtRDtBQUNuRCwrQkFBOEM7QUFDOUMsb0ZBQThFO0FBRTlFLGlEQUE2RTtBQUc3RSw0REFBOEM7QUFFOUMsZ0RBYzJCO0FBQzNCLDJEQUFzRDtBQUN0RCwrQ0FTMEI7QUFDMUIsMkNBQXFDO0FBQ3JDLG1EQUErRjtBQUMvRixtREFZNkI7QUFDN0IsbURBQTJEO0FBRTNELGVBQWU7QUFDZiw0R0FBNEc7QUFDNUcsaURBQWtEO0FBQ2xELG9EQU1nQztBQUtoQyw2REFBNEQ7QUFFNUQsMENBQTBDO0FBQzFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQWlJekM7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxHQUFXLEVBQ1gsU0FBaUM7SUFFakMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSw4QkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsdURBQXVEO0lBQ3ZELElBQUEsNEJBQWlCLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsTUFBTSxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQXVCLEVBQUUsQ0FBQztJQUN0QyxJQUFJLFNBQVMsRUFBRTtRQUNiLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0tBQzlCO0lBQ0QsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLG9CQUFvQixDQUFDO0lBQ3pDLElBQUk7UUFDRixNQUFNLFFBQVEsR0FBd0MsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTtZQUMzRSxN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
|
|
666
|
+
async function concatenateUint8Array(uint8arrays) {
|
|
667
|
+
const blob = new Blob(uint8arrays);
|
|
668
|
+
const buffer = await blob.arrayBuffer();
|
|
669
|
+
return new Uint8Array(buffer);
|
|
670
|
+
}
|
|
671
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGRmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGRmMy9zcmMvdGRmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc01BLDhDQUtDO0FBRUQsMERBZUM7QUFlRCx3Q0FtQ0M7QUFFRCxvREFZQztBQXlERCxrQ0ErUEM7QUFHRCxzQ0FPQztBQUVELDBEQWdDQztBQXNPRCwwQ0FnREM7QUFFRCxnQ0FtSkM7QUEzaUNELCtCQUE4QztBQUU5QyxtREFPNkI7QUFDN0Isb0RBQXlFO0FBQ3pFLDZEQUE0RDtBQUM1RCwyREFBMkQ7QUFDM0QsbURBUTZCO0FBQzdCLG9GQUE4RTtBQUM5RSw4RUFBd0U7QUFDeEUsd0ZBQWtGO0FBR2xGLHFEQUFzRDtBQUV0RCw0REFBOEM7QUFDOUMsMkNBQXFDO0FBQ3JDLG1FQUEyRDtBQUczRCxvRkFBOEU7QUFPOUUsZ0RBVzJCO0FBQzNCLDZEQUFtRDtBQUNuRCwrQ0FBK0U7QUFHL0UsMENBQTBDO0FBQzFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQW1EekMsU0FBUyxPQUFPO0lBQ2QsSUFBSSxHQUF1QixDQUFDO0lBQzVCLElBQUksTUFBOEIsQ0FBQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUNuRCxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBQ2QsTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUNwQixDQUFDLENBQWUsQ0FBQztJQUVqQixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUksQ0FBQztJQUNuQixPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU8sQ0FBQztJQUV6QixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBd0VEOzs7R0FHRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsR0FBVyxFQUNYLFNBQWlDO0lBRWpDLE9BQU8s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
|