buffer.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // src/utils/buffer.ts
  2. import { sha256 } from "./crypto.js";
  3. var equal = (a, b) => {
  4. if (a === b) {
  5. return true;
  6. }
  7. if (a.byteLength !== b.byteLength) {
  8. return false;
  9. }
  10. const va = new DataView(a);
  11. const vb = new DataView(b);
  12. let i = va.byteLength;
  13. while (i--) {
  14. if (va.getUint8(i) !== vb.getUint8(i)) {
  15. return false;
  16. }
  17. }
  18. return true;
  19. };
  20. var constantTimeEqualString = (a, b) => {
  21. const aLen = a.length;
  22. const bLen = b.length;
  23. const maxLen = Math.max(aLen, bLen);
  24. let out = aLen ^ bLen;
  25. for (let i = 0; i < maxLen; i++) {
  26. const aChar = i < aLen ? a.charCodeAt(i) : 0;
  27. const bChar = i < bLen ? b.charCodeAt(i) : 0;
  28. out |= aChar ^ bChar;
  29. }
  30. return out === 0;
  31. };
  32. var timingSafeEqualString = async (a, b, hashFunction) => {
  33. if (!hashFunction) {
  34. hashFunction = sha256;
  35. }
  36. const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);
  37. if (sa == null || sb == null || typeof sa !== "string" || typeof sb !== "string") {
  38. return false;
  39. }
  40. const hashEqual = constantTimeEqualString(sa, sb);
  41. const originalEqual = constantTimeEqualString(a, b);
  42. return hashEqual && originalEqual;
  43. };
  44. var timingSafeEqual = async (a, b, hashFunction) => {
  45. if (typeof a === "string" && typeof b === "string") {
  46. return timingSafeEqualString(a, b, hashFunction);
  47. }
  48. if (!hashFunction) {
  49. hashFunction = sha256;
  50. }
  51. const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);
  52. if (!sa || !sb || typeof sa !== "string" || typeof sb !== "string") {
  53. return false;
  54. }
  55. return timingSafeEqualString(sa, sb);
  56. };
  57. var bufferToString = (buffer) => {
  58. if (buffer instanceof ArrayBuffer) {
  59. const enc = new TextDecoder("utf-8");
  60. return enc.decode(buffer);
  61. }
  62. return buffer;
  63. };
  64. var bufferToFormData = (arrayBuffer, contentType) => {
  65. const response = new Response(arrayBuffer, {
  66. headers: {
  67. "Content-Type": contentType
  68. }
  69. });
  70. return response.formData();
  71. };
  72. export {
  73. bufferToFormData,
  74. bufferToString,
  75. equal,
  76. timingSafeEqual
  77. };