Skip to content

Commit bd94120

Browse files
authored
Merge pull request RustPython#1630 from Kroisse/hashlib-ctors
Add an optional data parameter for predefined constructors of hashlib
2 parents 73f56af + db5b897 commit bd94120

File tree

2 files changed

+62
-52
lines changed

2 files changed

+62
-52
lines changed

tests/snippets/stdlib_hashlib.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,32 @@
44
# print(hashlib.md5)
55
h = hashlib.md5()
66
h.update(b'a')
7-
assert h.name == 'md5'
7+
g = hashlib.md5(b'a')
8+
assert h.name == g.name == 'md5'
89
print(h.hexdigest())
10+
print(g.hexdigest())
911

10-
assert h.hexdigest() == '0cc175b9c0f1b6a831c399e269772661'
11-
assert h.digest_size == 16
12+
assert h.hexdigest() == g.hexdigest() == '0cc175b9c0f1b6a831c399e269772661'
13+
assert h.digest_size == g.digest_size == 16
1214

1315
h = hashlib.sha256()
1416
h.update(b'a')
15-
assert h.name == 'sha256'
16-
assert h.digest_size == 32
17+
g = hashlib.sha256(b'a')
18+
assert h.name == g.name == 'sha256'
19+
assert h.digest_size == g.digest_size == 32
1720
print(h.hexdigest())
21+
print(g.hexdigest())
1822

19-
assert h.hexdigest() == 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb'
23+
assert h.hexdigest() == g.hexdigest() == 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb'
2024

2125
h = hashlib.sha512()
22-
assert h.name == 'sha512'
26+
g = hashlib.sha512(b'a')
27+
assert h.name == g.name == 'sha512'
2328
h.update(b'a')
2429
print(h.hexdigest())
30+
print(g.hexdigest())
2531

26-
assert h.hexdigest() == '1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75'
32+
assert h.hexdigest() == g.hexdigest() == '1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75'
2733

2834
h = hashlib.new("blake2s", b"fubar")
2935
print(h.hexdigest())

vm/src/stdlib/hashlib.rs

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -86,89 +86,93 @@ fn hashlib_new(
8686
data: OptionalArg<PyBytesRef>,
8787
vm: &VirtualMachine,
8888
) -> PyResult<PyHasher> {
89-
let hasher = match name.as_str() {
90-
"md5" => Ok(PyHasher::new("md5", HashWrapper::md5())),
91-
"sha1" => Ok(PyHasher::new("sha1", HashWrapper::sha1())),
92-
"sha224" => Ok(PyHasher::new("sha224", HashWrapper::sha224())),
93-
"sha256" => Ok(PyHasher::new("sha256", HashWrapper::sha256())),
94-
"sha384" => Ok(PyHasher::new("sha384", HashWrapper::sha384())),
95-
"sha512" => Ok(PyHasher::new("sha512", HashWrapper::sha512())),
96-
"sha3_224" => Ok(PyHasher::new("sha3_224", HashWrapper::sha3_224())),
97-
"sha3_256" => Ok(PyHasher::new("sha3_256", HashWrapper::sha3_256())),
98-
"sha3_384" => Ok(PyHasher::new("sha3_384", HashWrapper::sha3_384())),
99-
"sha3_512" => Ok(PyHasher::new("sha3_512", HashWrapper::sha3_512())),
100-
// TODO: "shake128" => Ok(PyHasher::new("shake128", HashWrapper::shake128())),
101-
// TODO: "shake256" => Ok(PyHasher::new("shake256", HashWrapper::shake256())),
102-
"blake2b" => Ok(PyHasher::new("blake2b", HashWrapper::blake2b())),
103-
"blake2s" => Ok(PyHasher::new("blake2s", HashWrapper::blake2s())),
89+
match name.as_str() {
90+
"md5" => md5(data, vm),
91+
"sha1" => sha1(data, vm),
92+
"sha224" => sha224(data, vm),
93+
"sha256" => sha256(data, vm),
94+
"sha384" => sha384(data, vm),
95+
"sha512" => sha512(data, vm),
96+
"sha3_224" => sha3_224(data, vm),
97+
"sha3_256" => sha3_256(data, vm),
98+
"sha3_384" => sha3_384(data, vm),
99+
"sha3_512" => sha3_512(data, vm),
100+
// TODO: "shake128" => shake128(data, vm),
101+
// TODO: "shake256" => shake256(data, vm),
102+
"blake2b" => blake2b(data, vm),
103+
"blake2s" => blake2s(data, vm),
104104
other => Err(vm.new_value_error(format!("Unknown hashing algorithm: {}", other))),
105-
}?;
105+
}
106+
}
106107

108+
fn init(
109+
hasher: PyHasher,
110+
data: OptionalArg<PyBytesRef>,
111+
vm: &VirtualMachine,
112+
) -> PyResult<PyHasher> {
107113
if let OptionalArg::Present(data) = data {
108114
hasher.update(data, vm)?;
109115
}
110116

111117
Ok(hasher)
112118
}
113119

