@@ -30,7 +30,7 @@ pub const PasswordHasher = struct {
3030 .{
3131 .t = 3 , // 3 iterations
3232 .m = 65536 , // 64 MB memory
33- .p = 4 , // 4 parallelism
33+ .p = 1 , // single-threaded (avoids async I/O requirement)
3434 },
3535 .argon2id ,
3636 io_compat .getIo (),
@@ -49,10 +49,10 @@ pub const PasswordHasher = struct {
4949 defer self .allocator .free (hash_b64 );
5050 const hash_encoded = encoder .encode (hash_b64 , & hash );
5151
52- // Format: $argon2id$v=19$m=65536,t=3,p=4 $<salt_b64>$<hash_b64>
52+ // Format: $argon2id$v=19$m=65536,t=3,p=1 $<salt_b64>$<hash_b64>
5353 const encoded = try std .fmt .allocPrint (
5454 self .allocator ,
55- "$argon2id$v=19$m=65536,t=3,p=4 ${s}${s}" ,
55+ "$argon2id$v=19$m=65536,t=3,p=1 ${s}${s}" ,
5656 .{ salt_encoded , hash_encoded },
5757 );
5858
@@ -62,7 +62,7 @@ pub const PasswordHasher = struct {
6262 /// Verify a password against a hash
6363 pub fn verifyPassword (self : * PasswordHasher , password : []const u8 , hash_str : []const u8 ) ! bool {
6464 // Parse the hash string
65- // Format: $argon2id$v=19$m=65536,t=3,p=4 $<salt_b64>$<hash_b64>
65+ // Format: $argon2id$v=19$m=65536,t=3,p=1 $<salt_b64>$<hash_b64>
6666 var parts = std .mem .splitSequence (u8 , hash_str , "$" );
6767
6868 // Skip empty first part
@@ -77,11 +77,11 @@ pub const PasswordHasher = struct {
7777 // Skip version
7878 _ = parts .next ();
7979
80- // Parse parameters (m=65536,t=3,p=4 )
80+ // Parse parameters (m=65536,t=3,p=1 )
8181 const params_str = parts .next () orelse return error .InvalidHashFormat ;
8282 var m : u32 = 65536 ;
8383 var t : u32 = 3 ;
84- var p : u24 = 4 ;
84+ var p : u24 = 1 ;
8585
8686 var param_parts = std .mem .splitScalar (u8 , params_str , ',' );
8787 while (param_parts .next ()) | param | {
0 commit comments