try
{
KdcReqBody reqBody = new KdcReqBody();
KdcOptions kdcOptions = new KdcOptions();
reqBody.setKdcOptions( kdcOptions );
reqBody.setCName( new PrincipalName( principal ) );
reqBody.setRealm( principal.getRealm() );
PrincipalName srvPrincipal = new PrincipalName( targetPrincipal );
srvPrincipal.setNameType( PrincipalNameType.KRB_NT_SRV_INST );
reqBody.setSName( srvPrincipal );
Date prefStartTime = clientOptions.getStartTime();
if ( prefStartTime != null )
{
reqBody.setFrom( new KerberosTime( prefStartTime ) );
}
long currentTime = System.currentTimeMillis();
KerberosTime lifeTime = new KerberosTime( clientOptions.getLifeTime() + currentTime );
reqBody.setTill( lifeTime );
if ( clientOptions.getRenewableLifetime() > 0 )
{
reqBody.setRtime( new KerberosTime( clientOptions.getRenewableLifetime() + currentTime ) );
kdcOptions.setFlag( KdcOptions.RENEWABLE );
}
int nonce = random.nextInt();
reqBody.setNonce( nonce );
Set<EncryptionType> ciphers = clientOptions.getEncryptionTypes();
reqBody.setEType( ciphers );
if ( clientOptions.getClientAddresses() != null )
{
HostAddresses addresses = new HostAddresses();
for ( InetAddress ia : clientOptions.getClientAddresses() )
{
addresses.addHostAddress( new HostAddress( ia ) );
}
reqBody.setAddresses( addresses );
}
if ( clientOptions.isAllowPostdate() )
{
kdcOptions.setFlag( KdcOptions.ALLOW_POSTDATE );
}
if ( clientOptions.isProxiable() )
{
kdcOptions.setFlag( KdcOptions.PROXIABLE );
}
if ( clientOptions.isForwardable() )
{
kdcOptions.setFlag( KdcOptions.FORWARDABLE );
}
Map<EncryptionType, EncryptionKey> keys = KerberosKeyFactory.getKerberosKeys( principal.getName(),
password, ciphers );