aboutsummaryrefslogtreecommitdiff
path: root/src/node-fallbacks/crypto.js
blob: 65ae2f5b3a59f362c7fe9068848b3337f9924fd3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
export * from "crypto-browserify";
import * as cryptoBrowserify from "crypto-browserify";

export var DEFAULT_ENCODING = "buffer";

// we deliberately reference crypto. directly here because we want to preserve the This binding
export const getRandomValues = array => {
  return crypto.getRandomValues(array);
};

export const randomUUID = () => {
  return crypto.randomUUID();
};

const harcoded_curves = [
  "p192",
  "p224",
  "p256",
  "p384",
  "p521",
  "curve25519",
  "ed25519",
  "secp256k1",
  "secp224r1",
  "prime256v1",
  "prime192v1",
  "ed25519",
  "secp384r1",
  "secp521r1",
];

export function getCurves() {
  return harcoded_curves;
}

export const timingSafeEqual =
  "timingSafeEqual" in crypto
    ? (a, b) => {
        const { byteLength: byteLengthA } = a;
        const { byteLength: byteLengthB } = b;
        if (typeof byteLengthA !== "number" || typeof byteLengthB !== "number") {
          throw new TypeError("Input must be an array buffer view");
        }

        if (byteLengthA !== byteLengthB) {
          throw new RangeError("Input buffers must have the same length");
        }

        // these error checks are also performed in the function
        // however there is a bug where exceptions return no value
        return crypto.timingSafeEqual(a, b);
      }
    : undefined;

export const scryptSync =
  "scryptSync" in crypto
    ? (password, salt, keylen, options) => {
        const res = crypto.scryptSync(password, salt, keylen, options);
        return DEFAULT_ENCODING !== "buffer" ? new Buffer(res).toString(DEFAULT_ENCODING) : new Buffer(res);
      }
    : undefined;

export const scrypt =
  "scryptSync" in crypto
    ? function (password, salt, keylen, options, callback) {
        if (typeof options === "function") {
          callback = options;
          options = undefined;
        }

        if (typeof callback !== "function") {
          var err = new TypeError("callback must be a function");
          err.code = "ERR_INVALID_CALLBACK";
          throw err;
        }

        try {
          const result = crypto.scryptSync(password, salt, keylen, options);
          process.nextTick(
            callback,
            null,
            DEFAULT_ENCODING !== "buffer" ? new Buffer(result).toString(DEFAULT_ENCODING) : new Buffer(result),
          );
        } catch (err) {
          throw err;
        }
      }
    : undefined;

if (timingSafeEqual) {
  // hide it from stack trace
  Object.defineProperty(timingSafeEqual, "name", {
    value: "::bunternal::",
  });
  Object.defineProperty(scrypt, "name", {
    value: "::bunternal::",
  });
  Object.defineProperty(scryptSync, "name", {
    value: "::bunternal::",
  });
}

export const webcrypto = crypto;

export default {
  ...cryptoBrowserify,
  getRandomValues,
  randomUUID,
  timingSafeEqual,
  scryptSync,
  scrypt,
  webcrypto,
  getCurves,
};
mg src='//www.gravatar.com/avatar/e7083c09b30334ac5bb50a7b67697d02?s=13&d=retro' width='13' height='13' alt='Gravatar' /> Caleb Jasik 4-2/+13 2021-09-14[ci] yarn formatGravatar FredKSchott 1-1/+1 2021-09-14Merge "Remove check for referenced files" (#1196)Gravatar (none) 6-6/+45 2021-09-14Docs: Add READMEs for renderers (#1351)Gravatar Drew Powers 8-1/+184 2021-09-14Update deployment docs for Netlify deployment (#1361)Gravatar Cassidy Williams 1-7/+9 2021-09-14Delete perfect-kids-occur.md (#1372)Gravatar Fred K. Schott 1-5/+0 2021-09-14[ci] yarn formatGravatar FredKSchott 1-15/+10 2021-09-14Self-host homepage fonts to improve page load speed (#1370)Gravatar mundry 14-5/+52 2021-09-14Add types to examples and docs (#1347)Gravatar Matthew Phillips 8-20/+60 2021-09-14[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-13Fix typo (#1360)Gravatar Marcus Otterström 1-1/+1 2021-09-13Disclaimer for Github pages / jekyll quirk (#1355)Gravatar Tc001 2-0/+7 2021-09-13fix outdated lockfile issue (#1357)Gravatar Fred K. Schott 1-3/+1 2021-09-13Add `astro.build/play` link (#1359)Gravatar Nate Moore 1-0/+6 2021-09-13[ci] yarn formatGravatar FredKSchott 2-8/+7 2021-09-13Add a new lockfile (#1356)Gravatar Matthew Phillips 1-19/+19 2021-09-13[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-12[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-11[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-10Prevent removing CSS preloads during bundling (#1326)Gravatar Bartek Igielski 8-18/+96 2021-09-10Fix typos in Netlify sponsorship announcement blog post (#1346)Gravatar mundry 1-4/+4 2021-09-10[ci] collect statsGravatar FredKSchott 2-1/+2 2021-09-09blog: announce netlify sponsorship (#1345)Gravatar Fred K. Schott 4-5/+64 2021-09-09Version Packages (#1344)Gravatar github-actions[bot] 29-53/+42 2021-09-09Revert "Version Packages (#1303)"Gravatar Fred K. Schott 29-42/+53 2021-09-09update lockfileastro@0.20.5@astrojs/markdown-support@0.3.1Gravatar Fred K. Schott 1-9/+9 2021-09-09Version Packages (#1303)Gravatar github-actions[bot] 29-53/+42 2021-09-09[ci] collect statsGravatar FredKSchott 2-1/+2 2021-09-08Update netlify deploy instructions for `.nvmrc` syntax (#1337)Gravatar Caleb Jasik 1-1/+1 2021-09-08[ci] yarn formatGravatar jasikpark 1-1/+0