114-
fn md5(_vm: &VirtualMachine) -> PyResult<PyHasher> {
115-
Ok(PyHasher::new("md5", HashWrapper::md5()))
120+
fn md5(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
121+
init(PyHasher::new("md5", HashWrapper::md5()), data, vm)
116122
}
117123

118-
fn sha1(_vm: &VirtualMachine) -> PyResult<PyHasher> {
119-
Ok(PyHasher::new("sha1", HashWrapper::sha1()))
124+
fn sha1(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
125+
init(PyHasher::new("sha1", HashWrapper::sha1()), data, vm)
120126
}
121127

122-
fn sha224(_vm: &VirtualMachine) -> PyResult<PyHasher> {
123-
Ok(PyHasher::new("sha224", HashWrapper::sha224()))
128+
fn sha224(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
129+
init(PyHasher::new("sha224", HashWrapper::sha224()), data, vm)
124130
}
125131

126-
fn sha256(_vm: &VirtualMachine) -> PyResult<PyHasher> {
127-
Ok(PyHasher::new("sha256", HashWrapper::sha256()))
132+
fn sha256(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
133+
init(PyHasher::new("sha256", HashWrapper::sha256()), data, vm)
128134
}
129135

130-
fn sha384(_vm: &VirtualMachine) -> PyResult<PyHasher> {
131-
Ok(PyHasher::new("sha384", HashWrapper::sha384()))
136+
fn sha384(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
137+
init(PyHasher::new("sha384", HashWrapper::sha384()), data, vm)
132138
}
133139

134-
fn sha512(_vm: &VirtualMachine) -> PyResult<PyHasher> {
135-
Ok(PyHasher::new("sha512", HashWrapper::sha512()))
140+
fn sha512(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
141+
init(PyHasher::new("sha512", HashWrapper::sha512()), data, vm)
136142
}
137143

138-
fn sha3_224(_vm: &VirtualMachine) -> PyResult<PyHasher> {
139-
Ok(PyHasher::new("sha3_224", HashWrapper::sha3_224()))
144+
fn sha3_224(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
145+
init(PyHasher::new("sha3_224", HashWrapper::sha3_224()), data, vm)
140146
}
141147

142-
fn sha3_256(_vm: &VirtualMachine) -> PyResult<PyHasher> {
143-
Ok(PyHasher::new("sha3_256", HashWrapper::sha3_256()))
148+
fn sha3_256(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
149+
init(PyHasher::new("sha3_256", HashWrapper::sha3_256()), data, vm)
144150
}
145151

146-
fn sha3_384(_vm: &VirtualMachine) -> PyResult<PyHasher> {
147-
Ok(PyHasher::new("sha3_384", HashWrapper::sha3_384()))
152+
fn sha3_384(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
153+
init(PyHasher::new("sha3_384", HashWrapper::sha3_384()), data, vm)
148154
}
149155

150-
fn sha3_512(_vm: &VirtualMachine) -> PyResult<PyHasher> {
151-
Ok(PyHasher::new("sha3_512", HashWrapper::sha3_512()))
156+
fn sha3_512(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
157+
init(PyHasher::new("sha3_512", HashWrapper::sha3_512()), data, vm)
152158
}
153159

154-
fn shake128(vm: &VirtualMachine) -> PyResult<PyHasher> {
160+
fn shake128(_data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
155161
Err(vm.new_not_implemented_error("shake256".to_string()))
156-
// Ok(PyHasher::new("shake128", HashWrapper::shake128()))
157162
}
158163

159-
fn shake256(vm: &VirtualMachine) -> PyResult<PyHasher> {
164+
fn shake256(_data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
160165
Err(vm.new_not_implemented_error("shake256".to_string()))
161-
// TODO: Ok(PyHasher::new("shake256", HashWrapper::shake256()))
162166
}
163167

164-
fn blake2b(_vm: &VirtualMachine) -> PyResult<PyHasher> {
168+
fn blake2b(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
165169
// TODO: handle parameters
166-
Ok(PyHasher::new("blake2b", HashWrapper::blake2b()))
170+
init(PyHasher::new("blake2b", HashWrapper::blake2b()), data, vm)
167171
}
168172

169-
fn blake2s(_vm: &VirtualMachine) -> PyResult<PyHasher> {
173+
fn blake2s(data: OptionalArg<PyBytesRef>, vm: &VirtualMachine) -> PyResult<PyHasher> {
170174
// TODO: handle parameters
171-
Ok(PyHasher::new("blake2s", HashWrapper::blake2s()))
175+
init(PyHasher::new("blake2s", HashWrapper::blake2s()), data, vm)
172176
}
173177

174178
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {

0 commit comments

Comments
 (0)