1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.shared.kerberos.messages;
21
22
23 import java.nio.BufferOverflowException;
24 import java.nio.ByteBuffer;
25
26 import org.apache.directory.api.asn1.EncoderException;
27 import org.apache.directory.api.asn1.ber.tlv.BerValue;
28 import org.apache.directory.api.asn1.ber.tlv.TLV;
29 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
30 import org.apache.directory.api.util.Strings;
31 import org.apache.directory.server.i18n.I18n;
32 import org.apache.directory.shared.kerberos.KerberosConstants;
33 import org.apache.directory.shared.kerberos.KerberosMessageType;
34 import org.apache.directory.shared.kerberos.KerberosTime;
35 import org.apache.directory.shared.kerberos.components.EncryptionKey;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public class EncApRepPart extends KerberosMessage
54 {
55
56 private static final Logger LOG = LoggerFactory.getLogger( EncApRepPart.class );
57
58
59 private static final boolean IS_DEBUG = LOG.isDebugEnabled();
60
61
62 private KerberosTime ctime;
63
64
65 private int cusec;
66
67
68 private EncryptionKey subkey;
69
70
71 private Integer seqNumber;
72
73
74 private int ctimeLength;
75 private int cusecLength;
76 private int subKeyLength;
77 private int seqNumberLength;
78 private int encApRepPartSeqLength;
79 private int encApRepPartLength;
80
81
82
83
84
85 public EncApRepPart()
86 {
87 super( KerberosMessageType.ENC_AP_REP_PART );
88 }
89
90
91
92
93
94
95
96 public KerberosTime getCTime()
97 {
98 return ctime;
99 }
100
101
102
103
104
105 public void setCTime( KerberosTime ctime )
106 {
107 this.ctime = ctime;
108 }
109
110
111
112
113
114 public int getCusec()
115 {
116 return cusec;
117 }
118
119
120
121
122
123 public void setCusec( int cusec )
124 {
125 this.cusec = cusec;
126 }
127
128
129
130
131
132 public EncryptionKey getSubkey()
133 {
134 return subkey;
135 }
136
137
138
139
140
141 public void setSubkey( EncryptionKey subkey )
142 {
143 this.subkey = subkey;
144 }
145
146
147
148
149
150 public Integer getSeqNumber()
151 {
152 return seqNumber;
153 }
154
155
156
157
158
159 public void setSeqNumber( Integer seqNumber )
160 {
161 this.seqNumber = seqNumber;
162 }
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189 @Override
190 public int computeLength()
191 {
192
193 ctimeLength = 1 + 1 + 0x0F;
194 encApRepPartSeqLength = 1 + TLV.getNbBytes( ctimeLength ) + ctimeLength;
195
196
197 cusecLength = 1 + 1 + BerValue.getNbBytes( cusec );
198 encApRepPartSeqLength += 1 + TLV.getNbBytes( cusecLength ) + cusecLength;
199
200
201 if ( subkey != null )
202 {
203 subKeyLength = subkey.computeLength();
204 encApRepPartSeqLength += 1 + TLV.getNbBytes( subKeyLength ) + subKeyLength;
205 }
206
207
208 if ( seqNumber != null )
209 {
210 seqNumberLength = 1 + 1 + BerValue.getNbBytes( seqNumber );
211 encApRepPartSeqLength += 1 + TLV.getNbBytes( seqNumberLength ) + seqNumberLength;
212 }
213
214 encApRepPartLength = 1 + TLV.getNbBytes( encApRepPartSeqLength ) + encApRepPartSeqLength;
215
216 return 1 + TLV.getNbBytes( encApRepPartLength ) + encApRepPartLength;
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238 @Override
239 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
240 {
241 if ( buffer == null )
242 {
243 buffer = ByteBuffer.allocate( computeLength() );
244 }
245
246 try
247 {
248
249 buffer.put( ( byte ) KerberosConstants.ENC_AP_REP_PART_TAG );
250 buffer.put( TLV.getBytes( encApRepPartLength ) );
251
252
253 buffer.put( ( byte ) UniversalTag.SEQUENCE.getValue() );
254 buffer.put( TLV.getBytes( encApRepPartSeqLength ) );
255
256
257
258 buffer.put( ( byte ) KerberosConstants.ENC_AP_REP_PART_CTIME_TAG );
259 buffer.put( ( byte ) 0x11 );
260
261
262 buffer.put( ( byte ) UniversalTag.GENERALIZED_TIME.getValue() );
263 buffer.put( ( byte ) 0x0F );
264 buffer.put( ctime.getBytes() );
265
266
267
268 buffer.put( ( byte ) KerberosConstants.ENC_AP_REP_PART_CUSEC_TAG );
269 buffer.put( TLV.getBytes( cusecLength ) );
270
271
272 BerValue.encode( buffer, cusec );
273
274
275 if ( subkey != null )
276 {
277
278 buffer.put( ( byte ) KerberosConstants.ENC_AP_REP_PART_SUB_KEY_TAG );
279 buffer.put( TLV.getBytes( subKeyLength ) );
280
281
282 subkey.encode( buffer );
283 }
284
285
286 if ( seqNumber != null )
287 {
288
289 buffer.put( ( byte ) KerberosConstants.ENC_AP_REP_PART_SEQ_NUMBER_TAG );
290 buffer.put( TLV.getBytes( seqNumberLength ) );
291
292
293 BerValue.encode( buffer, seqNumber );
294 }
295
296 }
297 catch ( BufferOverflowException boe )
298 {
299 LOG.error( I18n.err( I18n.ERR_139, 1 + TLV.getNbBytes( encApRepPartLength )
300 + encApRepPartLength, buffer.capacity() ) );
301 throw new EncoderException( I18n.err( I18n.ERR_138 ), boe );
302 }
303
304 if ( IS_DEBUG )
305 {
306 LOG.debug( "EncApRepPart encoding : {}", Strings.dumpBytes( buffer.array() ) );
307 LOG.debug( "EncApRepPart initial value : {}", this );
308 }
309
310 return buffer;
311 }
312
313
314
315
316
317 public String toString()
318 {
319 StringBuilder sb = new StringBuilder();
320
321 sb.append( "EncApRepPart : \n" );
322
323 sb.append( " ctime : " ).append( ctime ).append( '\n' );
324 sb.append( " cusec : " ).append( cusec ).append( '\n' );
325
326 if ( subkey != null )
327 {
328 sb.append( " subkey : " ).append( subkey ).append( '\n' );
329 }
330
331 if ( seqNumber != null )
332 {
333 sb.append( " seq-number : " ).append( seqNumber ).append( '\n' );
334 }
335
336 return sb.toString();
337 }
338 }