1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.kerberos.shared.io.decoder;
21
22
23 import java.io.IOException;
24 import java.nio.ByteBuffer;
25 import java.util.Enumeration;
26
27 import org.apache.directory.server.kerberos.shared.KerberosConstants;
28 import org.apache.directory.server.kerberos.shared.KerberosMessageType;
29 import org.apache.directory.server.kerberos.shared.messages.KdcRequest;
30 import org.apache.directory.server.kerberos.shared.messages.value.KdcOptions;
31 import org.apache.directory.server.kerberos.shared.messages.value.PaData;
32 import org.apache.directory.server.kerberos.shared.messages.value.RequestBody;
33 import org.apache.directory.server.kerberos.shared.messages.value.RequestBodyModifier;
34 import org.apache.directory.shared.asn1.der.ASN1InputStream;
35 import org.apache.directory.shared.asn1.der.DERApplicationSpecific;
36 import org.apache.directory.shared.asn1.der.DERBitString;
37 import org.apache.directory.shared.asn1.der.DEREncodable;
38 import org.apache.directory.shared.asn1.der.DERGeneralString;
39 import org.apache.directory.shared.asn1.der.DERGeneralizedTime;
40 import org.apache.directory.shared.asn1.der.DERInteger;
41 import org.apache.directory.shared.asn1.der.DERSequence;
42 import org.apache.directory.shared.asn1.der.DERTaggedObject;
43
44
45
46
47
48
49 public class KdcRequestDecoder
50 {
51
52
53
54
55
56
57
58 public KdcRequest decode( ByteBuffer in ) throws IOException
59 {
60 ASN1InputStream ais = new ASN1InputStream( in );
61
62 DERApplicationSpecific app = ( DERApplicationSpecific ) ais.readObject();
63
64 DERSequence kdcreq = ( DERSequence ) app.getObject();
65
66 return decodeKdcRequestSequence( kdcreq );
67 }
68
69
70
71
72
73
74
75
76
77
78
79
80 private KdcRequest decodeKdcRequestSequence( DERSequence sequence ) throws IOException
81 {
82 int pvno = KerberosConstants.KERBEROS_V5;
83 KerberosMessageType msgType = null;
84
85 PaData[] paData = null;
86 RequestBody requestBody = null;
87 byte[] bodyBytes = null;
88
89 for ( Enumeration<DEREncodable> e = sequence.getObjects(); e.hasMoreElements(); )
90 {
91 DERTaggedObject object = ( DERTaggedObject ) e.nextElement();
92 int tag = object.getTagNo();
93 DEREncodable derObject = object.getObject();
94
95 switch ( tag )
96 {
97 case 1:
98 DERInteger tag1 = ( DERInteger ) derObject;
99 pvno = tag1.intValue();
100 break;
101
102 case 2:
103 DERInteger tag2 = ( DERInteger ) derObject;
104 msgType = KerberosMessageType.getTypeByOrdinal( tag2.intValue() );
105 break;
106
107 case 3:
108 DERSequence tag3 = ( DERSequence ) derObject;
109 paData = PreAuthenticationDataDecoder.decodeSequence( tag3 );
110 break;
111
112 case 4:
113 DERSequence tag4 = ( DERSequence ) derObject;
114 requestBody = decodeRequestBody( tag4 );
115
116
117
118
119
120
121 bodyBytes = object.getOctets();
122
123 break;
124 }
125 }
126
127 return new KdcRequest( pvno, msgType, paData, requestBody, bodyBytes );
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 private RequestBody decodeRequestBody( DERSequence sequence ) throws IOException
151 {
152 RequestBodyModifier modifier = new RequestBodyModifier();
153
154 for ( Enumeration<DEREncodable> e = sequence.getObjects(); e.hasMoreElements(); )
155 {
156 DERTaggedObject object = ( DERTaggedObject ) e.nextElement();
157 int tag = object.getTagNo();
158 DEREncodable derObject = object.getObject();
159
160 switch ( tag )
161 {
162 case 0:
163 DERBitString kdcOptions = ( DERBitString ) derObject;
164 modifier.setKdcOptions( new KdcOptions( kdcOptions.getOctets() ) );
165 break;
166 case 1:
167 DERSequence cName = ( DERSequence ) derObject;
168 modifier.setClientName( PrincipalNameDecoder.decode( cName ) );
169 break;
170 case 2:
171 DERGeneralString realm = ( DERGeneralString ) derObject;
172 modifier.setRealm( realm.getString() );
173 break;
174 case 3:
175 DERSequence sname = ( DERSequence ) derObject;
176 modifier.setServerName( PrincipalNameDecoder.decode( sname ) );
177 break;
178 case 4:
179 DERGeneralizedTime from = ( DERGeneralizedTime ) derObject;
180 modifier.setFrom( KerberosTimeDecoder.decode( from ) );
181 break;
182 case 5:
183 DERGeneralizedTime till = ( DERGeneralizedTime ) derObject;
184 modifier.setTill( KerberosTimeDecoder.decode( till ) );
185 break;
186 case 6:
187 DERGeneralizedTime rtime = ( DERGeneralizedTime ) derObject;
188 modifier.setRtime( KerberosTimeDecoder.decode( rtime ) );
189 break;
190 case 7:
191 DERInteger nonce = ( DERInteger ) derObject;
192 modifier.setNonce( nonce.intValue() );
193 break;
194 case 8:
195 DERSequence etype = ( DERSequence ) derObject;
196 modifier.setEType( EncryptionTypeDecoder.decode( etype ) );
197 break;
198
199 case 9:
200 DERSequence hostAddresses = ( DERSequence ) derObject;
201 modifier.setAddresses( HostAddressDecoder.decodeSequence( hostAddresses ) );
202 break;
203 case 10:
204 DERSequence encryptedData = ( DERSequence ) derObject;
205 modifier.setEncAuthorizationData( EncryptedDataDecoder.decode( encryptedData ) );
206 break;
207 case 11:
208 DERSequence tag11 = ( DERSequence ) derObject;
209 modifier.setAdditionalTickets( TicketDecoder.decodeSequence( tag11 ) );
210 break;
211 }
212 }
213
214 return modifier.getRequestBody();
215 }
216 }