| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
/*  | 
 | 
 *  | 
 | 
 *  (C) Copyright IBM Corp. 1999 All Rights Reserved.  | 
 | 
 *  Copyright 1997 The Open Group Research Institute.  All rights reserved.  | 
 | 
 */  | 
 | 
 | 
 | 
package sun.security.krb5.internal.crypto;  | 
 | 
 | 
 | 
import sun.security.krb5.Checksum;  | 
 | 
import sun.security.krb5.KrbCryptoException;  | 
 | 
import sun.security.krb5.internal.*;  | 
 | 
 | 
 | 
public abstract class CksumType { | 
 | 
 | 
 | 
    private static boolean DEBUG = Krb5.DEBUG;  | 
 | 
 | 
 | 
    public static CksumType getInstance(int cksumTypeConst)  | 
 | 
        throws KdcErrException { | 
 | 
        CksumType cksumType = null;  | 
 | 
        String cksumTypeName = null;  | 
 | 
        switch (cksumTypeConst) { | 
 | 
        case Checksum.CKSUMTYPE_CRC32:  | 
 | 
            cksumType = new Crc32CksumType();  | 
 | 
            cksumTypeName = "sun.security.krb5.internal.crypto.Crc32CksumType";  | 
 | 
            break;  | 
 | 
        case Checksum.CKSUMTYPE_DES_MAC:  | 
 | 
            cksumType = new DesMacCksumType();  | 
 | 
            cksumTypeName = "sun.security.krb5.internal.crypto.DesMacCksumType";  | 
 | 
            break;  | 
 | 
        case Checksum.CKSUMTYPE_DES_MAC_K:  | 
 | 
            cksumType = new DesMacKCksumType();  | 
 | 
            cksumTypeName =  | 
 | 
                "sun.security.krb5.internal.crypto.DesMacKCksumType";  | 
 | 
            break;  | 
 | 
        case Checksum.CKSUMTYPE_RSA_MD5:  | 
 | 
            cksumType = new RsaMd5CksumType();  | 
 | 
            cksumTypeName = "sun.security.krb5.internal.crypto.RsaMd5CksumType";  | 
 | 
            break;  | 
 | 
        case Checksum.CKSUMTYPE_RSA_MD5_DES:  | 
 | 
            cksumType = new RsaMd5DesCksumType();  | 
 | 
            cksumTypeName =  | 
 | 
                "sun.security.krb5.internal.crypto.RsaMd5DesCksumType";  | 
 | 
            break;  | 
 | 
 | 
 | 
        case Checksum.CKSUMTYPE_HMAC_SHA1_DES3_KD:  | 
 | 
            cksumType = new HmacSha1Des3KdCksumType();  | 
 | 
            cksumTypeName =  | 
 | 
                "sun.security.krb5.internal.crypto.HmacSha1Des3KdCksumType";  | 
 | 
            break;  | 
 | 
 | 
 | 
        case Checksum.CKSUMTYPE_HMAC_SHA1_96_AES128:  | 
 | 
            cksumType = new HmacSha1Aes128CksumType();  | 
 | 
            cksumTypeName =  | 
 | 
                "sun.security.krb5.internal.crypto.HmacSha1Aes128CksumType";  | 
 | 
            break;  | 
 | 
 | 
 | 
        case Checksum.CKSUMTYPE_HMAC_SHA1_96_AES256:  | 
 | 
            cksumType = new HmacSha1Aes256CksumType();  | 
 | 
            cksumTypeName =  | 
 | 
                "sun.security.krb5.internal.crypto.HmacSha1Aes256CksumType";  | 
 | 
            break;  | 
 | 
 | 
 | 
        case Checksum.CKSUMTYPE_HMAC_MD5_ARCFOUR:  | 
 | 
            cksumType = new HmacMd5ArcFourCksumType();  | 
 | 
            cksumTypeName =  | 
 | 
                "sun.security.krb5.internal.crypto.HmacMd5ArcFourCksumType";  | 
 | 
            break;  | 
 | 
 | 
 | 
              | 
 | 
        case Checksum.CKSUMTYPE_RSA_MD4_DES_K:  | 
 | 
            // cksumType = new RsaMd4DesKCksumType();  | 
 | 
            // cksumTypeName =  | 
 | 
              | 
 | 
        case Checksum.CKSUMTYPE_RSA_MD4:  | 
 | 
            // cksumType = new RsaMd4CksumType();  | 
 | 
            // linux box support rsamd4, how to solve conflict?  | 
 | 
            // cksumTypeName =  | 
 | 
              | 
 | 
        case Checksum.CKSUMTYPE_RSA_MD4_DES:  | 
 | 
            // cksumType = new RsaMd4DesCksumType();  | 
 | 
            // cksumTypeName =  | 
 | 
            //          "sun.security.krb5.internal.crypto.RsaMd4DesCksumType";  | 
 | 
 | 
 | 
        default:  | 
 | 
            throw new KdcErrException(Krb5.KDC_ERR_SUMTYPE_NOSUPP);  | 
 | 
        }  | 
 | 
        if (DEBUG) { | 
 | 
            System.out.println(">>> CksumType: " + cksumTypeName); | 
 | 
        }  | 
 | 
        return cksumType;  | 
 | 
    }  | 
 | 
 | 
 | 
    public abstract int confounderSize();  | 
 | 
 | 
 | 
    public abstract int cksumType();  | 
 | 
 | 
 | 
    public abstract boolean isKeyed();  | 
 | 
 | 
 | 
    public abstract int cksumSize();  | 
 | 
 | 
 | 
    public abstract int keyType();  | 
 | 
 | 
 | 
    public abstract int keySize();  | 
 | 
 | 
 | 
      | 
 | 
    public abstract byte[] calculateChecksum(byte[] data, int size,  | 
 | 
        byte[] key, int usage) throws KrbCryptoException;  | 
 | 
 | 
 | 
      | 
 | 
    public abstract boolean verifyChecksum(byte[] data, int size,  | 
 | 
        byte[] key, byte[] checksum, int usage) throws KrbCryptoException;  | 
 | 
 | 
 | 
    public static boolean isChecksumEqual(byte[] cksum1, byte[] cksum2) { | 
 | 
        if (cksum1 == cksum2)  | 
 | 
            return true;  | 
 | 
        if ((cksum1 == null && cksum2 != null) ||  | 
 | 
            (cksum1 != null && cksum2 == null))  | 
 | 
            return false;  | 
 | 
        if (cksum1.length != cksum2.length)  | 
 | 
            return false;  | 
 | 
        for (int i = 0; i < cksum1.length; i++)  | 
 | 
            if (cksum1[i] != cksum2[i])  | 
 | 
                return false;  | 
 | 
        return true;  | 
 | 
    }  | 
 | 
 | 
 | 
}  |