package org.openxdm.xcap.server.slee.auth; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.httpclient.util.EncodingUtil; import org.apache.log4j.Logger; import org.openxdm.xcap.common.error.InternalServerErrorException; /** * * @author martins * */ public class RFC2617AuthQopDigest { private static final Logger logger = Logger.getLogger(RFC2617AuthQopDigest.class); /** * */ private final String username; /** * */ private final String realm; /** * */ private final String password; /** * */ private final String nonce; /** * */ private final String nonceCount; /** * */ private final String cnonce; /** * */ private final String qop = "auth"; /** * */ private final String method; /** * */ private final String digestUri; /** * * @param username * @param realm * @param password * @param nonce * @param nonceCount * @param cnonce * @param qop * @param method * @param digestUri */ public RFC2617AuthQopDigest(String username, String realm, String password, String nonce, String nonceCount, String cnonce, String method, String digestUri) { this.username = username; this.realm = realm; this.password = password; this.nonce = nonce; this.nonceCount = nonceCount; this.cnonce = cnonce; this.method = method; this.digestUri = digestUri; } /** * Calculates the encoded http digest according to RFC 2617 with "auth" qop. * * @return * @throws NoSuchAlgorithmException */ public String digest() throws InternalServerErrorException { if (logger.isDebugEnabled()) { logger.debug("Calculating RFC 2617 qop=auth digest with params: username = "+username+" , realm = "+realm+" , password = "+password+" , nonce = "+nonce+" , nonceCount = "+nonceCount+" , cnonce = "+cnonce+" , method = "+method+" , digestUri = "+digestUri+" ;"); } MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new InternalServerErrorException("failed to get instance of MD5 digest, used in "+this.getClass()); } final String a1 = username + ":" + realm + ":" + password; final String ha1 = AsciiHexStringEncoder.encode(messageDigest.digest(EncodingUtil.getAsciiBytes(a1))); final String a2 = method + ":" + digestUri; final String ha2 = AsciiHexStringEncoder.encode(messageDigest.digest(EncodingUtil.getAsciiBytes(a2))); final String kd = ha1 + ":" + nonce + ":" + nonceCount + ":" + cnonce + ":" + qop + ":" + ha2; return AsciiHexStringEncoder.encode(messageDigest.digest(EncodingUtil.getAsciiBytes(kd))); } }