/*
* Copyright (c) 2011-2019 Contributors to the Eclipse Foundation
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
*/
package io.vertx.mysqlclient.impl.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CachingSha2Authenticator {
Caching SHA-2 pluggable authentication method 'caching_sha2_password'
Calculate method: XOR(SHA256(password), SHA256(SHA256(SHA256(password)), Nonce))
Params: - password – password value
- nonce – 20 byte long random data
Returns: scrambled password
/**
* Caching SHA-2 pluggable authentication method 'caching_sha2_password'
* Calculate method: XOR(SHA256(password), SHA256(SHA256(SHA256(password)), Nonce))
*
* @param password password value
* @param nonce 20 byte long random data
* @return scrambled password
*/
public static byte[] encode(byte[] password, byte[] nonce) {
MessageDigest messageDigest;
try {
messageDigest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
// SHA256(password)
byte[] passwordHash1 = messageDigest.digest(password);
messageDigest.reset();
// SHA256(SHA256(password))
byte[] passwordHash2 = messageDigest.digest(passwordHash1);
messageDigest.reset();
// SHA256(SHA256(SHA256(password)), Nonce)
messageDigest.update(passwordHash2);
byte[] passwordDigest = messageDigest.digest(nonce);
// result = passwordHash1 XOR passwordDigest
for (int i = 0; i < passwordHash1.length; i++) {
passwordHash1[i] = (byte) (passwordHash1[i] ^ passwordDigest[i]);
}
return passwordHash1;
}
}