package oracle.sample.dbloginmodule.util;


/*
 * @(#)DBLoginModuleSHA1Encoder.java  1.0 March 2005
 *
 * Copyright (c) 2001-2005 by Oracle. All Rights Reserved.
 * 
 * Oracle grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Oracle.
 * 
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. ORACLE AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL ORACLE OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF ORACLE HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 * 
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import oracle.sample.dbloginmodule.interfaces.DBLoginModuleEncodingInterface;
import sun.misc.BASE64Encoder;

/**
 * Class to create a one way hash based on the provided key and message string. 
 * The encryption is sperformed with the SHA1 algorithm and does return a base64
 * encoded String. This class is used by the DBTableLoginModule.java class to 
 * compare the provided JAAS password with its encrypted representation in the
 * user database table. You can replace this implementation with a custom class by
 * implementing the DBLoginModuleEncodingInterface interface.
 *
 * 
 * @author Frank Nimphius
 * @version 1.0
 */

public class DBLoginModuleSHA1Encoder implements DBLoginModuleEncodingInterface{
  
  public DBLoginModuleSHA1Encoder()
  {
  }
  
  public String getKeyDigestString (String message, String key) {
    try {
      String pwCompareStr = "";
      byte[] messageByte = message.getBytes();
      // of no key is provided, the message string gets encrypted with itself
      
      byte[] keyByte = (key != null && key.length()>0)? key.getBytes():message.getBytes();
      
      // get SHA1 instance       
      MessageDigest sha1 = MessageDigest.getInstance("SHA1");        
      sha1.update(messageByte);
      byte[] digestByte = sha1.digest(keyByte);
              
      // base 64 encoding
      BASE64Encoder b64Encoder = new BASE64Encoder();
      pwCompareStr = (b64Encoder.encode(digestByte));
      
      return pwCompareStr;
      } 
      
      catch (NoSuchAlgorithmException e) {
      }
    return null;
  }
}