/* jcifs smb client library in Java * Copyright (C) 2004 "Michael B. Allen" <jcifs at samba dot org> * "Eric Glass" <jcifs at samba dot org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package jcifs.spnego; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Enumeration; import jcifs.spnego.asn1.ASN1EncodableVector; import jcifs.spnego.asn1.ASN1OctetString; import jcifs.spnego.asn1.ASN1Sequence; import jcifs.spnego.asn1.ASN1TaggedObject; import jcifs.spnego.asn1.DEREnumerated; import jcifs.spnego.asn1.DERInputStream; import jcifs.spnego.asn1.DERObjectIdentifier; import jcifs.spnego.asn1.DEROctetString; import jcifs.spnego.asn1.DEROutputStream; import jcifs.spnego.asn1.DERSequence; import jcifs.spnego.asn1.DERTaggedObject; public class NegTokenTarg extends SpnegoToken { public static final int UNSPECIFIED_RESULT = -1; public static final int ACCEPT_COMPLETED = 0; public static final int ACCEPT_INCOMPLETE = 1; public static final int REJECTED = 2; private String mechanism; private int result = UNSPECIFIED_RESULT; public NegTokenTarg() { } public NegTokenTarg(int result, String mechanism, byte[] mechanismToken, byte[] mechanismListMIC) { setResult(result); setMechanism(mechanism); setMechanismToken(mechanismToken); setMechanismListMIC(mechanismListMIC); } public NegTokenTarg(byte[] token) throws IOException { parse(token); } public int getResult() { return result; } public void setResult(int result) { this.result = result; } public String getMechanism() { return mechanism; } public void setMechanism(String mechanism) { this.mechanism = mechanism; } public byte[] toByteArray() { try { ByteArrayOutputStream collector = new ByteArrayOutputStream(); DEROutputStream der = new DEROutputStream(collector); ASN1EncodableVector fields = new ASN1EncodableVector(); int result = getResult(); if (result != UNSPECIFIED_RESULT) { fields.add(new DERTaggedObject(true, 0, new DEREnumerated(result))); } String mechanism = getMechanism(); if (mechanism != null) { fields.add(new DERTaggedObject(true, 1, new DERObjectIdentifier(mechanism))); } byte[] mechanismToken = getMechanismToken(); if (mechanismToken != null) { fields.add(new DERTaggedObject(true, 2, new DEROctetString(mechanismToken))); } byte[] mechanismListMIC = getMechanismListMIC(); if (mechanismListMIC != null) { fields.add(new DERTaggedObject(true, 3, new DEROctetString(mechanismListMIC))); } der.writeObject(new DERTaggedObject(true, 1, new DERSequence(fields))); return collector.toByteArray(); } catch (IOException ex) { throw new IllegalStateException(ex.getMessage()); } } protected void parse(byte[] token) throws IOException { ByteArrayInputStream tokenStream = new ByteArrayInputStream(token); DERInputStream der = new DERInputStream(tokenStream); ASN1TaggedObject tagged = (ASN1TaggedObject) der.readObject(); ASN1Sequence sequence = ASN1Sequence.getInstance(tagged, true); Enumeration fields = sequence.getObjects(); while (fields.hasMoreElements()) { tagged = (ASN1TaggedObject) fields.nextElement(); switch (tagged.getTagNo()) { case 0: DEREnumerated enumerated = DEREnumerated.getInstance(tagged, true); setResult(enumerated.getValue().intValue()); break; case 1: DERObjectIdentifier mechanism = DERObjectIdentifier.getInstance(tagged, true); setMechanism(mechanism.getId()); break; case 2: ASN1OctetString mechanismToken = ASN1OctetString.getInstance(tagged, true); setMechanismToken(mechanismToken.getOctets()); break; case 3: ASN1OctetString mechanismListMIC = ASN1OctetString.getInstance(tagged, true); setMechanismListMIC(mechanismListMIC.getOctets()); break; default: throw new IOException("Malformed token field."); } } } }