diff --git a/crypto/src/main/java/org/springframework/security/crypto/argon2/Argon2PasswordEncoder.java b/crypto/src/main/java/org/springframework/security/crypto/argon2/Argon2PasswordEncoder.java index faff2dd99fc..e10a50350d2 100644 --- a/crypto/src/main/java/org/springframework/security/crypto/argon2/Argon2PasswordEncoder.java +++ b/crypto/src/main/java/org/springframework/security/crypto/argon2/Argon2PasswordEncoder.java @@ -126,6 +126,24 @@ protected String encodeNonNullPassword(String rawPassword) { return Argon2EncodingUtils.encode(hash, params); } + protected String encodeNonNullPassword(char[] rawPassword) { + byte[] salt = this.saltGenerator.generateKey(); + byte[] hash = new byte[this.hashLength]; + // @formatter:off + Argon2Parameters params = new Argon2Parameters + .Builder(Argon2Parameters.ARGON2_id) + .withSalt(salt) + .withParallelism(this.parallelism) + .withMemoryAsKB(this.memory) + .withIterations(this.iterations) + .build(); + // @formatter:on + Argon2BytesGenerator generator = new Argon2BytesGenerator(); + generator.init(params); + generator.generateBytes(rawPassword, hash); + return Argon2EncodingUtils.encode(hash, params); + } + @Override protected boolean matchesNonNull(String rawPassword, String encodedPassword) { Argon2EncodingUtils.Argon2Hash decoded; @@ -143,7 +161,22 @@ protected boolean matchesNonNull(String rawPassword, String encodedPassword) { return constantTimeArrayEquals(decoded.getHash(), hashBytes); } - @Override + protected boolean matchesNonNull(char[] rawPassword, String encodedPassword) { + Argon2EncodingUtils.Argon2Hash decoded; + try { + decoded = Argon2EncodingUtils.decode(encodedPassword); + } + catch (IllegalArgumentException ex) { + this.logger.warn("Malformed password hash", ex); + return false; + } + byte[] hashBytes = new byte[decoded.getHash().length]; + Argon2BytesGenerator generator = new Argon2BytesGenerator(); + generator.init(decoded.getParameters()); + generator.generateBytes(rawPassword, hashBytes); + return constantTimeArrayEquals(decoded.getHash(), hashBytes); + } + protected boolean upgradeEncodingNonNull(String encodedPassword) { Argon2Parameters parameters = Argon2EncodingUtils.decode(encodedPassword).getParameters(); return parameters.getMemory() < this.memory || parameters.getIterations() < this.iterations;