/*
* DigestClientAlgorithm.java
*
* Created on January 7, 2003, 10:45 AM
*/
package org.mobicents.servlet.sip.testsuite;
import java.security.*;
/**
* Get this interface from the nist-sip IM
* @author olivier deruelle
*/
public class DigestClientAuthenticationMethod implements ClientAuthenticationMethod{
private String realm;
private String userName;
private String uri;
private String nonce;
private String password;
private String method;
private String cnonce;
private MessageDigest messageDigest;
/**
* to hex converter
*/
private static final char[] toHex = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/**
* convert an array of bytes to an hexadecimal string
* @return a string
* @param b bytes array to convert to a hexadecimal
* string
*/
public static String toHexString(byte b[]) {
int pos = 0;
char[] c = new char[b.length*2];
for (int i=0; i< b.length; i++) {
c[pos++] = toHex[(b[i] >> 4) & 0x0F];
c[pos++] = toHex[b[i] & 0x0f];
}
return new String(c);
}
public void initialize(String realm, String userName, String uri, String nonce,
String password, String method, String cnonce,String algorithm) throws Exception {
if (realm==null) throw new Exception("The realm parameter is null");
this.realm=realm;
if (userName==null) throw new Exception("The userName parameter is null");
this.userName=userName;
if (uri==null) throw new Exception("The uri parameter is null");
this.uri=uri;
if (nonce==null) throw new Exception("The nonce parameter is null");
this.nonce=nonce;
if (password==null) throw new Exception("The password parameter is null");
this.password=password;
if (method==null) throw new Exception("The method parameter is null");
this.method=method;
this.cnonce=cnonce;
if (algorithm==null) throw new Exception("The algorithm parameter is null");
try {
messageDigest = MessageDigest.getInstance(algorithm);
}
catch ( NoSuchAlgorithmException ex ) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, initialize(): "+
"ERROR: Digest algorithm does not exist.");
throw new Exception("ERROR: Digest algorithm does not exist.");
}
}
/**
* generate the response
*/
public String generateResponse() {
if (userName == null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: no userName parameter");
return null;
}
if (realm == null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: no realm parameter");
return null;
}
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"Trying to generate a response for the user: "+userName+" , with "+
"the realm: "+ realm);
if (password == null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: no password parameter");
return null;
}
if (method == null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: no method parameter");
return null;
}
if (uri== null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: no uri parameter");
return null;
}
if (nonce== null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: no nonce parameter");
return null;
}
if (messageDigest== null) {
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(): "+
"ERROR: the algorithm is not set");
return null;
}
/******* GENERATE RESPONSE ************************************/
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), userName:"+userName+"!");
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), realm:"+realm+"!");
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), password:"+password+"!");
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), uri:"+uri+"!");
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), nonce:"+nonce+"!");
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), method:"+method+"!");
// A1
String A1 = userName + ":" + realm+ ":" + password ;
byte mdbytes[] = messageDigest.digest(A1.getBytes());
String HA1 = toHexString(mdbytes);
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), HA1:"+HA1+"!");
//A2
String A2 = method.toUpperCase() + ":" + uri ;
mdbytes = messageDigest.digest(A2.getBytes());
String HA2 = toHexString(mdbytes);
System.out.println("DEBUG, DigestClientAuthenticationMethod, generateResponse(), HA2:"+HA2+"!");
//KD
String KD = HA1 + ":" + nonce;
if (cnonce != null) {
if(cnonce.length()>0) KD += ":" + cnonce;
}
KD += ":" + HA2;
mdbytes = messageDigest.digest(KD.getBytes());
String response = toHexString(mdbytes);
System.out.println("DEBUG, DigestClientAlgorithm, generateResponse():"+
" response generated: "+response);
return response;
}
}