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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { createHash, createHmac, getHashes } from "node:crypto";
import { Buffer } from "node:buffer";
import { Readable } from "node:stream";
import { assert, assertEquals } from "@std/assert";
// https://github.com/denoland/deno/issues/18140
Deno.test({
name: "[node/crypto] createHmac digest",
fn() {
assertEquals(
createHmac("sha256", "secret").update("hello").digest("hex"),
"88aab3ede8d3adf94d26ab90d3bafd4a2083070c3bcce9c014ee04a443847c0b",
);
},
});
Deno.test({
name: "[node/crypto] createHash digest",
fn() {
assertEquals(
createHash("sha256").update("hello").digest("hex"),
"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
);
},
});
Deno.test("[node/crypto.Hash] basic usage - buffer output", () => {
const d = createHash("sha1").update("abc").update("def").digest();
assertEquals(
d,
Buffer.from([
0x1f,
0x8a,
0xc1,
0xf,
0x23,
0xc5,
0xb5,
0xbc,
0x11,
0x67,
0xbd,
0xa8,
0x4b,
0x83,
0x3e,
0x5c,
0x5,
0x7a,
0x77,
0xd2,
]),
);
});
Deno.test("[node/crypto.Hash] basic usage - hex output", () => {
const d = createHash("sha1").update("abc").update("def").digest("hex");
assertEquals(d, "1f8ac10f23c5b5bc1167bda84b833e5c057a77d2");
});
Deno.test("[node/crypto.Hash] basic usage - base64 output", () => {
const d = createHash("sha1").update("abc").update("def").digest("base64");
assertEquals(d, "H4rBDyPFtbwRZ72oS4M+XAV6d9I=");
});
Deno.test("[node/crypto.Hash] basic usage - base64url output", () => {
const d = createHash("sha1").update("abc").update("def").digest("base64url");
assertEquals(d, "H4rBDyPFtbwRZ72oS4M-XAV6d9I");
});
Deno.test("[node/crypto.Hash] streaming usage", async () => {
const source = Readable.from(["abc", "def"]);
const hash = createHash("sha1");
const dest = source.pipe(hash);
const result = await new Promise((resolve, _) => {
let buffer = Buffer.from([]);
dest.on("data", (data) => {
buffer = Buffer.concat([buffer, data]);
});
dest.on("end", () => {
resolve(buffer);
});
});
assertEquals(
result,
Buffer.from([
0x1f,
0x8a,
0xc1,
0xf,
0x23,
0xc5,
0xb5,
0xbc,
0x11,
0x67,
0xbd,
0xa8,
0x4b,
0x83,
0x3e,
0x5c,
0x5,
0x7a,
0x77,
0xd2,
]),
);
});
Deno.test("[node/crypto.getHashes]", () => {
for (const algorithm of getHashes()) {
const d = createHash(algorithm).update("abc").digest();
assert(d instanceof Buffer);
assert(d.length > 0);
}
});
Deno.test("[node/crypto.hash] supports buffer args", () => {
const buffer = Buffer.from("abc");
const d = createHash("sha1").update(buffer).digest("hex");
assertEquals(d, "a9993e364706816aba3e25717850c26c9cd0d89d");
});
Deno.test("[node/crypto.hash] does not leak", () => {
const hasher = createHash("sha1");
hasher.update("abc");
});
|