in src/main/java/com/microsoft/azure/proton/transport/proxy/impl/DigestProxyChallengeProcessorImpl.java [113:173]
private void computeDigestAuthHeader(Map<String, String> challengeQuestionValues,
String uri,
PasswordAuthentication passwordAuthentication) {
if (logger.isInfoEnabled()) {
logger.info("Computing password authentication...");
}
if (!ProxyAuthenticator.isPasswordAuthenticationHasValues(passwordAuthentication)) {
if (logger.isErrorEnabled()) {
logger.error("Password authentication does not have values. Not computing authorization header.");
}
return;
}
final String proxyUserName = passwordAuthentication.getUserName();
final String proxyPassword = new String(passwordAuthentication.getPassword());
try {
String digestValue;
final String nonce = challengeQuestionValues.get("nonce");
final String realm = challengeQuestionValues.get("realm");
final String qop = challengeQuestionValues.get("qop");
final MessageDigest md5 = MessageDigest.getInstance(DEFAULT_ALGORITHM);
final String a1 = printHexBinary(md5.digest(String.format("%s:%s:%s", proxyUserName, realm, proxyPassword).getBytes(UTF_8)));
final String a2 = printHexBinary(md5.digest(String.format("%s:%s", Constants.CONNECT, uri).getBytes(UTF_8)));
final byte[] cnonceBytes = new byte[16];
SECURE_RANDOM.nextBytes(cnonceBytes);
final String cnonce = printHexBinary(cnonceBytes);
String response;
if (StringUtils.isNullOrEmpty(qop)) {
response = printHexBinary(md5.digest(String.format("%s:%s:%s", a1, nonce, a2).getBytes(UTF_8)));
digestValue = String.format("Digest username=\"%s\",realm=\"%s\",nonce=\"%s\",uri=\"%s\",cnonce=\"%s\",response=\"%s\"",
proxyUserName, realm, nonce, uri, cnonce, response);
} else {
int nc = nonceCounter.incrementAndGet();
response = printHexBinary(md5.digest(String.format("%s:%s:%08X:%s:%s:%s", a1, nonce, nc, cnonce, qop, a2).getBytes(UTF_8)));
digestValue = String.format(
"Digest username=\"%s\",realm=\"%s\",nonce=\"%s\",uri=\"%s\",cnonce=\"%s\",nc=%08X,response=\"%s\",qop=\"%s\"",
proxyUserName, realm, nonce, uri, cnonce, nc, response, qop);
}
headers.put(Constants.PROXY_AUTHORIZATION, digestValue);
if (logger.isInfoEnabled()) {
logger.info("Adding authorization header. {} '{}'", Constants.PROXY_AUTHORIZATION, digestValue);
}
} catch (NoSuchAlgorithmException ex) {
if (logger.isErrorEnabled()) {
logger.error("Error encountered when computing header.", ex);
}
throw new RuntimeException(ex);
}
}