blob: 7bb0d195691d4f2a247e3347407478d33e1a72da [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Portions Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26/*
27 *
28 * (C) Copyright IBM Corp. 1999 All Rights Reserved.
29 * Copyright 1997 The Open Group Research Institute. All rights reserved.
30 */
31
32package sun.security.krb5.internal;
33
34import sun.security.krb5.Confounder;
35
36public class LocalSeqNumber implements SeqNumber {
37 private int lastSeqNumber;
38
39 public LocalSeqNumber() {
40 randInit();
41 }
42
43 public LocalSeqNumber(int start) {
44 init(start);
45 }
46
47 public LocalSeqNumber(Integer start) {
48 init(start.intValue());
49 }
50
51 public synchronized void randInit() {
52 /*
53 * Sequence numbers fall in the range 0 through 2^32 - 1 and wrap
54 * to zero following the value 2^32 - 1.
55 * Previous implementations used signed sequence numbers.
56 * Workaround implementation incompatibilities by not generating
57 * initial sequence numbers greater than 2^30, as done
58 * in MIT distribution.
59 */
60 // get the random confounder
61 byte[] data = Confounder.bytes(4);
62 data[0] = (byte)(data[0] & 0x3f);
63 int result = ((data[3] & 0xff) |
64 ((data[2] & 0xff) << 8) |
65 ((data[1] & 0xff) << 16) |
66 ((data[0] & 0xff) << 24));
67 if (result == 0) {
68 result = 1;
69 }
70 lastSeqNumber = result;
71 }
72
73 public synchronized void init(int start) {
74 lastSeqNumber = start;
75 }
76
77 public synchronized int current() {
78 return lastSeqNumber;
79 }
80
81 public synchronized int next() {
82 return lastSeqNumber + 1;
83 }
84
85 public synchronized int step() {
86 return ++lastSeqNumber;
87 }
88
89}