package org.apache.kerberos.kerb.common; import org.apache.haox.asn1.type.AbstractAsn1Type; import org.apache.haox.asn1.type.Asn1Type; import org.apache.kerberos.kerb.codec.KrbCodec; import org.apache.kerberos.kerb.crypto.EncTypeHandler; import org.apache.kerberos.kerb.crypto.EncryptionHandler; import org.apache.kerberos.kerb.KrbException; import org.apache.kerberos.kerb.spec.common.EncryptedData; import org.apache.kerberos.kerb.spec.common.EncryptionKey; import org.apache.kerberos.kerb.spec.common.EncryptionType; import org.apache.kerberos.kerb.spec.common.KeyUsage; import java.util.ArrayList; import java.util.List; public class EncryptionUtil { public static List<EncryptionKey> generateKeys(List<EncryptionType> encryptionTypes) throws KrbException { List<EncryptionKey> results = new ArrayList<EncryptionKey>(encryptionTypes.size()); EncryptionKey encKey; for (EncryptionType eType : encryptionTypes) { encKey = EncryptionHandler.random2Key(eType); results.add(encKey); } return results; } public static List<EncryptionKey> generateKeys(String principal, String passwd, List<EncryptionType> encryptionTypes) throws KrbException { List<EncryptionKey> results = new ArrayList<EncryptionKey>(encryptionTypes.size()); EncryptionKey encKey; for (EncryptionType eType : encryptionTypes) { encKey = EncryptionHandler.string2Key(principal, passwd, eType); results.add(encKey); } return results; } public static EncryptionType getBestEncryptionType(List<EncryptionType> requestedTypes, List<EncryptionType> configuredTypes) { for (EncryptionType encryptionType : configuredTypes) { if (requestedTypes.contains(encryptionType)) { return encryptionType; } } return null; } public static EncryptedData seal(AbstractAsn1Type asn1Type, EncryptionKey key, KeyUsage usage) throws KrbException { byte[] encoded = asn1Type.encode(); EncryptedData encrypted = EncryptionHandler.encrypt(encoded, key, usage); return encrypted; } public static <T extends Asn1Type> T unseal(EncryptedData encrypted, EncryptionKey key, KeyUsage usage, Class<T> krbType) throws KrbException { byte[] encoded = EncryptionHandler.decrypt(encrypted, key, usage); return KrbCodec.decode(encoded, krbType); } public static byte[] encrypt(EncryptionKey key, byte[] plaintext, int usage) throws KrbException { EncTypeHandler encType = EncryptionHandler.getEncHandler(key.getKeyType()); byte[] cipherData = encType.encrypt(plaintext, key.getKeyData(), usage); return cipherData; } public static byte[] decrypt(EncryptionKey key, byte[] cipherData, int usage) throws KrbException { EncTypeHandler encType = EncryptionHandler.getEncHandler(key.getKeyType()); byte[] plainData = encType.decrypt(cipherData, key.getKeyData(), usage); return plainData; } }