@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.
Files changed (321) hide show
  1. package/README.md +45 -38
  2. package/dist/cjs/src/access.js +99 -62
  3. package/dist/cjs/src/auth/auth.js +5 -26
  4. package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +1 -1
  5. package/dist/cjs/src/auth/oidc-externaljwt-provider.js +1 -1
  6. package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +1 -1
  7. package/dist/cjs/src/auth/oidc.js +1 -1
  8. package/dist/cjs/src/auth/providers.js +1 -1
  9. package/dist/cjs/src/concurrency.js +3 -4
  10. package/dist/cjs/src/encodings/base64.js +4 -4
  11. package/dist/cjs/src/encodings/hex.js +5 -6
  12. package/dist/cjs/src/encodings/index.js +18 -8
  13. package/dist/cjs/src/errors.js +1 -1
  14. package/dist/cjs/src/index.js +28 -320
  15. package/dist/cjs/src/nanoclients.js +285 -0
  16. package/dist/cjs/src/nanoindex.js +47 -0
  17. package/dist/cjs/src/nanotdf/Client.js +35 -30
  18. package/dist/cjs/src/nanotdf/NanoTDF.js +1 -1
  19. package/dist/cjs/src/nanotdf/decrypt.js +2 -2
  20. package/dist/cjs/src/nanotdf/encrypt-dataset.js +2 -2
  21. package/dist/cjs/src/nanotdf/encrypt.js +2 -2
  22. package/dist/cjs/src/nanotdf/helpers/calculateByCurve.js +3 -4
  23. package/dist/cjs/src/nanotdf/helpers/getHkdfSalt.js +2 -2
  24. package/dist/cjs/src/nanotdf/models/Ciphers.js +3 -3
  25. package/dist/cjs/src/nanotdf/models/EcCurves.js +3 -3
  26. package/dist/cjs/src/nanotdf/models/Header.js +1 -1
  27. package/dist/cjs/src/nanotdf/models/Payload.js +1 -1
  28. package/dist/cjs/src/nanotdf/models/Policy/AbstractPolicy.js +1 -1
  29. package/dist/cjs/src/nanotdf/models/Policy/EmbeddedPolicy.js +1 -1
  30. package/dist/cjs/src/nanotdf/models/Policy/PolicyFactory.js +1 -1
  31. package/dist/cjs/src/nanotdf/models/ResourceLocator.js +1 -1
  32. package/dist/cjs/src/nanotdf/models/Signature.js +1 -1
  33. package/dist/cjs/src/nanotdf-crypto/ciphers.js +1 -1
  34. package/dist/cjs/src/nanotdf-crypto/decrypt.js +2 -2
  35. package/dist/cjs/src/nanotdf-crypto/digest.js +2 -2
  36. package/dist/cjs/src/nanotdf-crypto/ecdsaSignature.js +4 -5
  37. package/dist/cjs/src/nanotdf-crypto/encrypt.js +2 -2
  38. package/dist/cjs/src/nanotdf-crypto/exportCryptoKey.js +2 -2
  39. package/dist/cjs/src/nanotdf-crypto/generateKeyPair.js +2 -2
  40. package/dist/cjs/src/nanotdf-crypto/generateRandomNumber.js +2 -2
  41. package/dist/cjs/src/nanotdf-crypto/index.js +21 -13
  42. package/dist/cjs/src/nanotdf-crypto/keyAgreement.js +10 -8
  43. package/dist/cjs/src/nanotdf-crypto/pemPublicToCrypto.js +20 -11
  44. package/dist/cjs/src/opentdf.js +243 -0
  45. package/dist/cjs/src/policy/api.js +2 -3
  46. package/dist/cjs/src/policy/granter.js +3 -4
  47. package/dist/cjs/src/seekable.js +157 -0
  48. package/dist/cjs/src/tdf/AttributeObject.js +2 -4
  49. package/dist/cjs/src/tdf/Policy.js +3 -3
  50. package/dist/cjs/src/utils.js +13 -21
  51. package/dist/cjs/src/version.js +7 -3
  52. package/dist/cjs/tdf3/index.js +27 -16
  53. package/dist/cjs/tdf3/src/assertions.js +25 -11
  54. package/dist/cjs/tdf3/src/binary.js +1 -1
  55. package/dist/cjs/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
  56. package/dist/cjs/tdf3/src/ciphers/symmetric-cipher-base.js +1 -1
  57. package/dist/cjs/tdf3/src/client/DecoratedReadableStream.js +7 -74
  58. package/dist/cjs/tdf3/src/client/builders.js +26 -22
  59. package/dist/cjs/tdf3/src/client/index.js +91 -117
  60. package/dist/cjs/tdf3/src/client/validation.js +3 -3
  61. package/dist/cjs/tdf3/src/crypto/crypto-utils.js +1 -1
  62. package/dist/cjs/tdf3/src/crypto/index.js +18 -18
  63. package/dist/cjs/tdf3/src/index.js +22 -11
  64. package/dist/cjs/tdf3/src/models/attribute-set.js +1 -1
  65. package/dist/cjs/tdf3/src/models/encryption-information.js +3 -3
  66. package/dist/cjs/tdf3/src/models/index.js +1 -2
  67. package/dist/cjs/tdf3/src/models/key-access.js +67 -35
  68. package/dist/cjs/tdf3/src/models/policy.js +3 -3
  69. package/dist/cjs/tdf3/src/tdf.js +180 -395
  70. package/dist/cjs/tdf3/src/utils/buffer-crc32.js +2 -3
  71. package/dist/cjs/tdf3/src/utils/index.js +48 -38
  72. package/dist/cjs/tdf3/src/utils/keysplit.js +4 -5
  73. package/dist/cjs/tdf3/src/utils/unwrap.js +21 -0
  74. package/dist/cjs/tdf3/src/utils/zip-reader.js +4 -4
  75. package/dist/cjs/tdf3/src/utils/zip-writer.js +4 -4
  76. package/dist/types/src/access.d.ts +10 -4
  77. package/dist/types/src/access.d.ts.map +1 -1
  78. package/dist/types/src/auth/auth.d.ts +1 -28
  79. package/dist/types/src/auth/auth.d.ts.map +1 -1
  80. package/dist/types/src/auth/providers.d.ts.map +1 -1
  81. package/dist/types/src/index.d.ts +5 -136
  82. package/dist/types/src/index.d.ts.map +1 -1
  83. package/dist/types/src/nanoclients.d.ts +107 -0
  84. package/dist/types/src/nanoclients.d.ts.map +1 -0
  85. package/dist/types/src/nanoindex.d.ts +5 -0
  86. package/dist/types/src/nanoindex.d.ts.map +1 -0
  87. package/dist/types/src/nanotdf/Client.d.ts +1 -13
  88. package/dist/types/src/nanotdf/Client.d.ts.map +1 -1
  89. package/dist/types/src/nanotdf/NanoTDF.d.ts +1 -1
  90. package/dist/types/src/nanotdf/NanoTDF.d.ts.map +1 -1
  91. package/dist/types/src/nanotdf/encrypt-dataset.d.ts +1 -1
  92. package/dist/types/src/nanotdf/encrypt-dataset.d.ts.map +1 -1
  93. package/dist/types/src/nanotdf/encrypt.d.ts +1 -1
  94. package/dist/types/src/nanotdf/encrypt.d.ts.map +1 -1
  95. package/dist/types/src/nanotdf/enum/CipherEnum.d.ts +1 -1
  96. package/dist/types/src/nanotdf/enum/CipherEnum.d.ts.map +1 -1
  97. package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts +1 -1
  98. package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts.map +1 -1
  99. package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts +1 -1
  100. package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts.map +1 -1
  101. package/dist/types/src/nanotdf/models/DefaultParams.d.ts +1 -1
  102. package/dist/types/src/nanotdf/models/ResourceLocator.d.ts.map +1 -1
  103. package/dist/types/src/nanotdf-crypto/digest.d.ts +1 -1
  104. package/dist/types/src/nanotdf-crypto/digest.d.ts.map +1 -1
  105. package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts +1 -1
  106. package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts.map +1 -1
  107. package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts +1 -1
  108. package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts.map +1 -1
  109. package/dist/types/src/nanotdf-crypto/index.d.ts +2 -3
  110. package/dist/types/src/nanotdf-crypto/index.d.ts.map +1 -1
  111. package/dist/types/src/nanotdf-crypto/keyAgreement.d.ts.map +1 -1
  112. package/dist/types/src/opentdf.d.ts +106 -0
  113. package/dist/types/src/opentdf.d.ts.map +1 -0
  114. package/dist/types/src/seekable.d.ts +39 -0
  115. package/dist/types/src/seekable.d.ts.map +1 -0
  116. package/dist/types/src/tdf/AttributeObject.d.ts +0 -2
  117. package/dist/types/src/tdf/AttributeObject.d.ts.map +1 -1
  118. package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts +2 -2
  119. package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts.map +1 -1
  120. package/dist/types/src/tdf/Policy.d.ts +1 -1
  121. package/dist/types/src/tdf/Policy.d.ts.map +1 -1
  122. package/dist/types/src/tdf/PolicyObject.d.ts +1 -2
  123. package/dist/types/src/tdf/PolicyObject.d.ts.map +1 -1
  124. package/dist/types/src/tdf/TypedArray.d.ts +1 -2
  125. package/dist/types/src/tdf/TypedArray.d.ts.map +1 -1
  126. package/dist/types/src/utils.d.ts +1 -3
  127. package/dist/types/src/utils.d.ts.map +1 -1
  128. package/dist/types/src/version.d.ts +5 -1
  129. package/dist/types/src/version.d.ts.map +1 -1
  130. package/dist/types/tdf3/index.d.ts +5 -4
  131. package/dist/types/tdf3/index.d.ts.map +1 -1
  132. package/dist/types/tdf3/src/assertions.d.ts +3 -3
  133. package/dist/types/tdf3/src/assertions.d.ts.map +1 -1
  134. package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts +2 -15
  135. package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts.map +1 -1
  136. package/dist/types/tdf3/src/client/builders.d.ts +43 -42
  137. package/dist/types/tdf3/src/client/builders.d.ts.map +1 -1
  138. package/dist/types/tdf3/src/client/index.d.ts +12 -17
  139. package/dist/types/tdf3/src/client/index.d.ts.map +1 -1
  140. package/dist/types/tdf3/src/client/validation.d.ts +3 -3
  141. package/dist/types/tdf3/src/client/validation.d.ts.map +1 -1
  142. package/dist/types/tdf3/src/crypto/crypto-utils.d.ts.map +1 -1
  143. package/dist/types/tdf3/src/index.d.ts +1 -1
  144. package/dist/types/tdf3/src/index.d.ts.map +1 -1
  145. package/dist/types/tdf3/src/models/index.d.ts +0 -1
  146. package/dist/types/tdf3/src/models/index.d.ts.map +1 -1
  147. package/dist/types/tdf3/src/models/key-access.d.ts +63 -15
  148. package/dist/types/tdf3/src/models/key-access.d.ts.map +1 -1
  149. package/dist/types/tdf3/src/models/manifest.d.ts +2 -0
  150. package/dist/types/tdf3/src/models/manifest.d.ts.map +1 -1
  151. package/dist/types/tdf3/src/models/policy.d.ts +0 -1
  152. package/dist/types/tdf3/src/models/policy.d.ts.map +1 -1
  153. package/dist/types/tdf3/src/tdf.d.ts +24 -37
  154. package/dist/types/tdf3/src/tdf.d.ts.map +1 -1
  155. package/dist/types/tdf3/src/utils/index.d.ts +0 -4
  156. package/dist/types/tdf3/src/utils/index.d.ts.map +1 -1
  157. package/dist/types/tdf3/src/utils/unwrap.d.ts +2 -0
  158. package/dist/types/tdf3/src/utils/unwrap.d.ts.map +1 -0
  159. package/dist/types/tdf3/src/utils/zip-reader.d.ts +1 -1
  160. package/dist/types/tdf3/src/utils/zip-reader.d.ts.map +1 -1
  161. package/dist/types/tdf3/src/utils/zip-writer.d.ts +2 -2
  162. package/dist/web/src/access.js +93 -58
  163. package/dist/web/src/auth/auth.js +1 -21
  164. package/dist/web/src/auth/oidc-clientcredentials-provider.js +1 -1
  165. package/dist/web/src/auth/oidc-externaljwt-provider.js +1 -1
  166. package/dist/web/src/auth/oidc-refreshtoken-provider.js +1 -1
  167. package/dist/web/src/auth/oidc.js +1 -1
  168. package/dist/web/src/auth/providers.js +1 -1
  169. package/dist/web/src/concurrency.js +1 -1
  170. package/dist/web/src/encodings/base64.js +1 -1
  171. package/dist/web/src/encodings/hex.js +1 -1
  172. package/dist/web/src/errors.js +1 -1
  173. package/dist/web/src/index.js +6 -312
  174. package/dist/web/src/nanoclients.js +280 -0
  175. package/dist/web/src/nanoindex.js +5 -0
  176. package/dist/web/src/nanotdf/Client.js +18 -23
  177. package/dist/web/src/nanotdf/NanoTDF.js +1 -1
  178. package/dist/web/src/nanotdf/encrypt-dataset.js +1 -1
  179. package/dist/web/src/nanotdf/encrypt.js +1 -1
  180. package/dist/web/src/nanotdf/models/Ciphers.js +1 -1
  181. package/dist/web/src/nanotdf/models/EcCurves.js +1 -1
  182. package/dist/web/src/nanotdf/models/Header.js +1 -1
  183. package/dist/web/src/nanotdf/models/Payload.js +1 -1
  184. package/dist/web/src/nanotdf/models/Policy/AbstractPolicy.js +1 -1
  185. package/dist/web/src/nanotdf/models/Policy/EmbeddedPolicy.js +1 -1
  186. package/dist/web/src/nanotdf/models/Policy/PolicyFactory.js +1 -1
  187. package/dist/web/src/nanotdf/models/ResourceLocator.js +1 -1
  188. package/dist/web/src/nanotdf/models/Signature.js +1 -1
  189. package/dist/web/src/nanotdf-crypto/ciphers.js +1 -1
  190. package/dist/web/src/nanotdf-crypto/ecdsaSignature.js +1 -1
  191. package/dist/web/src/nanotdf-crypto/generateKeyPair.js +2 -2
  192. package/dist/web/src/nanotdf-crypto/generateRandomNumber.js +2 -2
  193. package/dist/web/src/nanotdf-crypto/index.js +3 -4
  194. package/dist/web/src/nanotdf-crypto/keyAgreement.js +9 -6
  195. package/dist/web/src/nanotdf-crypto/pemPublicToCrypto.js +1 -1
  196. package/dist/web/src/opentdf.js +234 -0
  197. package/dist/web/src/policy/api.js +1 -1
  198. package/dist/web/src/policy/granter.js +1 -1
  199. package/dist/web/src/seekable.js +148 -0
  200. package/dist/web/src/tdf/AttributeObject.js +1 -2
  201. package/dist/web/src/tdf/Policy.js +2 -4
  202. package/dist/web/src/utils.js +3 -10
  203. package/dist/web/src/version.js +6 -2
  204. package/dist/web/tdf3/index.js +5 -4
  205. package/dist/web/tdf3/src/assertions.js +21 -6
  206. package/dist/web/tdf3/src/binary.js +1 -1
  207. package/dist/web/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
  208. package/dist/web/tdf3/src/ciphers/symmetric-cipher-base.js +1 -1
  209. package/dist/web/tdf3/src/client/DecoratedReadableStream.js +4 -68
  210. package/dist/web/tdf3/src/client/builders.js +26 -22
  211. package/dist/web/tdf3/src/client/index.js +74 -105
  212. package/dist/web/tdf3/src/client/validation.js +1 -1
  213. package/dist/web/tdf3/src/crypto/crypto-utils.js +1 -1
  214. package/dist/web/tdf3/src/crypto/index.js +1 -1
  215. package/dist/web/tdf3/src/index.js +2 -2
  216. package/dist/web/tdf3/src/models/attribute-set.js +1 -1
  217. package/dist/web/tdf3/src/models/encryption-information.js +3 -3
  218. package/dist/web/tdf3/src/models/index.js +1 -2
  219. package/dist/web/tdf3/src/models/key-access.js +47 -24
  220. package/dist/web/tdf3/src/models/policy.js +1 -1
  221. package/dist/web/tdf3/src/tdf.js +153 -371
  222. package/dist/web/tdf3/src/utils/buffer-crc32.js +1 -1
  223. package/dist/web/tdf3/src/utils/index.js +19 -14
  224. package/dist/web/tdf3/src/utils/keysplit.js +1 -1
  225. package/dist/web/tdf3/src/utils/unwrap.js +18 -0
  226. package/dist/web/tdf3/src/utils/zip-reader.js +1 -1
  227. package/dist/web/tdf3/src/utils/zip-writer.js +1 -1
  228. package/package.json +45 -45
  229. package/src/access.ts +111 -54
  230. package/src/auth/auth.ts +1 -31
  231. package/src/index.ts +5 -440
  232. package/src/nanoclients.ts +405 -0
  233. package/src/nanoindex.ts +4 -0
  234. package/src/nanotdf/Client.ts +18 -25
  235. package/src/nanotdf/NanoTDF.ts +1 -1
  236. package/src/nanotdf/encrypt-dataset.ts +1 -1
  237. package/src/nanotdf/encrypt.ts +1 -1
  238. package/src/nanotdf/helpers/getHkdfSalt.ts +1 -1
  239. package/src/nanotdf-crypto/digest.ts +1 -1
  240. package/src/nanotdf-crypto/generateKeyPair.ts +1 -1
  241. package/src/nanotdf-crypto/generateRandomNumber.ts +1 -1
  242. package/src/nanotdf-crypto/index.ts +2 -3
  243. package/src/nanotdf-crypto/keyAgreement.ts +14 -7
  244. package/src/opentdf.ts +441 -0
  245. package/src/seekable.ts +180 -0
  246. package/src/tdf/AttributeObject.ts +0 -3
  247. package/src/tdf/Policy.ts +1 -2
  248. package/src/tdf/PolicyObject.ts +1 -2
  249. package/src/tdf/TypedArray.ts +1 -3
  250. package/src/utils.ts +3 -11
  251. package/src/version.ts +6 -1
  252. package/tdf3/index.ts +15 -10
  253. package/tdf3/src/assertions.ts +33 -8
  254. package/tdf3/src/client/DecoratedReadableStream.ts +3 -80
  255. package/tdf3/src/client/builders.ts +44 -28
  256. package/tdf3/src/client/index.ts +109 -165
  257. package/tdf3/src/index.ts +1 -1
  258. package/tdf3/src/models/encryption-information.ts +2 -2
  259. package/tdf3/src/models/index.ts +0 -1
  260. package/tdf3/src/models/key-access.ts +120 -38
  261. package/tdf3/src/models/manifest.ts +3 -0
  262. package/tdf3/src/models/policy.ts +0 -1
  263. package/tdf3/src/tdf.ts +266 -522
  264. package/tdf3/src/utils/index.ts +19 -18
  265. package/tdf3/src/utils/unwrap.ts +17 -0
  266. package/tdf3/src/utils/zip-reader.ts +1 -1
  267. package/dist/cjs/src/auth/Eas.js +0 -60
  268. package/dist/cjs/src/nanotdf-crypto/importRawKey.js +0 -18
  269. package/dist/cjs/src/tdf/Crypto.js +0 -47
  270. package/dist/cjs/src/tdf/EntityObject.js +0 -3
  271. package/dist/cjs/src/tdf/index.js +0 -35
  272. package/dist/cjs/tdf3/src/models/upsert-response.js +0 -3
  273. package/dist/cjs/tdf3/src/templates/default.html.js +0 -98
  274. package/dist/cjs/tdf3/src/templates/escaper.js +0 -15
  275. package/dist/cjs/tdf3/src/templates/index.js +0 -12
  276. package/dist/cjs/tdf3/src/utils/chunkers.js +0 -106
  277. package/dist/cjs/tdf3/src/version.js +0 -6
  278. package/dist/types/src/auth/Eas.d.ts +0 -34
  279. package/dist/types/src/auth/Eas.d.ts.map +0 -1
  280. package/dist/types/src/nanotdf-crypto/importRawKey.d.ts +0 -13
  281. package/dist/types/src/nanotdf-crypto/importRawKey.d.ts.map +0 -1
  282. package/dist/types/src/tdf/Crypto.d.ts +0 -37
  283. package/dist/types/src/tdf/Crypto.d.ts.map +0 -1
  284. package/dist/types/src/tdf/EntityObject.d.ts +0 -18
  285. package/dist/types/src/tdf/EntityObject.d.ts.map +0 -1
  286. package/dist/types/src/tdf/index.d.ts +0 -7
  287. package/dist/types/src/tdf/index.d.ts.map +0 -1
  288. package/dist/types/tdf3/src/models/upsert-response.d.ts +0 -16
  289. package/dist/types/tdf3/src/models/upsert-response.d.ts.map +0 -1
  290. package/dist/types/tdf3/src/templates/default.html.d.ts +0 -8
  291. package/dist/types/tdf3/src/templates/default.html.d.ts.map +0 -1
  292. package/dist/types/tdf3/src/templates/escaper.d.ts +0 -6
  293. package/dist/types/tdf3/src/templates/escaper.d.ts.map +0 -1
  294. package/dist/types/tdf3/src/templates/index.d.ts +0 -3
  295. package/dist/types/tdf3/src/templates/index.d.ts.map +0 -1
  296. package/dist/types/tdf3/src/utils/chunkers.d.ts +0 -29
  297. package/dist/types/tdf3/src/utils/chunkers.d.ts.map +0 -1
  298. package/dist/types/tdf3/src/version.d.ts +0 -3
  299. package/dist/types/tdf3/src/version.d.ts.map +0 -1
  300. package/dist/web/src/auth/Eas.js +0 -55
  301. package/dist/web/src/nanotdf-crypto/importRawKey.js +0 -15
  302. package/dist/web/src/tdf/Crypto.js +0 -44
  303. package/dist/web/src/tdf/EntityObject.js +0 -2
  304. package/dist/web/src/tdf/index.js +0 -4
  305. package/dist/web/tdf3/src/models/upsert-response.js +0 -2
  306. package/dist/web/tdf3/src/templates/default.html.js +0 -96
  307. package/dist/web/tdf3/src/templates/escaper.js +0 -10
  308. package/dist/web/tdf3/src/templates/index.js +0 -3
  309. package/dist/web/tdf3/src/utils/chunkers.js +0 -96
  310. package/dist/web/tdf3/src/version.js +0 -3
  311. package/src/auth/Eas.ts +0 -79
  312. package/src/nanotdf-crypto/importRawKey.ts +0 -19
  313. package/src/tdf/Crypto.ts +0 -42
  314. package/src/tdf/EntityObject.ts +0 -18
  315. package/src/tdf/index.ts +0 -6
  316. package/tdf3/src/models/upsert-response.ts +0 -17
  317. package/tdf3/src/templates/default.html.ts +0 -105
  318. package/tdf3/src/templates/escaper.ts +0 -10
  319. package/tdf3/src/templates/index.ts +0 -2
  320. package/tdf3/src/utils/chunkers.ts +0 -118
  321. package/tdf3/src/version.ts +0 -2
