Skip to content

Commit 9869352

Browse files
committed
argon2id - implement using argon2-cffi
1 parent dcf47a0 commit 9869352

2 files changed

Lines changed: 19 additions & 2 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ classifiers = [
3535
requires-python = ">=3.10"
3636
dependencies = [
3737
"hkdf >=0.0.3",
38+
"argon2-cffi >= 25.1.0",
3839
"pycryptodome >=3.17.0",
3940
"pydantic >=2.5.0",
4041
"httpx >=0.24.1",

src/vaultwarden/utils/crypto.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from Crypto.PublicKey import RSA
2020
from hkdf import hkdf_expand
2121

22+
2223
class CIPHERS(IntEnum):
2324
sym = 2
2425
asym = 4
@@ -129,11 +130,26 @@ def make_master_key(
129130
match kdf.Kdf:
130131
case vaultwarden.models.bitwarden.KdfType.Pbkdf2:
131132
return pbkdf2_hmac("sha256", password, salt, kdf.KdfIterations)
132-
case vaultwarden.models.bitwarden.KdfType.Argon2:
133-
raise NotImplementedError("x")
133+
case vaultwarden.models.bitwarden.KdfType.Argon2id:
134+
# c.f.
135+
# https://github.com/vaultwarden/vw_web_builds/blob/355bddc6c9d5c110e55fe74c5fcfa86ddd85572c/libs/common/src/platform/services/key-generation.service.ts#L55-L75
136+
import argon2
137+
138+
hsalt = hashlib.new("sha256", salt).digest()
139+
v = argon2.low_level.hash_secret_raw(
140+
password,
141+
hsalt,
142+
time_cost=kdf.KdfIterations,
143+
memory_cost=kdf.KdfMemory * 1024,
144+
parallelism=kdf.KdfParallelism,
145+
hash_len=32,
146+
type=argon2.Type.ID,
147+
)
148+
return v
134149
case _:
135150
return None
136151

152+
137153
def hash_password(password, salt, iterations=ITERATIONS):
138154
"""base64-encode a wrapped, stretched password+salt(email) for signup/login"""
139155
if not hasattr(password, "decode"):

0 commit comments

Comments
 (0)