private void computeDigestAuthHeader()

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);
        }
    }