@@ -1,313 +1,7 @@
1
- import { Client, NanoTDF, encrypt, decrypt, encryptDataset, getHkdfSalt, DefaultParams, } from './nanotdf/index.js';
2
- import { keyAgreement } from './nanotdf-crypto/index.js';
3
- import { createAttribute, Policy } from './tdf/index.js';
4
- import { fetchECKasPubKey } from './access.js';
5
- import { ConfigurationError } from './errors.js';
6
- export { attributeFQNsAsValues } from './policy/api.js';
7
- // Define default options
8
- const defaultOptions = {
9
- ecdsaBinding: false,
10
- };
11
- /**
12
- * NanoTDF SDK Client
13
- *
14
- * @example
15
- * ```
16
- * import { clientSecretAuthProvider, NanoTDFClient } from '@opentdf/sdk';
17
- *
18
- * const OIDC_ENDPOINT = 'http://localhost:65432/auth/realms/opentdf-demo';
19
- * const KAS_URL = 'http://localhost:65432/api/kas/';
20
- *
21
- * const ciphertext = '...';
22
- * const client = new NanoTDFClient({
23
- * authProvider: await clientSecretAuthProvider({
24
- * clientId: 'tdf-client',
25
- * clientSecret: '123-456',
26
- * oidcOrigin: OIDC_ENDPOINT,
27
- * }),
28
- * kasEndpoint: KAS_URL
29
- * }
30
- * );
31
- * client.decrypt(ciphertext)
32
- * .then(plaintext => {
33
- * console.log('Plaintext', plaintext);
34
- * })
35
- * .catch(err => {
36
- * console.error('Some error occurred', err);
37
- * })
38
- */
39
- export class NanoTDFClient extends Client {
40
- /**
41
- * Decrypt ciphertext
42
- *
43
- * Pass a base64 string, TypedArray, or ArrayBuffer ciphertext and get a promise which resolves plaintext
44
- *
45
- * @param ciphertext Ciphertext to decrypt
46
- */
47
- async decrypt(ciphertext) {
48
- // Parse ciphertext
49
- const nanotdf = NanoTDF.from(ciphertext);
50
- await this.fetchOIDCToken();
51
- // TODO: The version number should be fetched from the API
52
- const version = '0.0.1';
53
- const kasUrl = nanotdf.header.getKasRewrapUrl();
54
- // Rewrap key on every request
55
- const ukey = await this.rewrapKey(nanotdf.header.toBuffer(), kasUrl, nanotdf.header.magicNumberVersion, version);
56
- if (!ukey) {
57
- throw new Error('internal: key rewrap failure');
58
- }
59
- // Return decrypt promise
60
- return decrypt(ukey, nanotdf);
61
- }
62
- /**
63
- * Decrypt ciphertext of the legacy TDF, with the older, smaller i.v. calculation.
64
- *
65
- * Pass a base64 string, TypedArray, or ArrayBuffer ciphertext and get a promise which resolves plaintext
66
- *
67
- * @param ciphertext Ciphertext to decrypt
68
- */
69
- async decryptLegacyTDF(ciphertext) {
70
- // Parse ciphertext
71
- const nanotdf = NanoTDF.from(ciphertext, undefined, true);
72
- await this.fetchOIDCToken();
73
- const legacyVersion = '0.0.0';
74
- // Rewrap key on every request
75
- const key = await this.rewrapKey(nanotdf.header.toBuffer(), nanotdf.header.getKasRewrapUrl(), nanotdf.header.magicNumberVersion, legacyVersion);
76
- if (!key) {
77
- throw new Error('internal: failed unwrap');
78
- }
79
- // Return decrypt promise
80
- return decrypt(key, nanotdf);
81
- }
82
- /**
83
- * Encrypts the given data using the NanoTDF encryption scheme.
84
- *
85
- * @param {string | TypedArray | ArrayBuffer} data - The data to be encrypted.
86
- * @param {EncryptOptions} [options=defaultOptions] - The encryption options (currently unused).
87
- * @returns {Promise<ArrayBuffer>} A promise that resolves to the encrypted data as an ArrayBuffer.
88
- * @throws {Error} If the initialization vector is not a number.
89
- */
90
- async encrypt(data, options) {
91
- // For encrypt always generate the client ephemeralKeyPair
92
- const ephemeralKeyPair = await this.ephemeralKeyPair;
93
- const initializationVector = this.iv;
94
- if (typeof initializationVector !== 'number') {
95
- throw new ConfigurationError('NanoTDF clients are single use. Please generate a new client and keypair.');
96
- }
97
- delete this.iv;
98
- if (!this.kasPubKey) {
99
- this.kasPubKey = await fetchECKasPubKey(this.kasUrl);
100
- }
101
- // Create a policy for the tdf
102
- const policy = new Policy();
103
- // Add data attributes.
104
- for (const dataAttribute of this.dataAttributes) {
105
- const attribute = await createAttribute(dataAttribute, this.kasPubKey, this.kasUrl);
106
- policy.addAttribute(attribute);
107
- }
108
- if (this.dissems.length == 0 && this.dataAttributes.length == 0) {
109
- console.warn('This policy has an empty attributes list and an empty dissemination list. This will allow any entity with a valid Entity Object to access this TDF.');
110
- }
111
- // Encrypt the policy.
112
- const policyObjectAsStr = policy.toJSON();
113
- // IV is always '1', since the new keypair is generated on encrypt
114
- // using the same key is fine.
115
- const lengthAsUint32 = new Uint32Array(1);
116
- lengthAsUint32[0] = initializationVector;
117
- const lengthAsUint24 = new Uint8Array(lengthAsUint32.buffer);
118
- // NOTE: We are only interested in only first 3 bytes.
119
- const payloadIV = new Uint8Array(12).fill(0);
120
- payloadIV[9] = lengthAsUint24[2];
121
- payloadIV[10] = lengthAsUint24[1];
122
- payloadIV[11] = lengthAsUint24[0];
123
- const mergedOptions = { ...defaultOptions, ...options };
124
- return encrypt(policyObjectAsStr, this.kasPubKey, ephemeralKeyPair, payloadIV, data, mergedOptions.ecdsaBinding);
125
- }
126
- }
127
- /**
128
- * NanoTDF Dataset SDK Client
129
- *
130
- *
131
- * @example
132
- * ```
133
- * import { clientSecretAuthProvider, NanoTDFDatasetClient } from '@opentdf/sdk';
134
- *
135
- * const OIDC_ENDPOINT = 'http://localhost:65432/auth/realms/tdf';
136
- * const KAS_URL = 'http://localhost:65432/api/kas/';
137
- *
138
- * const ciphertext = '...';
139
- * const client = new NanoTDFDatasetClient({
140
- * authProvider: await clientSecretAuthProvider({
141
- * clientId: 'tdf-client',
142
- * clientSecret: '123-456',
143
- * exchange: 'client',
144
- * oidcOrigin: OIDC_ENDPOINT,
145
- * }),
146
- * kasEndpoint: KAS_URL,
147
- * });
148
- * const plaintext = client.decrypt(ciphertext);
149
- * console.log('Plaintext', plaintext);
150
- * ```
151
- */
152
- export class NanoTDFDatasetClient extends Client {
153
- /**
154
- * Create new NanoTDF Dataset Client
155
- *
156
- * The Ephemeral Key Pair can either be provided or will be generate when fetching the entity object. Once set it
157
- * cannot be changed. If a new ephemeral key is desired it a new client should be initialized.
158
- * There is no performance impact for creating a new client IFF the ephemeral key pair is provided.
159
- *
160
- * @param clientConfig OIDC client credentials
161
- * @param kasUrl Key access service URL
162
- * @param ephemeralKeyPair (optional) ephemeral key pair to use
163
- * @param maxKeyIterations Max iteration to performe without a key rotation
164
- */
165
- constructor(opts) {
166
- if (opts.maxKeyIterations &&
167
- opts.maxKeyIterations > NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS) {
168
- throw new ConfigurationError(`key iteration exceeds max iterations(${NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS})`);
169
- }
170
- super(opts);
171
- this.maxKeyIteration = opts.maxKeyIterations || NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS;
172
- this.keyIterationCount = 0;
173
- }
174
- /**
175
- * Encrypt data
176
- *
177
- * Pass a string, TypedArray, or ArrayBuffer data and get a promise which resolves ciphertext
178
- *
179
- * @param data to decrypt
180
- */
181
- async encrypt(data, options) {
182
- // Intial encrypt
183
- if (this.keyIterationCount == 0) {
184
- const mergedOptions = { ...defaultOptions, ...options };
185
- this.ecdsaBinding = mergedOptions.ecdsaBinding;
186
- // For encrypt always generate the client ephemeralKeyPair
187
- const ephemeralKeyPair = await this.ephemeralKeyPair;
188
- if (!this.kasPubKey) {
189
- this.kasPubKey = await fetchECKasPubKey(this.kasUrl);
190
- }
191
- // Create a policy for the tdf
192
- const policy = new Policy();
193
- // Add data attributes.
194
- for (const dataAttribute of this.dataAttributes) {
195
- const attribute = await createAttribute(dataAttribute, this.kasPubKey, this.kasUrl);
196
- policy.addAttribute(attribute);
197
- }
198
- if (this.dissems.length == 0 || this.dataAttributes.length == 0) {
199
- console.warn('This policy has an empty attributes list and an empty dissemination list. This will allow any entity with a valid Entity Object to access this TDF.');
200
- }
201
- // Encrypt the policy.
202
- const policyObjectAsStr = policy.toJSON();
203
- const ivVector = this.generateIV();
204
- // Generate a symmetric key.
205
- this.symmetricKey = await keyAgreement(ephemeralKeyPair.privateKey, await this.kasPubKey.key, await getHkdfSalt(DefaultParams.magicNumberVersion));
206
- const nanoTDFBuffer = await encrypt(policyObjectAsStr, this.kasPubKey, ephemeralKeyPair, ivVector, data, this.ecdsaBinding);
207
- // Cache the header and increment the key iteration
208
- if (!this.cachedHeader) {
209
- const nanoTDF = NanoTDF.from(nanoTDFBuffer);
210
- this.cachedHeader = nanoTDF.header;
211
- }
212
- this.keyIterationCount += 1;
213
- return nanoTDFBuffer;
214
- }
215
- this.keyIterationCount += 1;
216
- if (!this.cachedHeader) {
217
- throw new ConfigurationError('invalid dataset client: empty nanoTDF header');
218
- }
219
- if (!this.symmetricKey) {
220
- throw new ConfigurationError('invalid dataset client: empty dek');
221
- }
222
- this.keyIterationCount += 1;
223
- if (this.keyIterationCount == this.maxKeyIteration) {
224
- // reset the key iteration
225
- this.keyIterationCount = 0;
226
- }
227
- const ivVector = this.generateIV();
228
- return encryptDataset(this.symmetricKey, this.cachedHeader, ivVector, data);
229
- }
230
- /**
231
- * Decrypt ciphertext
232
- *
233
- * Pass a base64 string, TypedArray, or ArrayBuffer ciphertext and get a promise which resolves plaintext
234
- *
235
- * @param ciphertext Ciphertext to decrypt
236
- */
237
- async decrypt(ciphertext) {
238
- // Parse ciphertext
239
- const nanotdf = NanoTDF.from(ciphertext);
240
- if (!this.cachedEphemeralKey) {
241
- // First decrypt
242
- return this.rewrapAndDecrypt(nanotdf);
243
- }
244
- // Other encrypts
245
- if (this.cachedEphemeralKey.toString() == nanotdf.header.ephemeralPublicKey.toString()) {
246
- const ukey = this.unwrappedKey;
247
- if (!ukey) {
248
- // These should have thrown already.
249
- throw new Error('internal: key rewrap failure');
250
- }
251
- // Return decrypt promise
252
- return decrypt(ukey, nanotdf);
253
- }
254
- else {
255
- return this.rewrapAndDecrypt(nanotdf);
256
- }
257
- }
258
- async rewrapAndDecrypt(nanotdf) {
259
- // TODO: The version number should be fetched from the API
260
- await this.fetchOIDCToken();
261
- const version = '0.0.1';
262
- // Rewrap key on every request
263
- const ukey = await this.rewrapKey(nanotdf.header.toBuffer(), nanotdf.header.getKasRewrapUrl(), nanotdf.header.magicNumberVersion, version);
264
- if (!ukey) {
265
- // These should have thrown already.
266
- throw new Error('internal: key rewrap failure');
267
- }
268
- this.cachedEphemeralKey = nanotdf.header.ephemeralPublicKey;
269
- this.unwrappedKey = ukey;
270
- // Return decrypt promise
271
- return decrypt(ukey, nanotdf);
272
- }
273
- generateIV() {
274
- const iv = this.iv;
275
- if (iv === undefined) {
276
- // iv has passed the maximum iteration count for this dek
277
- throw new ConfigurationError('dataset full');
278
- }
279
- // assert iv ∈ ℤ ∩ (0, 2^24)
280
- if (!Number.isInteger(iv) || iv <= 0 || 16777215 < iv) {
281
- // Something has fiddled with the iv outside of the expected behavior
282
- // could indicate a race condition, e.g. if two workers or handlers are
283
- // processing the file at once, for example.
284
- throw new Error('internal: invalid state');
285
- }
286
- const lengthAsUint32 = new Uint32Array(1);
287
- lengthAsUint32[0] = iv;
288
- const lengthAsUint24 = new Uint8Array(lengthAsUint32.buffer);
289
- // NOTE: We are only interested in only first 3 bytes.
290
- const ivVector = new Uint8Array(Client.IV_SIZE).fill(0);
291
- ivVector[9] = lengthAsUint24[2];
292
- ivVector[10] = lengthAsUint24[1];
293
- ivVector[11] = lengthAsUint24[0];
294
- // Increment the IV
295
- if (iv == 16777215) {
296
- delete this.iv;
297
- }
298
- else {
299
- this.iv = iv + 1;
300
- }
301
- return ivVector;
302
- }
303
- }
304
- // Total unique IVs(2^24 -1) used for encrypting the nano tdf payloads
305
- // IV starts from 1 since the 0 IV is reserved for policy encryption
306
- NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS = 8388606;
307
- /**
308
- * Authorization for connecting authZ tokens to
309
- * remote requests.
310
- */
1
+ export { HttpRequest, withHeaders } from './auth/auth.js';
311
2
  export * as AuthProviders from './auth/providers.js';
