//udptest.java

import java.io.*;
import java.net.*;
import krb5.lib.*;
import krb5.lib.asn1.*;
import krb5.lib.crypto.*;
import asn1test;

class udptest {
	public static void main(String args[]) {
		byte[] obuf = null;
		try {
			obuf = asn1test.sample_as_req();
		} catch (Asn1Exception e) {
			System.out.println(e);
		} catch (UnknownHostException e) {
			System.out.println(e);
		}
		byte  ibuf[] = new byte[1024];
		InetAddress  iaddr = null;
		int iport = 88;
		DatagramSocket dgSocket;

		try {
			//iaddr = InetAddress.getByName("sanfilippo.osf.org");
			iaddr = InetAddress.getByName("link.osf.org");
		}
		catch (UnknownHostException e) {
			System.out.println(e);
		}

		DatagramPacket dgPacketOut = new DatagramPacket(obuf, obuf.length,
			iaddr, iport);
		DatagramPacket dgPacketIn = new DatagramPacket(ibuf, ibuf.length);

		try {
			System.out.println("as_req: " + obuf.length + " bytes");
			krb5.lib.asn1.util.print(obuf);
			System.out.println("\npress enter to send");
			System.in.read();
			dgSocket = new DatagramSocket();
			dgSocket.send(dgPacketOut);
			dgSocket.receive(dgPacketIn);
			System.out.println("as_rep: " + dgPacketIn.getLength() +
				" bytes");
			byte[] temp = new byte[dgPacketIn.getLength()];
			System.arraycopy(dgPacketIn.getData(), 0, temp, 0,
				dgPacketIn.getLength()); 
			krb5.lib.asn1.util.print(temp);
			EncodeRef ref = new EncodeRef(temp);
			ASRep rep = new ASRep(ref);
			byte[] enc_as_rep_part =
				rep.encPart.decrypt("sanfilipbooboo.osf.orgsanfilip");
			ref = new EncodeRef(enc_as_rep_part);
			EncASRepPart enc_part = new EncASRepPart(ref);
			krb5.lib.asn1.util.print(enc_part.asn1Encode());
			System.out.println();
		} catch (Asn1Exception e) {
			System.out.println(e);
		} catch (BitStringException e) {
			System.out.println(e);
		} catch (SocketException e) {
			System.out.println(e);
		} catch (IOException e) {
			System.out.println(e);
		} catch (KdcErrException e) {
			System.out.println(e);
		} catch (KrbApErrException e) {
			System.out.println(e);
		} catch (RealmException e) {
			System.out.println(e);
		} catch (RuntimeException e) {
			System.out.println(e);
		}
		System.out.println("ok");
	}
}