diff --git a/package.json b/package.json index f29128d..ded15de 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,11 @@ "email": "open.source@ribose.com" }, "peerDependencies": { - "isomorphic-git": "^1.7.8" + "isomorphic-git": "^1.7.8", + "@aws-crypto/sha256-universal": "^2.0.0" }, "devDependencies": { + "@aws-crypto/sha256-universal": "^2.0.0", "@babel/cli": "^7.1.5", "@babel/core": "^7.4.0", "@babel/preset-env": "^7.4.2", diff --git a/src/pointers.ts b/src/pointers.ts index 365d41c..862ed61 100644 --- a/src/pointers.ts +++ b/src/pointers.ts @@ -1,7 +1,6 @@ -// This is Node-only code due to use of crypto. -import crypto from 'crypto'; import path from 'path'; -import { SPEC_URL } from './util'; +import { Sha256 } from '@aws-crypto/sha256-universal'; +import { SPEC_URL, toHex } from './util'; export interface PointerInfo { @@ -76,6 +75,8 @@ export function formatPointerInfo(info: PointerInfo): Buffer { export async function buildPointerInfo(content: Buffer): Promise { const size = Buffer.byteLength(content); - const hash = crypto.createHash('sha256').update(content).digest('hex'); - return { oid: hash, size }; + const hash = new Sha256(); + hash.update(content); + const oid = toHex(await hash.digest()); + return { oid, size }; } diff --git a/src/util.ts b/src/util.ts index a9a864b..0564b9c 100644 --- a/src/util.ts +++ b/src/util.ts @@ -77,3 +77,14 @@ export async function bodyToBuffer(body: Uint8Array[]): Promise { } return Buffer.from(result.buffer); } + + +// Borrowed from Isomorphic Git core, it is not importable. +export function toHex(buffer: ArrayBuffer): string { + let hex = '' + for (const byte of new Uint8Array(buffer)) { + if (byte < 16) hex += '0' + hex += byte.toString(16) + } + return hex +} diff --git a/yarn.lock b/yarn.lock index 6983bd1..27ee5e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,105 @@ # yarn lockfile v1 +"@aws-crypto/ie11-detection@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz#bb6c2facf8f03457e949dcf0921477397ffa4c6e" + integrity sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz#741c9024df55ec59b51e5b1f5d806a4852699fb5" + integrity sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A== + dependencies: + "@aws-crypto/ie11-detection" "^2.0.0" + "@aws-crypto/sha256-js" "^2.0.0" + "@aws-crypto/supports-web-crypto" "^2.0.0" + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz#f1f936039bdebd0b9e2dd834d65afdc2aac4efcb" + integrity sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig== + dependencies: + "@aws-crypto/util" "^2.0.0" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-universal@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-universal/-/sha256-universal-2.0.0.tgz#c4ed6b2f84d00cadf4911f63df251c17f1b3921d" + integrity sha512-gwEj8B9vr0LWFuV7kSQH5L0L02PMDNuWDrChL84E0/o0+TRyiTfqe0j4irXRwy1fEKj72grzxVPyKhCJo2BeIg== + dependencies: + "@aws-crypto/sha256-browser" "^2.0.0" + "@aws-sdk/hash-node" "^3.0.0" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz#fd6cde30b88f77d5a4f57b2c37c560d918014f9e" + integrity sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-2.0.0.tgz#17ba6f83c7e447b70fc24b84c5f6714d1e329f4a" + integrity sha512-YDooyH83m2P5A3h6lNH7hm6mIP93sU/dtzRmXIgtO4BCB7SvtX8ysVKQAE8tVky2DQ3HHxPCjNTuUe7YoAMrNQ== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/hash-node@^3.0.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.40.0.tgz#bf4d31a41652cbc3c937055087c80096cfab67ae" + integrity sha512-yOXXK85DdGDktdnQtXgMdaVKii4wtMjEhJ1mrvx2A9nMFNaPhxvERkVVIUKSWlJRa9ZujOw5jWOx8d2R51/Kjg== + dependencies: + "@aws-sdk/types" "3.40.0" + "@aws-sdk/util-buffer-from" "3.37.0" + tslib "^2.3.0" + +"@aws-sdk/is-array-buffer@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.37.0.tgz#aa87619f8172b1a2a7ac8d573032025d98ae6c50" + integrity sha512-XLjA/a6AuGnCvcJZLsMTy2jxF2upgGhqCCkoIJgLlzzXHSihur13KcmPvW/zcaGnCRj0SvKWXiJHl4vDlW75VQ== + dependencies: + tslib "^2.3.0" + +"@aws-sdk/types@3.40.0", "@aws-sdk/types@^3.1.0": + version "3.40.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.40.0.tgz#a9d7926fcb9b699bc46be975033559d2293e60d1" + integrity sha512-KpILcfvRaL88TLvo3SY4OuCCg90SvcNLPyjDwUuBqiOyWODjrKShHtAPJzej4CLp92lofh+ul0UnBfV9Jb/5PA== + +"@aws-sdk/util-buffer-from@3.37.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.37.0.tgz#298d4a925b9f0ca23f99617648cd9fb3896b573c" + integrity sha512-aa3SBwjLwImuJoE4+hxDIWQ9REz3UFb3p7KFPe9qopdXb/yB12RTcbrXVb4whUux4i4mO6KRij0ZNjFZrjrKPg== + dependencies: + "@aws-sdk/is-array-buffer" "3.37.0" + tslib "^2.3.0" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.37.0.tgz#e041f411e5e6a235e5bcffacc4b7fa90f25d8d01" + integrity sha512-NvDCfOhLLVHp27oGUUs8EVirhz91aX5gdxGS7J/sh5PF0cNN8rwaR1vSLR7BxPmJHMO7NH7i9EwiELfLfYcq6g== + dependencies: + tslib "^2.3.0" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.37.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.37.0.tgz#d896899f4c475ceeaf8b77c5d7cdc453e5fe6b83" + integrity sha512-tuiOxzfqet1kKGYzlgpMGfhr64AHJnYsFx2jZiH/O6Yq8XQg43ryjQlbJlim/K/XHGNzY0R+nabeJg34q3Ua1g== + dependencies: + tslib "^2.3.0" + "@babel/cli@^7.1.5": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.16.0.tgz#a729b7a48eb80b49f48a339529fc4129fd7bcef3" @@ -1561,6 +1660,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tslib@^1.11.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + typescript@^4.4.2: version "4.5.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"