312
- export { version, clientType } from './version.js';
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBRVAsT0FBTyxFQUNQLE9BQU8sRUFDUCxjQUFjLEVBQ2QsV0FBVyxFQUNYLGFBQWEsR0FDZCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQWMsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFPeEQseUJBQXlCO0FBQ3pCLE1BQU0sY0FBYyxHQUFtQjtJQUNyQyxZQUFZLEVBQUUsS0FBSztDQUNwQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsTUFBTTtJQUN2Qzs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQTZDO1FBQ3pELG1CQUFtQjtRQUNuQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTVCLDBEQUEwRDtRQUMxRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVoRCw4QkFBOEI7UUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUMvQixPQUFPLENBQUMsTUFBTSxDQUFD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
3
+ export { attributeFQNsAsValues } from './policy/api.js';
4
+ export { version, clientType, tdfSpecVersion } from './version.js';
5
+ export * from './opentdf.js';
6
+ export * from './seekable.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQyxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxLQUFLLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkUsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxlQUFlLENBQUMifQ==
@@ -0,0 +1,280 @@
1
+ import { Client, NanoTDF, encrypt, decrypt, encryptDataset, getHkdfSalt, DefaultParams, } from './nanotdf/index.js';
2
+ import { keyAgreement } from './nanotdf-crypto/index.js';
3
+ import { Policy } from './tdf/Policy.js';
4
+ import { createAttribute } from './tdf/AttributeObject.js';
5
+ import { fetchECKasPubKey } from './access.js';
6
+ import { ConfigurationError } from './errors.js';
7
+ // Define default options
8
+ const defaultOptions = {
9
+ ecdsaBinding: false,
10
+ };
11
+ /**
12
+ * NanoTDF SDK Client. Deprecated in favor of OpenTDF.
13
+ *
14
+ */
15
+ export class NanoTDFClient extends Client {
16
+ /**
17
+ * Decrypt ciphertext
18
+ *
19
+ * Pass a base64 string, TypedArray, or ArrayBuffer ciphertext and get a promise which resolves plaintext
20
+ *
21
+ * @param ciphertext Ciphertext to decrypt
22
+ */
23
+ async decrypt(ciphertext) {
24
+ // Parse ciphertext
25
+ const nanotdf = NanoTDF.from(ciphertext);
26
+ // TODO: The version number should be fetched from the API
27
+ const version = '0.0.1';
28
+ const kasUrl = nanotdf.header.getKasRewrapUrl();
29
+ // Rewrap key on every request
30
+ const ukey = await this.rewrapKey(nanotdf.header.toBuffer(), kasUrl, nanotdf.header.magicNumberVersion, version);
31
+ if (!ukey) {
32
+ throw new Error('internal: key rewrap failure');
33
+ }
34
+ // Return decrypt promise
35
+ return decrypt(ukey, nanotdf);
36
+ }
37
+ /**
38
+ * Decrypt ciphertext of the legacy TDF, with the older, smaller i.v. calculation.
39
+ *
40
+ * Pass a base64 string, TypedArray, or ArrayBuffer ciphertext and get a promise which resolves plaintext
41
+ *
42
+ * @param ciphertext Ciphertext to decrypt
43
+ */
44
+ async decryptLegacyTDF(ciphertext) {
45
+ // Parse ciphertext
46
+ const nanotdf = NanoTDF.from(ciphertext, undefined, true);
47
+ const legacyVersion = '0.0.0';
48
+ // Rewrap key on every request
49
+ const key = await this.rewrapKey(nanotdf.header.toBuffer(), nanotdf.header.getKasRewrapUrl(), nanotdf.header.magicNumberVersion, legacyVersion);
50
+ if (!key) {
51
+ throw new Error('internal: failed unwrap');
52
+ }
53
+ // Return decrypt promise
54
+ return decrypt(key, nanotdf);
55
+ }
56
+ /**
57
+ * Encrypts the given data using the NanoTDF encryption scheme.
58
+ *
59
+ * @param {string | TypedArray | ArrayBuffer} data - The data to be encrypted.
60
+ * @param {EncryptOptions} [options=defaultOptions] - The encryption options (currently unused).
61
+ * @returns {Promise<ArrayBuffer>} A promise that resolves to the encrypted data as an ArrayBuffer.
62
+ * @throws {Error} If the initialization vector is not a number.
63
+ */
64
+ async encrypt(data, options) {
65
+ // For encrypt always generate the client ephemeralKeyPair
66
+ const ephemeralKeyPair = await this.ephemeralKeyPair;
67
+ const initializationVector = this.iv;
68
+ if (typeof initializationVector !== 'number') {
69
+ throw new ConfigurationError('NanoTDF clients are single use. Please generate a new client and keypair.');
70
+ }
71
+ delete this.iv;
72
+ if (!this.kasPubKey) {
73
+ this.kasPubKey = await fetchECKasPubKey(this.kasUrl);
74
+ }
75
+ // Create a policy for the tdf
76
+ const policy = new Policy();
77
+ // Add data attributes.
78
+ for (const dataAttribute of this.dataAttributes) {
79
+ const attribute = await createAttribute(dataAttribute, this.kasPubKey, this.kasUrl);
80
+ policy.addAttribute(attribute);
81
+ }
82
+ if (this.dissems.length == 0 && this.dataAttributes.length == 0) {
83
+ console.warn('This policy has an empty attributes list and an empty dissemination list. This will allow any entity with a valid Entity Object to access this TDF.');
84
+ }
85
+ // Encrypt the policy.
86
+ const policyObjectAsStr = policy.toJSON();
87
+ // IV is always '1', since the new keypair is generated on encrypt
88
+ // using the same key is fine.
89
+ const lengthAsUint32 = new Uint32Array(1);
90
+ lengthAsUint32[0] = initializationVector;
91
+ const lengthAsUint24 = new Uint8Array(lengthAsUint32.buffer);
92
+ // NOTE: We are only interested in only first 3 bytes.
93
+ const payloadIV = new Uint8Array(12).fill(0);
94
+ payloadIV[9] = lengthAsUint24[2];
95
+ payloadIV[10] = lengthAsUint24[1];
96
+ payloadIV[11] = lengthAsUint24[0];
97
+ const mergedOptions = { ...defaultOptions, ...options };
98
+ return encrypt(policyObjectAsStr, this.kasPubKey, ephemeralKeyPair, payloadIV, data, mergedOptions.ecdsaBinding);
99
+ }
100
+ }
101
+ /**
102
+ * NanoTDF Dataset SDK Client
103
+ *
104
+ *
105
+ * @example
106
+ * ```
107
+ * import { clientSecretAuthProvider, NanoTDFDatasetClient } from '@opentdf/sdk';
108
+ *
109
+ * const OIDC_ENDPOINT = 'http://localhost:65432/auth/realms/opentdf';
110
+ * const KAS_URL = 'http://localhost:65432/api/kas/';
111
+ *
112
+ * const ciphertext = '...';
113
+ * const client = new NanoTDFDatasetClient({
114
+ * authProvider: await clientSecretAuthProvider({
115
+ * clientId: 'tdf-client',
116
+ * clientSecret: '123-456',
117
+ * exchange: 'client',
118
+ * oidcOrigin: OIDC_ENDPOINT,
119
+ * }),
120
+ * kasEndpoint: KAS_URL,
121
+ * });
122
+ * const plaintext = client.decrypt(ciphertext);
123
+ * console.log('Plaintext', plaintext);
124
+ * ```
125
+ */
126
+ export class NanoTDFDatasetClient extends Client {
127
+ /**
128
+ * Create new NanoTDF Dataset Client
129
+ *
130
+ * The Ephemeral Key Pair can either be provided or will be generate when fetching the entity object. Once set it
131
+ * cannot be changed. If a new ephemeral key is desired it a new client should be initialized.
132
+ * There is no performance impact for creating a new client IFF the ephemeral key pair is provided.
133
+ *
134
+ * @param clientConfig OIDC client credentials
135
+ * @param kasUrl Key access service URL
136
+ * @param ephemeralKeyPair (optional) ephemeral key pair to use
137
+ * @param maxKeyIterations Max iteration to performe without a key rotation
138
+ */
139
+ constructor(opts) {
140
+ if (opts.maxKeyIterations &&
141
+ opts.maxKeyIterations > NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS) {
142
+ throw new ConfigurationError(`key iteration exceeds max iterations(${NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS})`);
143
+ }
144
+ super(opts);
145
+ this.maxKeyIteration = opts.maxKeyIterations || NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS;
146
+ this.keyIterationCount = 0;
147
+ }
148
+ /**
149
+ * Encrypt data
150
+ *
151
+ * Pass a string, TypedArray, or ArrayBuffer data and get a promise which resolves ciphertext
152
+ *
153
+ * @param data to decrypt
154
+ */
155
+ async encrypt(data, options) {
156
+ // Intial encrypt
157
+ if (this.keyIterationCount == 0) {
158
+ const mergedOptions = { ...defaultOptions, ...options };
159
+ this.ecdsaBinding = mergedOptions.ecdsaBinding;
160
+ // For encrypt always generate the client ephemeralKeyPair
161
+ const ephemeralKeyPair = await this.ephemeralKeyPair;
162
+ if (!this.kasPubKey) {
163
+ this.kasPubKey = await fetchECKasPubKey(this.kasUrl);
164
+ }
165
+ // Create a policy for the tdf
166
+ const policy = new Policy();
167
+ // Add data attributes.
168
+ for (const dataAttribute of this.dataAttributes) {
169
+ const attribute = await createAttribute(dataAttribute, this.kasPubKey, this.kasUrl);
170
+ policy.addAttribute(attribute);
171
+ }
172
+ if (this.dissems.length == 0 || this.dataAttributes.length == 0) {
173
+ console.warn('This policy has an empty attributes list and an empty dissemination list. This will allow any entity with a valid Entity Object to access this TDF.');
174
+ }
175
+ // Encrypt the policy.
176
+ const policyObjectAsStr = policy.toJSON();
177
+ const ivVector = this.generateIV();
178
+ // Generate a symmetric key.
179
+ this.symmetricKey = await keyAgreement(ephemeralKeyPair.privateKey, await this.kasPubKey.key, await getHkdfSalt(DefaultParams.magicNumberVersion));
180
+ const nanoTDFBuffer = await encrypt(policyObjectAsStr, this.kasPubKey, ephemeralKeyPair, ivVector, data, this.ecdsaBinding);
181
+ // Cache the header and increment the key iteration
182
+ if (!this.cachedHeader) {
183
+ const nanoTDF = NanoTDF.from(nanoTDFBuffer);
184
+ this.cachedHeader = nanoTDF.header;
185
+ }
186
+ this.keyIterationCount += 1;
187
+ return nanoTDFBuffer;
188
+ }
189
+ this.keyIterationCount += 1;
190
+ if (!this.cachedHeader) {
191
+ throw new ConfigurationError('invalid dataset client: empty nanoTDF header');
192
+ }
193
+ if (!this.symmetricKey) {
194
+ throw new ConfigurationError('invalid dataset client: empty dek');
195
+ }
196
+ this.keyIterationCount += 1;
197
+ if (this.keyIterationCount == this.maxKeyIteration) {
198
+ // reset the key iteration
199
+ this.keyIterationCount = 0;
200
+ }
201
+ const ivVector = this.generateIV();
202
+ return encryptDataset(this.symmetricKey, this.cachedHeader, ivVector, data);
203
+ }
204
+ /**
205
+ * Decrypt ciphertext
206
+ *
207
+ * Pass a base64 string, TypedArray, or ArrayBuffer ciphertext and get a promise which resolves plaintext
208
+ *
209
+ * @param ciphertext Ciphertext to decrypt
210
+ */
211
+ async decrypt(ciphertext) {
212
+ // Parse ciphertext
213
+ const nanotdf = NanoTDF.from(ciphertext);
214
+ if (!this.cachedEphemeralKey) {
215
+ // First decrypt
216
+ return this.rewrapAndDecrypt(nanotdf);
217
+ }
218
+ // Other encrypts
219
+ if (this.cachedEphemeralKey.toString() == nanotdf.header.ephemeralPublicKey.toString()) {
220
+ const ukey = this.unwrappedKey;
221
+ if (!ukey) {
222
+ // These should have thrown already.
223
+ throw new Error('internal: key rewrap failure');
224
+ }
225
+ // Return decrypt promise
226
+ return decrypt(ukey, nanotdf);
227
+ }
228
+ else {
229
+ return this.rewrapAndDecrypt(nanotdf);
230
+ }
231
+ }
232
+ async rewrapAndDecrypt(nanotdf) {
233
+ // TODO: The version number should be fetched from the API
234
+ const version = '0.0.1';
235
+ // Rewrap key on every request
236
+ const ukey = await this.rewrapKey(nanotdf.header.toBuffer(), nanotdf.header.getKasRewrapUrl(), nanotdf.header.magicNumberVersion, version);
237
+ if (!ukey) {
238
+ // These should have thrown already.
239
+ throw new Error('internal: key rewrap failure');
240
+ }
241
+ this.cachedEphemeralKey = nanotdf.header.ephemeralPublicKey;
242
+ this.unwrappedKey = ukey;
243
+ // Return decrypt promise
244
+ return decrypt(ukey, nanotdf);
245
+ }
246
+ generateIV() {
247
+ const iv = this.iv;
248
+ if (iv === undefined) {
249
+ // iv has passed the maximum iteration count for this dek
250
+ throw new ConfigurationError('dataset full');
251
+ }
252
+ // assert iv ∈ ℤ ∩ (0, 2^24)
253
+ if (!Number.isInteger(iv) || iv <= 0 || 0xff_ffff < iv) {
254
+ // Something has fiddled with the iv outside of the expected behavior
255
+ // could indicate a race condition, e.g. if two workers or handlers are
256
+ // processing the file at once, for example.
257
+ throw new Error('internal: invalid state');
258
+ }
259
+ const lengthAsUint32 = new Uint32Array(1);
260
+ lengthAsUint32[0] = iv;
261
+ const lengthAsUint24 = new Uint8Array(lengthAsUint32.buffer);
262
+ // NOTE: We are only interested in only first 3 bytes.
263
+ const ivVector = new Uint8Array(Client.IV_SIZE).fill(0);
264
+ ivVector[9] = lengthAsUint24[2];
265
+ ivVector[10] = lengthAsUint24[1];
266
+ ivVector[11] = lengthAsUint24[0];
267
+ // Increment the IV
268
+ if (iv == 0xff_ffff) {
269
+ delete this.iv;
270
+ }
271
+ else {
272
+ this.iv = iv + 1;
273
+ }
274
+ return ivVector;
275
+ }
276
+ }
277
+ // Total unique IVs(2^24 -1) used for encrypting the nano tdf payloads
278
+ // IV starts from 1 since the 0 IV is reserved for policy encryption
279
+ NanoTDFDatasetClient.NTDF_MAX_KEY_ITERATIONS = 8388606;
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2NsaWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmFub2NsaWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBRVAsT0FBTyxFQUNQLE9BQU8sRUFDUCxjQUFjLEVBQ2QsV0FBVyxFQUNYLGFBQWEsR0FDZCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPakQseUJBQXlCO0FBQ3pCLE1BQU0sY0FBYyxHQUFtQjtJQUNyQyxZQUFZLEVBQUUsS0FBSztDQUNwQixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxNQUFNO0lBQ3ZDOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBNkM7UUFDekQsbUJBQW1CO1FBQ25CLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekMsMERBQTBEO1FBQzFELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRWhELDhCQUE4QjtRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQy9CLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQ3pCLE1BQU0sRUFDTixPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUNqQyxP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
@@ -0,0 +1,5 @@
1
+ export * as AuthProviders from './auth/providers.js';
2
+ export { attributeFQNsAsValues } from './policy/api.js';
3
+ export * from './nanoclients.js';
4
+ export { version, clientType } from './version.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2luZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25hbm9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssYUFBYSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELGNBQWMsa0JBQWtCLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUMifQ==