1414from hashlib import pbkdf2_hmac , sha256
1515from hmac import new as hmac_new
1616from secrets import token_bytes
17+ import typing
1718
1819from Crypto .Cipher import AES , PKCS1_OAEP
1920from Crypto .PublicKey import RSA
2021from hkdf import hkdf_expand
2122
23+ if typing .TYPE_CHECKING :
24+ import vaultwarden .models .bitwarden
2225
2326class CIPHERS (IntEnum ):
2427 sym = 2
@@ -115,24 +118,26 @@ def is_encrypted(cipher_string):
115118 return True
116119
117120
118- def make_master_key (password : str , salt : str , kdf : "vaultwarden.models.bitwarden.Kdf" ):
121+ def make_master_key (password_ : str , salt_ : str , kdf : "vaultwarden.models.bitwarden.Kdf" ):
119122 import vaultwarden .models .bitwarden
120123
121- assert isinstance (salt , str )
122- assert isinstance (password , str )
124+ assert isinstance (salt_ , str )
125+ assert isinstance (password_ , str )
123126
124- salt = salt .lower ()
125- password = password .encode ("utf-8" )
126- salt = salt .encode ("utf-8" )
127+ password = password_ .encode ("utf-8" )
128+ salt = salt_ .lower ().encode ("utf-8" )
127129
128130 match kdf .Kdf :
129131 case vaultwarden .models .bitwarden .KdfType .Pbkdf2 :
132+ assert kdf .KdfIterations is not None
130133 return pbkdf2_hmac ("sha256" , password , salt , kdf .KdfIterations )
131134 case vaultwarden .models .bitwarden .KdfType .Argon2id :
132135 # c.f.
133136 # https://github.com/vaultwarden/vw_web_builds/blob/355bddc6c9d5c110e55fe74c5fcfa86ddd85572c/libs/common/src/platform/services/key-generation.service.ts#L55-L75
134137 import argon2
135-
138+ assert kdf .KdfIterations is not None
139+ assert kdf .KdfMemory is not None
140+ assert kdf .KdfParallelism is not None
136141 hsalt = hashlib .new ("sha256" , salt ).digest ()
137142 v = argon2 .low_level .hash_secret_raw (
138143 password ,
@@ -144,9 +149,6 @@ def make_master_key(password: str, salt: str, kdf: "vaultwarden.models.bitwarden
144149 type = argon2 .Type .ID ,
145150 )
146151 return v
147- case _:
148- return None
149-
150152
151153def hash_password (password , salt , iterations = ITERATIONS ):
152154 """base64-encode a wrapped, stretched password+salt(email) for signup/login"""
0 commit comments