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.encoder;
21
22
23 import java.io.ByteArrayOutputStream;
24 import java.io.IOException;
25 import java.nio.ByteBuffer;
26
27 import org.apache.directory.server.kerberos.shared.messages.KdcRequest;
28 import org.apache.directory.server.kerberos.shared.messages.value.PaData;
29 import org.apache.directory.server.kerberos.shared.messages.value.RequestBody;
30 import org.apache.directory.shared.asn1.der.ASN1OutputStream;
31 import org.apache.directory.shared.asn1.der.DERApplicationSpecific;
32 import org.apache.directory.shared.asn1.der.DERBitString;
33 import org.apache.directory.shared.asn1.der.DERGeneralString;
34 import org.apache.directory.shared.asn1.der.DERInteger;
35 import org.apache.directory.shared.asn1.der.DEROctetString;
36 import org.apache.directory.shared.asn1.der.DERSequence;
37 import org.apache.directory.shared.asn1.der.DERTaggedObject;
38
39
40
41
42
43
44 public class KdcRequestEncoder
45 {
46
47
48
49
50
51
52
53
54
55
56 public void encode( KdcRequest request, ByteBuffer out ) throws IOException
57 {
58 ASN1OutputStream aos = new ASN1OutputStream( out );
59
60 DERSequence kdcRequest = encodeInitialSequence( request );
61 aos.writeObject( DERApplicationSpecific.valueOf( request.getMessageType().getOrdinal(), kdcRequest ) );
62 aos.close();
63 }
64
65
66
67
68
69
70
71
72
73 private DERSequence encodeInitialSequence( KdcRequest app )
74 {
75 DERSequence sequence = new DERSequence();
76
77 sequence.add( new DERTaggedObject( 1, DERInteger.valueOf( app.getProtocolVersionNumber() ) ) );
78
79 sequence.add( new DERTaggedObject( 2, DERInteger.valueOf( app.getMessageType().getOrdinal() ) ) );
80
81 if ( app.getPreAuthData() != null )
82 {
83 sequence.add( new DERTaggedObject( 3, encodePreAuthData( app.getPreAuthData() ) ) );
84 }
85
86 sequence.add( new DERTaggedObject( 4, encodeKdcRequestBody( app.getRequestBody() ) ) );
87
88 return sequence;
89 }
90
91
92
93
94
95
96
97
98
99 public byte[] encodeRequestBody( RequestBody requestBody ) throws IOException
100 {
101 ByteArrayOutputStream baos = new ByteArrayOutputStream();
102 ASN1OutputStream aos = new ASN1OutputStream( baos );
103
104 aos.writeObject( encodeKdcRequestBody( requestBody ) );
105 aos.close();
106
107 return baos.toByteArray();
108 }
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 private DERSequence encodeKdcRequestBody( RequestBody requestBody )
133 {
134 DERSequence sequence = new DERSequence();
135
136 sequence.add( new DERTaggedObject( 0, new DERBitString( requestBody.getKdcOptions().getBytes() ) ) );
137
138
139 if ( requestBody.getClientPrincipal() != null )
140 {
141 sequence.add( new DERTaggedObject( 1, PrincipalNameEncoder.encode( requestBody.getClientPrincipal() ) ) );
142 }
143
144 sequence.add( new DERTaggedObject( 2, DERGeneralString.valueOf( requestBody.getServerPrincipal().getRealm()
145 .toString() ) ) );
146
147
148 if ( requestBody.getServerPrincipal() != null )
149 {
150 sequence.add( new DERTaggedObject( 3, PrincipalNameEncoder.encode( requestBody.getServerPrincipal() ) ) );
151 }
152
153
154 if ( requestBody.getFrom() != null )
155 {
156 sequence.add( new DERTaggedObject( 4, KerberosTimeEncoder.encode( requestBody.getFrom() ) ) );
157 }
158
159 sequence.add( new DERTaggedObject( 5, KerberosTimeEncoder.encode( requestBody.getTill() ) ) );
160
161
162 if ( requestBody.getRtime() != null )
163 {
164 sequence.add( new DERTaggedObject( 6, KerberosTimeEncoder.encode( requestBody.getRtime() ) ) );
165 }
166
167 sequence.add( new DERTaggedObject( 7, DERInteger.valueOf( requestBody.getNonce() ) ) );
168
169 sequence.add( new DERTaggedObject( 8, EncryptionTypeEncoder.encode( requestBody.getEType() ) ) );
170
171
172 if ( requestBody.getAddresses() != null )
173 {
174 sequence.add( new DERTaggedObject( 9, HostAddressesEncoder.encodeSequence( requestBody.getAddresses() ) ) );
175 }
176
177
178 if ( requestBody.getEncAuthorizationData() != null )
179 {
180 sequence.add( new DERTaggedObject( 10, EncryptedDataEncoder.encodeSequence( requestBody
181 .getEncAuthorizationData() ) ) );
182 }
183
184
185 if ( requestBody.getAdditionalTickets() != null )
186 {
187 sequence
188 .add( new DERTaggedObject( 11, TicketEncoder.encodeSequence( requestBody.getAdditionalTickets() ) ) );
189 }
190
191 return sequence;
192 }
193
194
195
196
197
198
199
200
201 private DERSequence encodePreAuthData( PaData[] preAuthData )
202 {
203 DERSequence preAuth = new DERSequence();
204
205 for ( int ii = 0; ii < preAuthData.length; ii++ )
206 {
207 DERSequence sequence = new DERSequence();
208
209 sequence.add( new DERTaggedObject( 1, DERInteger.valueOf( preAuthData[ii].getPaDataType().getOrdinal() ) ) );
210 sequence.add( new DERTaggedObject( 2, new DEROctetString( preAuthData[ii].getPaDataValue() ) ) );
211 preAuth.add( sequence );
212 }
213
214 return preAuth;
215 }
216 }