Imported GNU Classpath 0.90

Imported GNU Classpath 0.90
       * scripts/makemake.tcl: Set gnu/java/awt/peer/swing to ignore.
       * gnu/classpath/jdwp/VMFrame.java (SIZE): New constant.
       * java/lang/VMCompiler.java: Use gnu.java.security.hash.MD5.
       * java/lang/Math.java: New override file.
       * java/lang/Character.java: Merged from Classpath.
       (start, end): Now 'int's.
       (canonicalName): New field.
       (CANONICAL_NAME, NO_SPACES_NAME, CONSTANT_NAME): New constants.
       (UnicodeBlock): Added argument.
       (of): New overload.
       (forName): New method.
       Updated unicode blocks.
       (sets): Updated.
       * sources.am: Regenerated.
       * Makefile.in: Likewise.

From-SVN: r111942
This commit is contained in:
Mark Wielaard 2006-03-10 21:46:48 +00:00
parent 27079765d0
commit 8aa540d2f7
1367 changed files with 188789 additions and 22762 deletions

View file

@ -229,9 +229,9 @@ public class GLightweightPeer
public void repaint(long tm, int x, int y, int width, int height)
{
Component p = comp.getParent ();
if(p != null)
p.repaint(tm,x+comp.getX(),y+comp.getY(),width,height);
Component p = comp.getParent();
if (p != null)
p.repaint(tm, x + comp.getX(), y + comp.getY(), width, height);
}
public void requestFocus() {}

View file

@ -1,5 +1,5 @@
/* GtkButtonPeer.java -- Implements ButtonPeer with GTK
Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -57,7 +57,10 @@ public class GtkButtonPeer extends GtkComponentPeer
public native void connectSignals ();
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Overridden to set Font of Label inside Button inside EventBox.
*/
protected native void gtkWidgetModifyFont(String name, int style, int size);
native void gtkSetLabel (String label);
native void gtkWidgetSetForeground (int red, int green, int blue);
native void gtkWidgetSetBackground (int red, int green, int blue);

View file

@ -1,5 +1,5 @@
/* GtkCheckboxMenuItemPeer.java -- Implements CheckboxMenuItemPeer with GTK+
Copyright (C) 1999, 2005 Free Software Foundation, Inc.
Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -46,7 +46,7 @@ import java.awt.peer.CheckboxMenuItemPeer;
public class GtkCheckboxMenuItemPeer extends GtkMenuItemPeer
implements CheckboxMenuItemPeer
{
native void create (String label);
protected native void create (String label);
public GtkCheckboxMenuItemPeer (CheckboxMenuItem menu)
{
@ -56,6 +56,11 @@ public class GtkCheckboxMenuItemPeer extends GtkMenuItemPeer
public native void setState(boolean t);
/**
* Called from the signal handler of the gtk widget. Posts a
* ItemEvent to indicate a state changed, then calls super to post
* an ActionEvent.
*/
protected void postMenuActionEvent ()
{
CheckboxMenuItem item = (CheckboxMenuItem)awtWidget;

View file

@ -1,5 +1,5 @@
/* GtkCheckboxPeer.java -- Implements CheckboxPeer with GTK
Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2003, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -42,6 +42,8 @@ import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.peer.CheckboxPeer;
import java.awt.event.ItemEvent;
public class GtkCheckboxPeer extends GtkComponentPeer
implements CheckboxPeer
{
@ -49,12 +51,15 @@ public class GtkCheckboxPeer extends GtkComponentPeer
public GtkCheckboxGroupPeer old_group;
// The current state of the GTK checkbox.
private boolean currentState;
private boolean changing = false;
public native void create (GtkCheckboxGroupPeer group);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
public native void connectSignals ();
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Overridden to set Font of label inside button.
*/
protected native void gtkWidgetModifyFont(String name, int style, int size);
native void gtkButtonSetLabel (String label);
native void gtkToggleButtonSetActive (boolean is_active);
@ -71,23 +76,24 @@ public class GtkCheckboxPeer extends GtkComponentPeer
CheckboxGroup g = checkbox.getCheckboxGroup ();
old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g);
create (old_group);
gtkToggleButtonSetActive (checkbox.getState ());
currentState = checkbox.getState();
gtkToggleButtonSetActive(currentState);
gtkButtonSetLabel (checkbox.getLabel ());
}
public void setState (boolean state)
/**
* Sets native GtkCheckButton is state is different from current
* state. Will set currentState to state to prevent posting an
* event since events should only be posted for user initiated
* clicks on the GtkCheckButton.
*/
synchronized public void setState (boolean state)
{
// prevent item_toggled_cb -> postItemEvent ->
// awtComponent.setState -> this.setState ->
// gtkToggleButtonSetActive self-deadlock on the GDK lock.
if (changing && Thread.currentThread() == GtkToolkit.mainThread)
{
changing = false;
return;
}
if (currentState != state)
gtkToggleButtonSetActive (state);
{
currentState = state;
gtkToggleButtonSetActive(state);
}
}
public void setLabel (String label)
@ -111,22 +117,15 @@ public class GtkCheckboxPeer extends GtkComponentPeer
// Override the superclass postItemEvent so that the peer doesn't
// need information that we have.
// called back by native side: item_toggled_cb
public void postItemEvent (Object item, int stateChange)
synchronized public void postItemEvent(Object item, boolean state)
{
Checkbox currentCheckBox = ((Checkbox)awtComponent);
// A firing of the event is only desired if the state has changed due to a
// button press. The currentCheckBox's state must be different from the
// one that the stateChange is changing to.
// stateChange = 1 if it goes from false -> true
// stateChange = 2 if it goes from true -> false
if (( !currentCheckBox.getState() && stateChange == 1)
|| (currentCheckBox.getState() && stateChange == 2))
{
super.postItemEvent (awtComponent, stateChange);
currentState = !currentCheckBox.getState();
changing = true;
currentCheckBox.setState(currentState);
}
// Only fire event is state actually changed.
if (currentState != state)
{
currentState = state;
super.postItemEvent(awtComponent,
state ? ItemEvent.SELECTED : ItemEvent.DESELECTED);
}
}
public void dispose ()

View file

@ -1,5 +1,6 @@
/* GtkComponentPeer.java -- Implements ComponentPeer with GTK
Copyright (C) 1998, 1999, 2002, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -46,10 +47,10 @@ import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
@ -87,8 +88,6 @@ public class GtkComponentPeer extends GtkGenericPeer
boolean isInRepaint;
static final Timer repaintTimer = new Timer (true);
/* this isEnabled differs from Component.isEnabled, in that it
knows if a parent is disabled. In that case Component.isEnabled
may return true, but our isEnabled will always return false */
@ -146,12 +145,7 @@ public class GtkComponentPeer extends GtkGenericPeer
Component parent = awtComponent.getParent ();
// Only set our parent on the GTK side if our parent on the AWT
// side is not showing. Otherwise the gtk peer will be shown
// before we've had a chance to position and size it properly.
if (awtComponent instanceof Window
|| (parent != null && ! parent.isShowing ()))
setParentAndBounds ();
setParentAndBounds ();
setNativeEventMask ();
@ -202,11 +196,6 @@ public class GtkComponentPeer extends GtkGenericPeer
void setComponentBounds ()
{
Rectangle bounds = awtComponent.getBounds ();
if (bounds.x == 0 && bounds.y == 0
&& bounds.width == 0 && bounds.height == 0)
return;
setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
}
@ -303,29 +292,29 @@ public class GtkComponentPeer extends GtkGenericPeer
{
case PaintEvent.PAINT:
case PaintEvent.UPDATE:
{
try
{
Graphics g = getGraphics ();
// Some peers like GtkFileDialogPeer are repainted by Gtk itself
if (g == null)
break;
{
try
{
Graphics g = getGraphics();
g.setClip (((PaintEvent) event).getUpdateRect());
if (!awtComponent.isShowing() || awtComponent.getWidth() < 1
|| awtComponent.getHeight() < 1 || g == null)
break;
if (id == PaintEvent.PAINT)
awtComponent.paint (g);
else
awtComponent.update (g);
g.setClip(((PaintEvent) event).getUpdateRect());
g.dispose ();
}
catch (InternalError e)
{
System.err.println (e);
}
}
if (id == PaintEvent.PAINT)
awtComponent.paint(g);
else
awtComponent.update(g);
g.dispose();
}
catch (InternalError e)
{
System.err.println(e);
}
}
break;
case KeyEvent.KEY_PRESSED:
ke = (KeyEvent) event;
@ -383,19 +372,30 @@ public class GtkComponentPeer extends GtkGenericPeer
if (x == 0 && y == 0 && width == 0 && height == 0)
return;
repaintTimer.schedule(new RepaintTimerTask(x, y, width, height), tm);
if (tm <= 0)
q().postEvent(new PaintEvent(awtComponent, PaintEvent.UPDATE,
new Rectangle(x, y, width, height)));
else
RepaintTimerTask.schedule(tm, x, y, width, height, awtComponent);
}
private class RepaintTimerTask extends TimerTask
/**
* Used for scheduling delayed paint updates on the event queue.
*/
private static class RepaintTimerTask extends TimerTask
{
private int x, y, width, height;
private static final Timer repaintTimer = new Timer(true);
RepaintTimerTask(int x, int y, int width, int height)
private int x, y, width, height;
private Component awtComponent;
RepaintTimerTask(Component c, int x, int y, int width, int height)
{
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.awtComponent = c;
}
public void run()
@ -403,6 +403,12 @@ public class GtkComponentPeer extends GtkGenericPeer
q().postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE,
new Rectangle (x, y, width, height)));
}
static void schedule(long tm, int x, int y, int width, int height,
Component c)
{
repaintTimer.schedule(new RepaintTimerTask(c, x, y, width, height), tm);
}
}
public void requestFocus ()
@ -429,8 +435,7 @@ public class GtkComponentPeer extends GtkGenericPeer
int new_y = y;
Component parent = awtComponent.getParent ();
Component next_parent;
// Heavyweight components that are children of one or more
// lightweight containers have to be handled specially. Because
// calls to GLightweightPeer.setBounds do nothing, GTK has no
@ -441,33 +446,19 @@ public class GtkComponentPeer extends GtkGenericPeer
// so we need to continue adding offsets until we reach a
// container whose position GTK knows -- that is, the first
// non-lightweight.
boolean lightweightChild = false;
Insets i;
while (parent.isLightweight ())
Insets i;
while (parent.isLightweight())
{
lightweightChild = true;
next_parent = parent.getParent ();
i = ((Container) parent).getInsets ();
if (next_parent instanceof Window)
{
new_x += i.left;
new_y += i.top;
}
else
{
new_x += parent.getX () + i.left;
new_y += parent.getY () + i.top;
}
parent = next_parent;
i = ((Container) parent).getInsets();
new_x += parent.getX() + i.left;
new_y += parent.getY() + i.top;
parent = parent.getParent();
}
// We only need to convert from Java to GTK coordinates if we're
// placing a heavyweight component in a Window.
if (parent instanceof Window && !lightweightChild)
if (parent instanceof Window)
{
GtkWindowPeer peer = (GtkWindowPeer) parent.getPeer ();
// important: we want the window peer's insets here, not the
@ -479,12 +470,17 @@ public class GtkComponentPeer extends GtkGenericPeer
int menuBarHeight = 0;
if (peer instanceof GtkFramePeer)
menuBarHeight = ((GtkFramePeer) peer).getMenuBarHeight ();
new_x = x - insets.left;
new_y = y - insets.top + menuBarHeight;
new_x -= insets.left;
new_y -= insets.top;
new_y += menuBarHeight;
}
setNativeBounds (new_x, new_y, width, height);
// If the height or width were (or are now) smaller than zero
// then we want to adjust the visibility.
setVisible(awtComponent.isVisible());
}
void setCursor ()
@ -535,6 +531,13 @@ public class GtkComponentPeer extends GtkGenericPeer
public void setVisible (boolean b)
{
// Only really set visible when component is bigger than zero pixels.
if (b)
{
Rectangle bounds = awtComponent.getBounds();
b = (bounds.width > 0) && (bounds.height > 0);
}
if (Thread.currentThread() == GtkToolkit.mainThread)
setVisibleNativeUnlocked (b);
else
@ -571,6 +574,8 @@ public class GtkComponentPeer extends GtkGenericPeer
KeyEvent keyEvent = new KeyEvent (awtComponent, id, when, mods,
keyCode, keyChar, keyLocation);
EventQueue q = q();
// Also post a KEY_TYPED event if keyEvent is a key press that
// doesn't represent an action or modifier key.
if (keyEvent.getID () == KeyEvent.KEY_PRESSED
@ -579,15 +584,17 @@ public class GtkComponentPeer extends GtkGenericPeer
&& keyCode != KeyEvent.VK_CONTROL
&& keyCode != KeyEvent.VK_ALT))
{
synchronized (q)
{
q().postEvent (keyEvent);
q().postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods,
KeyEvent.VK_UNDEFINED, keyChar, keyLocation));
synchronized(q)
{
q.postEvent(keyEvent);
keyEvent = new KeyEvent(awtComponent, KeyEvent.KEY_TYPED, when,
mods, KeyEvent.VK_UNDEFINED, keyChar,
keyLocation);
q.postEvent(keyEvent);
}
}
else
q().postEvent (keyEvent);
q.postEvent(keyEvent);
}
protected void postFocusEvent (int id, boolean temporary)

View file

@ -1,5 +1,5 @@
/* GtkContainerPeer.java -- Implements ContainerPeer with GTK
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -65,29 +65,6 @@ public class GtkContainerPeer extends GtkComponentPeer
public void endValidate ()
{
Component parent = awtComponent.getParent ();
// Only set our parent on the GTK side if our parent on the AWT
// side is not showing. Otherwise the gtk peer will be shown
// before we've had a chance to position and size it properly.
if (parent != null && parent.isShowing ())
{
Component[] components = ((Container) awtComponent).getComponents ();
int ncomponents = components.length;
for (int i = 0; i < ncomponents; i++)
{
ComponentPeer peer = components[i].getPeer ();
// Skip lightweight peers.
if (peer instanceof GtkComponentPeer)
((GtkComponentPeer) peer).setParentAndBounds ();
}
// GTK windows don't have parents.
if (!(awtComponent instanceof Window))
setParentAndBounds ();
}
}
public Insets getInsets()

View file

@ -41,8 +41,6 @@ package gnu.java.awt.peer.gtk;
import java.awt.Dialog;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.ComponentEvent;
import java.awt.peer.FileDialogPeer;
import java.io.File;
import java.io.FilenameFilter;
@ -68,7 +66,8 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer
((FileDialog) awtComponent).getMode());
FileDialog fd = (FileDialog) awtComponent;
nativeSetDirectory(System.getProperty("user.dir"));
setDirectory(fd.getDirectory());
setFile(fd.getFile());
@ -117,13 +116,9 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer
// is not absolute, let's construct it based on current directory.
currentFile = fileName;
if (fileName.indexOf(FS) == 0)
{
nativeSetFile (fileName);
}
nativeSetFile(fileName);
else
{
nativeSetFile (nativeGetDirectory() + FS + fileName);
}
nativeSetFile(nativeGetDirectory() + FS + fileName);
}
public void setDirectory (String directory)
@ -132,18 +127,24 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer
the only way we have to set the directory in FileDialog is by
calling its setDirectory which will call us back. */
if ((directory == null && currentDirectory == null)
|| (directory != null && directory.equals (currentDirectory)))
|| (directory != null && directory.equals(currentDirectory)))
return;
if (directory == null || directory.equals (""))
if (directory == null || directory.equals(""))
{
currentDirectory = FS;
nativeSetFile (FS);
return;
nativeSetDirectory(FS);
return;
}
// GtkFileChooser requires absolute directory names. If the given directory
// name is not absolute, construct it based on current directory if it is not
// null. Otherwise, use FS.
currentDirectory = directory;
nativeSetDirectory (directory);
if (directory.indexOf(FS) == 0)
nativeSetDirectory(directory);
else
nativeSetDirectory(nativeGetDirectory() + FS + directory);
}
public void setFilenameFilter (FilenameFilter filter)

View file

@ -43,10 +43,7 @@ import java.awt.Graphics;
import java.awt.Image;
import java.awt.MenuBar;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.ComponentEvent;
import java.awt.event.PaintEvent;
import java.awt.image.ColorModel;
import java.awt.peer.FramePeer;
import java.awt.peer.MenuBarPeer;
@ -77,7 +74,10 @@ public class GtkFramePeer extends GtkWindowPeer
removeMenuBarPeer ();
insets.top -= menuBarHeight;
menuBarHeight = 0;
awtComponent.validate ();
// if component has already been validated, we need to revalidate.
// otherwise, it will be validated when it is shown.
if (awtComponent.isValid())
awtComponent.validate ();
gtkFixedSetVisible (true);
}
else if (bar != null && menuBar == null)
@ -92,7 +92,10 @@ public class GtkFramePeer extends GtkWindowPeer
setMenuBarWidth (menuBar, menuBarWidth);
menuBarHeight = getMenuBarHeight ();
insets.top += menuBarHeight;
awtComponent.validate ();
// if component has already been validated, we need to revalidate.
// otherwise, it will be validated when it is shown.
if (awtComponent.isValid())
awtComponent.validate ();
gtkFixedSetVisible (true);
}
else if (bar != null && menuBar != null)

View file

@ -1,5 +1,5 @@
/* GtkGenericPeer.java - Has a hashcode. Yuck.
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -39,23 +39,28 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
public class GtkGenericPeer
{
// Used by Native State Association (NSA) functions to map
// gtk_widget to peer object.
final int native_state = getUniqueInteger ();
// Next native state value we will assign.
private static int next_native_state = 0;
// The widget or other java-side object we wrap.
protected Object awtWidget;
protected final Object awtWidget;
// Global event queue.
protected static EventQueue q = null;
// Dispose of our native state.
/**
* Dispose of our native state. Calls gtk_widget_destroy on the
* native widget and removes the awtWidget from the native state
* tables. Should be overridden by subclasses if this is not (all)
* that needs to be done.
*/
public native void dispose ();
static EventQueue q ()
@ -68,12 +73,6 @@ public class GtkGenericPeer
this.awtWidget = awtWidget;
}
public static void enableQueue (EventQueue sq)
{
if (q == null)
q = sq;
}
protected void postActionEvent (String command, int mods)
{
q().postEvent (new ActionEvent (awtWidget, ActionEvent.ACTION_PERFORMED,
@ -88,8 +87,20 @@ public class GtkGenericPeer
// Let's assume this will never wrap.
return next_native_state++;
}
/**
* Helper method to set Font for Gtk Widget.
*/
protected void gtkWidgetModifyFont(Font f)
{
gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
}
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Sets font for this Gtk Widget. Should be overridden by peers which
* are composed of different widgets or are contained in bins.
*/
protected native void gtkWidgetModifyFont(String name, int style, int size);
static void printCurrentThread ()
{

View file

@ -1,5 +1,5 @@
/* GtkImage.java
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -329,6 +329,24 @@ public class GtkImage extends Image
props = new Hashtable();
}
// The singleton GtkImage that is returned on errors by GtkToolkit.
private static GtkImage errorImage;
/**
* Returns an empty GtkImage with the errorLoading flag set.
* Called from GtkToolKit when some error occured, but an image needs
* to be returned anyway.
*/
static synchronized GtkImage getErrorImage()
{
if (errorImage == null)
{
errorImage = new GtkImage();
errorImage.errorLoading = true;
}
return errorImage;
}
/**
* Native helper function for constructor that takes a pixbuf Pointer.
*/

View file

@ -1,5 +1,5 @@
/* GtkLabelPeer.java -- Implements LabelPeer with GTK
Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -48,7 +48,12 @@ public class GtkLabelPeer extends GtkComponentPeer
implements LabelPeer
{
native void create (String text, float alignment);
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Overridden to set the Font of the label inside the gtk_event_box.
*/
protected native void gtkWidgetModifyFont(String name, int style, int size);
native void nativeSetAlignment (float alignment);
public native void setText(String text);

View file

@ -1,5 +1,5 @@
/* GtkListPeer.java -- Implements ListPeer with GTK
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -59,7 +59,12 @@ public class GtkListPeer extends GtkComponentPeer
native void create (int rows);
native void connectSignals ();
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Overridden to set the Font of the text insode the gtk_scrolled_window.
*/
protected native void gtkWidgetModifyFont (String name, int style, int size);
native void gtkWidgetRequestFocus ();
native void getSize (int rows, int visibleRows, int dims[]);

View file

@ -1,5 +1,5 @@
/* GtkMenuBarPeer.java -- Implements MenuBarPeer with GTK+
Copyright (C) 1999, 2005 Free Software Foundation, Inc.
Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -48,38 +48,69 @@ import java.awt.peer.MenuPeer;
public class GtkMenuBarPeer extends GtkMenuComponentPeer
implements MenuBarPeer
{
/** Whether we already have an help menu set on this peer. */
private boolean hasHelpMenu;
native void create ();
native void addMenu (MenuPeer menu);
/**
* Creates the gtk+ widget for this peer and puts it in the nsa
* table. Called from the (super class) constructor.
*/
protected native void create();
public GtkMenuBarPeer (MenuBar target)
/**
* Adds a new GtkMenuPeer to the end of the GtkMenuBarPeer.
*/
private native void addMenu(GtkMenuPeer menu);
/**
* Creates a new GtkMenuBarPeer associated with the given MenuBar.
*/
public GtkMenuBarPeer(MenuBar menubar)
{
super (target);
super(menubar);
}
void setFont ()
{
MenuComponent mc = (MenuComponent) awtWidget;
Font f = mc.getFont ();
if (f == null)
mc.setFont (new Font ("Dialog", Font.PLAIN, 12));
}
// FIXME: remove this method or replace it with one that does
// something useful.
/* In Gnome, help menus are no longer right flushed. */
native void nativeSetHelpMenu(MenuPeer menuPeer);
/**
* Adds a help menu to this MenuBar. Gnome styleguides say the help
* menu is just the last item in the menubar (they are NOT right
* justified).
*/
public void addHelpMenu (Menu menu)
{
// nativeSetHelpMenu((MenuPeer) menu.getPeer());
if (hasHelpMenu)
{
// Remove the (help) menu, which is after all the other items.
delMenu(((MenuBar) awtWidget).getMenuCount());
hasHelpMenu = false;
}
if (menu != null)
{
addMenu(menu);
hasHelpMenu = true;
}
}
/**
* Deletes the menu at (zero-based) index from this GtkMenuBar.
*/
public native void delMenu(int index);
public void addMenu (Menu m)
/**
* Adds the GtkMenuPeer associated with the Menu to this
* GtkMenuBarPeer. Makes sure that any help menus keep the last menu
* on the bar.
*/
public void addMenu(Menu m)
{
// FIXME: implement
// Make sure the help menu is the last one.
if (hasHelpMenu)
{
addHelpMenu(null);
addMenu((GtkMenuPeer) m.getPeer());
addHelpMenu(((MenuBar) awtWidget).getHelpMenu());
}
else
addMenu((GtkMenuPeer) m.getPeer());
}
}

View file

@ -1,5 +1,5 @@
/* GtkMenuComponentPeer.java -- Implements MenuComponentPeer with GTK+
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -39,31 +39,66 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.Font;
import java.awt.MenuComponent;
import java.awt.MenuContainer;
import java.awt.peer.MenuComponentPeer;
public class GtkMenuComponentPeer extends GtkGenericPeer
public abstract class GtkMenuComponentPeer extends GtkGenericPeer
implements MenuComponentPeer
{
void create ()
/**
* Creates the associated gtk+ widget and stores it in the nsa table
* for this peer. Called by the constructor.
*/
protected abstract void create ();
/**
* Sets font based on MenuComponent font, or containing menu(bar)
* parent font.
*/
private void setFont()
{
throw new RuntimeException ();
MenuComponent mc = ((MenuComponent) awtWidget);
Font f = mc.getFont();
if (f == null)
{
MenuContainer parent = mc.getParent ();
// Submenus inherit the font of their containing Menu(Bar).
if (parent instanceof MenuComponent)
f = parent.getFont ();
}
setFont(f);
}
void setFont ()
/**
* Will call the abstract <code>create()</code> that needs to be
* overridden by subclasses, to create the MenuComponent. It will
* then correctly setup the font for the component based on the
* component and/or its containing parent component.
*/
public GtkMenuComponentPeer(MenuComponent component)
{
super(component);
create();
setFont();
}
public GtkMenuComponentPeer (Object awtWidget)
{
super (awtWidget);
create ();
setFont ();
}
/**
* Removes the awtWidget components from the native state tables.
* Subclasses should call <code>super.dispose()</code> if they don't
* remove these themselves.
*/
public native void dispose();
/**
* Sets the font for this particular MenuComponent only (not any
* containing items, if any).
*/
public void setFont(Font font)
{
// FIXME: implement
if (font != null)
gtkWidgetModifyFont(font);
}
}

View file

@ -1,5 +1,5 @@
/* GtkMenuItemPeer.java -- Implements MenuItemPeer with GTK+
Copyright (C) 1999, 2005 Free Software Foundation, Inc.
Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -49,70 +49,71 @@ import java.awt.peer.MenuPeer;
public class GtkMenuItemPeer extends GtkMenuComponentPeer
implements MenuItemPeer
{
native void create (String label);
native void connectSignals ();
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Creates the associated gtk+ widget and stores it in the nsa table
* for this peer. Called by the create() method with the label name
* of the associated MenuItem. Needs to be overridden my subclasses
* that want to create a different gtk+ widget.
*/
protected native void create (String label);
void create ()
/**
* Called from constructor to enable signals from an item. If a
* subclass needs different (or no) signals connected this method
* should be overridden.
*/
protected native void connectSignals ();
/**
* Overridden to set font on menu item label.
*/
protected native void gtkWidgetModifyFont(String name, int style, int size);
/**
* Creates the associated gtk+ widget and stores it in the nsa table
* for this peer. Called by the (super class) constructor.
* Overridden to get the label if the assiociated MenuItem and to
* call create(String).
*/
protected void create()
{
create (((MenuItem) awtWidget).getLabel());
}
public GtkMenuItemPeer (MenuItem item)
/**
* Creates a new GtkMenuItemPeer associated with the given MenuItem.
* It will call create(), setFont(), setEnabled() and
* connectSignals() in that order.
*/
public GtkMenuItemPeer(MenuItem item)
{
super (item);
setEnabled (item.isEnabled ());
setParent (item);
if (item.getParent() instanceof Menu && ! (item instanceof Menu))
connectSignals();
super(item);
setEnabled (item.isEnabled());
connectSignals();
}
void setFont ()
/**
* Calls setEnabled(false).
*/
public void disable()
{
MenuComponent mc = ((MenuComponent) awtWidget);
Font f = mc.getFont ();
if (f == null)
{
MenuComponent parent = (MenuComponent) mc.getParent ();
Font pf = parent.getFont ();
gtkWidgetModifyFont (pf.getName (), pf.getStyle (), pf.getSize ());
}
else
gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
setEnabled(false);
}
void setParent (MenuItem item)
/**
* Calls setEnabled(true).
*/
public void enable()
{
// add ourself differently, based on what type of parent we have
// yes, the typecasting here is nasty.
Object parent = item.getParent ();
if (parent instanceof MenuBar)
{
((GtkMenuBarPeer)((MenuBar)parent).getPeer ()).addMenu ((MenuPeer) this);
}
else // parent instanceof Menu
{
((GtkMenuPeer)((Menu)parent).getPeer ()).addItem (this,
item.getShortcut ());
}
}
public void disable ()
{
setEnabled (false);
}
public void enable ()
{
setEnabled (true);
setEnabled(true);
}
public native void setEnabled(boolean b);
public native void setLabel(String label);
/**
* Callback setup through connectSignals().
*/
protected void postMenuActionEvent ()
{
postActionEvent (((MenuItem)awtWidget).getActionCommand (), 0);

View file

@ -1,5 +1,5 @@
/* GtkMenuPeer.java -- Implements MenuPeer with GTK+
Copyright (C) 1999, 2005 Free Software Foundation, Inc.
Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -49,10 +49,28 @@ import java.awt.peer.MenuPeer;
public class GtkMenuPeer extends GtkMenuItemPeer
implements MenuPeer
{
native void create (String label);
native void addItem (MenuItemPeer item, int key, boolean shiftModifier);
/**
* Creates the associated gtk+ widget and stores it in the nsa table
* for this peer. Called by the create() method with the label name
* of the associated MenuItem. Overridden to greate a Menu widget.
*/
protected native void create (String label);
private native void addItem(MenuItemPeer item, int key,
boolean shiftModifier);
/** XXX - Document this and the override in GtkPopupMenuPeer. */
native void setupAccelGroup (GtkGenericPeer container);
native void addTearOff ();
private native void addTearOff ();
/**
* Overridden to not connect any signals.
*/
protected void connectSignals()
{
// No signals to connect.
}
public GtkMenuPeer (Menu menu)
{
@ -63,11 +81,11 @@ public class GtkMenuPeer extends GtkMenuItemPeer
MenuContainer parent = menu.getParent ();
if (parent instanceof Menu)
setupAccelGroup ((GtkGenericPeer)((Menu)parent).getPeer ());
setupAccelGroup ((GtkMenuPeer)((Menu)parent).getPeer ());
else if (parent instanceof Component)
setupAccelGroup ((GtkGenericPeer)((Component)parent).getPeer ());
setupAccelGroup ((GtkComponentPeer)((Component)parent).getPeer ());
else
setupAccelGroup (null);
setupAccelGroup (null); // XXX, should we warn about unknown parent?
}
public void addItem (MenuItem item)

View file

@ -39,8 +39,11 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.AWTEvent;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
import java.awt.peer.PanelPeer;
public class GtkPanelPeer extends GtkContainerPeer
@ -53,17 +56,39 @@ public class GtkPanelPeer extends GtkContainerPeer
super (p);
}
public void handleEvent (AWTEvent event)
public void handleEvent(AWTEvent event)
{
int id = event.getID();
switch (id)
{
case MouseEvent.MOUSE_PRESSED:
awtComponent.requestFocusInWindow ();
awtComponent.requestFocusInWindow();
break;
case PaintEvent.UPDATE:
case PaintEvent.PAINT:
{
try
{
Graphics g = getGraphics();
if (! awtComponent.isShowing() || awtComponent.getWidth() < 1
|| awtComponent.getHeight() < 1 || g == null)
return;
g.setClip(((PaintEvent) event).getUpdateRect());
// Do not want to clear anything before painting.);
awtComponent.paint(g);
g.dispose();
return;
}
catch (InternalError e)
{
System.err.println(e);
}
}
super.handleEvent (event);
}
super.handleEvent(event);
}
native void connectSignals ();

View file

@ -1,5 +1,5 @@
/* GtkPopupMenuPeer.java -- Implements PopupMenuPeer with GTK+
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -55,11 +55,6 @@ public class GtkPopupMenuPeer extends GtkMenuPeer
native void setupAccelGroup (GtkGenericPeer container);
void setParent (MenuItem item)
{
// we don't need to "add" ourselves to our parent
}
native void show (int x, int y, long time);
public void show (Component origin, int x, int y)
{

View file

@ -1,5 +1,5 @@
/* GtkScrollbarPeer.java -- Implements ScrollbarPeer with GTK+
Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.Adjustable;
import java.awt.EventQueue;
import java.awt.Scrollbar;
import java.awt.event.AdjustmentEvent;
import java.awt.peer.ScrollbarPeer;
@ -69,12 +70,25 @@ public class GtkScrollbarPeer extends GtkComponentPeer
public native void setLineIncrement(int amount);
public native void setPageIncrement(int amount);
public native void setValues(int value, int visible, int min, int max);
public void setValues(int value, int visible, int min, int max)
{
Scrollbar sb = (Scrollbar) awtComponent;
if (!sb.getValueIsAdjusting())
setBarValues(value, visible, min, max);
}
private native void setBarValues(int value, int visible, int min, int max);
/**
* Called from the native site when the scrollbar changed.
* Posts a "user generated" AdjustmentEvent to the queue.
*/
protected void postAdjustmentEvent (int type, int value)
{
q().postEvent (new AdjustmentEvent ((Adjustable)awtComponent,
Scrollbar bar = (Scrollbar) awtComponent;
q().postEvent(new AdjustmentEvent(bar,
AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED,
type, value));
type, value, true));
}
}

View file

@ -55,7 +55,11 @@ public class GtkTextAreaPeer extends GtkComponentPeer
native void create (int width, int height, int scrollbarVisibility);
native void gtkWidgetModifyFont (String name, int style, int size);
/**
* Overridden to set Font for text widget inside scrolled window.
*/
protected native void gtkWidgetModifyFont(String name, int style, int size);
native void gtkWidgetRequestFocus ();
public native void connectSignals ();

View file

@ -112,8 +112,6 @@ public class GtkTextFieldPeer extends GtkComponentPeer
native int gtkEntryGetBorderWidth ();
native void gtkWidgetModifyFont (String name, int style, int size);
public GtkTextFieldPeer (TextField tf)
{
super (tf);

View file

@ -1,5 +1,6 @@
/* GtkToolkit.java -- Implements an AWT Toolkit using GTK for peers
Copyright (C) 1998, 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -159,137 +160,93 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
}
/**
* A helper class to return to clients in cases where a BufferedImage is
* desired but its construction fails.
* Helper to return either a Image -- the argument -- or a
* GtkImage with the errorLoading flag set if the argument is null.
*/
private class GtkErrorImage extends Image
{
public GtkErrorImage()
{
}
public int getWidth(ImageObserver observer)
{
return -1;
}
public int getHeight(ImageObserver observer)
{
return -1;
}
public ImageProducer getSource()
{
return new ImageProducer()
{
HashSet consumers = new HashSet();
public void addConsumer(ImageConsumer ic)
{
consumers.add(ic);
}
public boolean isConsumer(ImageConsumer ic)
{
return consumers.contains(ic);
}
public void removeConsumer(ImageConsumer ic)
{
consumers.remove(ic);
}
public void startProduction(ImageConsumer ic)
{
consumers.add(ic);
Iterator i = consumers.iterator();
while(i.hasNext())
{
ImageConsumer c = (ImageConsumer) i.next();
c.imageComplete(ImageConsumer.IMAGEERROR);
}
}
public void requestTopDownLeftRightResend(ImageConsumer ic)
{
startProduction(ic);
}
};
}
public Graphics getGraphics()
{
return null;
}
public Object getProperty(String name, ImageObserver observer)
{
return null;
}
public Image getScaledInstance(int width, int height, int flags)
{
return new GtkErrorImage();
}
public void flush()
{
}
}
/**
* Helper to return either a BufferedImage -- the argument -- or a
* GtkErrorImage if the argument is null.
*/
private Image bufferedImageOrError(BufferedImage b)
private Image imageOrError(Image b)
{
if (b == null)
return new GtkErrorImage();
return GtkImage.getErrorImage();
else
return b;
}
public Image createImage (String filename)
{
if (filename.length() == 0)
return new GtkImage ();
if (useGraphics2D())
return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (filename));
else
return new GtkImage (filename);
Image image;
try
{
if (useGraphics2D())
image = GdkPixbufDecoder.createBufferedImage(filename);
else
image = new GtkImage(filename);
}
catch (IllegalArgumentException iae)
{
image = null;
}
return imageOrError(image);
}
public Image createImage (URL url)
{
if (useGraphics2D())
return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (url));
else
return new GtkImage (url);
Image image;
try
{
if (useGraphics2D())
image = GdkPixbufDecoder.createBufferedImage(url);
else
image = new GtkImage(url);
}
catch (IllegalArgumentException iae)
{
image = null;
}
return imageOrError(image);
}
public Image createImage (ImageProducer producer)
{
if (useGraphics2D())
return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (producer));
else
return new GtkImage (producer);
Image image;
try
{
if (useGraphics2D())
image = GdkPixbufDecoder.createBufferedImage(producer);
else
image = new GtkImage(producer);
}
catch (IllegalArgumentException iae)
{
image = null;
}
return imageOrError(image);
}
public Image createImage (byte[] imagedata, int imageoffset,
int imagelength)
{
if (useGraphics2D())
return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (imagedata,
imageoffset,
imagelength));
else
Image image;
try
{
byte[] datacopy = new byte[imagelength];
System.arraycopy (imagedata, imageoffset, datacopy, 0, imagelength);
return new GtkImage (datacopy);
if (useGraphics2D())
image = GdkPixbufDecoder.createBufferedImage(imagedata,
imageoffset,
imagelength);
else
{
byte[] datacopy = new byte[imagelength];
System.arraycopy(imagedata, imageoffset, datacopy, 0, imagelength);
return new GtkImage(datacopy);
}
}
catch (IllegalArgumentException iae)
{
image = null;
}
return imageOrError(image);
}
/**
@ -608,7 +565,6 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
if (q == null)
{
q = new EventQueue();
GtkGenericPeer.enableQueue (q);
}
}
return q;

View file

@ -38,9 +38,12 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.PaintEvent;
import java.awt.event.WindowEvent;
import java.awt.peer.WindowPeer;
@ -123,7 +126,23 @@ public class GtkWindowPeer extends GtkContainerPeer
native void nativeSetBounds (int x, int y, int width, int height);
native void nativeSetBoundsUnlocked (int x, int y, int width, int height);
native void nativeSetLocation (int x, int y);
native void nativeSetLocationUnlocked (int x, int y);
public void setLocation (int x, int y)
{
// prevent window_configure_cb -> awtComponent.setSize ->
// peer.setBounds -> nativeSetBounds self-deadlock on GDK lock.
if (Thread.currentThread() == GtkToolkit.mainThread)
return;
nativeSetLocation (x, y);
}
public void setLocationUnlocked (int x, int y)
{
nativeSetLocationUnlocked (x, y);
}
public void setBounds (int x, int y, int width, int height)
{
// prevent window_configure_cb -> awtComponent.setSize ->
@ -192,12 +211,7 @@ public class GtkWindowPeer extends GtkContainerPeer
public void show ()
{
// Prevent the window manager from automatically placing this
// window when it is shown.
setBounds (awtComponent.getX(),
awtComponent.getY(),
awtComponent.getWidth(),
awtComponent.getHeight());
setLocation(awtComponent.getX(), awtComponent.getY());
setVisible (true);
}
@ -235,4 +249,32 @@ public class GtkWindowPeer extends GtkContainerPeer
// TODO Auto-generated method stub
return false;
}
public void handleEvent(AWTEvent event)
{
int id = event.getID();
if (id == PaintEvent.UPDATE || id == PaintEvent.PAINT)
{
try
{
Graphics g = getGraphics();
if (! awtComponent.isShowing() || awtComponent.getWidth() < 1
|| awtComponent.getHeight() < 1 || g == null)
return;
g.setClip(((PaintEvent) event).getUpdateRect());
// Do not want to clear anything before painting.
awtComponent.paint(g);
g.dispose();
return;
}
catch (InternalError e)
{
System.err.println(e);
}
}
super.handleEvent(event);
}
}

View file

@ -0,0 +1,224 @@
/* SwingButtonPeer.java -- A Swing based peer for AWT buttons
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.peer.ButtonPeer;
import javax.swing.JButton;
import javax.swing.JComponent;
/**
* A Swing based peer for the AWT button.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingButtonPeer
extends SwingComponentPeer
implements ButtonPeer
{
/**
* A specialized Swing button to be used as AWT button.
*
* @author Roman Kennke (kennke@aicas.com)
*/
class SwingButton
extends JButton
implements SwingComponent
{
/**
* Overridden so that this method returns the correct value even without a
* peer.
*
* @return the screen location of the button
*/
public Point getLocationOnScreen()
{
return SwingButtonPeer.this.getLocationOnScreen();
}
/**
* Overridden so that the isShowing method returns the correct value for the
* swing button, even if it has no peer on its own.
*
* @return <code>true</code> if the button is currently showing,
* <code>false</code> otherwise
*/
public boolean isShowing()
{
boolean retVal = false;
if (SwingButtonPeer.this.awtComponent != null)
retVal = SwingButtonPeer.this.awtComponent.isShowing();
return retVal;
}
/**
* Overridden, so that the Swing button can create an Image without its
* own peer.
*
* @param w the width of the image
* @param h the height of the image
*
* @return an image
*/
public Image createImage(int w, int h)
{
return SwingButtonPeer.this.createImage(w, h);
}
/**
* Overridden, so that the Swing button can create a Graphics without its
* own peer.
*
* @return a graphics instance for the button
*/
public Graphics getGraphics()
{
return SwingButtonPeer.this.getGraphics();
}
/**
* Returns this button.
*
* @return this button
*/
public JComponent getJComponent()
{
return this;
}
/**
* Handles mouse events by forwarding it to
* <code>processMouseEvent()</code> after having retargetted it to this
* button.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseEvent(ev);
}
/**
* Handles mouse motion events by forwarding it to
* <code>processMouseMotionEvent()</code> after having retargetted it to
* this button.
*
* @param ev the mouse motion event
*/
public void handleMouseMotionEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseMotionEvent(ev);
}
/**
* Handles key events by forwarding it to
* <code>processKeyEvent()</code> after having retargetted it to this
* button.
*
* @param ev the mouse event
*/
public void handleKeyEvent(KeyEvent ev)
{
ev.setSource(this);
processKeyEvent(ev);
}
}
/**
* Listens for ActionEvents on the Swing button and triggers corresponding
* ActionEvents on the AWT button.
*
* @author Roman Kennke (kennke@aicas.com)
*/
class SwingButtonListener implements ActionListener
{
/**
* Receives notification when an action was performend on the button.
*
* @param event the action event
*/
public void actionPerformed(ActionEvent event)
{
Button b = (Button) SwingButtonPeer.this.awtComponent;
ActionListener[] l = b.getActionListeners();
if (l.length == 0)
return;
ActionEvent ev = new ActionEvent(b, ActionEvent.ACTION_PERFORMED,
b.getActionCommand());
for (int i = 0; i < l.length; ++i)
l[i].actionPerformed(ev);
}
}
/**
* Constructs a new SwingButtonPeer.
*
* @param theButton the AWT button for this peer
*/
public SwingButtonPeer(Button theButton)
{
SwingButton button = new SwingButton();
button.setText(theButton.getLabel());
button.addActionListener(new SwingButtonListener());
init(theButton, button);
}
/**
* Sets the label of the button. This call is forwarded to the setText method
* of the managed Swing button.
*
* @param label the label to set
*/
public void setLabel(String label)
{
((SwingButton) swingComponent).setText(label);
}
}

View file

@ -1,5 +1,5 @@
/* SHA1withRSA.java -- SHA-1 with RSA encryption signatures.
Copyright (C) 2004 Free Software Foundation, Inc.
/* SwingCanvasPeer.java -- A canvas peer based on Swing
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -36,26 +36,29 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.provider;
package gnu.java.awt.peer.swing;
import gnu.java.security.OID;
import java.awt.Canvas;
import java.awt.peer.CanvasPeer;
import java.awt.peer.LightweightPeer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA1withRSA extends RSA
/**
* A CanvasPeer to be used together with the Swing peers.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingCanvasPeer
extends SwingComponentPeer
implements LightweightPeer, CanvasPeer
{
// Constant.
// -------------------------------------------------------------------------
private static final OID SHA1 = new OID("1.3.14.3.2.26");
// Constructor.
// -------------------------------------------------------------------------
public SHA1withRSA() throws NoSuchAlgorithmException
/**
* Creates a new <code>SwingCanvasPeer</code> for the specified Canvas.
*
* @param canvas the canvas.
*/
public SwingCanvasPeer(Canvas canvas)
{
super(MessageDigest.getInstance("SHA-160"), SHA1);
init(canvas, null);
}
}

View file

@ -0,0 +1,89 @@
/* SwingComponent.java -- An interface that defines a Swing component for peers
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
/**
* Defines some additional methods that the Swing components must implement
* in order to work with the Swing peers. This is usually achieved by
* subclassing a Swing component and forwarding the method calls to some
* protected JComponent method.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public interface SwingComponent
{
/**
* Returns the actual swing compenent.
*
* @return the actual swing compenent
*/
JComponent getJComponent();
/**
* Handles a mouse event. This is usually forwarded to
* {@link Component#processMouseMotionEvent(MouseEvent)} of the swing
* component.
*
* @param ev the mouse event
*/
void handleMouseEvent(MouseEvent ev);
/**
* Handles a mouse motion event. This is usually forwarded to
* {@link Component#processMouseEvent(MouseEvent)} of the swing
* component.
*
* @param ev the mouse motion event
*/
void handleMouseMotionEvent(MouseEvent ev);
/**
* Handles a key event. This is usually forwarded to
* {@link Component#processKeyEvent(KeyEvent)} of the swing
* component.
*
* @param ev the key event
*/
void handleKeyEvent(KeyEvent ev);
}

View file

@ -0,0 +1,994 @@
/* SwingComponentPeer.java -- An abstract base class for Swing based peers
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.AWTEvent;
import java.awt.AWTException;
import java.awt.BufferCapabilities;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.BufferCapabilities.FlipContents;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
import java.awt.image.ColorModel;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.awt.image.VolatileImage;
import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
/**
* The base class for Swing based component peers. This provides the basic
* functionality needed for Swing based component peers. Many methods are
* implemented to forward to the Swing component. Others however forward
* to the component's parent and expect the toplevel component peer to provide
* a real implementation of it. These are for example the key methods
* {@link #getGraphics()} and {@link #createImage(int, int)}, as well as
* {@link #getLocationOnScreen()}.
*
* This class also provides the necesary hooks into the Swing painting and
* event handling system. In order to achieve this, it traps paint, mouse and
* key events in {@link #handleEvent(AWTEvent)} and calls some special methods
* ({@link #peerPaint(Graphics)}, {@link #handleKeyEvent(KeyEvent)},
* {@link #handleMouseEvent(MouseEvent)} and
* {@link #handleMouseMotionEvent(MouseEvent)}) that call the corresponding
* Swing methods.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingComponentPeer
implements ComponentPeer
{
/**
* The AWT component for this peer.
*/
protected Component awtComponent;
/**
* The Swing component for this peer.
*/
protected SwingComponent swingComponent;
/**
* Creates a SwingComponentPeer instance. Subclasses are expected to call
* this constructor and thereafter call {@link #init(Component, JComponent)}
* in order to setup the AWT and Swing components properly.
*/
protected SwingComponentPeer()
{
// Nothing to do here.
}
/**
* Initializes the AWT and Swing component for this peer. It is expected that
* subclasses call this from within their constructor.
*
* @param awtComp the AWT component for this peer
* @param swingComp the Swing component for this peer
*/
protected void init(Component awtComp, SwingComponent swingComp)
{
awtComponent = awtComp;
swingComponent = swingComp;
}
/**
* Returns the construction status of the specified image. This is called
* by {@link Component#checkImage(Image, int, int, ImageObserver)}.
*
* @param img the image
* @param width the width of the image
* @param height the height of the image
* @param ob the image observer to be notified of updates of the status
*
* @return a bitwise ORed set of ImageObserver flags
*/
public int checkImage(Image img, int width, int height, ImageObserver ob)
{
return Toolkit.getDefaultToolkit().checkImage(img, width, height, ob);
}
/**
* Creates an image by starting the specified image producer. This is called
* by {@link Component#createImage(ImageProducer)}.
*
* @param prod the image producer to be used to create the image
*
* @return the created image
*/
public Image createImage(ImageProducer prod)
{
Image image = Toolkit.getDefaultToolkit().createImage(prod);
return image;
}
/**
* Creates an empty image with the specified <code>width</code> and
* <code>height</code>.
*
* This is implemented to let the parent component create the image. This
* eventually goes up to the top-level component peer, which is then expected
* to deliver the image.
*
* @param width the width of the image to be created
* @param height the height of the image to be created
*
* @return the created image
*/
public Image createImage(int width, int height)
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
return parentPeer.createImage(width, height);
}
/**
* Disables the component. This is called by {@link Component#disable()}.
*/
public void disable()
{
if (swingComponent != null)
swingComponent.getJComponent().setEnabled(false);
}
/**
* Disposes the component peer. This should release all resources held by the
* peer. This is called when the component is no longer in use.
*/
public void dispose()
{
awtComponent = null;
swingComponent = null;
}
/**
* Enables the component. This is called by {@link Component#enable()}.
*/
public void enable()
{
if (swingComponent != null)
swingComponent.getJComponent().setEnabled(true);
}
/**
* Returns the color model of the component. This is currently not used.
*
* @return the color model of the component
*/
public ColorModel getColorModel()
{
// FIXME: When this peer method will be used, we need to provide an
// implementation of this, probably forwarding to the toplevel peer, like
// in the other methods.
return null;
}
/**
* Returns the font metrics for the specified font. This is called by
* {@link Component#getFontMetrics(Font)}.
*
* This is implemented to query the font metrics from the parent component.
* This will eventually call the top-level component peer, which is then
* expected to deliver a font metrics object.
*
* @param f the font for which to query the font metrics
*
* @return the font metrics for the specified font
*/
public FontMetrics getFontMetrics(Font f)
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
return parentPeer.getFontMetrics(f);
}
/**
* Returns a {@link Graphics} object suitable for drawing on this component.
* This is called by {@link Component#getGraphics()}.
*
* This is implemented to query the graphics from the parent component and
* adjust the clip and translation to match this component.
* This will eventually call the top-level component peer, which is then
* expected to deliver a graphics object.
*
* @return a graphics object suitable for drawing on this component
*/
public Graphics getGraphics()
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
Graphics g = parentPeer.getGraphics();
g.translate(awtComponent.getX(), awtComponent.getY());
g.setClip(0, 0, awtComponent.getWidth(), awtComponent.getHeight());
return g;
}
/**
* Returns the location of this component in screen coordinates. This is
* called by {@link Component#getLocationOnScreen()}.
*
* This is implemented to query the parent component peer for its screen
* location and adds the offset of this component to it. This will eventually
* call the top-level component's peer, which is then expected to provide
* it's screen location.
*
* @return the location of this component in screen coordinates
*/
public Point getLocationOnScreen()
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
Point location = parentPeer.getLocationOnScreen();
location.x += awtComponent.getX();
location.y += awtComponent.getY();
return location;
}
/**
* Returns the minimum size for the component. This is called by
* {@link Component#getMinimumSize()}.
*
* This is implemented to return the Swing component's minimum size.
*
* @return the minimum size for the component
*/
public Dimension getMinimumSize()
{
Dimension retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getMinimumSize();
else
retVal = new Dimension(0, 0);
return retVal;
}
/**
* Returns the preferred size for the component. This is called by
* {@link Component#getPreferredSize()}.
*
* This is implemented to return the Swing component's preferred size.
*
* @return the preferred size for the component
*/
public Dimension getPreferredSize()
{
Dimension retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getPreferredSize();
else
retVal = new Dimension(0, 0);
return retVal;
}
/**
* Returns the toolkit that created this peer.
*
* @return the toolkit that created this peer
*/
public Toolkit getToolkit()
{
return Toolkit.getDefaultToolkit();
}
/**
* Handles the given event. This is called from
* {@link Component#dispatchEvent(AWTEvent)} to give the peer a chance to
* react to events for the component.
*
* @param e the event
*/
public void handleEvent(AWTEvent e)
{
switch (e.getID())
{
case PaintEvent.UPDATE:
case PaintEvent.PAINT:
Graphics g = getGraphics();
Rectangle clip = ((PaintEvent)e).getUpdateRect();
g.clipRect(clip.x, clip.y, clip.width, clip.height);
//if (this instanceof LightweightPeer)
// {
if (e.getID() == PaintEvent.UPDATE)
awtComponent.update(g);
else
awtComponent.paint(g);
// }
// We paint the 'heavyweights' at last, so that they appear on top of
// everything else.
peerPaint(g);
g.dispose();
break;
case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED:
case MouseEvent.MOUSE_CLICKED:
case MouseEvent.MOUSE_ENTERED:
case MouseEvent.MOUSE_EXITED:
handleMouseEvent((MouseEvent) e);
break;
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
handleMouseMotionEvent((MouseEvent) e);
break;
case KeyEvent.KEY_PRESSED:
case KeyEvent.KEY_RELEASED:
case KeyEvent.KEY_TYPED:
handleKeyEvent((KeyEvent) e);
break;
default:
// Other event types are not handled here.
break;
}
}
/**
* Makes the component invisible. This is called from
* {@link Component#hide()}.
*
* This is implemented to call setVisible(false) on the Swing component.
*/
public void hide()
{
if (swingComponent != null)
swingComponent.getJComponent().setVisible(false);
}
/**
* Returns <code>true</code> if the component can receive keyboard input
* focus. This is called from {@link Component#isFocusTraversable()}.
*
* This is implemented to return isFocusable() from the Swing component.
*
* @specnote Part of the earlier 1.1 API, replaced by isFocusable().
*/
public boolean isFocusTraversable()
{
return swingComponent != null ?
swingComponent.getJComponent().isFocusable() : false;
}
/**
* Returns <code>true</code> if the component can receive keyboard input
* focus. This is called from {@link Component#isFocusable()}.
*
* This is implemented to return isFocusable() from the Swing component.
*/
public boolean isFocusable()
{
return swingComponent != null ?
swingComponent.getJComponent().isFocusable() : false;
}
/**
* Returns the minimum size for the component. This is called by
* {@link Component#minimumSize()}.
*
* This is implemented to return the Swing component's minimum size.
*
* @return the minimum size for the component
*/
public Dimension minimumSize()
{
Dimension retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getMinimumSize();
else
retVal = new Dimension(0, 0);
return retVal;
}
/**
* Returns the preferred size for the component. This is called by
* {@link Component#getPreferredSize()}.
*
* This is implemented to return the Swing component's preferred size.
*
* @return the preferred size for the component
*/
public Dimension preferredSize()
{
Dimension retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getPreferredSize();
else
retVal = new Dimension(0, 0);
return retVal;
}
/**
* Prepares an image for rendering on this component. This is called by
* {@link Component#prepareImage(Image, int, int, ImageObserver)}.
*
* @param img the image to prepare
* @param width the desired width of the rendered image
* @param height the desired height of the rendered image
* @param ob the image observer to be notified of updates in the preparation
* process
*
* @return <code>true</code> if the image has been fully prepared,
* <code>false</code> otherwise (in which case the image observer
* receives updates)
*/
public void paint(Graphics graphics)
{
// FIXME: I don't know what this method is supposed to do.
}
/**
* Prepares an image for rendering on this component. This is called by
* {@link Component#prepareImage(Image, int, int, ImageObserver)}.
*
* @param img the image to prepare
* @param width the desired width of the rendered image
* @param height the desired height of the rendered image
* @param ob the image observer to be notified of updates in the preparation
* process
*
* @return <code>true</code> if the image has been fully prepared,
* <code>false</code> otherwise (in which case the image observer
* receives updates)
*/
public boolean prepareImage(Image img, int width, int height, ImageObserver ob)
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
return parentPeer.prepareImage(img, width, height, ob);
}
public void print(Graphics graphics)
{
// FIXME: I don't know what this method is supposed to do.
}
/**
* Repaints the specified rectangle of this component. This is called from
* {@link Component#repaint(long, int, int, int, int)}.
*
* This is implemented to call repaint() on the Swing component.
*
* @param tm number of milliseconds to wait with repainting
* @param x the X coordinate of the upper left corner of the damaged rectangle
* @param y the Y coordinate of the upper left corner of the damaged rectangle
* @param width the width of the damaged rectangle
* @param height the height of the damaged rectangle
*/
public void repaint(long tm, int x, int y, int width, int height)
{
if (swingComponent != null)
swingComponent.getJComponent().repaint(tm, x, y, width, height);
else
{
PaintEvent ev = new PaintEvent(awtComponent, PaintEvent.UPDATE,
new Rectangle(x, y, width, height));
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ev);
}
}
/**
* Requests that this component receives the focus. This is called from
* {@link Component#requestFocus()}.
*
* This calls requestFocus() on the Swing component.
*
* @specnote Part of the earlier 1.1 API, apparently replaced by argument
* form of the same method.
*/
public void requestFocus()
{
if (swingComponent != null)
swingComponent.getJComponent().requestFocus();
}
/**
* Requests that this component receives the focus. This is called from
* {@link Component#requestFocus()}.
*
* This calls requestFocus() on the Swing component.
*
* @param source TODO
* @param bool1 TODO
* @param bool2 TODO
* @param x TODO
*
* @return TODO
*/
public boolean requestFocus(Component source, boolean bool1, boolean bool2, long x)
{
if (swingComponent != null)
swingComponent.getJComponent().requestFocus();
return swingComponent != null;
}
/**
* Notifies the peer that the bounds of this component have changed. This
* is called by {@link Component#reshape(int, int, int, int)}.
*
* This is implemented to call setBounds() on the Swing component.
*
* @param x the X coordinate of the upper left corner of the component
* @param y the Y coordinate of the upper left corner of the component
* @param width the width of the component
* @param height the height of the component
*/
public void reshape(int x, int y, int width, int height)
{
if (swingComponent != null)
swingComponent.getJComponent().setBounds(x, y, width, height);
}
/**
* Sets the background color of the component. This is called by
* {@link Component#setBackground(Color)}.
*
* This is implemented to call setBackground() on the Swing component.
*
* @param color the background color to set
*/
public void setBackground(Color color)
{
if (swingComponent != null)
swingComponent.getJComponent().setBackground(color);
}
/**
* Notifies the peer that the bounds of this component have changed. This
* is called by {@link Component#setBounds(int, int, int, int)}.
*
* This is implemented to call setBounds() on the Swing component.
*
* @param x the X coordinate of the upper left corner of the component
* @param y the Y coordinate of the upper left corner of the component
* @param width the width of the component
* @param height the height of the component
*/
public void setBounds(int x, int y, int width, int height)
{
if (swingComponent != null)
swingComponent.getJComponent().setBounds(x, y, width, height);
}
/**
* Sets the cursor of the component. This is called by
* {@link Component#setCursor(Cursor)}.
*
* This is implemented to call setCursor() on the Swing component.
*
* @specnote Part of the earlier 1.1 API, apparently no longer needed.
*/
public void setCursor(Cursor cursor)
{
if (swingComponent != null)
swingComponent.getJComponent().setCursor(cursor);
}
/**
* Sets the enabled/disabled state of this component. This is called by
* {@link Component#setEnabled(boolean)}.
*
* This is implemented to call setEnabled() on the Swing component.
*
* @param enabled <code>true</code> to enable the component,
* <code>false</code> to disable it
*/
public void setEnabled(boolean enabled)
{
if (swingComponent != null)
swingComponent.getJComponent().setEnabled(enabled);
}
/**
* Sets the font of the component. This is called by
* {@link Component#setFont(Font)}.
*
* This is implemented to call setFont() on the Swing component.
*
* @param font the font to set
*/
public void setFont(Font font)
{
if (swingComponent != null)
swingComponent.getJComponent().setFont(font);
}
/**
* Sets the foreground color of the component. This is called by
* {@link Component#setForeground(Color)}.
*
* This is implemented to call setForeground() on the Swing component.
*
* @param color the foreground color to set
*/
public void setForeground(Color color)
{
if (swingComponent != null)
swingComponent.getJComponent().setForeground(color);
}
/**
* Sets the visibility state of the component. This is called by
* {@link Component#setVisible(boolean)}.
*
* This is implemented to call setVisible() on the Swing component.
*
* @param visible <code>true</code> to make the component visible,
* <code>false</code> to make it invisible
*/
public void setVisible(boolean visible)
{
if (swingComponent != null)
swingComponent.getJComponent().setVisible(visible);
}
/**
* Makes the component visible. This is called by {@link Component#show()}.
*
* This is implemented to call setVisible(true) on the Swing component.
*/
public void show()
{
if (swingComponent != null)
swingComponent.getJComponent().setVisible(true);
}
/**
* Get the graphics configuration of the component. The color model
* of the component can be derived from the configuration.
*
* This is implemented to return the GraphicsConfiguration of the parent
* component. This will eventually call the toplevel component peer, which
* is expected to provide a real implementation.
*
* @return the graphics configuration of the component
*/
public GraphicsConfiguration getGraphicsConfiguration()
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
return parentPeer.getGraphicsConfiguration();
}
/**
* Part of an older API, no longer needed.
*/
public void setEventMask(long mask)
{
// Nothing to do here.
}
/**
* Returns <code>true</code> if this component has been obscured,
* <code>false</code> otherwise. This will only work if
* {@link #canDetermineObscurity()} also returns <code>true</code>.
*
* This is not yet implemented.
*
* @return <code>true</code> if this component has been obscured,
* <code>false</code> otherwise.
*/
public boolean isObscured()
{
return false;
}
/**
* Returns <code>true</code> if this component peer can determine if the
* component has been obscured, <code>false</code> otherwise.
*
* This is not yet implemented.
*
* @return <code>true</code> if this component peer can determine if the
* component has been obscured, <code>false</code> otherwise
*/
public boolean canDetermineObscurity()
{
return false;
}
/**
* Coalesces the specified paint event.
*
* @param e the paint event
*/
public void coalescePaintEvent(PaintEvent e)
{
// Nothing to do here yet.
}
/**
* Updates the cursor. This is not yet implemented.
*/
public void updateCursorImmediately()
{
// Nothing to do here yet.
}
/**
* Returns true, if this component can handle wheel scrolling,
* <code>false</code> otherwise.
*
* This is not yet implemented and returns <code>false</code>.
*
* @return true, if this component can handle wheel scrolling,
* <code>false</code> otherwise
*/
public boolean handlesWheelScrolling()
{
return false;
}
/**
* A convenience method that creates a volatile image. The volatile
* image is created on the screen device on which this component is
* displayed, in the device's current graphics configuration.
*
* This is implemented to let the parent component peer create an image.
* This eventually ends up in the toplevel component peer, which is then
* responsible for creating the real image.
*
* @param width width of the image
* @param height height of the image
*
* @see VolatileImage
*
* @since 1.2
*/
public VolatileImage createVolatileImage(int width, int height)
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
return parentPeer.createVolatileImage(width, height);
}
/**
* Create a number of image buffers that implement a buffering
* strategy according to the given capabilities.
*
* This is implemented to forward to the parent component peer. Eventually
* this ends up in the top level component peer, which is then responsible
* for doing the real work.
*
* @param numBuffers the number of buffers
* @param caps the buffering capabilities
*
* @throws AWTException if the specified buffering strategy is not
* implemented
*
* @since 1.2
*/
public void createBuffers(int numBuffers, BufferCapabilities caps) throws AWTException
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
parentPeer.createBuffers(numBuffers, caps);
}
/**
* Return the back buffer of this component.
*
* This is implemented to forward to the parent. Eventually this ends
* up in the toplevel component, which is then responsible for providing
* a back buffer.
*
* @return the back buffer of this component.
*
* @since 1.2
*/
public Image getBackBuffer()
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
return parentPeer.getBackBuffer();
}
/**
* Perform a page flip, leaving the contents of the back buffer in
* the specified state.
*
* This is implemented to forward to the parent. Eventually this ends
* up in the toplevel component, which is then responsible for doing the real
* work.
*
* @param contents the state in which to leave the back buffer
*
* @since 1.2
*/
public void flip(FlipContents contents)
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
parentPeer.flip(contents);
}
/**
* Destroy the resources created by createBuffers.
*
* This is implemented to forward to the parent component peer. Eventually
* this ends up in the top level component peer, which is then responsible
* for doing the real work.
*
* @since 1.2
*/
public void destroyBuffers()
{
Component parent = awtComponent.getParent();
ComponentPeer parentPeer = parent.getPeer();
parentPeer.destroyBuffers();
}
/**
* Get the bounds of this component peer.
*
* This is implemented to forward to the Swing component.
*
* @return component peer bounds
* @since 1.5
*/
public Rectangle getBounds()
{
Rectangle retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getBounds();
else
retVal = new Rectangle();
return retVal;
}
/**
* Reparent this component under another container.
*
* @param parent
* @since 1.5
*/
public void reparent(ContainerPeer parent)
{
// Nothing to do here.
}
/**
* Set the bounds of this component peer.
*
* This is implemented to forward to the swing component.
*
* @param x the new x co-ordinate
* @param y the new y co-ordinate
* @param width the new width
* @param height the new height
* @param z the new stacking level
* @since 1.5
*/
public void setBounds(int x, int y, int width, int height, int z)
{
if (swingComponent != null)
swingComponent.getJComponent().setBounds(x, y, width, height);
// FIXME: Somehow handle the Z order.
}
/**
* Check if this component supports being reparented.
*
* @return true if this component can be reparented,
* false otherwise.
* @since 1.5
*/
public boolean isReparentSupported()
{
return true;
}
/**
* Layout this component peer.
*
* @since 1.5
*/
public void layout()
{
if (swingComponent != null)
swingComponent.getJComponent().doLayout();
}
/**
* Triggers 'heavyweight' painting of the components. This usually calls
* paint() on the Swing component.
*
* @param g the graphics context to use for painting
*/
protected void peerPaint(Graphics g)
{
if (swingComponent != null)
swingComponent.getJComponent().paint(g);
}
/**
* Handles mouse events on the component. This is usually forwarded to the
* SwingComponent's processMouseEvent() method.
*
* @param e the mouse event
*/
protected void handleMouseEvent(MouseEvent e)
{
if (swingComponent != null)
swingComponent.handleMouseEvent(e);
}
/**
* Handles mouse motion events on the component. This is usually forwarded
* to the SwingComponent's processMouseMotionEvent() method.
*
* @param e the mouse motion event
*/
protected void handleMouseMotionEvent(MouseEvent e)
{
if (swingComponent != null)
swingComponent.handleMouseMotionEvent(e);
}
/**
* Handles key events on the component. This is usually forwarded to the
* SwingComponent's processKeyEvent() method.
*
* @param e the key event
*/
protected void handleKeyEvent(KeyEvent e)
{
if (swingComponent != null)
swingComponent.handleKeyEvent(e);
}
/**
* Returns the AWT component for this peer.
*
* @return the AWT component for this peer
*/
public Component getComponent()
{
return awtComponent;
}
}

View file

@ -0,0 +1,241 @@
/* SwingContainerPeer.java -- A Swing based peer for AWT containers
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
/**
* A peer for Container to be used with the Swing based AWT peers.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingContainerPeer
extends SwingComponentPeer
implements ContainerPeer
{
/**
* Creates a new SwingContainerPeer.
*
* @param awtCont
*/
public SwingContainerPeer(Container awtCont)
{
init(awtCont, null);
}
/**
* Returns the insets of the container.
*
* This is implemented to return the insets of the Swing container.
*
* @return the insets of the container
*/
public Insets insets()
{
Insets retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getInsets();
else
retVal = new Insets(0, 0, 0, 0);
return retVal;
}
/**
* Returns the insets of the container.
*
* This is implemented to return the insets of the Swing container.
*
* @return the insets of the container
*/
public Insets getInsets()
{
Insets retVal;
if (swingComponent != null)
retVal = swingComponent.getJComponent().getInsets();
else
retVal = new Insets(0, 0, 0, 0);
return retVal;
}
/**
* Called before the validation of this containers begins.
*/
public void beginValidate()
{
// Nothing to do here.
}
/**
* Called after the validation of this containers ended.
*/
public void endValidate()
{
// Nothing to do here.
}
/**
* Called before the layout of this containers begins.
*/
public void beginLayout()
{
// Nothing to do here.
}
/**
* Called after the layout of this containers ended.
*/
public void endLayout()
{
// Nothing to do here.
}
/**
* Returns <code>false</code> unconditionally. This method is not used at
* the moment.
*
* @return <code>false</code>
*/
public boolean isPaintPending()
{
return false;
}
/**
* Returns <code>false</code> unconditionally. This method is not used at
* the moment.
*
* @return <code>false</code>
*/
public boolean isRestackSupported()
{
return false;
}
/**
* This method is not used at the moment.
*/
public void cancelPendingPaint(int x, int y, int width, int height)
{
// Nothing to do here.
}
/**
* This method is not used at the moment.
*/
public void restack()
{
// Nothing to do here.
}
/**
* Triggers painting of a component. This calls peerPaint on all the child
* components of this container.
*
* @param g the graphics context to paint to
*/
protected void peerPaint(Graphics g)
{
Container c = (Container) awtComponent;
Component[] children = c.getComponents();
for (int i = children.length - 1; i >= 0; --i)
{
Component child = children[i];
ComponentPeer peer = child.getPeer();
boolean translated = false;
boolean clipped = false;
Shape oldClip = g.getClip();
try
{
g.translate(child.getX(), child.getY());
translated = true;
g.setClip(0, 0, child.getWidth(), child.getHeight());
clipped = true;
if (peer instanceof SwingComponentPeer)
((SwingComponentPeer) peer).peerPaint(g);
}
finally
{
if (translated)
g.translate(- child.getX(), - child.getY());
if (clipped)
g.setClip(oldClip);
}
}
}
/**
* Handles mouse events by dispatching it to the correct component.
*
* @param ev the mouse event
*/
protected void handleMouseEvent(MouseEvent ev)
{
Component comp = awtComponent.getComponentAt(ev.getPoint());
ComponentPeer peer = comp.getPeer();
if (awtComponent != comp && !comp.isLightweight() && peer instanceof SwingComponentPeer)
{
ev.translatePoint(comp.getX(), comp.getY());
ev.setSource(comp);
((SwingComponentPeer) peer).handleMouseEvent(ev);
}
}
/**
* Handles mouse events by dispatching it to the correct component.
*
* @param ev the mouse event
*/
protected void handleMouseMotionEvent(MouseEvent ev)
{
Component comp = awtComponent.getComponentAt(ev.getPoint());
ComponentPeer peer = comp.getPeer();
if (awtComponent != comp && !comp.isLightweight() && peer instanceof SwingComponentPeer)
{
ev.translatePoint(comp.getX(), comp.getY());
((SwingComponentPeer) peer).handleMouseMotionEvent(ev);
}
}
}

View file

@ -0,0 +1,196 @@
/* SwingFramePeer.java -- An abstract Swing based peer for AWT frames
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.MenuBar;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.peer.FramePeer;
/**
* An abstract base class for FramePeer implementations based on Swing.
* This class provides the ability to display and handle AWT MenuBars that
* are based on Swing.
*
* As a minimum, a subclass must implement all the remaining abstract methods
* as well as the following methods:
* <ul>
* <li>{@link ComponentPeer#getLocationOnScreen()}</li>
* <li>{@link ComponentPeer#getGraphics()}</li>
* <li>{@link ComponentPeer#createImage(int, int)}</li>
* </ul>
*
* @author Roman Kennke (kennke@aicas.com)
*/
public abstract class SwingFramePeer
extends SwingWindowPeer
implements FramePeer
{
/**
* The menu bar to display.
*/
SwingMenuBarPeer menuBar = null;
/**
* Creates a new SwingFramePeer.
*
* @param frame the frame
*/
public SwingFramePeer(Frame frame)
{
super(frame);
}
/**
* Sets the menu bar to display in this frame.
*
* @param mb the menu bar to set
*/
public void setMenuBar(MenuBar mb)
{
menuBar = (SwingMenuBarPeer) mb.getPeer();
menuBar.setFramePeer(this);
menuBar.setWidth(awtComponent.getWidth());
}
/**
* Triggers 'heavyweight' painting of the frame. This will paint a menu bar
* if present as well as the child components of this frame.
*
* @param g the graphics context to use for painting
*/
protected void peerPaint(Graphics g)
{
super.peerPaint(g);
if (menuBar != null)
menuBar.peerPaint(g);
}
/**
* Sets the size and location of this frame. This resizes the menubar to fit
* within the frame.
*
* @param x the X coordinate of the screen location
* @param y the Y coordinate of the screen location
* @param w the width of the frame
* @param h the height of the frame
*/
public void setBounds(int x, int y, int w, int h)
{
super.setBounds(x, y, w, h);
if (menuBar != null)
menuBar.setWidth(w);
}
/**
* Calculates the insets of this frame peer. This fetches the insets
* from the superclass and adds the insets of the menubar if one is present.
*
* @return the insets of the frame
*/
public Insets getInsets()
{
Insets insets = super.getInsets();
if (menuBar != null)
insets.top += menuBar.getHeight();
return insets;
}
/**
* Returns the location of the menu on the screen. This is needed internally
* by the {@link SwingMenuBarPeer} in order to determine its screen location.
*
* @return the location of the menu on the screen
*/
public Point getMenuLocationOnScreen()
{
Insets i = super.getInsets();
return new Point(i.top, i.left);
}
/**
* Overridden to provide the ability to handle menus.
*
* @param ev the mouse event
*/
protected void handleMouseEvent(MouseEvent ev)
{
Point p = ev.getPoint();
Insets i = super.getInsets();
if (menuBar != null)
{
int menuHeight = menuBar.getHeight();
if (p.y >= i.top && p.y <= i.top + menuHeight)
menuBar.handleMouseEvent(ev);
else
{
ev.translatePoint(0, -menuHeight);
super.handleMouseMotionEvent(ev);
}
}
super.handleMouseEvent(ev);
}
/**
* Overridden to provide the ability to handle menus.
*
* @param ev the mouse event
*/
protected void handleMouseMotionEvent(MouseEvent ev)
{
Point p = ev.getPoint();
Insets i = super.getInsets();
if (menuBar != null)
{
int menuHeight = menuBar.getHeight();
if (p.y >= i.top && p.y <= i.top + menuHeight)
menuBar.handleMouseMotionEvent(ev);
else
{
ev.translatePoint(0, -menuHeight);
super.handleMouseMotionEvent(ev);
}
}
super.handleMouseMotionEvent(ev);
}
}

View file

@ -0,0 +1,196 @@
/* SwingLabelPeer.java -- A Swing based peer for AWT labels
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Image;
import java.awt.Label;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.peer.LabelPeer;
import javax.swing.JComponent;
import javax.swing.JLabel;
/**
* A Label peer based on {@link JLabel}.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingLabelPeer
extends SwingComponentPeer
implements LabelPeer
{
/**
* A spezialized Swing label used to paint the label for the AWT Label.
*
* @author Roman Kennke (kennke@aicas.com)
*/
private class SwingLabel
extends JLabel
implements SwingComponent
{
/**
* Returns this label.
*
* @return <code>this</code>
*/
public JComponent getJComponent()
{
return this;
}
/**
* Handles mouse events by forwarding it to
* <code>processMouseEvent()</code>.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
processMouseEvent(ev);
}
/**
* Handles mouse motion events by forwarding it to
* <code>processMouseMotionEvent()</code>.
*
* @param ev the mouse motion event
*/
public void handleMouseMotionEvent(MouseEvent ev)
{
processMouseMotionEvent(ev);
}
/**
* Handles key events by forwarding it to <code>processKeyEvent()</code>.
*
* @param ev the mouse event
*/
public void handleKeyEvent(KeyEvent ev)
{
processKeyEvent(ev);
}
/**
* Overridden so that this method returns the correct value even without a
* peer.
*
* @return the screen location of the button
*/
public Point getLocationOnScreen()
{
return SwingLabelPeer.this.getLocationOnScreen();
}
/**
* Overridden so that the isShowing method returns the correct value for the
* swing button, even if it has no peer on its own.
*
* @return <code>true</code> if the button is currently showing,
* <code>false</code> otherwise
*/
public boolean isShowing()
{
boolean retVal = false;
if (SwingLabelPeer.this.awtComponent != null)
retVal = SwingLabelPeer.this.awtComponent.isShowing();
return retVal;
}
/**
* Overridden, so that the Swing button can create an Image without its
* own peer.
*
* @param w the width of the image
* @param h the height of the image
*
* @return an image
*/
public Image createImage(int w, int h)
{
return SwingLabelPeer.this.createImage(w, h);
}
}
/**
* Creates a new <code>SwingLabelPeer</code> for the specified AWT label.
*
* @param label the AWT label
*/
public SwingLabelPeer(Label label)
{
super();
SwingLabel swingLabel = new SwingLabel();
swingLabel.setText(label.getText());
swingLabel.setHorizontalAlignment(label.getAlignment());
swingLabel.setOpaque(true);
init(label, swingLabel);
}
/**
* Sets the text of the label. This is implemented to set the text on the
* Swing label.
*
* @param text the text to be set
*/
public void setText(String text)
{
((JLabel) swingComponent.getJComponent()).setText(text);
}
/**
* Sets the horizontal alignment of the label. This is implemented to
* set the alignment on the Swing label.
*
* @param alignment the horizontal alignment
*
* @see Label#LEFT
* @see Label#RIGHT
* @see Label#CENTER
*/
public void setAlignment(int alignment)
{
((JLabel) swingComponent.getJComponent()).setHorizontalAlignment(alignment);
}
}

View file

@ -0,0 +1,295 @@
/* SwingMenuBarPeer.java -- A Swing based peer for AWT menu bars
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.peer.MenuBarPeer;
import javax.swing.JMenuBar;
/**
* A Swing based peer for the AWT menu bar. This is a little bit different from
* the other peers, since the AWT MenuBar is not derived from the AWT
* component.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingMenuBarPeer
implements MenuBarPeer
{
/**
* The AWT menu bar.
*/
MenuBar awtMenuBar;
/**
* The Swing menu bar.
*/
SwingMenuBar menuBar;
/**
* The peer of the frame that contains this menu bar.
*/
SwingFramePeer framePeer;
/**
* A specialized JMenuBar that can be used as 'backend' for AWT MenuBars.
*
* @author Roman Kennke (kennke@aicas.com)
*/
private class SwingMenuBar
extends JMenuBar
{
/**
* Overridden in order to provide a parent frame for this menu bar. The
* menu bar still is not inside the component hierarchy, we are faking
* here.
*/
public Container getParent()
{
Container result = null;
if (framePeer != null)
result = (Container) framePeer.awtComponent;
return result;
}
/**
* Unconditionally returns <code>true</code>, since we assume that when the
* menubar has a peer, it must be showing.
*
* @return <code>true</code>
*/
public boolean isShowing()
{
// FIXME: This might be wrong. Maybe find a better way to do that.
return true;
}
/**
* Handles mouse events by forwarding it to
* <code>processMouseEvent()</code>.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseEvent(ev);
}
/**
* Determines the menubar's screen location by asking the SwingFramePeer
* for it.
*
* @return the screen location of the menu bar
*/
public Point getLocationOnScreen()
{
return framePeer.getMenuLocationOnScreen();
}
}
/**
* Creates a new <code>SwingMenuBarPeer</code> instance.
*
* @param awtMenuBar the AWT menu bar
*/
public SwingMenuBarPeer(MenuBar awtMenuBar)
{
this.awtMenuBar = awtMenuBar;
menuBar = new SwingMenuBar();
menuBar.setDoubleBuffered(false);
// Add all the menus that are already in the MenuBar.
for (int i = 0; i < awtMenuBar.getMenuCount(); i++)
{
Menu menu = awtMenuBar.getMenu(i);
menu.addNotify();
addMenu(awtMenuBar.getMenu(i));
}
}
/**
* Sets the <code>SwingFramePeer</code> of the frame that holds this menu.
*
* @param peer the <code>SwingFramePeer</code> to set
*/
public void setFramePeer(SwingFramePeer peer)
{
framePeer = peer;
}
/**
* Adds a menu to the menu bar.
*
* @param m the menu to add
*/
public void addMenu(Menu m)
{
SwingMenuPeer menuPeer = (SwingMenuPeer) m.getPeer();
menuBar.add(menuPeer.menu);
}
/**
* Adds a help menu to the menu bar.
*
* @param m the menu to add
*/
public void addHelpMenu(Menu menu)
{
// FIXME: We should manage the help menu differently, so that it always
// appears at the rightmost position.
SwingMenuPeer menuPeer = (SwingMenuPeer) menu.getPeer();
menuBar.add(menuPeer.menu);
}
/**
* Removes the menu with the specified index.
*
* @param index the index of the menu to remove
*/
public void delMenu(int index)
{
menuBar.remove(index);
}
/**
* Disposes this peer. This releases any reference to the AWT and Swing
* components.
*/
public void dispose()
{
menuBar = null;
awtMenuBar = null;
}
/**
* Sets a font for the menu bar.
*
* @param font the font to set
*/
public void setFont(Font font)
{
menuBar.setFont(font);
}
/**
* Sets the width of the menu bar. This is called from the top level
* component peers to adjust the width of the menubar when their sizes
* change.
*
* @param w the width to set
*/
public void setWidth(int w)
{
menuBar.setSize(w, menuBar.getPreferredSize().height);
menuBar.doLayout();
}
/**
* Paints the menu bar.
*
* @param g the graphics context to use for painting
*/
public void peerPaint(Graphics g)
{
menuBar.paint(g);
}
/**
* Determines the height of the menubar.
*
* @return the height of the menu bar
*/
public int getHeight()
{
return menuBar.getPreferredSize().height;
}
/**
* Handles mouse events.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
Point point = ev.getPoint();
for (int i = 0; i < awtMenuBar.getMenuCount(); i++)
{
Menu menu = awtMenuBar.getMenu(i);
SwingMenuPeer peer = (SwingMenuPeer) menu.getPeer();
int x1 = peer.getX();
int x2 = x1 + peer.getWidth();
if (point.x >= x1 && point.x <= x2)
{
ev.translatePoint(peer.getX(), peer.getY());
peer.handleMouseEvent(ev);
break;
}
}
}
/**
* Handles mouse motion events.
*
* @param ev the mouse motion event
*/
public void handleMouseMotionEvent(MouseEvent ev)
{
Point point = ev.getPoint();
for (int i = 0; i < awtMenuBar.getMenuCount(); i++)
{
Menu menu = awtMenuBar.getMenu(i);
SwingMenuPeer peer = (SwingMenuPeer) menu.getPeer();
int x1 = peer.getX();
int x2 = x1 + peer.getWidth();
if (point.x >= x1 && point.x <= x2)
{
ev.translatePoint(peer.getX(), peer.getY());
peer.handleMouseMotionEvent(ev);
break;
}
}
}
}

View file

@ -0,0 +1,157 @@
/* SwingMenuItemPeer.java -- A Swing based peer for AWT menu items
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Font;
import java.awt.MenuItem;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.peer.MenuItemPeer;
import javax.swing.JMenuItem;
/**
* A Swing based peer for the AWT MenuItem.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingMenuItemPeer
implements MenuItemPeer
{
/**
* The AWT menu item.
*/
MenuItem awtMenuItem;
/**
* The Swing menu item.
*/
JMenuItem menuItem;
/**
* Receives ActionEvents from the Swing menu item and forwards them
* to the ActionListeners of the AWT MenuItem.
*
* @author Roman Kennke (kennke@aicas.com)
*/
private class SwingMenuItemListener implements ActionListener
{
/**
* Receives notification when the action has been performed.
*
* @param event the action event
*/
public void actionPerformed(ActionEvent event)
{
event.setSource(awtMenuItem);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
}
}
/**
* Creates a new instance of <code>SwingMenuItemPeer</code>.
*
* @param awtMenuItem the AWT menu item
*/
public SwingMenuItemPeer(MenuItem awtMenuItem)
{
this.awtMenuItem = awtMenuItem;
menuItem = new JMenuItem(awtMenuItem.getLabel());
menuItem.addActionListener(new SwingMenuItemListener());
}
/**
* Disables the menu item.
*/
public void disable()
{
menuItem.setEnabled(false);
}
/**
* Enables the menu item.
*/
public void enable()
{
menuItem.setEnabled(true);
}
/**
* Sets the enabled state to <code>enabled</code>.
*
* @param enabled if the menu item should be enabled or not
*/
public void setEnabled(boolean enabled)
{
menuItem.setEnabled(enabled);
}
/**
* Sets the label for the menu item.
*
* @param text the label to set
*/
public void setLabel(String text)
{
menuItem.setText(text);
}
/**
* Disposes the menu item. This releases any reference to the Swing and AWT
* menu item.
*/
public void dispose()
{
menuItem = null;
awtMenuItem = null;
}
/**
* Sets the font for this menu item.
*
* @param font the font to set
*/
public void setFont(Font font)
{
menuItem.setFont(font);
}
}

View file

@ -0,0 +1,284 @@
/* SwingMenuPeer.java -- A Swing based peer for AWT menus
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Font;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.peer.MenuPeer;
import javax.swing.JMenu;
/**
* A Swing based peer for the AWT menu.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingMenuPeer
implements MenuPeer
{
/**
* The AWT menu.
*/
Menu awtMenu;
/**
* The Swing menu.
*/
SwingMenu menu;
/**
* A specialized JMenu that can be used as 'backend' for an AWT menu.
*
* @author Roman Kennke (kennke@aicas.com)
*/
private class SwingMenu
extends JMenu
{
/**
* Unconditionally returns <code>true</code>, since we assume that when the
* menu has a peer, it must be showing.
*
* @return <code>true</code>
*/
public boolean isShowing()
{
// FIXME: This might be wrong. Maybe find a better way to do that.
return true;
}
/**
* Overridden so that we can provide a location even without a real peer
* attached.
*
* @return the screen location of this menu
*/
public Point getLocationOnScreen()
{
Point parentLoc = getParent().getLocationOnScreen();
parentLoc.x += getX();
parentLoc.y += getY();
return parentLoc;
}
/**
* Handles mouse events by forwarding them to
* <code>processMouseEvent()</code>.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseEvent(ev);
}
/**
* Handles mouse events by forwarding them to
* <code>processMouseMotionEvent()</code>.
*
* @param ev the mouse event
*/
public void handleMouseMotionEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseMotionEvent(ev);
}
}
/**
* Creates a new <code>SwingMenuPeer</code> instance.
*
* @param awtMenu the AWT menu
*/
public SwingMenuPeer(Menu awtMenu)
{
this.awtMenu = awtMenu;
menu = new SwingMenu();
menu.setDoubleBuffered(false);
menu.setText(awtMenu.getLabel());
for (int i = 0; i < awtMenu.getItemCount(); i++)
{
MenuItem item = awtMenu.getItem(i);
item.addNotify();
SwingMenuItemPeer peer = (SwingMenuItemPeer) item.getPeer();
menu.add(peer.menuItem);
}
}
/**
* Adds a menu item to this menu.
*
* @param item the menu item to add
*/
public void addItem(MenuItem item)
{
SwingMenuItemPeer menuItemPeer = (SwingMenuItemPeer) item.getPeer();
menu.add(menuItemPeer.menuItem);
}
/**
* Adds a separator to the menu.
*/
public void addSeparator()
{
menu.addSeparator();
}
/**
* Removes a menu item from the menu.
*
* @param index the index of the menu item to remove
*/
public void delItem(int index)
{
menu.remove(index);
}
/**
* Disables the menu.
*/
public void disable()
{
menu.setEnabled(false);
}
/**
* Enables the menu.
*/
public void enable()
{
menu.setEnabled(true);
}
/**
* Sets the enabled state of the menu to <code>enabled</code>.
*
* @param enabled if the menu should be enabled or not
*/
public void setEnabled(boolean enabled)
{
menu.setEnabled(enabled);
}
/**
* Sets the label of the menu.
*
* @param text the label to set
*/
public void setLabel(String text)
{
menu.setText(text);
}
/**
* Releases any reference to the AWT and Swing menu instances.
*/
public void dispose()
{
menu = null;
awtMenu = null;
}
/**
* Sets the font for the menu.
*
* @param font the font to set
*/
public void setFont(Font font)
{
menu.setFont(font);
}
/**
* Handles mouse events by forwarding them to the Swing menu.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
menu.handleMouseEvent(ev);
}
/**
* Handles mouse motion events by forwarding them to the Swing menu.
*
* @param ev the mouse event
*/
public void handleMouseMotionEvent(MouseEvent ev)
{
menu.handleMouseMotionEvent(ev);
}
/**
* Returns the X coordinate of the upper left corner of the menu. This is
* used internally by the SwingMenuBarPeer.
*
* @return the X coordinate of the upper left corner of the menu
*/
int getX()
{
return menu.getX();
}
/**
* Returns the width of the menu. This is used internally by the
* SwingMenuBarPeer.
*
* @return the X coordinate of the upper left corner of the menu
*/
int getWidth()
{
return menu.getWidth();
}
/**
* Returns the Y coordinate of the upper left corner of the menu. This is
* used internally by the SwingMenuBarPeer.
*
* @return the X coordinate of the upper left corner of the menu
*/
public int getY()
{
return menu.getY();
}
}

View file

@ -0,0 +1,67 @@
/* SwingPanelPeer.java -- A PanelPeer based on Swing
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Panel;
import java.awt.peer.LightweightPeer;
import java.awt.peer.PanelPeer;
/**
* A panel peer based on Swing.
*
* @author Roman Kennke (kennke@aicas.com)
*/
// TODO: Maybe base implementation on JPanel. However, this doesn't seem
// necessary, but might be good for more consistend Look.
public class SwingPanelPeer
extends SwingContainerPeer
implements PanelPeer, LightweightPeer
{
/**
* Creates a new instance of <code>SwingPanelPeer</code> for the specified
* AWT panel.
*
* @param panel the AWT panel
*/
public SwingPanelPeer(Panel panel)
{
super(panel);
}
}

View file

@ -0,0 +1,367 @@
/* SwingTextFieldPeer.java -- A Swing based peer for AWT textfields
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.im.InputMethodRequests;
import java.awt.peer.TextFieldPeer;
import javax.swing.JComponent;
import javax.swing.JTextField;
/**
* A TextFieldPeer based on Swing JTextField.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public class SwingTextFieldPeer
extends SwingComponentPeer
implements TextFieldPeer
{
/**
* A specialized Swing textfield for use in the peer.
*
* @author Roman Kennke (kennke@aicas.com)
*/
private class SwingTextField
extends JTextField
implements SwingComponent
{
/**
* Overridden to provide normal behaviour even without a real peer
* attached.
*
* @return the location of the textfield on screen
*/
public Point getLocationOnScreen()
{
return SwingTextFieldPeer.this.getLocationOnScreen();
}
/**
* Overridden so that the isShowing method returns the correct value for the
* swing button, even if it has no peer on its own.
*
* @return <code>true</code> if the button is currently showing,
* <code>false</code> otherwise
*/
public boolean isShowing()
{
boolean retVal = false;
if (SwingTextFieldPeer.this.awtComponent != null)
retVal = SwingTextFieldPeer.this.awtComponent.isShowing();
return retVal;
}
/**
* Overridden, so that the Swing button can create an Image without its
* own peer.
*
* @param w the width of the image
* @param h the height of the image
*
* @return an image
*/
public Image createImage(int w, int h)
{
return SwingTextFieldPeer.this.createImage(w, h);
}
/**
* Returns this textfield.
*
* @return <code>this</code>
*/
public JComponent getJComponent()
{
return this;
}
/**
* Handles mouse events by forwarding it to the swing textfield.
*
* @param ev the mouse event
*/
public void handleMouseEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseEvent(ev);
}
/**
* Handles mouse motion events by forwarding it to the swing textfield.
*
* @param ev the mouse motion event
*/
public void handleMouseMotionEvent(MouseEvent ev)
{
ev.setSource(this);
processMouseMotionEvent(ev);
}
/**
* Handles key events by forwarding it to the swing textfield.
*
* @param ev the key event
*/
public void handleKeyEvent(KeyEvent ev)
{
ev.setSource(this);
processKeyEvent(ev);
}
}
/**
* Creates a new <code>SwingTextFieldPeer</code> instance for the specified
* AWT textfield.
*
* @param textField the AWT textfield
*/
public SwingTextFieldPeer(TextField textField)
{
SwingTextField swingTextField = new SwingTextField();
swingTextField.setText(textField.getText());
init(textField, swingTextField);
}
/**
* Returns the minimum size of the textfield.
*
* @param len not used here
*
* @return the minimum size of the textfield
*/
public Dimension minimumSize(int len)
{
return swingComponent.getJComponent().getMinimumSize();
}
/**
* Returns the preferred size of the textfield.
*
* @param len not used here
*
* @return the preferred size of the textfield
*/
public Dimension preferredSize(int len)
{
return swingComponent.getJComponent().getPreferredSize();
}
/**
* Returns the minimum size of the textfield.
*
* @param len not used here
*
* @return the minimum size of the textfield
*/
public Dimension getMinimumSize(int len)
{
return swingComponent.getJComponent().getMinimumSize();
}
/**
* Returns the preferred size of the textfield.
*
* @param len not used here
*
* @return the preferred size of the textfield
*/
public Dimension getPreferredSize(int len)
{
return swingComponent.getJComponent().getPreferredSize();
}
/**
* Sets the echo character.
*
* @param echoChar the echo character to be set
*/
public void setEchoChar(char echoChar)
{
// TODO: Must be implemented.
}
/**
* Sets the echo character.
*
* @param echoChar the echo character to be set
*/
public void setEchoCharacter(char echoChar)
{
// TODO: Must be implemented.
}
/**
* Returns the end index of the current selection.
*
* @return the end index of the current selection
*/
public int getSelectionEnd()
{
// TODO: Must be implemented.
return 0;
}
/**
* Returns the start index of the current selection.
*
* @return the start index of the current selection
*/
public int getSelectionStart()
{
// TODO: Must be implemented.
return 0;
}
/**
* Returns the current content of the textfield.
*
* @return the current content of the textfield
*/
public String getText()
{
return ((JTextField) swingComponent.getJComponent()).getText();
}
/**
* Sets the content of the textfield.
*
* @param text the text to set
*/
public void setText(String text)
{
((JTextField) swingComponent.getJComponent()).setText(text);
}
/**
* Sets the current selection.
*
* @param startPos the start index of the selection
* @param endPos the start index of the selection
*/
public void select(int start_pos, int endPos)
{
// TODO: Must be implemented.
}
/**
* Sets the editable flag of the text field.
*
* @param editable <code>true</code> to make the textfield editable,
* <code>false</code> to make it uneditable
*/
public void setEditable(boolean editable)
{
((JTextField) swingComponent.getJComponent()).setEditable(editable);
}
/**
* Returns the current caret position.
*
* @return the current caret position
*/
public int getCaretPosition()
{
return ((JTextField) swingComponent.getJComponent()).getCaret().getDot();
}
/**
* Sets the current caret position.
*
* @param pos the caret position to set
*/
public void setCaretPosition(int pos)
{
((JTextField) swingComponent.getJComponent()).getCaret().setDot(pos);
}
/**
* Returns the index of the character at the specified location.
*
* @param x the X coordinate of the point to query
* @param y the Y coordinate of the point to query
*
* @return the index of the character at the specified location
*/
public int getIndexAtPoint(int x, int y)
{
// TODO: Must be implemented.
return 0;
}
/**
* Returns the bounds of the character at the specified index.
*
* @param pos the index of the character
*
* @return the bounds of the character at the specified index
*/
public Rectangle getCharacterBounds(int pos)
{
// TODO: Must be implemented.
return null;
}
/**
* Not used.
*/
public long filterEvents(long filter)
{
// TODO: Must be implemented.
return 0;
}
/**
* Not used.
*/
public InputMethodRequests getInputMethodRequests()
{
// TODO: Must be implemented.
return null;
}
}

View file

@ -0,0 +1,165 @@
/* SwingToolkit.java -- A base toolkit for Swing peers
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Label;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.peer.ButtonPeer;
import java.awt.peer.CanvasPeer;
import java.awt.peer.LabelPeer;
import java.awt.peer.MenuBarPeer;
import java.awt.peer.MenuItemPeer;
import java.awt.peer.MenuPeer;
import java.awt.peer.PanelPeer;
import java.awt.peer.TextFieldPeer;
import gnu.java.awt.ClasspathToolkit;
/**
* A base implementation for {@link java.awt.Toolkit} that provides the
* Swing based widgets. Concrete implementations still must provide the
* remaining abstract methods.
*
* @author Roman Kennke (kennke@aicas.com)
*/
public abstract class SwingToolkit extends ClasspathToolkit
{
/**
* Creates a SwingButtonPeer.
*
* @param button the AWT button
*
* @return the Swing button peer
*/
protected ButtonPeer createButton(Button button)
{
return new SwingButtonPeer(button);
}
/**
* Creates a SwingCanvasPeer.
*
* @param canvas the AWT canvas
*
* @return the Swing canvas peer
*/
protected CanvasPeer createCanvas(Canvas canvas)
{
return new SwingCanvasPeer(canvas);
}
/**
* Creates a SwingLabelPeer.
*
* @param label the AWT label
*
* @return the Swing label peer
*/
protected LabelPeer createLabel(Label label)
{
return new SwingLabelPeer(label);
}
/**
* Creates a SwingMenuPeer.
*
* @param menu the AWT menu
*
* @return the Swing menu peer
*/
protected MenuPeer createMenu(Menu menu)
{
return new SwingMenuPeer(menu);
}
/**
* Creates a SwingMenuBarPeer.
*
* @param menuBar the AWT menubar
*
* @return the Swing menu bar peer
*/
protected MenuBarPeer createMenuBar(MenuBar menuBar)
{
return new SwingMenuBarPeer(menuBar);
}
/**
* Creates a SwingMenuItemPeer.
*
* @param menuItem the AWT menu item
*
* @return the Swing menu item peer
*/
protected MenuItemPeer createMenuItem(MenuItem menuItem)
{
return new SwingMenuItemPeer(menuItem);
}
/**
* Creates a SwingPanelPeer.
*
* @param panel the AWT panel
*
* @return the Swing panel peer
*/
protected PanelPeer createPanel(Panel panel)
{
return new SwingPanelPeer(panel);
}
/**
* Creates a SwingTextFieldPeer.
*
* @param textField the AWT text field
*
* @return the Swing text field peer
*/
protected TextFieldPeer createTextField(TextField textField)
{
return new SwingTextFieldPeer(textField);
}
}

View file

@ -0,0 +1,72 @@
/* SwingWindowPeer.java -- An abstract base for Swing based window peers
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.awt.peer.swing;
import java.awt.Window;
import java.awt.peer.WindowPeer;
/**
* An abstract base class for Swing based WindowPeer implementation. Concrete
* implementations of WindowPeers should subclass this class in order to get
* the correct behaviour.
*
* As a minimum, a subclass must implement all the remaining abstract methods
* as well as the following methods:
* <ul>
* <li>{@link ComponentPeer#getLocationOnScreen()}</li>
* <li>{@link ComponentPeer#getGraphics()}</li>
* <li>{@link ComponentPeer#createImage(int, int)}</li>
* </ul>
*
* @author Roman Kennke (kennke@aicas.com)
*/
public abstract class SwingWindowPeer
extends SwingContainerPeer
implements WindowPeer
{
/**
* Creates a new instance of WindowPeer.
*
* @param window the AWT window
*/
public SwingWindowPeer(Window window)
{
super(window);
}
}

View file

@ -0,0 +1,71 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in gnu.java.awt.peer.swing package.
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head>
<title>Swing based AWT peers</title>
</head>
<body>
<h1>Swing based AWT peers.</h1>
<p>This package defines an abstract set of AWT peers that is based on Swing
widgets. This can be used as an implementation base for peer implementors
who don't have access to native widgets or who want to build a quick
prototype of a peer set without implementing all of the AWT widgets.
</p>
<p>An actual implementation would have to provide the following:
<ul>
<li>A concrete implementation of {@link java.awt.Toolkit}, possibly based
on {@link SwingToolkit}. This implementation must provide all the missing
methods of the <code>SwingToolkit</code>.</li>
<li>Concrete implementations of {@link java.awt.peer.DialogPeer},
{@link java.awt.peer.FramePeer} and {@link java.awt.peer.WindowPeer},
ideally based on their <code>SwingXXXPeer</code> counterparts.
Some methods must be specially
overridden in those peers to provide useful functionality, like
<code>getLocationOnScreen()</code>. See the API documentation for more
details</li>
<li>An implementation of {@link java.awt.Image}. These must be provided by
the toplevel component peers.</li>
<li>An implementation of {@link java.awt.Graphics}. This must also be
provided by the toplevel peers.</li>
<li>An implementation of {@link java.awt.Font}. This must be
provided by the toolkit.</li>
</ul>
</p>
</body>
</html>

View file

@ -1,5 +1,5 @@
/* gnu.java.beans.DefaultExceptionListener
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -35,23 +35,32 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.beans.decoder;
package gnu.java.beans;
import java.beans.ExceptionListener;
/** The DefaultExceptionListener is the default implementation of the ExceptionListener
* interface. An instance of this class is used whenever the user provided no
* ExceptionListener instance on its own.
/** The DefaultExceptionListener is the default implementation of the
* {@link ExceptionListener} interface. An instance of
* this class is used whenever the user provided no
* <code>ExceptionListener</code> instance on its own.
*
* <p>The implementation just writes the exception's message to <code>System.err</code>.</p>
* <p>The implementation just writes the exception's message
* to <code>System.err</code> and is used by the {@link java.beans.Encoder}
* and the {@link java.beans.XMLDecoder}.
* </p>
*
* @author Robert Schuster
* @author Robert Schuster (robertschuster@fsfe.org)
*/
public class DefaultExceptionListener implements ExceptionListener
{
public final static DefaultExceptionListener INSTANCE
= new DefaultExceptionListener();
public void exceptionThrown(Exception e)
{
System.err.println("non-critical exception: " + e + " - message: "
System.err.println("exception thrown: "
+ e + " - message: "
+ e.getMessage());
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* CRLFInputStream.java --
Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -39,7 +39,6 @@ exception statement from your version. */
package gnu.java.net;
import java.io.BufferedInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
@ -49,7 +48,7 @@ import java.io.InputStream;
* @author Chris Burdess (dog@gnu.org)
*/
public class CRLFInputStream
extends FilterInputStream
extends InputStream
{
/**
* The CR octet.
@ -61,6 +60,11 @@ public class CRLFInputStream
*/
public static final int LF = 10;
/**
* The underlying input stream.
*/
protected InputStream in;
private boolean doReset;
/**
@ -69,7 +73,7 @@ public class CRLFInputStream
*/
public CRLFInputStream(InputStream in)
{
super(in.markSupported() ? in : new BufferedInputStream(in));
this.in = in.markSupported() ? in : new BufferedInputStream(in);
}
/**
@ -145,13 +149,14 @@ public class CRLFInputStream
throws IOException
{
doReset = false;
int lm1 = len - 1;
for (int i = off; i < len; i++)
int end = off + len;
int em1 = end - 1;
for (int i = off; i < end; i++)
{
if (b[i] == CR)
{
int d;
if (i == lm1)
if (i == em1)
{
d = in.read();
doReset = true;

View file

@ -1,5 +1,5 @@
/* LineInputStream.java --
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -40,7 +40,6 @@ package gnu.java.net;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
@ -50,8 +49,14 @@ import java.io.InputStream;
* @author Chris Burdess (dog@gnu.org)
*/
public class LineInputStream
extends FilterInputStream
extends InputStream
{
/**
* The underlying input stream.
*/
protected InputStream in;
/*
* Line buffer.
*/
@ -88,7 +93,7 @@ public class LineInputStream
*/
public LineInputStream(InputStream in, String encoding)
{
super(in);
this.in = in;
buf = new ByteArrayOutputStream();
this.encoding = encoding;
eof = false;
@ -96,6 +101,24 @@ public class LineInputStream
blockReads = !(in instanceof BufferedInputStream) && in.markSupported();
}
public int read()
throws IOException
{
return in.read();
}
public int read(byte[] buf)
throws IOException
{
return in.read(buf);
}
public int read(byte[] buf, int off, int len)
throws IOException
{
return in.read(buf, off, len);
}
/**
* Read a line of input.
*/

View file

@ -135,21 +135,18 @@ public class Connection extends URLConnection
* @exception MalformedURLException If the given string contains invalid
* escape sequences.
*
* Sadly the same as URI.unquote, but there's nothing we can do to
* make it accessible.
*
*/
public static String unquote(String str) throws MalformedURLException
{
if (str == null)
return null;
byte[] buf = new byte[str.length()];
final int MAX_BYTES_PER_UTF_8_CHAR = 3;
byte[] buf = new byte[str.length()*MAX_BYTES_PER_UTF_8_CHAR];
int pos = 0;
for (int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
if (c > 127)
throw new MalformedURLException(str + " : Invalid character");
if (c == '%')
{
if (i + 2 >= str.length())
@ -160,6 +157,15 @@ public class Connection extends URLConnection
throw new MalformedURLException(str + " : Invalid quoted character");
buf[pos++] = (byte) (hi * 16 + lo);
}
else if (c > 127) {
try {
byte [] c_as_bytes = Character.toString(c).getBytes("utf-8");
System.arraycopy(c_as_bytes, 0, buf, pos, c_as_bytes.length);
}
catch (java.io.UnsupportedEncodingException x2) {
throw (Error) new InternalError().initCause(x2);
}
}
else
buf[pos++] = (byte) c;
}

View file

@ -84,6 +84,7 @@ final class ActiveModeDTP
}
this.connectionTimeout = connectionTimeout;
acceptThread = new Thread(this, "ActiveModeDTP");
acceptThread.setDaemon(true);
acceptThread.start();
}

View file

@ -1,5 +1,5 @@
/* FTPURLConnection.java --
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,10 +38,9 @@ exception statement from your version. */
package gnu.java.net.protocol.ftp;
import gnu.classpath.SystemProperties;
import gnu.java.net.GetLocalHostAction;
import gnu.java.security.action.GetPropertyAction;
import java.io.FileNotFoundException;
import java.io.FilterInputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
@ -51,7 +50,6 @@ import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.Map;
@ -113,11 +111,9 @@ public class FTPURLConnection
else
{
username = "anonymous";
PrivilegedAction a = new GetPropertyAction("user.name");
String systemUsername =(String) AccessController.doPrivileged(a);
a = new GetLocalHostAction();
GetLocalHostAction a = new GetLocalHostAction();
InetAddress localhost =(InetAddress) AccessController.doPrivileged(a);
password = systemUsername + "@" +
password = SystemProperties.getProperty("user.name") + "@" +
((localhost == null) ? "localhost" : localhost.getHostName());
}
connection = new FTPConnection(host, port);
@ -167,24 +163,13 @@ public class FTPURLConnection
connect();
}
String path = url.getPath();
String filename = null;
int lsi = path.lastIndexOf('/');
if (lsi != -1)
if (connection.changeWorkingDirectory(path))
{
filename = path.substring(lsi + 1);
path = path.substring(0, lsi);
if (!connection.changeWorkingDirectory(path))
{
throw new FileNotFoundException(path);
}
}
if (filename != null && filename.length() > 0)
{
return this.new ClosingInputStream(connection.retrieve(filename));
return this.new ClosingInputStream(connection.list(null));
}
else
{
return this.new ClosingInputStream(connection.list(null));
return this.new ClosingInputStream(connection.retrieve(path));
}
}
@ -198,20 +183,8 @@ public class FTPURLConnection
{
connect();
}
String dir = url.getPath();
String filename = url.getFile();
if (!connection.changeWorkingDirectory(dir))
{
throw new FileNotFoundException(dir);
}
if (filename != null)
{
return this.new ClosingOutputStream(connection.store(filename));
}
else
{
throw new FileNotFoundException(filename);
}
String path = url.getPath();
return this.new ClosingOutputStream(connection.store(path));
}
public String getRequestProperty(String key)

View file

@ -1,5 +1,5 @@
/* ChunkedInputStream.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,29 +38,47 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ProtocolException;
//
// Note that we rely on the implemtation of skip() in the super class
// (InputStream) calling our read methods to account for chunk headers
// while skipping.
//
/**
* Input stream wrapper for the "chunked" transfer-coding.
*
* @author Chris Burdess (dog@gnu.org)
*/
public class ChunkedInputStream
extends FilterInputStream
extends InputStream
{
private static final byte CR = 0x0d;
private static final byte LF = 0x0a;
int size;
int count;
boolean meta;
boolean eof;
Headers headers;
/** The underlying stream. */
private InputStream in;
/** Size of the chunk we're reading. */
int size;
/** Number of bytes we've read in this chunk. */
int count;
/**
* True when we should read meta-information, false when we should
* read data.
*/
boolean meta;
/** True when we've hit EOF. */
boolean eof;
/**
* Constructor.
* @param in the response socket input stream
@ -68,7 +86,7 @@ public class ChunkedInputStream
*/
public ChunkedInputStream(InputStream in, Headers headers)
{
super(in);
this.in = in;
this.headers = headers;
size = -1;
count = 0;
@ -84,21 +102,10 @@ public class ChunkedInputStream
{
return -1;
}
int ret = (int) buf[0];
if (ret < 0)
{
ret += 0x100;
}
return ret;
return 0xff & buf[0];
}
public int read(byte[] buffer)
throws IOException
{
return read(buffer, 0, buffer.length);
}
public int read(byte[] buffer, int offset, int length)
public synchronized int read(byte[] buffer, int offset, int length)
throws IOException
{
if (eof)
@ -120,7 +127,18 @@ public class ChunkedInputStream
}
else if (c == 0x0a && last == 0x0d) // CRLF
{
size = Integer.parseInt(buf.toString(), 16);
try
{
size = Integer.parseInt(buf.toString(), 16);
}
catch (NumberFormatException nfe)
{
IOException ioe = new IOException("Bad chunk header");
ioe.initCause(nfe);
// Unrecoverable. Don't try to read more.
in.close();
throw ioe;
}
break;
}
else if (!seenSemi && c >= 0x30)
@ -142,17 +160,22 @@ public class ChunkedInputStream
}
else
{
int diff = length - offset;
int max = size - count;
max = (diff < max) ? diff : max;
int len = (max > 0) ? in.read(buffer, offset, max) : 0;
int canRead = Math.min(size - count, length);
int len = in.read(buffer, offset, canRead);
if (len == -1)
{
// This is an error condition but it isn't clear what we
// should do with it.
eof = true;
return -1;
}
count += len;
if (count == size)
{
// Read CRLF
int c1 = in.read();
int c2 = in.read();
if (c1 == -1 && c2 == -1)
if (c1 == -1 || c2 == -1)
{
// EOF before CRLF: bad, but ignore
eof = true;
@ -167,6 +190,37 @@ public class ChunkedInputStream
return len;
}
}
/**
* This method returns the number of bytes that can be read from
* this stream before a read might block. Even if the underlying
* InputStream has data available past the end of the current chunk,
* we have no way of knowing how large the next chunk header will
* be. So we cannot report available data past the current chunk.
*
* @return The number of bytes that can be read before a read might
* block
*
* @exception IOException If an error occurs
*/
public int available() throws IOException
{
if (meta)
return 0;
return Math.min(in.available(), size - count);
}
/**
* This method closes the ChunkedInputStream by closing the underlying
* InputStream.
*
* @exception IOException If an error occurs
*/
public void close() throws IOException
{
in.close();
}
}

View file

@ -1,5 +1,5 @@
/* HTTPConnection.java --
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,7 +38,6 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
import gnu.classpath.Configuration;
import gnu.classpath.SystemProperties;
import gnu.java.net.EmptyX509TrustManager;
@ -53,8 +52,9 @@ import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import javax.net.ssl.HandshakeCompletedListener;
@ -164,7 +164,7 @@ public class HTTPConnection
/**
* The pool that this connection is a member of (if any).
*/
private LinkedHashMap pool;
private Pool pool;
/**
* Creates a new HTTP connection.
@ -266,7 +266,8 @@ public class HTTPConnection
/**
* Returns the HTTP version string supported by this connection.
* @see #version
* @see #majorVersion
* @see #minorVersion
*/
public String getVersion()
{
@ -330,28 +331,228 @@ public class HTTPConnection
return cookieManager;
}
/**
* Manages a pool of HTTPConections. The pool will have a maximum
* size determined by the value of the maxConn parameter passed to
* the {@link #get} method. This value inevitably comes from the
* http.maxConnections system property. If the
* classpath.net.http.keepAliveTTL system property is set, that will
* be the maximum time (in seconds) that an idle connection will be
* maintained.
*/
static class Pool
{
/**
* Singleton instance of the pool.
*/
static Pool instance = new Pool();
/**
* The pool
*/
final LinkedList connectionPool = new LinkedList();
/**
* Maximum size of the pool.
*/
int maxConnections;
/**
* If greater than zero, the maximum time a connection will remain
* int the pool.
*/
int connectionTTL;
/**
* A thread that removes connections older than connectionTTL.
*/
class Reaper
implements Runnable
{
public void run()
{
synchronized (Pool.this)
{
try
{
do
{
while (connectionPool.size() > 0)
{
long currentTime = System.currentTimeMillis();
HTTPConnection c =
(HTTPConnection)connectionPool.getFirst();
long waitTime = c.timeLastUsed
+ connectionTTL - currentTime;
if (waitTime <= 0)
removeOldest();
else
try
{
Pool.this.wait(waitTime);
}
catch (InterruptedException _)
{
// Ignore the interrupt.
}
}
// After the pool is empty, wait TTL to see if it
// is used again. This is because in the
// situation where a single thread is making HTTP
// requests to the same server it can remove the
// connection from the pool before the Reaper has
// a chance to start. This would cause the Reaper
// to exit if it were not for this extra delay.
// The result would be starting a Reaper thread
// for each HTTP request. With the delay we get
// at most one Reaper created each TTL.
try
{
Pool.this.wait(connectionTTL);
}
catch (InterruptedException _)
{
// Ignore the interrupt.
}
}
while (connectionPool.size() > 0);
}
finally
{
reaper = null;
}
}
}
}
Reaper reaper;
/**
* Private constructor to ensure singleton.
*/
private Pool()
{
}
/**
* Tests for a matching connection.
*
* @param c connection to match.
* @param h the host name.
* @param p the port.
* @param sec true if using https.
*
* @return true if c matches h, p, and sec.
*/
private static boolean matches(HTTPConnection c,
String h, int p, boolean sec)
{
return h.equals(c.hostname) && (p == c.port) && (sec == c.secure);
}
/**
* Get a pooled HTTPConnection. If there is an existing idle
* connection to the requested server it is returned. Otherwise a
* new connection is created.
*
* @param host the name of the host to connect to
* @param port the port on the host to connect to
* @param secure whether to use a secure connection
*
* @return the HTTPConnection.
*/
synchronized HTTPConnection get(String host,
int port,
boolean secure)
{
String ttl =
SystemProperties.getProperty("classpath.net.http.keepAliveTTL");
connectionTTL = (ttl != null && ttl.length() > 0) ?
1000 * Math.max(1, Integer.parseInt(ttl)) : 10000;
String mc = SystemProperties.getProperty("http.maxConnections");
maxConnections = (mc != null && mc.length() > 0) ?
Math.max(Integer.parseInt(mc), 1) : 5;
if (maxConnections < 1)
maxConnections = 1;
HTTPConnection c = null;
ListIterator it = connectionPool.listIterator(0);
while (it.hasNext())
{
HTTPConnection cc = (HTTPConnection)it.next();
if (matches(cc, host, port, secure))
{
c = cc;
it.remove();
break;
}
}
if (c == null)
{
c = new HTTPConnection(host, port, secure);
c.setPool(this);
}
return c;
}
/**
* Put an idle HTTPConnection back into the pool. If this causes
* the pool to be come too large, the oldest connection is removed
* and closed.
*
*/
synchronized void put(HTTPConnection c)
{
c.timeLastUsed = System.currentTimeMillis();
connectionPool.addLast(c);
// maxConnections must always be >= 1
while (connectionPool.size() >= maxConnections)
removeOldest();
if (connectionTTL > 0 && null == reaper) {
// If there is a connectionTTL, then the reaper has removed
// any stale connections, so we don't have to check for stale
// now. We do have to start a reaper though, as there is not
// one running now.
reaper = new Reaper();
Thread t = new Thread(reaper, "HTTPConnection.Reaper");
t.setDaemon(true);
t.start();
}
}
/**
* Remove the oldest connection from the pool and close it.
*/
void removeOldest()
{
HTTPConnection cx = (HTTPConnection)connectionPool.removeFirst();
try
{
cx.closeConnection();
}
catch (IOException ioe)
{
// Ignore it. We are just cleaning up.
}
}
}
/**
* The number of times this HTTPConnection has be used via keep-alive.
*/
int useCount;
/**
* Generates a key for connections in the connection pool.
*
* @param h the host name.
* @param p the port.
* @param sec true if using https.
*
* @return the key.
* If this HTTPConnection is in the pool, the time it was put there.
*/
static Object getPoolKey(String h, int p, boolean sec)
{
StringBuilder buf = new StringBuilder(sec ? "https://" : "http://");
buf.append(h);
buf.append(':');
buf.append(p);
return buf.toString();
}
long timeLastUsed;
/**
* Set the connection pool that this HTTPConnection is a member of.
@ -360,7 +561,7 @@ public class HTTPConnection
*
* @param p the pool.
*/
void setPool(LinkedHashMap p)
void setPool(Pool p)
{
pool = p;
}
@ -374,25 +575,20 @@ public class HTTPConnection
{
if (pool != null)
{
synchronized (pool)
useCount++;
pool.put(this);
}
else
{
// If there is no pool, just close.
try
{
useCount++;
Object key = HTTPConnection.getPoolKey(hostname, port, secure);
pool.put(key, this);
while (pool.size() >= HTTPURLConnection.maxConnections)
{
// maxConnections must always be >= 1
Object lru = pool.keySet().iterator().next();
HTTPConnection c = (HTTPConnection)pool.remove(lru);
try
{
c.closeConnection();
}
catch (IOException ioe)
{
// Ignore it. We are just cleaning up.
}
}
closeConnection();
}
catch (IOException ioe)
{
// Ignore it. We are just cleaning up.
}
}
}

View file

@ -1,5 +1,5 @@
/* HTTPURLConnection.java --
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
import gnu.classpath.SystemProperties;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
@ -45,11 +47,11 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.ProtocolException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
@ -70,13 +72,6 @@ public class HTTPURLConnection
extends HttpsURLConnection
implements HandshakeCompletedListener
{
/**
* Pool of reusable connections, used if keepAlive is true.
*/
private static final LinkedHashMap connectionPool = new LinkedHashMap();
static int maxConnections;
/*
* The underlying connection.
*/
@ -108,38 +103,23 @@ public class HTTPURLConnection
{
super(url);
requestHeaders = new Headers();
AccessController.doPrivileged(this.new GetHTTPPropertiesAction());
}
class GetHTTPPropertiesAction
implements PrivilegedAction
{
public Object run()
{
proxyHostname = System.getProperty("http.proxyHost");
if (proxyHostname != null && proxyHostname.length() > 0)
{
String port = System.getProperty("http.proxyPort");
if (port != null && port.length() > 0)
{
proxyPort = Integer.parseInt(port);
}
else
{
proxyHostname = null;
proxyPort = -1;
}
}
agent = System.getProperty("http.agent");
String ka = System.getProperty("http.keepAlive");
keepAlive = !(ka != null && "false".equals(ka));
String mc = System.getProperty("http.maxConnections");
maxConnections = (mc != null && mc.length() > 0) ?
Math.max(Integer.parseInt(mc), 1) : 5;
return null;
}
proxyHostname = SystemProperties.getProperty("http.proxyHost");
if (proxyHostname != null && proxyHostname.length() > 0)
{
String port = SystemProperties.getProperty("http.proxyPort");
if (port != null && port.length() > 0)
{
proxyPort = Integer.parseInt(port);
}
else
{
proxyHostname = null;
proxyPort = -1;
}
}
agent = SystemProperties.getProperty("http.agent");
String ka = SystemProperties.getProperty("http.keepAlive");
keepAlive = !(ka != null && "false".equals(ka));
}
public void connect()
@ -254,8 +234,24 @@ public class HTTPURLConnection
}
}
if (response.getCodeClass() == 3 && getInstanceFollowRedirects())
if (response.isRedirect() && getInstanceFollowRedirects())
{
// Read the response body, if there is one. If the
// redirect points us back at the same server, we will use
// the cached connection, so we must make sure there is no
// pending data in it.
InputStream body = response.getBody();
if (body != null)
{
byte[] ignore = new byte[1024];
while (true)
{
int n = body.read(ignore, 0, ignore.length);
if (n == -1)
break;
}
}
// Follow redirect
String location = response.getHeader("Location");
if (location != null)
@ -333,16 +329,13 @@ public class HTTPURLConnection
{
responseSink = response.getBody();
if (response.getCode() == 404)
{
errorSink = responseSink;
throw new FileNotFoundException(url.toString());
}
if (response.isError())
errorSink = responseSink;
}
}
while (retry);
connected = true;
}
}
/**
* Returns a connection, from the pool if necessary.
@ -353,16 +346,7 @@ public class HTTPURLConnection
HTTPConnection connection;
if (keepAlive)
{
Object key = HTTPConnection.getPoolKey(host, port, secure);
synchronized (connectionPool)
{
connection = (HTTPConnection) connectionPool.remove(key);
if (connection == null)
{
connection = new HTTPConnection(host, port, secure);
connection.setPool(connectionPool);
}
}
connection = HTTPConnection.Pool.instance.get(host, port, secure);
}
else
{
@ -427,30 +411,32 @@ public class HTTPURLConnection
public String getRequestProperty(String key)
{
if (key == null)
return null;
return requestHeaders.getValue(key);
}
public Map getRequestProperties()
{
return requestHeaders;
if (connected)
throw new IllegalStateException("Already connected");
Map m = requestHeaders.getAsMap();
return Collections.unmodifiableMap(m);
}
public void setRequestProperty(String key, String value)
{
super.setRequestProperty(key, value);
requestHeaders.put(key, value);
}
public void addRequestProperty(String key, String value)
{
String old = requestHeaders.getValue(key);
if (old == null)
{
requestHeaders.put(key, value);
}
else
{
requestHeaders.put(key, old + "," + value);
}
super.addRequestProperty(key, value);
requestHeaders.addValue(key, value);
}
public OutputStream getOutputStream()
@ -493,6 +479,17 @@ public class HTTPURLConnection
{
throw new ProtocolException("doInput is false");
}
if (response.isError())
{
int code = response.getCode();
if (code == 404 || code == 410)
throw new FileNotFoundException(url.toString());
throw new IOException("Server returned HTTP response code " + code
+ " for URL " + url.toString());
}
return responseSink;
}
@ -514,17 +511,9 @@ public class HTTPURLConnection
return null;
}
}
Headers headers = response.getHeaders();
LinkedHashMap ret = new LinkedHashMap();
ret.put(null, Collections.singletonList(getStatusLine(response)));
for (Iterator i = headers.entrySet().iterator(); i.hasNext(); )
{
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
ret.put(key, Collections.singletonList(value));
}
return Collections.unmodifiableMap(ret);
Map m = response.getHeaders().getAsMap();
m.put(null, Collections.singletonList(getStatusLine(response)));
return Collections.unmodifiableMap(m);
}
String getStatusLine(Response response)
@ -552,20 +541,7 @@ public class HTTPURLConnection
{
return getStatusLine(response);
}
Iterator i = response.getHeaders().entrySet().iterator();
Map.Entry entry;
int count = 1;
do
{
if (!i.hasNext())
{
return null;
}
entry = (Map.Entry) i.next();
count++;
}
while (count <= index);
return (String) entry.getValue();
return response.getHeaders().getHeaderValue(index - 1);
}
public String getHeaderFieldKey(int index)
@ -581,24 +557,8 @@ public class HTTPURLConnection
return null;
}
}
if (index == 0)
{
return null;
}
Iterator i = response.getHeaders().entrySet().iterator();
Map.Entry entry;
int count = 1;
do
{
if (!i.hasNext())
{
return null;
}
entry = (Map.Entry) i.next();
count++;
}
while (count <= index);
return (String) entry.getKey();
// index of zero is the status line.
return response.getHeaders().getHeaderName(index - 1);
}
public String getHeaderField(String name)
@ -614,7 +574,7 @@ public class HTTPURLConnection
return null;
}
}
return (String) response.getHeader(name);
return response.getHeader(name);
}
public long getHeaderFieldDate(String name, long def)

View file

@ -1,5 +1,5 @@
/* Headers.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -44,125 +44,75 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
/**
* A collection of HTTP header names and associated values.
* Retrieval of values is case insensitive. An iteration over the keys
* A collection of HTTP header names and associated values. The
* values are {@link ArrayList ArrayLists} of Strings. Retrieval of
* values is case insensitive. An iteration over the collection
* returns the header names in the order they were received.
*
* @author Chris Burdess (dog@gnu.org)
* @author David Daney (ddaney@avtrex.com)
*/
public class Headers
extends LinkedHashMap
class Headers
{
/**
* A list of HeaderElements
*
*/
private final ArrayList headers = new ArrayList();
static final DateFormat dateFormat = new HTTPDateFormat();
static class Header
static class HeaderElement
{
String name;
String value;
final String name;
Header(String name)
HeaderElement(String name, String value)
{
if (name == null || name.length() == 0)
{
throw new IllegalArgumentException(name);
}
this.name = name;
this.value = value;
}
public int hashCode()
{
return name.toLowerCase().hashCode();
}
public boolean equals(Object other)
{
if (other instanceof Header)
{
return ((Header) other).name.equalsIgnoreCase(name);
}
return false;
}
public String toString()
{
return name;
}
}
static class HeaderEntry
implements Map.Entry
{
final Map.Entry entry;
HeaderEntry(Map.Entry entry)
{
this.entry = entry;
}
public Object getKey()
{
return ((Header) entry.getKey()).name;
}
public Object getValue()
{
return entry.getValue();
}
public Object setValue(Object value)
{
return entry.setValue(value);
}
public int hashCode()
{
return entry.hashCode();
}
public boolean equals(Object other)
{
return entry.equals(other);
}
public String toString()
{
return getKey().toString() + "=" + getValue();
}
}
public Headers()
{
}
public boolean containsKey(Object key)
{
return super.containsKey(new Header((String) key));
}
public Object get(Object key)
{
return super.get(new Header((String) key));
}
/**
* Returns the value of the specified header as a string.
* Return an Iterator over this collection of headers.
* Iterator.getNext() returns objects of type {@link HeaderElement}.
*
* @return the Iterator.
*/
Iterator iterator()
{
return headers.iterator();
}
/**
* Returns the value of the specified header as a string. If
* multiple values are present, the last one is returned.
*/
public String getValue(String header)
{
return (String) super.get(new Header(header));
for (int i = headers.size() - 1; i >= 0; i--)
{
HeaderElement e = (HeaderElement)headers.get(i);
if (e.name.equalsIgnoreCase(header))
{
return e.value;
}
}
return null;
}
/**
@ -228,51 +178,62 @@ public class Headers
}
}
public Object put(Object key, Object value)
/**
* Add a header to this set of headers. If there is an existing
* header with the same name, it is discarded.
*
* @param name the header name
* @param value the header value
*
* @see #addValue
*/
public void put(String name, String value)
{
return super.put(new Header((String) key), value);
}
public Object remove(Object key)
{
return super.remove(new Header((String) key));
}
public void putAll(Map t)
{
for (Iterator i = t.keySet().iterator(); i.hasNext(); )
{
String key = (String) i.next();
String value = (String) t.get(key);
put(key, value);
}
}
public Set keySet()
{
Set keys = super.keySet();
Set ret = new LinkedHashSet();
for (Iterator i = keys.iterator(); i.hasNext(); )
{
ret.add(((Header) i.next()).name);
}
return ret;
}
public Set entrySet()
{
Set entries = super.entrySet();
Set ret = new LinkedHashSet();
for (Iterator i = entries.iterator(); i.hasNext(); )
{
Map.Entry entry = (Map.Entry) i.next();
ret.add(new HeaderEntry(entry));
}
return ret;
remove(name);
headers.add(headers.size(), new HeaderElement(name, value));
}
/**
* Parse the specified input stream, adding headers to this collection.
* Add all headers from a set of headers to this set. If any of the
* headers to be added have the same name as existing headers, the
* existing headers will be discarded.
*
* @param o the headers to be added
*/
public void putAll(Headers o)
{
for (Iterator it = o.iterator(); it.hasNext(); )
{
HeaderElement e = (HeaderElement)it.next();
remove(e.name);
}
for (Iterator it = o.iterator(); it.hasNext(); )
{
HeaderElement e = (HeaderElement)it.next();
addValue(e.name, e.value);
}
}
/**
* Remove a header from this set of headers. If there is more than
* one instance of a header of the given name, they are all removed.
*
* @param name the header name
*/
public void remove(String name)
{
for (Iterator it = headers.iterator(); it.hasNext(); )
{
HeaderElement e = (HeaderElement)it.next();
if (e.name.equalsIgnoreCase(name))
it.remove();
}
}
/**
* Parse the specified InputStream, adding headers to this collection.
*
* @param in the InputStream.
*/
public void parse(InputStream in)
throws IOException
@ -334,18 +295,90 @@ public class Headers
}
}
private void addValue(String name, String value)
/**
* Add a header to this set of headers. If there is an existing
* header with the same name, it is not effected.
*
* @param name the header name
* @param value the header value
*
* @see #put
*/
public void addValue(String name, String value)
{
Header key = new Header(name);
String old = (String) super.get(key);
if (old == null)
headers.add(headers.size(), new HeaderElement(name, value));
}
/**
* Get a new Map containing all the headers. The keys of the Map
* are Strings (the header names). The values of the Map are
* unmodifiable Lists containing Strings (the header values).
*
* <p>
*
* The returned map is modifiable. Changing it will not effect this
* collection of Headers in any way.
*
* @return a Map containing all the headers.
*/
public Map getAsMap()
{
LinkedHashMap m = new LinkedHashMap();
for (Iterator it = headers.iterator(); it.hasNext(); )
{
super.put(key, value);
HeaderElement e = (HeaderElement)it.next();
ArrayList l = (ArrayList)m.get(e.name);
if (l == null)
{
l = new ArrayList(1);
l.add(e.value);
m.put(e.name, l);
}
else
l.add(0, e.value);
}
else
for (Iterator it = m.entrySet().iterator(); it.hasNext(); )
{
super.put(key, old + ", " + value);
Map.Entry me = (Map.Entry)it.next();
ArrayList l = (ArrayList)me.getValue();
me.setValue(Collections.unmodifiableList(l));
}
return m;
}
/**
* Get the name of the Nth header.
*
* @param i the header index.
*
* @return the header name.
*
* @see #getHeaderValue
*/
public String getHeaderName(int i)
{
if (i >= headers.size() || i < 0)
return null;
return ((HeaderElement)headers.get(i)).name;
}
/**
* Get the value of the Nth header.
*
* @param i the header index.
*
* @return the header value.
*
* @see #getHeaderName
*/
public String getHeaderValue(int i)
{
if (i >= headers.size() || i < 0)
return null;
return ((HeaderElement)headers.get(i)).value;
}
}

View file

@ -1,5 +1,5 @@
/* Request.java --
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -93,11 +93,6 @@ public class Request
*/
protected RequestBodyWriter requestBodyWriter;
/**
* Request body negotiation threshold for 100-continue expectations.
*/
protected int requestBodyNegotiationThreshold;
/**
* Map of response header handlers.
*/
@ -127,7 +122,6 @@ public class Request
this.path = path;
requestHeaders = new Headers();
responseHeaderHandlers = new HashMap();
requestBodyNegotiationThreshold = 4096;
}
/**
@ -250,21 +244,6 @@ public class Request
this.authenticator = authenticator;
}
/**
* Sets the request body negotiation threshold.
* If this is set, it determines the maximum size that the request body
* may be before body negotiation occurs(via the
* <code>100-continue</code> expectation). This ensures that a large
* request body is not sent when the server wouldn't have accepted it
* anyway.
* @param threshold the body negotiation threshold, or &lt;=0 to disable
* request body negotation entirely
*/
public void setRequestBodyNegotiationThreshold(int threshold)
{
requestBodyNegotiationThreshold = threshold;
}
/**
* Dispatches this request.
* A request can only be dispatched once; calling this method a second
@ -291,10 +270,10 @@ public class Request
if (requestBodyWriter != null)
{
contentLength = requestBodyWriter.getContentLength();
if (contentLength > requestBodyNegotiationThreshold)
String expect = getHeader("Expect");
if (expect != null && expect.equals("100-continue"))
{
expectingContinue = true;
setHeader("Expect", "100-continue");
}
else
{
@ -323,12 +302,10 @@ public class Request
String line = method + ' ' + requestUri + ' ' + version + CRLF;
out.write(line.getBytes(US_ASCII));
// Request headers
for (Iterator i = requestHeaders.keySet().iterator();
i.hasNext(); )
for (Iterator i = requestHeaders.iterator(); i.hasNext(); )
{
String name =(String) i.next();
String value =(String) requestHeaders.get(name);
line = name + HEADER_SEP + value + CRLF;
Headers.HeaderElement elt = (Headers.HeaderElement)i.next();
line = elt.name + HEADER_SEP + elt.value + CRLF;
out.write(line.getBytes(US_ASCII));
}
out.write(CRLF.getBytes(US_ASCII));
@ -459,23 +436,17 @@ public class Request
void notifyHeaderHandlers(Headers headers)
{
for (Iterator i = headers.entrySet().iterator(); i.hasNext(); )
for (Iterator i = headers.iterator(); i.hasNext(); )
{
Map.Entry entry = (Map.Entry) i.next();
String name =(String) entry.getKey();
Headers.HeaderElement entry = (Headers.HeaderElement) i.next();
// Handle Set-Cookie
if ("Set-Cookie".equalsIgnoreCase(name))
{
String value = (String) entry.getValue();
handleSetCookie(value);
}
if ("Set-Cookie".equalsIgnoreCase(entry.name))
handleSetCookie(entry.value);
ResponseHeaderHandler handler =
(ResponseHeaderHandler) responseHeaderHandlers.get(name);
(ResponseHeaderHandler) responseHeaderHandlers.get(entry.name);
if (handler != null)
{
String value = (String) entry.getValue();
handler.setValue(value);
}
handler.setValue(entry.value);
}
}
@ -528,6 +499,9 @@ public class Request
throw new ProtocolException("Unsupported Content-Encoding: " +
contentCoding);
}
// Remove the Content-Encoding header because the content is
// no longer compressed.
responseHeaders.remove("Content-Encoding");
}
return in;
}

View file

@ -1,5 +1,5 @@
/* Response.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -188,6 +188,28 @@ public class Response
{
return headers.getDateValue(name);
}
/**
* Tests whether this response indicates a redirection.
*
* @return <code>true</code> if, <code>false</code> otherwise.
*/
public boolean isRedirect()
{
return (code != 304 && getCodeClass() == 3);
}
/**
* Tests whether this response indicates an error.
* Errors are the response codes <code>4xx</code> - Client error and
* <code>5xx</code> - Server error.
*
* @return <code>true</code> if, <code>false</code> otherwise.
*/
public boolean isError()
{
return (getCodeClass() == 4 || getCodeClass() == 5);
}
/**
* Returns an InputStream that returns the body of the response.

View file

@ -41,7 +41,7 @@ package gnu.java.net.protocol.http;
/**
* Callback interface for objects that wish to be notified of response
* header values.
* @see Request#setHeaderHandler(String)
* @see Request#setResponseHeaderHandler(String, ResponseHeaderHandler)
*
* @author Chris Burdess (dog@gnu.org)
*/

View file

@ -1,5 +1,5 @@
/* Connection - jar url connection for java.net
Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
Copyright (C) 1999, 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.net.protocol.jar;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -145,7 +146,7 @@ public final class Connection extends JarURLConnection
jar_entry = (JarEntry) jar_file.getEntry (entry_name);
if(jar_entry == null)
throw new IOException ("No entry for " + entry_name + " exists.");
throw new FileNotFoundException("No entry for " + entry_name + " exists.");
}
connected = true;
@ -159,9 +160,6 @@ public final class Connection extends JarURLConnection
if (! doInput)
throw new ProtocolException("Can't open InputStream if doInput is false");
if (jar_entry == null)
throw new IOException (jar_url + " couldn't be found.");
return jar_file.getInputStream (jar_entry);
}

View file

@ -527,7 +527,7 @@ public final class FileChannelImpl extends FileChannel
throws IOException
{
if (newPosition < 0)
throw new IllegalArgumentException ("newPostition: " + newPosition);
throw new IllegalArgumentException ("newPosition: " + newPosition);
if (!isOpen ())
throw new ClosedChannelException ();

View file

@ -81,7 +81,8 @@ public final class Provider extends CharsetProvider
*/
private boolean extendedLoaded;
private Provider ()
// Package private to avoid an accessor method in PrivilegedAction below.
Provider ()
{
extendedLoaded = false;
canonicalNames = new HashMap ();

View file

@ -44,7 +44,6 @@ import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;
final class IconvDecoder extends CharsetDecoder

View file

@ -43,7 +43,6 @@ import gnu.classpath.Pointer;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;

View file

@ -40,8 +40,6 @@ package gnu.java.nio.charset.iconv;
import java.nio.charset.Charset;
import java.nio.charset.spi.CharsetProvider;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

View file

@ -8,7 +8,7 @@ GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
@ -49,70 +49,146 @@ import java.rmi.server.RMISocketFactory;
import java.util.Hashtable;
/**
* I let DGCImpl to extend UnicastServerRef, but not
* UnicastRemoteObject, because UnicastRemoteObject must
* exportObject automatically.
*/
* The DGC implementation is used for the server side during the distributed
* garbage collection. This interface contains the two methods: dirty and clean.
* A dirty call is made when a remote reference is unmarshaled in a client. A
* corresponding clean call is made by client it no longer uses that remote
* reference. A reference to a remote object is also automatically released
* after so called lease period that starts after the dirty call is received. It
* is the client's responsibility to renew the leases, by making additional
* dirty calls before such leases expire.
*/
public class DGCImpl
extends UnicastServerRef implements DGC {
extends UnicastServerRef
implements DGC
{
/*
* The DGCImpl extends UnicastServerRef and not UnicastRemoteObject, because
* UnicastRemoteObject must exportObject automatically.
*/
/**
* This defauld lease value is used if the lease value, passed to the
* {@link #dirty} is equal to zero.
*/
static final long LEASE_VALUE = 600000L;
private static final long LEASE_VALUE = 600000L;
// leaseCache caches a LeaseRecord associated with a vmid
private Hashtable leaseCache = new Hashtable();
// leaseCache caches a LeaseRecord associated with a vmid
Hashtable leaseCache = new Hashtable();
public DGCImpl() throws RemoteException {
super(new ObjID(ObjID.DGC_ID), 0, RMISocketFactory.getSocketFactory());
}
public DGCImpl() throws RemoteException
{
super(new ObjID(ObjID.DGC_ID), 0, RMISocketFactory.getSocketFactory());
}
/**
* Mark the given objects referecnes as used on the client side.
*
* @param ids the ids of the used objects.
* @param sequenceNum the number of the call (used to detect and discard late
* calls).
* @param lease the requested lease
* @return the granted lease
*/
public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease)
throws RemoteException
{
VMID vmid = lease.getVMID();
if (vmid == null)
vmid = new VMID();
long leaseValue = lease.getValue();
if (leaseValue <= 0)
leaseValue = LEASE_VALUE;
public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease) throws RemoteException {
VMID vmid = lease.getVMID();
if (vmid == null)
vmid = new VMID();
long leaseValue = LEASE_VALUE;
//long leaseValue = lease.getValue();
lease = new Lease(vmid, leaseValue);
synchronized(leaseCache){
LeaseRecord lr = (LeaseRecord)leaseCache.get(vmid);
if (lr != null)
lr.reset(leaseValue);
else{
lr = new LeaseRecord(vmid, leaseValue);
leaseCache.put(vmid, lr);
}
}
return (lease);
}
public void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong) throws RemoteException {
// Not implemented
}
LeaseRecord lr = (LeaseRecord) leaseCache.get(vmid);
if (lr != null)
lr.reset(leaseValue);
else
{
lr = new LeaseRecord(vmid, leaseValue, ids);
leaseCache.put(vmid, lr);
}
return (lease);
}
/**
* Mark the given objects as no longer used on the client side.
*
* @param ids the ids of the objects that are no longer used.
* @param sequenceNum the number of the call (used to detect and discard late
* calls)
* @param vmid the VMID of the client.
* @param strong make the "strong" clean call.
*/
public void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong)
throws RemoteException
{
// Not implemented
// TODO implement
}
/**
* LeaseRecord associates a vmid to expireTime.
*/
private static class LeaseRecord{
private VMID vmid;
private long expireTime;
static class LeaseRecord
{
/**
* The lease id.
*/
final VMID vmid;
/**
* The lease expiration time.
*/
long expireTime;
LeaseRecord(VMID vmid, long leaseValue){
/**
* The array of ObjeID's that must be protected from being garbage
* collected.
*/
final ObjID [] objects;
/**
* Create the new lease record.
*
* @param vmid lease id.
* @param leaseValue lease value
*/
LeaseRecord(VMID vmid, long leaseValue, ObjID [] an_objects)
{
this.vmid = vmid;
reset(leaseValue);
objects = an_objects;
}
// reset expireTime
void reset(long leaseValue){
/**
* Prolong the expiration time till current time + passed value
*
* @param leaseValue the value after that (since the current moment)
* the lease should expire in the future.
*/
void reset(long leaseValue)
{
long l = System.currentTimeMillis();
expireTime = l + leaseValue;
}
boolean isExpired(){
/**
* Check if the lease has been expired.
*
* @return true if the lease has been expired, false if it is still valid.
*/
boolean isExpired()
{
long l = System.currentTimeMillis();
if ( l > expireTime)
return true;
if (l > expireTime)
return true;
return false;
}
} //End of LeaseRecord
} //End of DGCImpl
} // End of LeaseRecord
} // End of DGCImpl

View file

@ -111,7 +111,7 @@ public static void version() {
+ System.getProperty("java.vm.name")
+ ") "
+ System.getProperty("java.vm.version"));
System.out.println("Copyright 2005 Free Software Foundation, Inc.");
System.out.println("Copyright 2006 Free Software Foundation, Inc.");
System.out.println("This is free software; see the source for copying conditions. There is NO");
System.out.println("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
System.exit(0);

View file

@ -0,0 +1,149 @@
/* CombinedClassLoader.java -- Multiple class loader support for proxy.
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.rmi.server;
import java.io.IOException;
import java.net.URL;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.ArrayList;
/**
* This class supports the multiple class loaders to load the resources. It is
* used for constructing proxy classes that implement interfaces, loaded by
* the several different class loaders.
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
public class CombinedClassLoader extends ClassLoader
{
/**
* The class loader array.
*/
ClassLoader[] loaders;
/**
* Create a new combined class loader that uses the given collection of
* loaders to load the classes and resources. The loader order is equal to
* the order, returned by the collection interator. The duplicate loaders
* are discarded and the system class loader is added as the last loader.
*
* @param a_loaders the loadery collection (may contain duplicate instances
* that will be discarded.
*/
public CombinedClassLoader(Collection a_loaders)
{
ArrayList sLoaders = new ArrayList(a_loaders.size());
Iterator iter = a_loaders.iterator();
Object cl;
while (iter.hasNext())
{
cl = iter.next();
if (!sLoaders.contains(cl))
sLoaders.add(iter.next());
}
loaders = new ClassLoader[sLoaders.size()];
for (int i = 0; i < loaders.length; i++)
loaders[i] = (ClassLoader) sLoaders.get(i);
}
/**
* Find the class with the given name.
*/
protected Class findClass(String name) throws ClassNotFoundException
{
for (int i = 0; i < loaders.length; i++)
{
try
{
return findClass(name);
}
catch (ClassNotFoundException e)
{
// try another.
}
}
return super.findClass(name);
}
/**
* Find the library with the given name
*/
protected String findLibrary(String name)
{
for (int i = 0; i < loaders.length; i++)
{
String lib = findLibrary(name);
if (lib != null)
return lib;
}
return super.findLibrary(name);
}
/**
* Find resource with the given name.
*/
protected URL findResource(String name)
{
for (int i = 0; i < loaders.length; i++)
{
URL resource = findResource(name);
if (resource != null)
return resource;
}
return super.findResource(name);
}
/**
* Find resources with the given name.
*/
protected Enumeration findResources(String name) throws IOException
{
for (int i = 0; i < loaders.length; i++)
{
Enumeration resource = findResources(name);
if (resource != null)
return resource;
}
return super.findResources(name); }
}

View file

@ -46,6 +46,7 @@ import java.io.ObjectStreamClass;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.rmi.server.RMIClassLoader;
import java.util.ArrayList;
public class RMIObjectInputStream
extends ObjectInputStream {
@ -76,28 +77,51 @@ protected Object getAnnotation()
return readObject();
}
protected Class resolveProxyClass(String intfs[])
throws IOException, ClassNotFoundException
{
String annotation = (String)getAnnotation();
protected Class resolveProxyClass(String intfs[]) throws IOException,
ClassNotFoundException
{
String annotation = (String) getAnnotation();
Class clss[] = new Class[intfs.length];
if(annotation == null)
clss[0] = RMIClassLoader.loadClass(intfs[0]);
else
clss[0] = RMIClassLoader.loadClass(annotation, intfs[0]);
//assume all interfaces can be loaded by the same classloader
ClassLoader loader = clss[0].getClassLoader();
for (int i = 0; i < intfs.length; i++)
clss[i] = Class.forName(intfs[i], false, loader);
try {
return Proxy.getProxyClass(loader, clss);
} catch (IllegalArgumentException e) {
throw new ClassNotFoundException(null, e);
}
}
{
if (annotation == null)
clss[i] = RMIClassLoader.loadClass(intfs[i]);
else
clss[i] = RMIClassLoader.loadClass(annotation, intfs[i]);
}
ClassLoader loader;
if (clss.length > 0)
{
// Chain all class loaders (they may differ).
ArrayList loaders = new ArrayList(intfs.length);
ClassLoader cx;
for (int i = 0; i < clss.length; i++)
{
cx = clss[i].getClassLoader();
if (!loaders.contains(cx))
{
loaders.add(0, cx);
}
}
loader = new CombinedClassLoader(loaders);
}
else
loader = ClassLoader.getSystemClassLoader();
try
{
return Proxy.getProxyClass(loader, clss);
}
catch (IllegalArgumentException e)
{
throw new ClassNotFoundException(null, e);
}
}
protected Object readValue(Class valueClass) throws IOException, ClassNotFoundException {
if(valueClass.isPrimitive()){

View file

@ -1,5 +1,5 @@
/* UnicastServerRef.java --
Copyright (c) 1996, 1997, 1998, 1999, 2002, 2003, 2004
Copyright (c) 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -43,263 +43,433 @@ import java.io.ObjectInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.ObjID;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.RemoteObjectInvocationHandler;
import java.rmi.server.RemoteRef;
import java.rmi.server.RemoteServer;
import java.rmi.server.RemoteStub;
import java.rmi.server.ServerNotActiveException;
import java.rmi.server.ServerRef;
import java.rmi.server.Skeleton;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
public class UnicastServerRef
extends UnicastRef
implements ServerRef{ //SHOULD implement ServerRef
extends UnicastRef
{
final static private Class[] stubprototype = new Class[] { RemoteRef.class };
/**
* Use GNU Classpath v 0.20 SVUID for interoperability
*/
private static final long serialVersionUID = - 5585608108300801246L;
/**
* The class array, defining parameters of the jdk 1.2 RMI stub constructor.
*/
private static final Class[] stubprototype = new Class[] { RemoteRef.class };
/**
* The exported remote object itself.
*/
Remote myself; // save the remote object itself
/**
* The skeleton (if any), associated with the exported remote object.
*/
private Skeleton skel;
/**
* The stub, associated with the exported remote object (may be proxy class).
*/
private Remote stub;
/**
* The method table (RMI hash code to method) of the methods of the
* exported object.
*/
private Hashtable methods = new Hashtable();
Remote myself; //save the remote object itself
private Skeleton skel;
private RemoteStub stub;
private Hashtable methods = new Hashtable();
/**
* Used by serialization.
*/
UnicastServerRef()
{
}
/**
* Used by serialization.
*/
UnicastServerRef()
{
}
public UnicastServerRef(ObjID id, int port, RMIServerSocketFactory ssf)
throws RemoteException
{
super(id);
manager = UnicastConnectionManager.getInstance(port, ssf);
}
/**
* Export the object and return its remote stub. The method tries to locate
* existing stubs and skeletons. If this fails, the method instantiates the
* proxy stub class.
*
* Stubs and skeletons are always ignored (even if present) if the
* java.rmi.server.ignoreStubClasses property is set to true.
*
* @param obj the object being exported.
* @return the stub (existing class or proxy) of the exported object.
* @throws RemoteException if the export failed due any reason
*/
public Remote exportObject(Remote obj) throws RemoteException
{
if (myself == null)
{
myself = obj;
// Save it to server manager, to let client calls in the same VM to
// issue
// local call
manager.serverobj = obj;
public UnicastServerRef(ObjID id, int port, RMIServerSocketFactory ssf) throws RemoteException {
super(id);
manager = UnicastConnectionManager.getInstance(port, ssf);
}
String ignoreStubs;
ClassLoader loader =obj.getClass().getClassLoader();
// Stubs are always searched for the bootstrap classes that may have
// obsolete pattern and may still need also skeletons.
if (loader==null)
ignoreStubs = "false";
else
ignoreStubs = System.getProperty("java.rmi.server.ignoreStubClasses",
"false");
if (! ignoreStubs.equals("true"))
{
// Find and install the stub
Class cls = obj.getClass();
public RemoteStub exportObject(Remote obj) throws RemoteException {
if (myself == null) {
myself = obj;
// Save it to server manager, to let client calls in the same VM to issue
// local call
manager.serverobj = obj;
// where ist the _Stub? (check superclasses also)
Class expCls = expCls = findStubSkelClass(cls);
// Find and install the stub
Class cls = obj.getClass();
Class expCls;
try {
// where ist the _Stub? (check superclasses also)
expCls = findStubSkelClass(cls);
} catch (Exception ex) {
throw new RemoteException("can not find stubs for class: " + cls, ex);
}
if (expCls != null)
{
stub = (RemoteStub) getHelperClass(expCls, "_Stub");
// Find and install the skeleton (if there is one)
skel = (Skeleton) getHelperClass(expCls, "_Skel");
}
}
stub = (RemoteStub)getHelperClass(expCls, "_Stub");
if (stub == null) {
throw new RemoteException("failed to export: " + cls);
}
if (stub == null)
stub = createProxyStub(obj.getClass(), this);
// Find and install the skeleton (if there is one)
skel = (Skeleton)getHelperClass(expCls, "_Skel");
// Build hash of methods which may be called.
buildMethodHash(obj.getClass(), true);
// Build hash of methods which may be called.
buildMethodHash(obj.getClass(), true);
// Export it.
UnicastServer.exportObject(this);
}
// Export it.
UnicastServer.exportObject(this);
}
return (stub);
}
public RemoteStub exportObject(Remote remote, Object obj)
throws RemoteException
{
//FIX ME
return exportObject(remote);
}
public RemoteStub getStub(){
return stub;
}
public boolean unexportObject(Remote obj, boolean force) {
}
/**
* Get the stub (actual class or proxy) of the exported remote object.
*
* @return the remote stub (null if exportObject has not been called).
*/
public Remote getStub()
{
return stub;
}
/**
* Unexport the object (remove methods from the method hashcode table
* and call UnicastServer.unexportObject.
*
* @param obj the object being unexported
* @param force passed to the UnicastServer.unexportObject.
* @return value, returned by the UnicastServer.unexportObject.
*/
public boolean unexportObject(Remote obj, boolean force)
{
// Remove all hashes of methods which may be called.
buildMethodHash(obj.getClass(), false);
return UnicastServer.unexportObject(this, force);
}
}
/**
*
* The Subs/Skels might not there for the actual class, but maybe
* for one of the superclasses.
*
*/
private Class findStubSkelClass(Class startCls) throws Exception {
Class cls = startCls;
/**
* Return the class in the hierarchy for that the stub class is defined.
* The Subs/Skels might not there for the actual class, but maybe for one of
* the superclasses.
*
* @return the class having stub defined, null if none.
*/
private Class findStubSkelClass(Class startCls)
{
Class cls = startCls;
while (true) {
try {
String stubClassname = cls.getName() + "_Stub";
ClassLoader cl = cls.getClassLoader();
Class scls = cl == null ? Class.forName(stubClassname)
: cl.loadClass(stubClassname);
return cls; // found it
} catch (ClassNotFoundException e) {
Class superCls = cls.getSuperclass();
if (superCls == null
|| superCls == java.rmi.server.UnicastRemoteObject.class)
{
throw new Exception("Neither " + startCls
+ " nor one of their superclasses (like" + cls + ")"
+ " has a _Stub");
}
cls = superCls;
}
}
}
while (true)
{
try
{
String stubClassname = cls.getName() + "_Stub";
ClassLoader cl = cls.getClassLoader();
Class scls = cl == null ? Class.forName(stubClassname)
: cl.loadClass(stubClassname);
return cls; // found it
}
catch (ClassNotFoundException e)
{
Class superCls = cls.getSuperclass();
if (superCls == null
|| superCls == java.rmi.server.UnicastRemoteObject.class)
{
return null;
}
cls = superCls;
}
}
}
/**
* Get the helper (assisting) class with the given type.
*
* @param cls the class, for that the helper class is requested. This class
* and the requested helper class must share the same class loader.
*
* @param type the type of the assisting helper. The only currently supported
* non deprecated value is "_Stub" (load jdk 1.1 or 1.2 RMI stub). Another
* (deprecated) value is "_Skel" (load skeleton).
*
* @return the instantiated instance of the helper class or null if the
* helper class cannot be found or instantiated.
*/
private Object getHelperClass(Class cls, String type)
{
try
{
String classname = cls.getName();
ClassLoader cl = cls.getClassLoader();
Class scls = cl == null ? Class.forName(classname + type)
: cl.loadClass(classname + type);
if (type.equals("_Stub"))
{
try
{
// JDK 1.2 stubs
Constructor con = scls.getConstructor(stubprototype);
return (con.newInstance(new Object[] { this }));
}
catch (NoSuchMethodException e)
{
}
catch (InstantiationException e)
{
}
catch (IllegalAccessException e)
{
}
catch (IllegalArgumentException e)
{
}
catch (InvocationTargetException e)
{
}
// JDK 1.1 stubs
RemoteStub stub = (RemoteStub) scls.newInstance();
UnicastRemoteStub.setStubRef(stub, this);
return (stub);
}
else
{
// JDK 1.1 skel
return (scls.newInstance());
}
}
catch (ClassNotFoundException e)
{
}
catch (InstantiationException e)
{
}
catch (IllegalAccessException e)
{
}
return (null);
}
public String getClientHost() throws ServerNotActiveException
{
return RemoteServer.getClientHost();
}
/**
* Build the method has code table and put it into {@link #methods}
* (mapping RMI hashcode tos method). The same method is used to remove
* the table.
*
* @param cls the class for that the method table is built.
* @param build if true, the class methods are added to the table. If
* false, they are removed from the table.
*/
private void buildMethodHash(Class cls, boolean build)
{
Method[] meths = cls.getMethods();
for (int i = 0; i < meths.length; i++)
{
/* Don't need to include any java.xxx related stuff */
if (meths[i].getDeclaringClass().getName().startsWith("java."))
{
continue;
}
long hash = RMIHashes.getMethodHash(meths[i]);
if (build)
methods.put(new Long(hash), meths[i]);
else
methods.remove(new Long(hash));
// System.out.println("meth = " + meths[i] + ", hash = " + hash);
}
}
private Object getHelperClass(Class cls, String type) {
try {
String classname = cls.getName();
ClassLoader cl = cls.getClassLoader();
Class scls = cl == null ? Class.forName(classname + type)
: cl.loadClass(classname + type);
if (type.equals("_Stub")) {
try {
// JDK 1.2 stubs
Constructor con = scls.getConstructor(stubprototype);
return (con.newInstance(new Object[]{this}));
}
catch (NoSuchMethodException e) {
}
catch (InstantiationException e) {
}
catch (IllegalAccessException e) {
}
catch (IllegalArgumentException e) {
}
catch (InvocationTargetException e) {
}
// JDK 1.1 stubs
RemoteStub stub = (RemoteStub)scls.newInstance();
UnicastRemoteStub.setStubRef(stub, this);
return (stub);
}
else {
// JDK 1.1 skel
return (scls.newInstance());
}
}
catch (ClassNotFoundException e) {
}
catch (InstantiationException e) {
}
catch (IllegalAccessException e) {
}
return (null);
}
public String getClientHost() throws ServerNotActiveException {
return RemoteServer.getClientHost();
}
private void buildMethodHash(Class cls, boolean build) {
Method[] meths = cls.getMethods();
for (int i = 0; i < meths.length; i++) {
/* Don't need to include any java.xxx related stuff */
if (meths[i].getDeclaringClass().getName().startsWith("java.")) {
continue;
}
long hash = RMIHashes.getMethodHash(meths[i]);
if(build)
methods.put(new Long (hash), meths[i]);
else
methods.remove(new Long (hash));
//System.out.println("meth = " + meths[i] + ", hash = " + hash);
}
}
Class getMethodReturnType(int method, long hash) throws Exception
{
if (method == -1) {
Method meth = (Method)methods.get(new Long (hash));
Class getMethodReturnType(int method, long hash) throws Exception
{
if (method == - 1)
{
Method meth = (Method) methods.get(new Long(hash));
return meth.getReturnType();
}else
return null;
}
}
else
return null;
}
public Object incomingMessageCall(UnicastConnection conn, int method, long hash) throws Exception {
//System.out.println("method = " + method + ", hash = " + hash);
// If method is -1 then this is JDK 1.2 RMI - so use the hash
// to locate the method
if (method == -1) {
Method meth = (Method)methods.get(new Long (hash));
//System.out.println("class = " + myself.getClass() + ", meth = " + meth);
if (meth == null) {
throw new NoSuchMethodException();
}
public Object incomingMessageCall(UnicastConnection conn, int method,
long hash) throws Exception
{
// System.out.println("method = " + method + ", hash = " + hash);
// If method is -1 then this is JDK 1.2 RMI - so use the hash
// to locate the method
if (method == - 1)
{
Method meth = (Method) methods.get(new Long(hash));
// System.out.println("class = " + myself.getClass() + ", meth = " +
// meth);
if (meth == null)
{
throw new NoSuchMethodException();
}
ObjectInputStream in = conn.getObjectInputStream();
int nrargs = meth.getParameterTypes().length;
Object[] args = new Object[nrargs];
for (int i = 0; i < nrargs; i++) {
/**
* For debugging purposes - we don't handle CodeBases
* quite right so we don't always find the stubs. This
* lets us know that.
*/
try {
// need to handle primitive types
args[i] = ((RMIObjectInputStream)in).readValue(meth.getParameterTypes()[i]);
}
catch (Exception t) {
t.printStackTrace();
throw t;
}
}
//We must reinterpret the exception thrown by meth.invoke()
//return (meth.invoke(myself, args));
Object ret = null;
try{
ret = meth.invoke(myself, args);
}catch(InvocationTargetException e){
Throwable cause = e.getTargetException();
if (cause instanceof Exception) {
throw (Exception)cause;
}
else if (cause instanceof Error) {
throw (Error)cause;
}
else {
throw new Error("The remote method threw a java.lang.Throwable that is neither java.lang.Exception nor java.lang.Error.", e);
}
}
return ret;
}
// Otherwise this is JDK 1.1 style RMI - we find the skeleton
// and invoke it using the method number. We wrap up our
// connection system in a UnicastRemoteCall so it appears in a
// way the Skeleton can handle.
else {
if (skel == null) {
throw new NoSuchMethodException();
}
UnicastRemoteCall call = new UnicastRemoteCall(conn);
skel.dispatch(myself, call, method, hash);
if (!call.isReturnValue())
return RMIVoidValue.INSTANCE;
else
return (call.returnValue());
}
}
ObjectInputStream in = conn.getObjectInputStream();
int nrargs = meth.getParameterTypes().length;
Object[] args = new Object[nrargs];
for (int i = 0; i < nrargs; i++)
{
/**
* For debugging purposes - we don't handle CodeBases quite right so
* we don't always find the stubs. This lets us know that.
*/
try
{
// need to handle primitive types
args[i] = ((RMIObjectInputStream) in)
.readValue(meth.getParameterTypes()[i]);
}
catch (Exception t)
{
t.printStackTrace();
throw t;
}
}
//We must reinterpret the exception thrown by meth.invoke()
//return (meth.invoke(myself, args));
Object ret = null;
try
{
ret = meth.invoke(myself, args);
}
catch (InvocationTargetException e)
{
Throwable cause = e.getTargetException();
if (cause instanceof Exception)
{
throw (Exception) cause;
}
else if (cause instanceof Error)
{
throw (Error) cause;
}
else
{
throw new Error(
"The remote method threw a java.lang.Throwable that"+
" is neither java.lang.Exception nor java.lang.Error.",
e);
}
}
return ret;
}
// Otherwise this is JDK 1.1 style RMI - we find the skeleton
// and invoke it using the method number. We wrap up our
// connection system in a UnicastRemoteCall so it appears in a
// way the Skeleton can handle.
else
{
if (skel == null)
{
throw new NoSuchMethodException();
}
UnicastRemoteCall call = new UnicastRemoteCall(conn);
skel.dispatch(myself, call, method, hash);
if (! call.isReturnValue())
return RMIVoidValue.INSTANCE;
else
return (call.returnValue());
}
}
/**
* Create the 1.2 proxy stub in the case when the pre-generated stub is not
* available of the system is explicitly instructed to use proxy stubs.
*
* @param stubFor the class for that the proxy class must be constructed.
* @param reference the remote reference, used to find the given object
*
* @return the applicable proxy stub.
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
Remote createProxyStub(Class stubFor, RemoteRef reference)
{
// Collect all interfaces, implemented by stubFor and derived from
// Remote (also Remote itself):
HashSet interfaces = new HashSet();
Class c = stubFor;
Class[] intfs;
while (c != null)
{
intfs = c.getInterfaces();
for (int i = 0; i < intfs.length; i++)
{
if (Remote.class.isAssignableFrom(intfs[i]))
interfaces.add(intfs[i]);
}
c = c.getSuperclass();
}
intfs = new Class[interfaces.size()];
Iterator it = interfaces.iterator();
for (int i = 0; i < intfs.length; i++)
intfs[i] = (Class) it.next();
RemoteObjectInvocationHandler handler =
new RemoteObjectInvocationHandler(reference);
Object proxy =
Proxy.newProxyInstance(stubFor.getClassLoader(), intfs, handler);
return (Remote) proxy;
}
}

View file

@ -0,0 +1,374 @@
/* Properties.java -- run-time configuration properties.
Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.PropertyPermission;
/**
* <p>A global object containing build-specific properties that affect the
* behaviour of the generated binaries from this library.</p>
*/
public final class Properties
{
// Debugging methods and variables
// -------------------------------------------------------------------------
private static final String NAME = "Properties";
private static final boolean DEBUG = false;
// private static final int debuglevel = 9;
private static final PrintWriter err = new PrintWriter(System.out, true);
private static void debug(final String s)
{
err.println(">>> " + NAME + ": " + s);
}
// Constants and variables
// -------------------------------------------------------------------------
public static final String VERSION = "gnu.crypto.version";
public static final String PROPERTIES_FILE = "gnu.crypto.properties.file";
public static final String REPRODUCIBLE_PRNG = "gnu.crypto.with.reproducible.prng";
public static final String CHECK_WEAK_KEYS = "gnu.crypto.with.check.for.weak.keys";
public static final String DO_RSA_BLINDING = "gnu.crypto.with.rsa.blinding";
private static final String TRUE = Boolean.TRUE.toString();
private static final String FALSE = Boolean.FALSE.toString();
private static final HashMap props = new HashMap();
private static Properties singleton = null;
private boolean reproducible = false;
private boolean checkForWeakKeys = true;
private boolean doRSABlinding = true;
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial constructor to enforce Singleton pattern. */
private Properties()
{
super();
init();
}
// Class methods
// -------------------------------------------------------------------------
/**
* <p>Returns the string representation of the library global configuration
* property with the designated <code>key</code>.</p>
*
* @param key the case-insensitive, non-null and non-empty name of a
* configuration property.
* @return the string representation of the designated property, or
* <code>null</code> if such property is not yet set, or <code>key</code> is
* empty.
*/
public static final synchronized String getProperty(String key)
{
if (key == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(key, "read"));
key = key.trim().toLowerCase();
if ("".equals(key))
return null;
return (String) props.get(key);
}
/**
* <p>Sets the value of a designated library global configuration property,
* to a string representation of what should be a legal value.</p>
*
* @param key the case-insensitive, non-null and non-empty name of a
* configuration property.
* @param value the non-null, non-empty string representation of a legal
* value of the configuration property named by <code>key</code>.
*/
public static final synchronized void setProperty(String key, String value)
{
if (key == null || value == null)
return;
key = key.trim().toLowerCase();
if ("".equals(key))
return;
if (key.equals(VERSION))
return;
value = value.trim();
if ("".equals(value))
return;
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(key, "write"));
if (key.equals(REPRODUCIBLE_PRNG)
&& (value.equalsIgnoreCase(TRUE) || value.equalsIgnoreCase(FALSE)))
setReproducible(Boolean.valueOf(value).booleanValue());
else if (key.equals(CHECK_WEAK_KEYS)
&& (value.equalsIgnoreCase(TRUE) || value.equalsIgnoreCase(FALSE)))
setCheckForWeakKeys(Boolean.valueOf(value).booleanValue());
else if (key.equals(DO_RSA_BLINDING)
&& (value.equalsIgnoreCase(TRUE) || value.equalsIgnoreCase(FALSE)))
setDoRSABlinding(Boolean.valueOf(value).booleanValue());
else
props.put(key, value);
}
/**
* <p>A convenience method that returns, as a boolean, the library global
* configuration property indicating if the default Pseudo Random Number
* Generator produces, or not, the same bit stream when instantiated.</p>
*
* @return <code>true</code> if the default PRNG produces the same bit stream
* with every VM instance. Returns <code>false</code> if the default PRNG is
* seeded with the time of day of its first invocation.
*/
public static final synchronized boolean isReproducible()
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(REPRODUCIBLE_PRNG, "read"));
return instance().reproducible;
}
/**
* <p>A convenience method that returns, as a boolean, the library global
* configuration property indicating if the implementations of symmetric
* key block ciphers check, or not, for possible/potential weak and semi-weak
* keys that may be produced in the course of generating round encryption
* and/or decryption keys.</p>
*
* @return <code>true</code> if the cipher implementations check for weak and
* semi-weak keys. Returns <code>false</code> if the cipher implementations
* do not check for weak or semi-weak keys.
*/
public static final synchronized boolean checkForWeakKeys()
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(CHECK_WEAK_KEYS, "read"));
return instance().checkForWeakKeys;
}
/**
* <p>A convenience method that returns, as a boolean, the library global
* configuration property indicating if RSA decryption (RSADP primitive),
* does, or not, blinding against timing attacks.</p>
*
* @return <code>true</code> if the RSA decryption primitive includes a
* blinding operation. Returns <code>false</code> if the RSA decryption
* primitive does not include the additional blinding operation.
*/
public static final synchronized boolean doRSABlinding()
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(DO_RSA_BLINDING, "read"));
return instance().doRSABlinding;
}
/**
* <p>A convenience method to set the global property for reproducibility of
* the default PRNG bit stream output.</p>
*
* @param value if <code>true</code> then the default PRNG bit stream output
* is the same with every invocation of the VM.
*/
public static final synchronized void setReproducible(final boolean value)
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(REPRODUCIBLE_PRNG, "write"));
instance().reproducible = value;
props.put(REPRODUCIBLE_PRNG, String.valueOf(value));
}
/**
* <p>A convenience method to set the global property for checking for weak
* and semi-weak cipher keys.</p>
*
* @param value if <code>true</code> then the cipher implementations will
* invoke additional checks for weak and semi-weak key values that may get
* generated.
*/
public static final synchronized void setCheckForWeakKeys(final boolean value)
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(CHECK_WEAK_KEYS, "write"));
instance().checkForWeakKeys = value;
props.put(CHECK_WEAK_KEYS, String.valueOf(value));
}
/**
* <p>A convenience method to set the global property fo adding a blinding
* operation when executing the RSA decryption primitive.</p>
*
* @param value if <code>true</code> then the code for performing the RSA
* decryption primitive will include a blinding operation.
*/
public static final synchronized void setDoRSABlinding(final boolean value)
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(new PropertyPermission(DO_RSA_BLINDING, "write"));
instance().doRSABlinding = value;
props.put(DO_RSA_BLINDING, String.valueOf(value));
}
private static final synchronized Properties instance()
{
if (singleton == null)
singleton = new Properties();
return singleton;
}
// Instance methods
// -------------------------------------------------------------------------
private void init()
{
// default values
props.put(REPRODUCIBLE_PRNG, (reproducible ? "true" : "false"));
props.put(CHECK_WEAK_KEYS, (checkForWeakKeys ? "true" : "false"));
props.put(DO_RSA_BLINDING, (doRSABlinding ? "true" : "false"));
// 1. allow site-wide override by reading a properties file
String propFile = null;
try
{
propFile = (String) AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
return System.getProperty(PROPERTIES_FILE);
}
});
}
catch (SecurityException se)
{
if (DEBUG)
debug("Reading property " + PROPERTIES_FILE
+ " not allowed. Ignored.");
}
if (propFile != null)
{
try
{
final java.util.Properties temp = new java.util.Properties();
final FileInputStream fin = new FileInputStream(propFile);
temp.load(fin);
temp.list(System.out);
props.putAll(temp);
}
catch (IOException ioe)
{
if (DEBUG)
debug("IO error reading " + propFile + ": " + ioe.getMessage());
}
catch (SecurityException se)
{
if (DEBUG)
debug("Security error reading " + propFile + ": "
+ se.getMessage());
}
}
// 2. allow vm-specific override by allowing -D options in launcher
handleBooleanProperty(REPRODUCIBLE_PRNG);
handleBooleanProperty(CHECK_WEAK_KEYS);
handleBooleanProperty(DO_RSA_BLINDING);
// re-sync the 'known' properties
reproducible = new Boolean((String) props.get(REPRODUCIBLE_PRNG)).booleanValue();
checkForWeakKeys = new Boolean((String) props.get(CHECK_WEAK_KEYS)).booleanValue();
doRSABlinding = new Boolean((String) props.get(DO_RSA_BLINDING)).booleanValue();
// This does not change.
props.put(VERSION, Registry.VERSION_STRING);
}
private void handleBooleanProperty(final String name)
{
String s = null;
try
{
s = System.getProperty(name);
}
catch (SecurityException x)
{
if (DEBUG)
debug("SecurityManager forbids reading system properties. Ignored");
}
if (s != null)
{
s = s.trim().toLowerCase();
// we have to test for explicit "true" or "false". anything else may
// hide valid value set previously
if (s.equals(TRUE) || s.equals(FALSE))
{
if (DEBUG)
debug("Setting " + name + " to '" + s + "'");
props.put(name, s);
}
else
{
if (DEBUG)
debug("Invalid value for -D" + name + ": " + s + ". Ignored");
}
}
}
}

View file

@ -0,0 +1,455 @@
/* Registry.java --
Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security;
/**
* A placeholder for <i>names</i> and <i>literals</i> used throughout this
* library.
*/
public interface Registry
{
// Constants
// -------------------------------------------------------------------------
/** The name of our Providers. */
String GNU_SECURITY = "GNU";
String GNU_CRYPTO = "GNU-CRYPTO";
String GNU_SASL = "GNU-SASL";
/** Our version number. */
String VERSION_STRING = "2.1.0";
// Names of properties to use in Maps when initialising primitives .........
// Symmetric block cipher algorithms and synonyms...........................
String ANUBIS_CIPHER = "anubis";
String BLOWFISH_CIPHER = "blowfish";
String DES_CIPHER = "des";
String KHAZAD_CIPHER = "khazad";
String RIJNDAEL_CIPHER = "rijndael";
String SERPENT_CIPHER = "serpent";
String SQUARE_CIPHER = "square";
String TRIPLEDES_CIPHER = "tripledes";
String TWOFISH_CIPHER = "twofish";
String CAST5_CIPHER = "cast5";
String NULL_CIPHER = "null";
/** AES is synonymous to Rijndael for 128-bit block size only. */
String AES_CIPHER = "aes";
/** TripleDES is also known as DESede. */
String DESEDE_CIPHER = "desede";
/** CAST5 is also known as CAST-128. */
String CAST128_CIPHER = "cast128";
String CAST_128_CIPHER = "cast-128";
// Message digest algorithms and synonyms...................................
String WHIRLPOOL_HASH = "whirlpool";
String RIPEMD128_HASH = "ripemd128";
String RIPEMD160_HASH = "ripemd160";
String SHA160_HASH = "sha-160";
String SHA256_HASH = "sha-256";
String SHA384_HASH = "sha-384";
String SHA512_HASH = "sha-512";
String TIGER_HASH = "tiger";
String HAVAL_HASH = "haval";
String MD5_HASH = "md5";
String MD4_HASH = "md4";
String MD2_HASH = "md2";
/** RIPEMD-128 is synonymous to RIPEMD128. */
String RIPEMD_128_HASH = "ripemd-128";
/** RIPEMD-160 is synonymous to RIPEMD160. */
String RIPEMD_160_HASH = "ripemd-160";
/** SHA-1 is synonymous to SHA-160. */
String SHA_1_HASH = "sha-1";
/** SHA1 is synonymous to SHA-160. */
String SHA1_HASH = "sha1";
/** SHA is synonymous to SHA-160. */
String SHA_HASH = "sha";
// Symmetric block cipher modes of operations...............................
/** Electronic CodeBook mode. */
String ECB_MODE = "ecb";
/** Counter (NIST) mode. */
String CTR_MODE = "ctr";
/** Integer Counter Mode (David McGrew). */
String ICM_MODE = "icm";
/** Output Feedback Mode (NIST). */
String OFB_MODE = "ofb";
/** Cipher block chaining mode (NIST). */
String CBC_MODE = "cbc";
/** Cipher feedback mode (NIST). */
String CFB_MODE = "cfb";
/** Authenticated-Encrypted mode. */
String EAX_MODE = "eax";
// Padding scheme names and synonyms........................................
/** PKCS#7 padding scheme. */
String PKCS7_PAD = "pkcs7";
/** Trailing Bit Complement padding scheme. */
String TBC_PAD = "tbc";
/** EME-PKCS1-v1_5 padding as described in section 7.2 in RFC-3447. */
String EME_PKCS1_V1_5_PAD = "eme-pkcs1-v1.5";
/** SSLv3 padding scheme. */
String SSL3_PAD = "ssl3";
/** TLSv1 padding scheme. */
String TLS1_PAD = "tls1";
// Pseudo-random number generators..........................................
/** (Apparently) RC4 keystream PRNG. */
String ARCFOUR_PRNG = "arcfour";
/** We use "rc4" as an alias for "arcfour". */
String RC4_PRNG = "rc4";
/** PRNG based on David McGrew's Integer Counter Mode. */
String ICM_PRNG = "icm";
/** PRNG based on a designated hash function. */
String MD_PRNG = "md";
/** PRNG based on UMAC's Key Derivation Function. */
String UMAC_PRNG = "umac-kdf";
/**
* PRNG based on PBKDF2 from PKCS #5 v.2. This is suffixed with the name
* of a MAC to be used as a PRF.
*/
String PBKDF2_PRNG_PREFIX = "pbkdf2-";
/** The continuously-seeded pseudo-random number generator. */
String CSPRNG_PRNG = "csprng";
/** The Fortuna PRNG. */
String FORTUNA_PRNG = "fortuna";
/** The Fortuna generator PRNG. */
String FORTUNA_GENERATOR_PRNG = "fortuna-generator";
// Asymmetric keypair generators............................................
String DSS_KPG = "dss";
String RSA_KPG = "rsa";
String DH_KPG = "dh";
String SRP_KPG = "srp";
/** DSA is synonymous to DSS. */
String DSA_KPG = "dsa";
// Signature-with-appendix schemes..........................................
String DSS_SIG = "dss";
String RSA_SIG_PREFIX = "rsa-";
String RSA_PSS_ENCODING = "pss";
String RSA_PSS_SIG = RSA_SIG_PREFIX + RSA_PSS_ENCODING;
String RSA_PKCS1_V1_5_ENCODING = "pkcs1-v1.5";
String RSA_PKCS1_V1_5_SIG = RSA_SIG_PREFIX + RSA_PKCS1_V1_5_ENCODING;
/** DSA is synonymous to DSS. */
String DSA_SIG = "dsa";
// Key agreement protocols .................................................
String DH_KA = "dh";
String ELGAMAL_KA = "elgamal";
String SRP6_KA = "srp6";
String SRP_SASL_KA = "srp-sasl";
String SRP_TLS_KA = "srp-tls";
// Keyed-Hash Message Authentication Code ..................................
/** Name prefix of every HMAC implementation. */
String HMAC_NAME_PREFIX = "hmac-";
// Other MAC algorithms ....................................................
/** The One-key CBC MAC. */
String OMAC_PREFIX = "omac-";
/** Message Authentication Code using Universal Hashing (Ted Krovetz). */
String UHASH32 = "uhash32";
String UMAC32 = "umac32";
/** The Truncated Multi-Modular Hash Function -v1 (David McGrew). */
String TMMH16 = "tmmh16";
// String TMMH32 = "tmmh32";
// Format IDs used to identify how we externalise asymmetric keys ..........
// fully-qualified names of the supported codecs
String RAW_ENCODING = "gnu.crypto.raw.format";
String X509_ENCODING = "gnu.crypto.x509.format";
String PKCS8_ENCODING = "gnu.crypto.pkcs8.format";
String ASN1_ENCODING = "gnu.crypto.asn1.format";
// short names of the same. used by JCE adapters
String RAW_ENCODING_SHORT_NAME = "RAW";
String X509_ENCODING_SORT_NAME = "X.509";
String PKCS8_ENCODING_SHORT_NAME = "PKCS#8";
String ASN1_ENCODING_SHORT_NAME = "ASN.1";
// unique identifiers of the same
int RAW_ENCODING_ID = 1;
int X509_ENCODING_ID = 2;
int PKCS8_ENCODING_ID = 3;
int ASN1_ENCODING_ID = 4;
// OID strings used in encoding/decoding keys
String DSA_OID_STRING = "1.2.840.10040.4.1";
String RSA_OID_STRING = "1.2.840.113549.1.1.1";
String DH_OID_STRING = "1.2.840.10046.2.1";
// Magic bytes we generate/expect in externalised asymmetric keys ..........
// the four bytes represent G (0x47) for GNU, 1 (0x01) for Raw format,
// D (0x44) for DSS, R (0x52) for RSA, H (0x48) for Diffie-Hellman, or S
// (0x53) for SRP-6, and finally P (0x50) for Public, p (0x70) for private,
// or S (0x53) for signature.
byte[] MAGIC_RAW_DSS_PUBLIC_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x44,
0x50 };
byte[] MAGIC_RAW_DSS_PRIVATE_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x44,
0x70 };
byte[] MAGIC_RAW_DSS_SIGNATURE = new byte[] { 0x47, RAW_ENCODING_ID, 0x44,
0x53 };
byte[] MAGIC_RAW_RSA_PUBLIC_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x52,
0x50 };
byte[] MAGIC_RAW_RSA_PRIVATE_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x52,
0x70 };
byte[] MAGIC_RAW_RSA_PSS_SIGNATURE = new byte[] { 0x47, RAW_ENCODING_ID,
0x52, 0x53 };
byte[] MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE = new byte[] { 0x47, RAW_ENCODING_ID,
0x52, 0x54 };
byte[] MAGIC_RAW_DH_PUBLIC_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x48,
0x50 };
byte[] MAGIC_RAW_DH_PRIVATE_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x48,
0x70 };
byte[] MAGIC_RAW_SRP_PUBLIC_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x53,
0x50 };
byte[] MAGIC_RAW_SRP_PRIVATE_KEY = new byte[] { 0x47, RAW_ENCODING_ID, 0x53,
0x70 };
// SASL Property names .....................................................
String SASL_PREFIX = "gnu.crypto.sasl";
/** Name of username property. */
String SASL_USERNAME = SASL_PREFIX + ".username";
/** Name of password property. */
String SASL_PASSWORD = SASL_PREFIX + ".password";
/** Name of authentication information provider packages. */
String SASL_AUTH_INFO_PROVIDER_PKGS = SASL_PREFIX
+ ".auth.info.provider.pkgs";
/** SASL authorization ID. */
String SASL_AUTHORISATION_ID = SASL_PREFIX + ".authorisation.ID";
/** SASL protocol. */
String SASL_PROTOCOL = SASL_PREFIX + ".protocol";
/** SASL Server name. */
String SASL_SERVER_NAME = SASL_PREFIX + ".server.name";
/** SASL Callback handler. */
String SASL_CALLBACK_HANDLER = SASL_PREFIX + ".callback.handler";
/** SASL channel binding. */
String SASL_CHANNEL_BINDING = SASL_PREFIX + ".channel.binding";
// SASL data element size limits ...........................................
/** The size limit, in bytes, of a SASL OS (Octet Sequence) element. */
int SASL_ONE_BYTE_MAX_LIMIT = 255;
/**
* The size limit, in bytes, of both a SASL MPI (Multi-Precision Integer)
* element and a SASL Text element.
*/
int SASL_TWO_BYTE_MAX_LIMIT = 65535;
/** The size limit, in bytes, of a SASL EOS (Extended Octet Sequence) element. */
int SASL_FOUR_BYTE_MAX_LIMIT = 2147483383;
/** The size limit, in bytes, of a SASL Buffer. */
int SASL_BUFFER_MAX_LIMIT = 2147483643;
// Canonical names of SASL mechanisms ......................................
String SASL_ANONYMOUS_MECHANISM = "ANONYMOUS";
String SASL_CRAM_MD5_MECHANISM = "CRAM-MD5";
String SASL_PLAIN_MECHANISM = "PLAIN";
String SASL_SRP_MECHANISM = "SRP";
// Canonical names of Integrity Protection algorithms ......................
String SASL_HMAC_MD5_IALG = "HMACwithMD5";
String SASL_HMAC_SHA_IALG = "HMACwithSHA";
// Quality Of Protection string representations ............................
/** authentication only. */
String QOP_AUTH = "auth";
/** authentication plus integrity protection. */
String QOP_AUTH_INT = "auth-int";
/** authentication plus integrity and confidentiality protection. */
String QOP_AUTH_CONF = "auth-conf";
// SASL mechanism strength string representation ...........................
String STRENGTH_HIGH = "high";
String STRENGTH_MEDIUM = "medium";
String STRENGTH_LOW = "low";
// SASL Server Authentication requirement ..................................
/** Server must authenticate to the client. */
String SERVER_AUTH_TRUE = "true";
/** Server does not need to, or cannot, authenticate to the client. */
String SERVER_AUTH_FALSE = "false";
// SASL mechanism reuse capability .........................................
String REUSE_TRUE = "true";
String REUSE_FALSE = "false";
// Keyrings ...............................................................
byte[] GKR_MAGIC = new byte[] { 0x47, 0x4b, 0x52, 0x01 };
// Ring usage fields.
int GKR_PRIVATE_KEYS = 1 << 0;
int GKR_PUBLIC_CREDENTIALS = 1 << 1;
int GKR_CERTIFICATES = 1 << 2;
// HMac types.
int GKR_HMAC_MD5_128 = 0;
int GKR_HMAC_SHA_160 = 1;
int GKR_HMAC_MD5_96 = 2;
int GKR_HMAC_SHA_96 = 3;
// Cipher types.
int GKR_CIPHER_AES_128_OFB = 0;
int GKR_CIPHER_AES_128_CBC = 1;
// Methods
// -------------------------------------------------------------------------
}

View file

@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.der;
import gnu.java.security.x509.Util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -108,7 +110,9 @@ public class DERValue implements DER
}
catch (IOException ioe)
{
encoded = new byte[0];
IllegalArgumentException iae = new IllegalArgumentException ();
iae.initCause (ioe);
throw iae;
}
}
return length;
@ -138,7 +142,9 @@ public class DERValue implements DER
}
catch (IOException ioe)
{
encoded = new byte[0];
IllegalArgumentException iae = new IllegalArgumentException ();
iae.initCause (ioe);
throw iae;
}
}
return (byte[]) encoded.clone();
@ -156,7 +162,9 @@ public class DERValue implements DER
}
catch (IOException ioe)
{
encoded = new byte[0];
IllegalArgumentException iae = new IllegalArgumentException ();
iae.initCause (ioe);
throw iae;
}
}
return encoded.length;
@ -164,7 +172,18 @@ public class DERValue implements DER
public String toString()
{
return "DERValue [ tag=" + tag + ", class=" + tagClass + ", constructed="
+ constructed + ", value=" + value + " ]";
String start = "DERValue ( [";
if (tagClass == DER.UNIVERSAL)
start = start + "UNIVERSAL ";
else if (tagClass == DER.PRIVATE)
start = start + "PRIVATE ";
else if (tagClass == DER.APPLICATION)
start = start + "APPLICATION ";
start = start + tag + "] constructed=" + constructed + ", value=";
if (constructed)
start = start + "\n" + Util.hexDump(getEncoded(), "\t");
else
start = start + value;
return start + " )";
}
}

View file

@ -84,6 +84,12 @@ public class DERWriter implements DER
public static int write(OutputStream out, DERValue object)
throws IOException
{
if (DER.CONSTRUCTED_VALUE.equals (object.getValue ()))
{
out.write (object.getEncoded ());
return object.getLength ();
}
out.write(object.getExternalTag());
Object value = object.getValue();
if (value == null)
@ -216,10 +222,10 @@ public class DERWriter implements DER
throws IOException
{
byte[] buf = bs.getShiftedByteArray();
out.write(buf.length + 1);
writeLength(out, buf.length + 1);
out.write(bs.getIgnoredBits());
out.write(buf);
return buf.length;
return buf.length + 1;
}
private static int writeString(OutputStream out, int tag, String str)

View file

@ -0,0 +1,206 @@
/* BaseHash.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
/**
* <p>A base abstract class to facilitate hash implementations.</p>
*/
public abstract class BaseHash implements IMessageDigest
{
// Constants and variables
// -------------------------------------------------------------------------
/** The canonical name prefix of the hash. */
protected String name;
/** The hash (output) size in bytes. */
protected int hashSize;
/** The hash (inner) block size in bytes. */
protected int blockSize;
/** Number of bytes processed so far. */
protected long count;
/** Temporary input buffer. */
protected byte[] buffer;
// Constructor(s)
// -------------------------------------------------------------------------
/**
* <p>Trivial constructor for use by concrete subclasses.</p>
*
* @param name the canonical name prefix of this instance.
* @param hashSize the block size of the output in bytes.
* @param blockSize the block size of the internal transform.
*/
protected BaseHash(String name, int hashSize, int blockSize)
{
super();
this.name = name;
this.hashSize = hashSize;
this.blockSize = blockSize;
this.buffer = new byte[blockSize];
resetContext();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// IMessageDigest interface implementation ---------------------------------
public String name()
{
return name;
}
public int hashSize()
{
return hashSize;
}
public int blockSize()
{
return blockSize;
}
public void update(byte b)
{
// compute number of bytes still unhashed; ie. present in buffer
int i = (int) (count % blockSize);
count++;
buffer[i] = b;
if (i == (blockSize - 1))
{
transform(buffer, 0);
}
}
public void update(byte[] b)
{
update(b, 0, b.length);
}
public void update(byte[] b, int offset, int len)
{
int n = (int) (count % blockSize);
count += len;
int partLen = blockSize - n;
int i = 0;
if (len >= partLen)
{
System.arraycopy(b, offset, buffer, n, partLen);
transform(buffer, 0);
for (i = partLen; i + blockSize - 1 < len; i += blockSize)
{
transform(b, offset + i);
}
n = 0;
}
if (i < len)
{
System.arraycopy(b, offset + i, buffer, n, len - i);
}
}
public byte[] digest()
{
byte[] tail = padBuffer(); // pad remaining bytes in buffer
update(tail, 0, tail.length); // last transform of a message
byte[] result = getResult(); // make a result out of context
reset(); // reset this instance for future re-use
return result;
}
public void reset()
{ // reset this instance for future re-use
count = 0L;
for (int i = 0; i < blockSize;)
{
buffer[i++] = 0;
}
resetContext();
}
// methods to be implemented by concrete subclasses ------------------------
public abstract Object clone();
public abstract boolean selfTest();
/**
* <p>Returns the byte array to use as padding before completing a hash
* operation.</p>
*
* @return the bytes to pad the remaining bytes in the buffer before
* completing a hash operation.
*/
protected abstract byte[] padBuffer();
/**
* <p>Constructs the result from the contents of the current context.</p>
*
* @return the output of the completed hash operation.
*/
protected abstract byte[] getResult();
/** Resets the instance for future re-use. */
protected abstract void resetContext();
/**
* <p>The block digest transformation per se.</p>
*
* @param in the <i>blockSize</i> long block, as an array of bytes to digest.
* @param offset the index where the data to digest is located within the
* input buffer.
*/
protected abstract void transform(byte[] in, int offset);
}

View file

@ -0,0 +1,178 @@
/* HashFactory.java --
Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* <p>A <i>Factory</i> to instantiate message digest algorithm instances.</p>
*/
public class HashFactory
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial constructor to enforce <i>Singleton</i> pattern. */
private HashFactory()
{
super();
}
// Class methods
// -------------------------------------------------------------------------
/**
* <p>Return an instance of a hash algorithm given its name.</p>
*
* @param name the name of the hash algorithm.
* @return an instance of the hash algorithm, or null if none found.
* @exception InternalError if the implementation does not pass its self-
* test.
*/
public static IMessageDigest getInstance(String name)
{
if (name == null)
{
return null;
}
name = name.trim();
IMessageDigest result = null;
if (name.equalsIgnoreCase(Registry.WHIRLPOOL_HASH))
{
result = new Whirlpool();
}
else if (name.equalsIgnoreCase(Registry.RIPEMD128_HASH)
|| name.equalsIgnoreCase(Registry.RIPEMD_128_HASH))
{
result = new RipeMD128();
}
else if (name.equalsIgnoreCase(Registry.RIPEMD160_HASH)
|| name.equalsIgnoreCase(Registry.RIPEMD_160_HASH))
{
result = new RipeMD160();
}
else if (name.equalsIgnoreCase(Registry.SHA160_HASH)
|| name.equalsIgnoreCase(Registry.SHA_1_HASH)
|| name.equalsIgnoreCase(Registry.SHA1_HASH)
|| name.equalsIgnoreCase(Registry.SHA_HASH))
{
result = new Sha160();
}
else if (name.equalsIgnoreCase(Registry.SHA256_HASH))
{
result = new Sha256();
}
else if (name.equalsIgnoreCase(Registry.SHA384_HASH))
{
result = new Sha384();
}
else if (name.equalsIgnoreCase(Registry.SHA512_HASH))
{
result = new Sha512();
}
else if (name.equalsIgnoreCase(Registry.TIGER_HASH))
{
result = new Tiger();
}
else if (name.equalsIgnoreCase(Registry.HAVAL_HASH))
{
result = new Haval();
}
else if (name.equalsIgnoreCase(Registry.MD5_HASH))
{
result = new MD5();
}
else if (name.equalsIgnoreCase(Registry.MD4_HASH))
{
result = new MD4();
}
else if (name.equalsIgnoreCase(Registry.MD2_HASH))
{
result = new MD2();
}
else if (name.equalsIgnoreCase(Registry.HAVAL_HASH))
{
result = new Haval();
}
if (result != null && !result.selfTest())
{
throw new InternalError(result.name());
}
return result;
}
/**
* <p>Returns a {@link Set} of names of hash algorithms supported by this
* <i>Factory</i>.</p>
*
* @return a {@link Set} of hash names (Strings).
*/
public static final Set getNames()
{
HashSet hs = new HashSet();
hs.add(Registry.WHIRLPOOL_HASH);
hs.add(Registry.RIPEMD128_HASH);
hs.add(Registry.RIPEMD160_HASH);
hs.add(Registry.SHA160_HASH);
hs.add(Registry.SHA256_HASH);
hs.add(Registry.SHA384_HASH);
hs.add(Registry.SHA512_HASH);
hs.add(Registry.TIGER_HASH);
hs.add(Registry.HAVAL_HASH);
hs.add(Registry.MD5_HASH);
hs.add(Registry.MD4_HASH);
hs.add(Registry.MD2_HASH);
return Collections.unmodifiableSet(hs);
}
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,759 @@
/* Haval.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>The <i>HAVAL</i> message-digest algorithm is a variable output length,
* with variable number of rounds. By default, this implementation allows
* <i>HAVAL</i> to be used as a drop-in replacement for <i>MD5</i>.</p>
*
* <p>References:</p>
*
* <ol>
* <li>HAVAL - A One-Way Hashing Algorithm with Variable Length of Output<br>
* Advances in Cryptology - AUSCRYPT'92, Lecture Notes in Computer Science,<br>
* Springer-Verlag, 1993; <br>
* Y. Zheng, J. Pieprzyk and J. Seberry.</li>
* </ol>
*/
public class Haval extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
public static final int HAVAL_VERSION = 1;
public static final int HAVAL_128_BIT = 16;
public static final int HAVAL_160_BIT = 20;
public static final int HAVAL_192_BIT = 24;
public static final int HAVAL_224_BIT = 28;
public static final int HAVAL_256_BIT = 32;
public static final int HAVAL_3_ROUND = 3;
public static final int HAVAL_4_ROUND = 4;
public static final int HAVAL_5_ROUND = 5;
private static final int BLOCK_SIZE = 128; // inner block size in bytes
private static final String DIGEST0 = "C68F39913F901F3DDF44C707357A7D70";
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/**
* Number of HAVAL rounds. Allowed values are integers in the range <code>3
* .. 5</code>. The default is <code>3</code>.
*/
private int rounds = HAVAL_3_ROUND;
/** 128-bit interim result. */
private int h0, h1, h2, h3, h4, h5, h6, h7;
// Constructor(s)
// -------------------------------------------------------------------------
/**
* <p>Calls the constructor with two argument using {@link #HAVAL_128_BIT} as
* the value for the output size (i.e. <code>128</code> bits, and
* {@link #HAVAL_3_ROUND} for the value of number of rounds.</p>
*/
public Haval()
{
this(HAVAL_128_BIT, HAVAL_3_ROUND);
}
/**
* <p>Calls the constructor with two arguments using the designated output
* size, and {@link #HAVAL_3_ROUND} for the value of number of rounds.</p>
*
* @param size the output size in bytes of this instance.
* @throws IllegalArgumentException if the designated output size is invalid.
* @see #HAVAL_128_BIT
* @see #HAVAL_160_BIT
* @see #HAVAL_192_BIT
* @see #HAVAL_224_BIT
* @see #HAVAL_256_BIT
*/
public Haval(int size)
{
this(size, HAVAL_3_ROUND);
}
/**
* <p>Constructs a <code>Haval</code> instance with the designated output
* size (in bytes). Valid output <code>size</code> values are <code>16</code>,
* <code>20</code>, <code>24</code>, <code>28</code> and <code>32</code>.
* Valid values for <code>rounds</code> are in the range <code>3..5</code>
* inclusive.</p>
*
* @param size the output size in bytes of this instance.
* @param rounds the number of rounds to apply when transforming data.
* @throws IllegalArgumentException if the designated output size is invalid,
* or if the number of rounds is invalid.
* @see #HAVAL_128_BIT
* @see #HAVAL_160_BIT
* @see #HAVAL_192_BIT
* @see #HAVAL_224_BIT
* @see #HAVAL_256_BIT
* @see #HAVAL_3_ROUND
* @see #HAVAL_4_ROUND
* @see #HAVAL_5_ROUND
*/
public Haval(int size, int rounds)
{
super(Registry.HAVAL_HASH, size, BLOCK_SIZE);
if (size != HAVAL_128_BIT && size != HAVAL_160_BIT && size != HAVAL_192_BIT
&& size != HAVAL_224_BIT && size != HAVAL_256_BIT)
{
throw new IllegalArgumentException("Invalid HAVAL output size");
}
if (rounds != HAVAL_3_ROUND && rounds != HAVAL_4_ROUND
&& rounds != HAVAL_5_ROUND)
{
throw new IllegalArgumentException("Invalid HAVAL number of rounds");
}
this.rounds = rounds;
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private Haval(Haval md)
{
this(md.hashSize, md.rounds);
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.h4 = md.h4;
this.h5 = md.h5;
this.h6 = md.h6;
this.h7 = md.h7;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Constructor(s)
// -------------------------------------------------------------------------
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new Haval(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected synchronized void transform(byte[] in, int i)
{
int X0 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X1 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X2 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X3 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X4 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X5 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X6 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X7 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X8 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X9 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X10 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X11 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X12 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X13 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X14 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X15 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X16 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X17 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X18 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X19 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X20 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X21 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X22 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X23 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X24 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X25 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X26 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X27 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X28 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X29 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X30 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int X31 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| (in[i++] & 0xFF) << 24;
int t0 = h0, t1 = h1, t2 = h2, t3 = h3, t4 = h4, t5 = h5, t6 = h6, t7 = h7;
// Pass 1
t7 = FF1(t7, t6, t5, t4, t3, t2, t1, t0, X0);
t6 = FF1(t6, t5, t4, t3, t2, t1, t0, t7, X1);
t5 = FF1(t5, t4, t3, t2, t1, t0, t7, t6, X2);
t4 = FF1(t4, t3, t2, t1, t0, t7, t6, t5, X3);
t3 = FF1(t3, t2, t1, t0, t7, t6, t5, t4, X4);
t2 = FF1(t2, t1, t0, t7, t6, t5, t4, t3, X5);
t1 = FF1(t1, t0, t7, t6, t5, t4, t3, t2, X6);
t0 = FF1(t0, t7, t6, t5, t4, t3, t2, t1, X7);
t7 = FF1(t7, t6, t5, t4, t3, t2, t1, t0, X8);
t6 = FF1(t6, t5, t4, t3, t2, t1, t0, t7, X9);
t5 = FF1(t5, t4, t3, t2, t1, t0, t7, t6, X10);
t4 = FF1(t4, t3, t2, t1, t0, t7, t6, t5, X11);
t3 = FF1(t3, t2, t1, t0, t7, t6, t5, t4, X12);
t2 = FF1(t2, t1, t0, t7, t6, t5, t4, t3, X13);
t1 = FF1(t1, t0, t7, t6, t5, t4, t3, t2, X14);
t0 = FF1(t0, t7, t6, t5, t4, t3, t2, t1, X15);
t7 = FF1(t7, t6, t5, t4, t3, t2, t1, t0, X16);
t6 = FF1(t6, t5, t4, t3, t2, t1, t0, t7, X17);
t5 = FF1(t5, t4, t3, t2, t1, t0, t7, t6, X18);
t4 = FF1(t4, t3, t2, t1, t0, t7, t6, t5, X19);
t3 = FF1(t3, t2, t1, t0, t7, t6, t5, t4, X20);
t2 = FF1(t2, t1, t0, t7, t6, t5, t4, t3, X21);
t1 = FF1(t1, t0, t7, t6, t5, t4, t3, t2, X22);
t0 = FF1(t0, t7, t6, t5, t4, t3, t2, t1, X23);
t7 = FF1(t7, t6, t5, t4, t3, t2, t1, t0, X24);
t6 = FF1(t6, t5, t4, t3, t2, t1, t0, t7, X25);
t5 = FF1(t5, t4, t3, t2, t1, t0, t7, t6, X26);
t4 = FF1(t4, t3, t2, t1, t0, t7, t6, t5, X27);
t3 = FF1(t3, t2, t1, t0, t7, t6, t5, t4, X28);
t2 = FF1(t2, t1, t0, t7, t6, t5, t4, t3, X29);
t1 = FF1(t1, t0, t7, t6, t5, t4, t3, t2, X30);
t0 = FF1(t0, t7, t6, t5, t4, t3, t2, t1, X31);
// Pass 2
t7 = FF2(t7, t6, t5, t4, t3, t2, t1, t0, X5, 0x452821E6);
t6 = FF2(t6, t5, t4, t3, t2, t1, t0, t7, X14, 0x38D01377);
t5 = FF2(t5, t4, t3, t2, t1, t0, t7, t6, X26, 0xBE5466CF);
t4 = FF2(t4, t3, t2, t1, t0, t7, t6, t5, X18, 0x34E90C6C);
t3 = FF2(t3, t2, t1, t0, t7, t6, t5, t4, X11, 0xC0AC29B7);
t2 = FF2(t2, t1, t0, t7, t6, t5, t4, t3, X28, 0xC97C50DD);
t1 = FF2(t1, t0, t7, t6, t5, t4, t3, t2, X7, 0x3F84D5B5);
t0 = FF2(t0, t7, t6, t5, t4, t3, t2, t1, X16, 0xB5470917);
t7 = FF2(t7, t6, t5, t4, t3, t2, t1, t0, X0, 0x9216D5D9);
t6 = FF2(t6, t5, t4, t3, t2, t1, t0, t7, X23, 0x8979FB1B);
t5 = FF2(t5, t4, t3, t2, t1, t0, t7, t6, X20, 0xD1310BA6);
t4 = FF2(t4, t3, t2, t1, t0, t7, t6, t5, X22, 0x98DFB5AC);
t3 = FF2(t3, t2, t1, t0, t7, t6, t5, t4, X1, 0x2FFD72DB);
t2 = FF2(t2, t1, t0, t7, t6, t5, t4, t3, X10, 0xD01ADFB7);
t1 = FF2(t1, t0, t7, t6, t5, t4, t3, t2, X4, 0xB8E1AFED);
t0 = FF2(t0, t7, t6, t5, t4, t3, t2, t1, X8, 0x6A267E96);
t7 = FF2(t7, t6, t5, t4, t3, t2, t1, t0, X30, 0xBA7C9045);
t6 = FF2(t6, t5, t4, t3, t2, t1, t0, t7, X3, 0xF12C7F99);
t5 = FF2(t5, t4, t3, t2, t1, t0, t7, t6, X21, 0x24A19947);
t4 = FF2(t4, t3, t2, t1, t0, t7, t6, t5, X9, 0xB3916CF7);
t3 = FF2(t3, t2, t1, t0, t7, t6, t5, t4, X17, 0x0801F2E2);
t2 = FF2(t2, t1, t0, t7, t6, t5, t4, t3, X24, 0x858EFC16);
t1 = FF2(t1, t0, t7, t6, t5, t4, t3, t2, X29, 0x636920D8);
t0 = FF2(t0, t7, t6, t5, t4, t3, t2, t1, X6, 0x71574E69);
t7 = FF2(t7, t6, t5, t4, t3, t2, t1, t0, X19, 0xA458FEA3);
t6 = FF2(t6, t5, t4, t3, t2, t1, t0, t7, X12, 0xF4933D7E);
t5 = FF2(t5, t4, t3, t2, t1, t0, t7, t6, X15, 0x0D95748F);
t4 = FF2(t4, t3, t2, t1, t0, t7, t6, t5, X13, 0x728EB658);
t3 = FF2(t3, t2, t1, t0, t7, t6, t5, t4, X2, 0x718BCD58);
t2 = FF2(t2, t1, t0, t7, t6, t5, t4, t3, X25, 0x82154AEE);
t1 = FF2(t1, t0, t7, t6, t5, t4, t3, t2, X31, 0x7B54A41D);
t0 = FF2(t0, t7, t6, t5, t4, t3, t2, t1, X27, 0xC25A59B5);
// Pass 3
t7 = FF3(t7, t6, t5, t4, t3, t2, t1, t0, X19, 0x9C30D539);
t6 = FF3(t6, t5, t4, t3, t2, t1, t0, t7, X9, 0x2AF26013);
t5 = FF3(t5, t4, t3, t2, t1, t0, t7, t6, X4, 0xC5D1B023);
t4 = FF3(t4, t3, t2, t1, t0, t7, t6, t5, X20, 0x286085F0);
t3 = FF3(t3, t2, t1, t0, t7, t6, t5, t4, X28, 0xCA417918);
t2 = FF3(t2, t1, t0, t7, t6, t5, t4, t3, X17, 0xB8DB38EF);
t1 = FF3(t1, t0, t7, t6, t5, t4, t3, t2, X8, 0x8E79DCB0);
t0 = FF3(t0, t7, t6, t5, t4, t3, t2, t1, X22, 0x603A180E);
t7 = FF3(t7, t6, t5, t4, t3, t2, t1, t0, X29, 0x6C9E0E8B);
t6 = FF3(t6, t5, t4, t3, t2, t1, t0, t7, X14, 0xB01E8A3E);
t5 = FF3(t5, t4, t3, t2, t1, t0, t7, t6, X25, 0xD71577C1);
t4 = FF3(t4, t3, t2, t1, t0, t7, t6, t5, X12, 0xBD314B27);
t3 = FF3(t3, t2, t1, t0, t7, t6, t5, t4, X24, 0x78AF2FDA);
t2 = FF3(t2, t1, t0, t7, t6, t5, t4, t3, X30, 0x55605C60);
t1 = FF3(t1, t0, t7, t6, t5, t4, t3, t2, X16, 0xE65525F3);
t0 = FF3(t0, t7, t6, t5, t4, t3, t2, t1, X26, 0xAA55AB94);
t7 = FF3(t7, t6, t5, t4, t3, t2, t1, t0, X31, 0x57489862);
t6 = FF3(t6, t5, t4, t3, t2, t1, t0, t7, X15, 0x63E81440);
t5 = FF3(t5, t4, t3, t2, t1, t0, t7, t6, X7, 0x55CA396A);
t4 = FF3(t4, t3, t2, t1, t0, t7, t6, t5, X3, 0x2AAB10B6);
t3 = FF3(t3, t2, t1, t0, t7, t6, t5, t4, X1, 0xB4CC5C34);
t2 = FF3(t2, t1, t0, t7, t6, t5, t4, t3, X0, 0x1141E8CE);
t1 = FF3(t1, t0, t7, t6, t5, t4, t3, t2, X18, 0xA15486AF);
t0 = FF3(t0, t7, t6, t5, t4, t3, t2, t1, X27, 0x7C72E993);
t7 = FF3(t7, t6, t5, t4, t3, t2, t1, t0, X13, 0xB3EE1411);
t6 = FF3(t6, t5, t4, t3, t2, t1, t0, t7, X6, 0x636FBC2A);
t5 = FF3(t5, t4, t3, t2, t1, t0, t7, t6, X21, 0x2BA9C55D);
t4 = FF3(t4, t3, t2, t1, t0, t7, t6, t5, X10, 0x741831F6);
t3 = FF3(t3, t2, t1, t0, t7, t6, t5, t4, X23, 0xCE5C3E16);
t2 = FF3(t2, t1, t0, t7, t6, t5, t4, t3, X11, 0x9B87931E);
t1 = FF3(t1, t0, t7, t6, t5, t4, t3, t2, X5, 0xAFD6BA33);
t0 = FF3(t0, t7, t6, t5, t4, t3, t2, t1, X2, 0x6C24CF5C);
if (rounds >= 4)
{
t7 = FF4(t7, t6, t5, t4, t3, t2, t1, t0, X24, 0x7A325381);
t6 = FF4(t6, t5, t4, t3, t2, t1, t0, t7, X4, 0x28958677);
t5 = FF4(t5, t4, t3, t2, t1, t0, t7, t6, X0, 0x3B8F4898);
t4 = FF4(t4, t3, t2, t1, t0, t7, t6, t5, X14, 0x6B4BB9AF);
t3 = FF4(t3, t2, t1, t0, t7, t6, t5, t4, X2, 0xC4BFE81B);
t2 = FF4(t2, t1, t0, t7, t6, t5, t4, t3, X7, 0x66282193);
t1 = FF4(t1, t0, t7, t6, t5, t4, t3, t2, X28, 0x61D809CC);
t0 = FF4(t0, t7, t6, t5, t4, t3, t2, t1, X23, 0xFB21A991);
t7 = FF4(t7, t6, t5, t4, t3, t2, t1, t0, X26, 0x487CAC60);
t6 = FF4(t6, t5, t4, t3, t2, t1, t0, t7, X6, 0x5DEC8032);
t5 = FF4(t5, t4, t3, t2, t1, t0, t7, t6, X30, 0xEF845D5D);
t4 = FF4(t4, t3, t2, t1, t0, t7, t6, t5, X20, 0xE98575B1);
t3 = FF4(t3, t2, t1, t0, t7, t6, t5, t4, X18, 0xDC262302);
t2 = FF4(t2, t1, t0, t7, t6, t5, t4, t3, X25, 0xEB651B88);
t1 = FF4(t1, t0, t7, t6, t5, t4, t3, t2, X19, 0x23893E81);
t0 = FF4(t0, t7, t6, t5, t4, t3, t2, t1, X3, 0xD396ACC5);
t7 = FF4(t7, t6, t5, t4, t3, t2, t1, t0, X22, 0x0F6D6FF3);
t6 = FF4(t6, t5, t4, t3, t2, t1, t0, t7, X11, 0x83F44239);
t5 = FF4(t5, t4, t3, t2, t1, t0, t7, t6, X31, 0x2E0B4482);
t4 = FF4(t4, t3, t2, t1, t0, t7, t6, t5, X21, 0xA4842004);
t3 = FF4(t3, t2, t1, t0, t7, t6, t5, t4, X8, 0x69C8F04A);
t2 = FF4(t2, t1, t0, t7, t6, t5, t4, t3, X27, 0x9E1F9B5E);
t1 = FF4(t1, t0, t7, t6, t5, t4, t3, t2, X12, 0x21C66842);
t0 = FF4(t0, t7, t6, t5, t4, t3, t2, t1, X9, 0xF6E96C9A);
t7 = FF4(t7, t6, t5, t4, t3, t2, t1, t0, X1, 0x670C9C61);
t6 = FF4(t6, t5, t4, t3, t2, t1, t0, t7, X29, 0xABD388F0);
t5 = FF4(t5, t4, t3, t2, t1, t0, t7, t6, X5, 0x6A51A0D2);
t4 = FF4(t4, t3, t2, t1, t0, t7, t6, t5, X15, 0xD8542F68);
t3 = FF4(t3, t2, t1, t0, t7, t6, t5, t4, X17, 0x960FA728);
t2 = FF4(t2, t1, t0, t7, t6, t5, t4, t3, X10, 0xAB5133A3);
t1 = FF4(t1, t0, t7, t6, t5, t4, t3, t2, X16, 0x6EEF0B6C);
t0 = FF4(t0, t7, t6, t5, t4, t3, t2, t1, X13, 0x137A3BE4);
if (rounds == 5)
{
t7 = FF5(t7, t6, t5, t4, t3, t2, t1, t0, X27, 0xBA3BF050);
t6 = FF5(t6, t5, t4, t3, t2, t1, t0, t7, X3, 0x7EFB2A98);
t5 = FF5(t5, t4, t3, t2, t1, t0, t7, t6, X21, 0xA1F1651D);
t4 = FF5(t4, t3, t2, t1, t0, t7, t6, t5, X26, 0x39AF0176);
t3 = FF5(t3, t2, t1, t0, t7, t6, t5, t4, X17, 0x66CA593E);
t2 = FF5(t2, t1, t0, t7, t6, t5, t4, t3, X11, 0x82430E88);
t1 = FF5(t1, t0, t7, t6, t5, t4, t3, t2, X20, 0x8CEE8619);
t0 = FF5(t0, t7, t6, t5, t4, t3, t2, t1, X29, 0x456F9FB4);
t7 = FF5(t7, t6, t5, t4, t3, t2, t1, t0, X19, 0x7D84A5C3);
t6 = FF5(t6, t5, t4, t3, t2, t1, t0, t7, X0, 0x3B8B5EBE);
t5 = FF5(t5, t4, t3, t2, t1, t0, t7, t6, X12, 0xE06F75D8);
t4 = FF5(t4, t3, t2, t1, t0, t7, t6, t5, X7, 0x85C12073);
t3 = FF5(t3, t2, t1, t0, t7, t6, t5, t4, X13, 0x401A449F);
t2 = FF5(t2, t1, t0, t7, t6, t5, t4, t3, X8, 0x56C16AA6);
t1 = FF5(t1, t0, t7, t6, t5, t4, t3, t2, X31, 0x4ED3AA62);
t0 = FF5(t0, t7, t6, t5, t4, t3, t2, t1, X10, 0x363F7706);
t7 = FF5(t7, t6, t5, t4, t3, t2, t1, t0, X5, 0x1BFEDF72);
t6 = FF5(t6, t5, t4, t3, t2, t1, t0, t7, X9, 0x429B023D);
t5 = FF5(t5, t4, t3, t2, t1, t0, t7, t6, X14, 0x37D0D724);
t4 = FF5(t4, t3, t2, t1, t0, t7, t6, t5, X30, 0xD00A1248);
t3 = FF5(t3, t2, t1, t0, t7, t6, t5, t4, X18, 0xDB0FEAD3);
t2 = FF5(t2, t1, t0, t7, t6, t5, t4, t3, X6, 0x49F1C09B);
t1 = FF5(t1, t0, t7, t6, t5, t4, t3, t2, X28, 0x075372C9);
t0 = FF5(t0, t7, t6, t5, t4, t3, t2, t1, X24, 0x80991B7B);
t7 = FF5(t7, t6, t5, t4, t3, t2, t1, t0, X2, 0x25D479D8);
t6 = FF5(t6, t5, t4, t3, t2, t1, t0, t7, X23, 0xF6E8DEF7);
t5 = FF5(t5, t4, t3, t2, t1, t0, t7, t6, X16, 0xE3FE501A);
t4 = FF5(t4, t3, t2, t1, t0, t7, t6, t5, X22, 0xB6794C3B);
t3 = FF5(t3, t2, t1, t0, t7, t6, t5, t4, X4, 0x976CE0BD);
t2 = FF5(t2, t1, t0, t7, t6, t5, t4, t3, X1, 0x04C006BA);
t1 = FF5(t1, t0, t7, t6, t5, t4, t3, t2, X25, 0xC1A94FB6);
t0 = FF5(t0, t7, t6, t5, t4, t3, t2, t1, X15, 0x409F60C4);
}
}
h7 += t7;
h6 += t6;
h5 += t5;
h4 += t4;
h3 += t3;
h2 += t2;
h1 += t1;
h0 += t0;
}
protected byte[] padBuffer()
{
// pad out to 118 mod 128. other 10 bytes have special use.
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 118) ? (118 - n) : (246 - n);
byte[] result = new byte[padding + 10];
result[0] = (byte) 0x01;
// save the version number (LSB 3), the number of rounds (3 bits in the
// middle), the fingerprint length (MSB 2 bits and next byte) and the
// number of bits in the unpadded message.
int bl = hashSize * 8;
result[padding++] = (byte) (((bl & 0x03) << 6) | ((rounds & 0x07) << 3) | (HAVAL_VERSION & 0x07));
result[padding++] = (byte) (bl >>> 2);
// save number of bits, casting the long to an array of 8 bytes
long bits = count << 3;
result[padding++] = (byte) bits;
result[padding++] = (byte) (bits >>> 8);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 48);
result[padding] = (byte) (bits >>> 56);
return result;
}
protected byte[] getResult()
{
tailorDigestBits(); // tailor context for the designated output size
// cast enough top context values into an array of hashSize bytes
byte[] result = new byte[hashSize];
if (hashSize >= HAVAL_256_BIT)
{
result[31] = (byte) (h7 >>> 24);
result[30] = (byte) (h7 >>> 16);
result[29] = (byte) (h7 >>> 8);
result[28] = (byte) h7;
}
if (hashSize >= HAVAL_224_BIT)
{
result[27] = (byte) (h6 >>> 24);
result[26] = (byte) (h6 >>> 16);
result[25] = (byte) (h6 >>> 8);
result[24] = (byte) h6;
}
if (hashSize >= HAVAL_192_BIT)
{
result[23] = (byte) (h5 >>> 24);
result[22] = (byte) (h5 >>> 16);
result[21] = (byte) (h5 >>> 8);
result[20] = (byte) h5;
}
if (hashSize >= HAVAL_160_BIT)
{
result[19] = (byte) (h4 >>> 24);
result[18] = (byte) (h4 >>> 16);
result[17] = (byte) (h4 >>> 8);
result[16] = (byte) h4;
}
result[15] = (byte) (h3 >>> 24);
result[14] = (byte) (h3 >>> 16);
result[13] = (byte) (h3 >>> 8);
result[12] = (byte) h3;
result[11] = (byte) (h2 >>> 24);
result[10] = (byte) (h2 >>> 16);
result[9] = (byte) (h2 >>> 8);
result[8] = (byte) h2;
result[7] = (byte) (h1 >>> 24);
result[6] = (byte) (h1 >>> 16);
result[5] = (byte) (h1 >>> 8);
result[4] = (byte) h1;
result[3] = (byte) (h0 >>> 24);
result[2] = (byte) (h0 >>> 16);
result[1] = (byte) (h0 >>> 8);
result[0] = (byte) h0;
return result;
}
protected void resetContext()
{
h0 = 0x243F6A88;
h1 = 0x85A308D3;
h2 = 0x13198A2E;
h3 = 0x03707344;
h4 = 0xA4093822;
h5 = 0x299F31D0;
h6 = 0x082EFA98;
h7 = 0xEC4E6C89;
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean(DIGEST0.equals(Util.toString(new Haval().digest())));
}
return valid.booleanValue();
}
// helper methods ----------------------------------------------------------
/** Tailors the last output. */
private void tailorDigestBits()
{
int t;
switch (hashSize)
{
case HAVAL_128_BIT:
t = (h7 & 0x000000FF) | (h6 & 0xFF000000) | (h5 & 0x00FF0000)
| (h4 & 0x0000FF00);
h0 += t >>> 8 | t << 24;
t = (h7 & 0x0000FF00) | (h6 & 0x000000FF) | (h5 & 0xFF000000)
| (h4 & 0x00FF0000);
h1 += t >>> 16 | t << 16;
t = (h7 & 0x00FF0000) | (h6 & 0x0000FF00) | (h5 & 0x000000FF)
| (h4 & 0xFF000000);
h2 += t >>> 24 | t << 8;
t = (h7 & 0xFF000000) | (h6 & 0x00FF0000) | (h5 & 0x0000FF00)
| (h4 & 0x000000FF);
h3 += t;
break;
case HAVAL_160_BIT:
t = (h7 & 0x3F) | (h6 & (0x7F << 25)) | (h5 & (0x3F << 19));
h0 += t >>> 19 | t << 13;
t = (h7 & (0x3F << 6)) | (h6 & 0x3F) | (h5 & (0x7F << 25));
h1 += t >>> 25 | t << 7;
t = (h7 & (0x7F << 12)) | (h6 & (0x3F << 6)) | (h5 & 0x3F);
h2 += t;
t = (h7 & (0x3F << 19)) | (h6 & (0x7F << 12)) | (h5 & (0x3F << 6));
h3 += (t >>> 6);
t = (h7 & (0x7F << 25)) | (h6 & (0x3F << 19)) | (h5 & (0x7F << 12));
h4 += (t >>> 12);
break;
case HAVAL_192_BIT:
t = (h7 & 0x1F) | (h6 & (0x3F << 26));
h0 += t >>> 26 | t << 6;
t = (h7 & (0x1F << 5)) | (h6 & 0x1F);
h1 += t;
t = (h7 & (0x3F << 10)) | (h6 & (0x1F << 5));
h2 += (t >>> 5);
t = (h7 & (0x1F << 16)) | (h6 & (0x3F << 10));
h3 += (t >>> 10);
t = (h7 & (0x1F << 21)) | (h6 & (0x1F << 16));
h4 += (t >>> 16);
t = (h7 & (0x3F << 26)) | (h6 & (0x1F << 21));
h5 += (t >>> 21);
break;
case HAVAL_224_BIT:
h0 += ((h7 >>> 27) & 0x1F);
h1 += ((h7 >>> 22) & 0x1F);
h2 += ((h7 >>> 18) & 0x0F);
h3 += ((h7 >>> 13) & 0x1F);
h4 += ((h7 >>> 9) & 0x0F);
h5 += ((h7 >>> 4) & 0x1F);
h6 += (h7 & 0x0F);
}
}
/**
* Permutations phi_{i,j}, i=3,4,5, j=1,...,i.
*
* rounds = 3: 6 5 4 3 2 1 0
* | | | | | | | (replaced by)
* phi_{3,1}: 1 0 3 5 6 2 4
* phi_{3,2}: 4 2 1 0 5 3 6
* phi_{3,3}: 6 1 2 3 4 5 0
*
* rounds = 4: 6 5 4 3 2 1 0
* | | | | | | | (replaced by)
* phi_{4,1}: 2 6 1 4 5 3 0
* phi_{4,2}: 3 5 2 0 1 6 4
* phi_{4,3}: 1 4 3 6 0 2 5
* phi_{4,4}: 6 4 0 5 2 1 3
*
* rounds = 5: 6 5 4 3 2 1 0
* | | | | | | | (replaced by)
* phi_{5,1}: 3 4 1 0 5 2 6
* phi_{5,2}: 6 2 1 0 3 4 5
* phi_{5,3}: 2 6 0 4 3 1 5
* phi_{5,4}: 1 5 3 2 0 4 6
* phi_{5,5}: 2 5 0 6 4 3 1
*/
private int FF1(int x7, int x6, int x5, int x4, int x3, int x2, int x1,
int x0, int w)
{
int t;
switch (rounds)
{
case 3:
t = f1(x1, x0, x3, x5, x6, x2, x4);
break;
case 4:
t = f1(x2, x6, x1, x4, x5, x3, x0);
break;
default:
t = f1(x3, x4, x1, x0, x5, x2, x6);
}
return (t >>> 7 | t << 25) + (x7 >>> 11 | x7 << 21) + w;
}
private int FF2(int x7, int x6, int x5, int x4, int x3, int x2, int x1,
int x0, int w, int c)
{
int t;
switch (rounds)
{
case 3:
t = f2(x4, x2, x1, x0, x5, x3, x6);
break;
case 4:
t = f2(x3, x5, x2, x0, x1, x6, x4);
break;
default:
t = f2(x6, x2, x1, x0, x3, x4, x5);
}
return (t >>> 7 | t << 25) + (x7 >>> 11 | x7 << 21) + w + c;
}
private int FF3(int x7, int x6, int x5, int x4, int x3, int x2, int x1,
int x0, int w, int c)
{
int t;
switch (rounds)
{
case 3:
t = f3(x6, x1, x2, x3, x4, x5, x0);
break;
case 4:
t = f3(x1, x4, x3, x6, x0, x2, x5);
break;
default:
t = f3(x2, x6, x0, x4, x3, x1, x5);
}
return (t >>> 7 | t << 25) + (x7 >>> 11 | x7 << 21) + w + c;
}
private int FF4(int x7, int x6, int x5, int x4, int x3, int x2, int x1,
int x0, int w, int c)
{
int t;
switch (rounds)
{
case 4:
t = f4(x6, x4, x0, x5, x2, x1, x3);
break;
default:
t = f4(x1, x5, x3, x2, x0, x4, x6);
}
return (t >>> 7 | t << 25) + (x7 >>> 11 | x7 << 21) + w + c;
}
private int FF5(int x7, int x6, int x5, int x4, int x3, int x2, int x1,
int x0, int w, int c)
{
int t = f5(x2, x5, x0, x6, x4, x3, x1);
return (t >>> 7 | t << 25) + (x7 >>> 11 | x7 << 21) + w + c;
}
private int f1(int x6, int x5, int x4, int x3, int x2, int x1, int x0)
{
return x1 & (x0 ^ x4) ^ x2 & x5 ^ x3 & x6 ^ x0;
}
private int f2(int x6, int x5, int x4, int x3, int x2, int x1, int x0)
{
return x2 & (x1 & ~x3 ^ x4 & x5 ^ x6 ^ x0) ^ x4 & (x1 ^ x5) ^ x3 & x5 ^ x0;
}
private int f3(int x6, int x5, int x4, int x3, int x2, int x1, int x0)
{
return x3 & (x1 & x2 ^ x6 ^ x0) ^ x1 & x4 ^ x2 & x5 ^ x0;
}
private int f4(int x6, int x5, int x4, int x3, int x2, int x1, int x0)
{
return x4 & (x5 & ~x2 ^ x3 & ~x6 ^ x1 ^ x6 ^ x0) ^ x3 & (x1 & x2 ^ x5 ^ x6)
^ x2 & x6 ^ x0;
}
private int f5(int x6, int x5, int x4, int x3, int x2, int x1, int x0)
{
return x0 & (x1 & x2 & x3 ^ ~x5) ^ x1 & x4 ^ x2 & x5 ^ x3 & x6;
}
}

View file

@ -0,0 +1,135 @@
/* IMessageDigest.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
/**
* <p>The basic visible methods of any hash algorithm.</p>
*
* <p>A hash (or message digest) algorithm produces its output by iterating a
* basic compression function on blocks of data.</p>
*/
public interface IMessageDigest extends Cloneable
{
// Constants
// -------------------------------------------------------------------------
// Methods
// -------------------------------------------------------------------------
/**
* <p>Returns the canonical name of this algorithm.</p>
*
* @return the canonical name of this instance.
*/
String name();
/**
* <p>Returns the output length in bytes of this message digest algorithm.</p>
*
* @return the output length in bytes of this message digest algorithm.
*/
int hashSize();
/**
* <p>Returns the algorithm's (inner) block size in bytes.</p>
*
* @return the algorithm's inner block size in bytes.
*/
int blockSize();
/**
* <p>Continues a message digest operation using the input byte.</p>
*
* @param b the input byte to digest.
*/
void update(byte b);
/**
* <p>Continues a message digest operation, by filling the buffer, processing
* data in the algorithm's HASH_SIZE-bit block(s), updating the context and
* count, and buffering the remaining bytes in buffer for the next
* operation.</p>
*
* @param in the input block.
*/
void update(byte[] in);
/**
* <p>Continues a message digest operation, by filling the buffer, processing
* data in the algorithm's HASH_SIZE-bit block(s), updating the context and
* count, and buffering the remaining bytes in buffer for the next
* operation.</p>
*
* @param in the input block.
* @param offset start of meaningful bytes in input block.
* @param length number of bytes, in input block, to consider.
*/
void update(byte[] in, int offset, int length);
/**
* <p>Completes the message digest by performing final operations such as
* padding and resetting the instance.</p>
*
* @return the array of bytes representing the hash value.
*/
byte[] digest();
/**
* <p>Resets the current context of this instance clearing any eventually cached
* intermediary values.</p>
*/
void reset();
/**
* <p>A basic test. Ensures that the digest of a pre-determined message is equal
* to a known pre-computed value.</p>
*
* @return <tt>true</tt> if the implementation passes a basic self-test.
* Returns <tt>false</tt> otherwise.
*/
boolean selfTest();
/**
* <p>Returns a clone copy of this instance.</p>
*
* @return a clone copy of this instance.
*/
Object clone();
}

View file

@ -0,0 +1,301 @@
/* MD2.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>An implementation of the MD2 message digest algorithm.</p>
*
* <p>MD2 is not widely used. Unless it is needed for compatibility with
* existing systems, it is not recommended for use in new applications.</p>
*
* <p>References:</p>
*
* <ol>
* <li>The <a href="http://www.ietf.org/rfc/rfc1319.txt">MD2</a>
* Message-Digest Algorithm.<br>
* B. Kaliski.</li>
* <li>The <a href="http://www.rfc-editor.org/errata.html">RFC ERRATA PAGE</a>
* under section RFC 1319.</li>
* </ol>
*/
public class MD2 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
/** An MD2 message digest is always 128-bits long, or 16 bytes. */
private static final int DIGEST_LENGTH = 16;
/** The MD2 algorithm operates on 128-bit blocks, or 16 bytes. */
private static final int BLOCK_LENGTH = 16;
/** 256 byte "random" permutation of the digits of pi. */
private static final byte[] PI = { 41, 46, 67, -55, -94, -40, 124, 1, 61, 54,
84, -95, -20, -16, 6, 19, 98, -89, 5, -13,
-64, -57, 115, -116, -104, -109, 43, -39,
-68, 76, -126, -54, 30, -101, 87, 60, -3,
-44, -32, 22, 103, 66, 111, 24, -118, 23,
-27, 18, -66, 78, -60, -42, -38, -98, -34,
73, -96, -5, -11, -114, -69, 47, -18, 122,
-87, 104, 121, -111, 21, -78, 7, 63, -108,
-62, 16, -119, 11, 34, 95, 33, -128, 127,
93, -102, 90, -112, 50, 39, 53, 62, -52,
-25, -65, -9, -105, 3, -1, 25, 48, -77, 72,
-91, -75, -47, -41, 94, -110, 42, -84, 86,
-86, -58, 79, -72, 56, -46, -106, -92, 125,
-74, 118, -4, 107, -30, -100, 116, 4, -15,
69, -99, 112, 89, 100, 113, -121, 32, -122,
91, -49, 101, -26, 45, -88, 2, 27, 96, 37,
-83, -82, -80, -71, -10, 28, 70, 97, 105,
52, 64, 126, 15, 85, 71, -93, 35, -35, 81,
-81, 58, -61, 92, -7, -50, -70, -59, -22,
38, 44, 83, 13, 110, -123, 40, -124, 9,
-45, -33, -51, -12, 65, -127, 77, 82, 106,
-36, 55, -56, 108, -63, -85, -6, 36, -31,
123, 8, 12, -67, -79, 74, 120, -120, -107,
-117, -29, 99, -24, 109, -23, -53, -43, -2,
59, 0, 29, 57, -14, -17, -73, 14, 102, 88,
-48, -28, -90, 119, 114, -8, -21, 117, 75,
10, 49, 68, 80, -76, -113, -19, 31, 26,
-37, -103, -115, 51, -97, 17, -125, 20 };
/** The output of this message digest when no data has been input. */
private static final String DIGEST0 = "8350E5A3E24C153DF2275C9F80692773";
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** The checksum computed so far. */
private byte[] checksum;
/**
* Work array needed by encrypt method. First <code>BLOCK_LENGTH</code> bytes
* are also used to store the running digest.
*/
private byte[] work;
// Constructor(s)
// -------------------------------------------------------------------------
/** Creates a new MD2 digest ready for use. */
public MD2()
{
super(Registry.MD2_HASH, DIGEST_LENGTH, BLOCK_LENGTH);
}
/**
* <p>Private constructor used for cloning.</p>
*
* @param md2 the instance to clone.
*/
private MD2(MD2 md2)
{
this();
// superclass field
this.count = md2.count;
this.buffer = (byte[]) md2.buffer.clone();
// private field
this.checksum = (byte[]) md2.checksum.clone();
this.work = (byte[]) md2.work.clone();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new MD2(this);
}
// Implementation of abstract methods in BaseHash --------------------------
protected byte[] getResult()
{
byte[] result = new byte[DIGEST_LENGTH];
// Encrypt checksum as last block.
encryptBlock(checksum, 0);
for (int i = 0; i < BLOCK_LENGTH; i++)
{
result[i] = work[i];
}
return result;
}
protected void resetContext()
{
checksum = new byte[BLOCK_LENGTH];
work = new byte[BLOCK_LENGTH * 3];
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean(DIGEST0.equals(Util.toString(new MD2().digest())));
}
return valid.booleanValue();
}
/**
* <p>Generates an array of padding bytes. The padding is defined as
* <code>i</code> bytes of value <code>i</code>, where <code>i</code> is the
* number of bytes to fill the last block of the message to
* <code>BLOCK_LENGTH</code> bytes (or <code>BLOCK_LENGTH</code> bytes when
* the last block was completely full).</p>
*
* @return the bytes to pad the remaining bytes in the buffer before
* completing a hash operation.
*/
protected byte[] padBuffer()
{
int length = BLOCK_LENGTH - (int) (count % BLOCK_LENGTH);
if (length == 0)
{
length = BLOCK_LENGTH;
}
byte[] pad = new byte[length];
for (int i = 0; i < length; i++)
{
pad[i] = (byte) length;
}
return pad;
}
/**
* <p>Adds <code>BLOCK_LENGTH</code> bytes to the running digest.</p>
*
* @param in the byte array to take the <code>BLOCK_LENGTH</code> bytes from.
* @param off the offset to start from in the given byte array.
*/
protected void transform(byte[] in, int off)
{
// encryptBlock(in, off);
// updateCheckSum(in, off);
updateCheckSumAndEncryptBlock(in, off);
}
// Private instance methods ------------------------------------------------
/**
* Updates the checksum with the <code>BLOCK_LENGTH</code> bytes from the
* given array starting at <code>off</code>.
*/
/*
private void updateCheckSum(byte[] in, int off) {
byte l = checksum[BLOCK_LENGTH-1];
for (int i = 0; i < BLOCK_LENGTH; i++) {
byte b = in[off+i];
// l = (byte)((checksum[i] & 0xFF) ^ (PI[((b & 0xFF) ^ (l & 0xFF))] & 0xFF));
l = (byte)(checksum[i] ^ PI[(b ^ l) & 0xFF]);
checksum[i] = l;
}
}
*/
/**
* Adds a new block (<code>BLOCK_LENGTH</code> bytes) to the running digest
* from the given byte array starting from the given offset.
*/
private void encryptBlock(byte[] in, int off)
{
for (int i = 0; i < BLOCK_LENGTH; i++)
{
byte b = in[off + i];
work[BLOCK_LENGTH + i] = b;
work[BLOCK_LENGTH * 2 + i] = (byte) (work[i] ^ b);
}
byte t = 0;
for (int i = 0; i < 18; i++)
{
for (int j = 0; j < 3 * BLOCK_LENGTH; j++)
{
// t = (byte)((work[j] & 0xFF) ^ (PI[t & 0xFF] & 0xFF));
t = (byte) (work[j] ^ PI[t & 0xFF]);
work[j] = t;
}
// t = (byte)((t + i) & 0xFF);
t = (byte) (t + i);
}
}
/**
* Optimized method that combines a checksum update and encrypt of a block.
*/
private void updateCheckSumAndEncryptBlock(byte[] in, int off)
{
byte l = checksum[BLOCK_LENGTH - 1];
for (int i = 0; i < BLOCK_LENGTH; i++)
{
byte b = in[off + i];
work[BLOCK_LENGTH + i] = b;
// work[BLOCK_LENGTH*2+i] = (byte)((work[i] & 0xFF) ^ (b & 0xFF));
work[BLOCK_LENGTH * 2 + i] = (byte) (work[i] ^ b);
// l = (byte)((checksum[i] & 0xFF) ^ (PI[((b & 0xFF) ^ (l & 0xFF))] & 0xFF));
l = (byte) (checksum[i] ^ PI[(b ^ l) & 0xFF]);
checksum[i] = l;
}
byte t = 0;
for (int i = 0; i < 18; i++)
{
for (int j = 0; j < 3 * BLOCK_LENGTH; j++)
{
// t = (byte)((work[j] & 0xFF) ^ (PI[t & 0xFF] & 0xFF));
t = (byte) (work[j] ^ PI[t & 0xFF]);
work[j] = t;
}
// t = (byte)((t + i) & 0xFF);
t = (byte) (t + i);
}
}
}

View file

@ -0,0 +1,328 @@
/* MD4.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>An implementation of Ron Rivest's MD4 message digest algorithm.</p>
*
* <p>MD4 was the precursor to the stronger {@link gnu.crypto.hash.MD5}
* algorithm, and while not considered cryptograpically secure itself, MD4 is
* in use in various applications. It is slightly faster than MD5.</p>
*
* <p>References:</p>
*
* <ol>
* <li>The <a href="http://www.ietf.org/rfc/rfc1320.txt">MD4</a>
* Message-Digest Algorithm.<br>
* R. Rivest.</li>
* </ol>
*
* @author Casey Marshall (rsdio@metastatic.org)
*/
public class MD4 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
/** An MD4 message digest is always 128-bits long, or 16 bytes. */
private static final int DIGEST_LENGTH = 16;
/** The MD4 algorithm operates on 512-bit blocks, or 64 bytes. */
private static final int BLOCK_LENGTH = 64;
private static final int A = 0x67452301;
private static final int B = 0xefcdab89;
private static final int C = 0x98badcfe;
private static final int D = 0x10325476;
/** The output of this message digest when no data has been input. */
private static final String DIGEST0 = "31D6CFE0D16AE931B73C59D7E0C089C0";
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
private int a, b, c, d;
// Constructor(s)
// -------------------------------------------------------------------------
/**
* <p>Public constructor. Initializes the chaining variables, sets the byte
* count to <code>0</code>, and creates a new block of <code>512</code> bits.
* </p>
*/
public MD4()
{
super(Registry.MD4_HASH, DIGEST_LENGTH, BLOCK_LENGTH);
}
/**
* <p>Trivial private constructor for cloning purposes.</p>
*
* @param that the instance to clone.
*/
private MD4(MD4 that)
{
this();
this.a = that.a;
this.b = that.b;
this.c = that.c;
this.d = that.d;
this.count = that.count;
this.buffer = (byte[]) that.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new MD4(this);
}
// Implementation of abstract methods in BashHash --------------------------
protected byte[] getResult()
{
byte[] digest = { (byte) a, (byte) (a >>> 8), (byte) (a >>> 16),
(byte) (a >>> 24), (byte) b, (byte) (b >>> 8),
(byte) (b >>> 16), (byte) (b >>> 24), (byte) c,
(byte) (c >>> 8), (byte) (c >>> 16), (byte) (c >>> 24),
(byte) d, (byte) (d >>> 8), (byte) (d >>> 16),
(byte) (d >>> 24) };
return digest;
}
protected void resetContext()
{
a = A;
b = B;
c = C;
d = D;
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean(DIGEST0.equals(Util.toString(new MD4().digest())));
}
return valid.booleanValue();
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_LENGTH);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] pad = new byte[padding + 8];
pad[0] = (byte) 0x80;
long bits = count << 3;
pad[padding++] = (byte) bits;
pad[padding++] = (byte) (bits >>> 8);
pad[padding++] = (byte) (bits >>> 16);
pad[padding++] = (byte) (bits >>> 24);
pad[padding++] = (byte) (bits >>> 32);
pad[padding++] = (byte) (bits >>> 40);
pad[padding++] = (byte) (bits >>> 48);
pad[padding] = (byte) (bits >>> 56);
return pad;
}
protected void transform(byte[] in, int i)
{
int X0 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X1 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X2 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X3 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X4 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X5 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X6 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X7 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X8 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X9 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X10 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X11 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X12 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X13 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X14 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X15 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i] << 24;
int aa, bb, cc, dd;
aa = a;
bb = b;
cc = c;
dd = d;
aa += ((bb & cc) | ((~bb) & dd)) + X0;
aa = aa << 3 | aa >>> -3;
dd += ((aa & bb) | ((~aa) & cc)) + X1;
dd = dd << 7 | dd >>> -7;
cc += ((dd & aa) | ((~dd) & bb)) + X2;
cc = cc << 11 | cc >>> -11;
bb += ((cc & dd) | ((~cc) & aa)) + X3;
bb = bb << 19 | bb >>> -19;
aa += ((bb & cc) | ((~bb) & dd)) + X4;
aa = aa << 3 | aa >>> -3;
dd += ((aa & bb) | ((~aa) & cc)) + X5;
dd = dd << 7 | dd >>> -7;
cc += ((dd & aa) | ((~dd) & bb)) + X6;
cc = cc << 11 | cc >>> -11;
bb += ((cc & dd) | ((~cc) & aa)) + X7;
bb = bb << 19 | bb >>> -19;
aa += ((bb & cc) | ((~bb) & dd)) + X8;
aa = aa << 3 | aa >>> -3;
dd += ((aa & bb) | ((~aa) & cc)) + X9;
dd = dd << 7 | dd >>> -7;
cc += ((dd & aa) | ((~dd) & bb)) + X10;
cc = cc << 11 | cc >>> -11;
bb += ((cc & dd) | ((~cc) & aa)) + X11;
bb = bb << 19 | bb >>> -19;
aa += ((bb & cc) | ((~bb) & dd)) + X12;
aa = aa << 3 | aa >>> -3;
dd += ((aa & bb) | ((~aa) & cc)) + X13;
dd = dd << 7 | dd >>> -7;
cc += ((dd & aa) | ((~dd) & bb)) + X14;
cc = cc << 11 | cc >>> -11;
bb += ((cc & dd) | ((~cc) & aa)) + X15;
bb = bb << 19 | bb >>> -19;
aa += ((bb & (cc | dd)) | (cc & dd)) + X0 + 0x5a827999;
aa = aa << 3 | aa >>> -3;
dd += ((aa & (bb | cc)) | (bb & cc)) + X4 + 0x5a827999;
dd = dd << 5 | dd >>> -5;
cc += ((dd & (aa | bb)) | (aa & bb)) + X8 + 0x5a827999;
cc = cc << 9 | cc >>> -9;
bb += ((cc & (dd | aa)) | (dd & aa)) + X12 + 0x5a827999;
bb = bb << 13 | bb >>> -13;
aa += ((bb & (cc | dd)) | (cc & dd)) + X1 + 0x5a827999;
aa = aa << 3 | aa >>> -3;
dd += ((aa & (bb | cc)) | (bb & cc)) + X5 + 0x5a827999;
dd = dd << 5 | dd >>> -5;
cc += ((dd & (aa | bb)) | (aa & bb)) + X9 + 0x5a827999;
cc = cc << 9 | cc >>> -9;
bb += ((cc & (dd | aa)) | (dd & aa)) + X13 + 0x5a827999;
bb = bb << 13 | bb >>> -13;
aa += ((bb & (cc | dd)) | (cc & dd)) + X2 + 0x5a827999;
aa = aa << 3 | aa >>> -3;
dd += ((aa & (bb | cc)) | (bb & cc)) + X6 + 0x5a827999;
dd = dd << 5 | dd >>> -5;
cc += ((dd & (aa | bb)) | (aa & bb)) + X10 + 0x5a827999;
cc = cc << 9 | cc >>> -9;
bb += ((cc & (dd | aa)) | (dd & aa)) + X14 + 0x5a827999;
bb = bb << 13 | bb >>> -13;
aa += ((bb & (cc | dd)) | (cc & dd)) + X3 + 0x5a827999;
aa = aa << 3 | aa >>> -3;
dd += ((aa & (bb | cc)) | (bb & cc)) + X7 + 0x5a827999;
dd = dd << 5 | dd >>> -5;
cc += ((dd & (aa | bb)) | (aa & bb)) + X11 + 0x5a827999;
cc = cc << 9 | cc >>> -9;
bb += ((cc & (dd | aa)) | (dd & aa)) + X15 + 0x5a827999;
bb = bb << 13 | bb >>> -13;
aa += (bb ^ cc ^ dd) + X0 + 0x6ed9eba1;
aa = aa << 3 | aa >>> -3;
dd += (aa ^ bb ^ cc) + X8 + 0x6ed9eba1;
dd = dd << 9 | dd >>> -9;
cc += (dd ^ aa ^ bb) + X4 + 0x6ed9eba1;
cc = cc << 11 | cc >>> -11;
bb += (cc ^ dd ^ aa) + X12 + 0x6ed9eba1;
bb = bb << 15 | bb >>> -15;
aa += (bb ^ cc ^ dd) + X2 + 0x6ed9eba1;
aa = aa << 3 | aa >>> -3;
dd += (aa ^ bb ^ cc) + X10 + 0x6ed9eba1;
dd = dd << 9 | dd >>> -9;
cc += (dd ^ aa ^ bb) + X6 + 0x6ed9eba1;
cc = cc << 11 | cc >>> -11;
bb += (cc ^ dd ^ aa) + X14 + 0x6ed9eba1;
bb = bb << 15 | bb >>> -15;
aa += (bb ^ cc ^ dd) + X1 + 0x6ed9eba1;
aa = aa << 3 | aa >>> -3;
dd += (aa ^ bb ^ cc) + X9 + 0x6ed9eba1;
dd = dd << 9 | dd >>> -9;
cc += (dd ^ aa ^ bb) + X5 + 0x6ed9eba1;
cc = cc << 11 | cc >>> -11;
bb += (cc ^ dd ^ aa) + X13 + 0x6ed9eba1;
bb = bb << 15 | bb >>> -15;
aa += (bb ^ cc ^ dd) + X3 + 0x6ed9eba1;
aa = aa << 3 | aa >>> -3;
dd += (aa ^ bb ^ cc) + X11 + 0x6ed9eba1;
dd = dd << 9 | dd >>> -9;
cc += (dd ^ aa ^ bb) + X7 + 0x6ed9eba1;
cc = cc << 11 | cc >>> -11;
bb += (cc ^ dd ^ aa) + X15 + 0x6ed9eba1;
bb = bb << 15 | bb >>> -15;
a += aa;
b += bb;
c += cc;
d += dd;
}
}

View file

@ -0,0 +1,365 @@
/* MD5.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>The MD5 message-digest algorithm takes as input a message of arbitrary
* length and produces as output a 128-bit "fingerprint" or "message digest" of
* the input. It is conjectured that it is computationally infeasible to
* produce two messages having the same message digest, or to produce any
* message having a given prespecified target message digest.</p>
*
* <p>References:</p>
*
* <ol>
* <li>The <a href="http://www.ietf.org/rfc/rfc1321.txt">MD5</a> Message-
* Digest Algorithm.<br>
* R. Rivest.</li>
* </ol>
*/
public class MD5 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final int BLOCK_SIZE = 64; // inner block size in bytes
private static final String DIGEST0 = "D41D8CD98F00B204E9800998ECF8427E";
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 128-bit interim result. */
private int h0, h1, h2, h3;
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public MD5()
{
super(Registry.MD5_HASH, 16, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private MD5(MD5 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new MD5(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected synchronized void transform(byte[] in, int i)
{
int X0 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X1 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X2 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X3 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X4 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X5 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X6 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X7 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X8 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X9 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X10 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X11 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X12 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X13 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X14 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i++] << 24;
int X15 = (in[i++] & 0xFF) | (in[i++] & 0xFF) << 8 | (in[i++] & 0xFF) << 16
| in[i] << 24;
int A = h0;
int B = h1;
int C = h2;
int D = h3;
// hex constants are from md5.c in FSF Gnu Privacy Guard 0.9.2
// round 1
A += ((B & C) | (~B & D)) + X0 + 0xD76AA478;
A = B + (A << 7 | A >>> -7);
D += ((A & B) | (~A & C)) + X1 + 0xE8C7B756;
D = A + (D << 12 | D >>> -12);
C += ((D & A) | (~D & B)) + X2 + 0x242070DB;
C = D + (C << 17 | C >>> -17);
B += ((C & D) | (~C & A)) + X3 + 0xC1BDCEEE;
B = C + (B << 22 | B >>> -22);
A += ((B & C) | (~B & D)) + X4 + 0xF57C0FAF;
A = B + (A << 7 | A >>> -7);
D += ((A & B) | (~A & C)) + X5 + 0x4787C62A;
D = A + (D << 12 | D >>> -12);
C += ((D & A) | (~D & B)) + X6 + 0xA8304613;
C = D + (C << 17 | C >>> -17);
B += ((C & D) | (~C & A)) + X7 + 0xFD469501;
B = C + (B << 22 | B >>> -22);
A += ((B & C) | (~B & D)) + X8 + 0x698098D8;
A = B + (A << 7 | A >>> -7);
D += ((A & B) | (~A & C)) + X9 + 0x8B44F7AF;
D = A + (D << 12 | D >>> -12);
C += ((D & A) | (~D & B)) + X10 + 0xFFFF5BB1;
C = D + (C << 17 | C >>> -17);
B += ((C & D) | (~C & A)) + X11 + 0x895CD7BE;
B = C + (B << 22 | B >>> -22);
A += ((B & C) | (~B & D)) + X12 + 0x6B901122;
A = B + (A << 7 | A >>> -7);
D += ((A & B) | (~A & C)) + X13 + 0xFD987193;
D = A + (D << 12 | D >>> -12);
C += ((D & A) | (~D & B)) + X14 + 0xA679438E;
C = D + (C << 17 | C >>> -17);
B += ((C & D) | (~C & A)) + X15 + 0x49B40821;
B = C + (B << 22 | B >>> -22);
// round 2
A += ((B & D) | (C & ~D)) + X1 + 0xF61E2562;
A = B + (A << 5 | A >>> -5);
D += ((A & C) | (B & ~C)) + X6 + 0xC040B340;
D = A + (D << 9 | D >>> -9);
C += ((D & B) | (A & ~B)) + X11 + 0x265E5A51;
C = D + (C << 14 | C >>> -14);
B += ((C & A) | (D & ~A)) + X0 + 0xE9B6C7AA;
B = C + (B << 20 | B >>> -20);
A += ((B & D) | (C & ~D)) + X5 + 0xD62F105D;
A = B + (A << 5 | A >>> -5);
D += ((A & C) | (B & ~C)) + X10 + 0x02441453;
D = A + (D << 9 | D >>> -9);
C += ((D & B) | (A & ~B)) + X15 + 0xD8A1E681;
C = D + (C << 14 | C >>> -14);
B += ((C & A) | (D & ~A)) + X4 + 0xE7D3FBC8;
B = C + (B << 20 | B >>> -20);
A += ((B & D) | (C & ~D)) + X9 + 0x21E1CDE6;
A = B + (A << 5 | A >>> -5);
D += ((A & C) | (B & ~C)) + X14 + 0xC33707D6;
D = A + (D << 9 | D >>> -9);
C += ((D & B) | (A & ~B)) + X3 + 0xF4D50D87;
C = D + (C << 14 | C >>> -14);
B += ((C & A) | (D & ~A)) + X8 + 0x455A14ED;
B = C + (B << 20 | B >>> -20);
A += ((B & D) | (C & ~D)) + X13 + 0xA9E3E905;
A = B + (A << 5 | A >>> -5);
D += ((A & C) | (B & ~C)) + X2 + 0xFCEFA3F8;
D = A + (D << 9 | D >>> -9);
C += ((D & B) | (A & ~B)) + X7 + 0x676F02D9;
C = D + (C << 14 | C >>> -14);
B += ((C & A) | (D & ~A)) + X12 + 0x8D2A4C8A;
B = C + (B << 20 | B >>> -20);
// round 3
A += (B ^ C ^ D) + X5 + 0xFFFA3942;
A = B + (A << 4 | A >>> -4);
D += (A ^ B ^ C) + X8 + 0x8771F681;
D = A + (D << 11 | D >>> -11);
C += (D ^ A ^ B) + X11 + 0x6D9D6122;
C = D + (C << 16 | C >>> -16);
B += (C ^ D ^ A) + X14 + 0xFDE5380C;
B = C + (B << 23 | B >>> -23);
A += (B ^ C ^ D) + X1 + 0xA4BEEA44;
A = B + (A << 4 | A >>> -4);
D += (A ^ B ^ C) + X4 + 0x4BDECFA9;
D = A + (D << 11 | D >>> -11);
C += (D ^ A ^ B) + X7 + 0xF6BB4B60;
C = D + (C << 16 | C >>> -16);
B += (C ^ D ^ A) + X10 + 0xBEBFBC70;
B = C + (B << 23 | B >>> -23);
A += (B ^ C ^ D) + X13 + 0x289B7EC6;
A = B + (A << 4 | A >>> -4);
D += (A ^ B ^ C) + X0 + 0xEAA127FA;
D = A + (D << 11 | D >>> -11);
C += (D ^ A ^ B) + X3 + 0xD4EF3085;
C = D + (C << 16 | C >>> -16);
B += (C ^ D ^ A) + X6 + 0x04881D05;
B = C + (B << 23 | B >>> -23);
A += (B ^ C ^ D) + X9 + 0xD9D4D039;
A = B + (A << 4 | A >>> -4);
D += (A ^ B ^ C) + X12 + 0xE6DB99E5;
D = A + (D << 11 | D >>> -11);
C += (D ^ A ^ B) + X15 + 0x1FA27CF8;
C = D + (C << 16 | C >>> -16);
B += (C ^ D ^ A) + X2 + 0xC4AC5665;
B = C + (B << 23 | B >>> -23);
// round 4
A += (C ^ (B | ~D)) + X0 + 0xF4292244;
A = B + (A << 6 | A >>> -6);
D += (B ^ (A | ~C)) + X7 + 0x432AFF97;
D = A + (D << 10 | D >>> -10);
C += (A ^ (D | ~B)) + X14 + 0xAB9423A7;
C = D + (C << 15 | C >>> -15);
B += (D ^ (C | ~A)) + X5 + 0xFC93A039;
B = C + (B << 21 | B >>> -21);
A += (C ^ (B | ~D)) + X12 + 0x655B59C3;
A = B + (A << 6 | A >>> -6);
D += (B ^ (A | ~C)) + X3 + 0x8F0CCC92;
D = A + (D << 10 | D >>> -10);
C += (A ^ (D | ~B)) + X10 + 0xFFEFF47D;
C = D + (C << 15 | C >>> -15);
B += (D ^ (C | ~A)) + X1 + 0x85845dd1;
B = C + (B << 21 | B >>> -21);
A += (C ^ (B | ~D)) + X8 + 0x6FA87E4F;
A = B + (A << 6 | A >>> -6);
D += (B ^ (A | ~C)) + X15 + 0xFE2CE6E0;
D = A + (D << 10 | D >>> -10);
C += (A ^ (D | ~B)) + X6 + 0xA3014314;
C = D + (C << 15 | C >>> -15);
B += (D ^ (C | ~A)) + X13 + 0x4E0811A1;
B = C + (B << 21 | B >>> -21);
A += (C ^ (B | ~D)) + X4 + 0xF7537E82;
A = B + (A << 6 | A >>> -6);
D += (B ^ (A | ~C)) + X11 + 0xBD3AF235;
D = A + (D << 10 | D >>> -10);
C += (A ^ (D | ~B)) + X2 + 0x2AD7D2BB;
C = D + (C << 15 | C >>> -15);
B += (D ^ (C | ~A)) + X9 + 0xEB86D391;
B = C + (B << 21 | B >>> -21);
h0 += A;
h1 += B;
h2 += C;
h3 += D;
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] result = new byte[padding + 8];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
long bits = count << 3;
result[padding++] = (byte) bits;
result[padding++] = (byte) (bits >>> 8);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 48);
result[padding] = (byte) (bits >>> 56);
return result;
}
protected byte[] getResult()
{
byte[] result = new byte[] { (byte) h0, (byte) (h0 >>> 8),
(byte) (h0 >>> 16), (byte) (h0 >>> 24),
(byte) h1, (byte) (h1 >>> 8),
(byte) (h1 >>> 16), (byte) (h1 >>> 24),
(byte) h2, (byte) (h2 >>> 8),
(byte) (h2 >>> 16), (byte) (h2 >>> 24),
(byte) h3, (byte) (h3 >>> 8),
(byte) (h3 >>> 16), (byte) (h3 >>> 24) };
return result;
}
protected void resetContext()
{
// magic MD5/RIPEMD128 initialisation constants
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean(DIGEST0.equals(Util.toString(new MD5().digest())));
}
return valid.booleanValue();
}
}

View file

@ -0,0 +1,291 @@
/* RipeMD128.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>RIPEMD-128 is a 128-bit message digest.</p>
*
* <p>References:</p>
*
* <ol>
* <li><a href="http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html">
* RIPEMD160</a>: A Strengthened Version of RIPEMD.<br>
* Hans Dobbertin, Antoon Bosselaers and Bart Preneel.</li>
* </ol>
*/
public class RipeMD128 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final int BLOCK_SIZE = 64; // inner block size in bytes
private static final String DIGEST0 = "CDF26213A150DC3ECB610F18F6B38B46";
/** Constants for the transform method. */
// selection of message word
private static final int[] R = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0,
9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8,
1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10,
0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2 };
private static final int[] Rp = { 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1,
10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14,
15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14,
6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4,
1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14 };
// amount for rotate left (rol)
private static final int[] S = { 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15,
6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12,
15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9,
13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12,
14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5,
12 };
private static final int[] Sp = { 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11,
14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11,
7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8,
6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15,
5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5,
15, 8 };
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 128-bit h0, h1, h2, h3 (interim result) */
private int h0, h1, h2, h3;
/** 512 bits work buffer = 16 x 32-bit words */
private int[] X = new int[16];
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public RipeMD128()
{
super(Registry.RIPEMD128_HASH, 16, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private RipeMD128(RipeMD128 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new RipeMD128(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
int A, B, C, D, Ap, Bp, Cp, Dp, T, s, i;
// encode 64 bytes from input block into an array of 16 unsigned
// integers.
for (i = 0; i < 16; i++)
{
X[i] = (in[offset++] & 0xFF) | (in[offset++] & 0xFF) << 8
| (in[offset++] & 0xFF) << 16 | in[offset++] << 24;
}
A = Ap = h0;
B = Bp = h1;
C = Cp = h2;
D = Dp = h3;
for (i = 0; i < 16; i++)
{ // rounds 0...15
s = S[i];
T = A + (B ^ C ^ D) + X[i];
A = D;
D = C;
C = B;
B = T << s | T >>> (32 - s);
s = Sp[i];
T = Ap + ((Bp & Dp) | (Cp & ~Dp)) + X[Rp[i]] + 0x50A28BE6;
Ap = Dp;
Dp = Cp;
Cp = Bp;
Bp = T << s | T >>> (32 - s);
}
for (; i < 32; i++)
{ // rounds 16...31
s = S[i];
T = A + ((B & C) | (~B & D)) + X[R[i]] + 0x5A827999;
A = D;
D = C;
C = B;
B = T << s | T >>> (32 - s);
s = Sp[i];
T = Ap + ((Bp | ~Cp) ^ Dp) + X[Rp[i]] + 0x5C4DD124;
Ap = Dp;
Dp = Cp;
Cp = Bp;
Bp = T << s | T >>> (32 - s);
}
for (; i < 48; i++)
{ // rounds 32...47
s = S[i];
T = A + ((B | ~C) ^ D) + X[R[i]] + 0x6ED9EBA1;
A = D;
D = C;
C = B;
B = T << s | T >>> (32 - s);
s = Sp[i];
T = Ap + ((Bp & Cp) | (~Bp & Dp)) + X[Rp[i]] + 0x6D703EF3;
Ap = Dp;
Dp = Cp;
Cp = Bp;
Bp = T << s | T >>> (32 - s);
}
for (; i < 64; i++)
{ // rounds 48...63
s = S[i];
T = A + ((B & D) | (C & ~D)) + X[R[i]] + 0x8F1BBCDC;
A = D;
D = C;
C = B;
B = T << s | T >>> (32 - s);
s = Sp[i];
T = Ap + (Bp ^ Cp ^ Dp) + X[Rp[i]];
Ap = Dp;
Dp = Cp;
Cp = Bp;
Bp = T << s | T >>> (32 - s);
}
T = h1 + C + Dp;
h1 = h2 + D + Ap;
h2 = h3 + A + Bp;
h3 = h0 + B + Cp;
h0 = T;
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] result = new byte[padding + 8];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
long bits = count << 3;
result[padding++] = (byte) bits;
result[padding++] = (byte) (bits >>> 8);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 48);
result[padding] = (byte) (bits >>> 56);
return result;
}
protected byte[] getResult()
{
byte[] result = new byte[] { (byte) h0, (byte) (h0 >>> 8),
(byte) (h0 >>> 16), (byte) (h0 >>> 24),
(byte) h1, (byte) (h1 >>> 8),
(byte) (h1 >>> 16), (byte) (h1 >>> 24),
(byte) h2, (byte) (h2 >>> 8),
(byte) (h2 >>> 16), (byte) (h2 >>> 24),
(byte) h3, (byte) (h3 >>> 8),
(byte) (h3 >>> 16), (byte) (h3 >>> 24) };
return result;
}
protected void resetContext()
{
// magic RIPEMD128 initialisation constants
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean
(DIGEST0.equals(Util.toString(new RipeMD128().digest())));
}
return valid.booleanValue();
}
}

View file

@ -0,0 +1,328 @@
/* RipeMD160.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>RIPEMD-160 is a 160-bit message digest.</p>
*
* <p>References:</p>
*
* <ol>
* <li><a href="http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html">
* RIPEMD160</a>: A Strengthened Version of RIPEMD.<br>
* Hans Dobbertin, Antoon Bosselaers and Bart Preneel.</li>
* </ol>
*/
public class RipeMD160 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final int BLOCK_SIZE = 64; // inner block size in bytes
private static final String DIGEST0 = "9C1185A5C5E9FC54612808977EE8F548B2258D31";
// selection of message word
private static final int[] R = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0,
9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8,
1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10,
0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0,
5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15,
13 };
private static final int[] Rp = { 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1,
10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14,
15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14,
6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4,
1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0,
3, 9, 11 };
// amount for rotate left (rol)
private static final int[] S = { 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15,
6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12,
15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9,
13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12,
14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5,
12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13,
14, 11, 8, 5, 6 };
private static final int[] Sp = { 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11,
14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11,
7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8,
6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15,
5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5,
15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6,
5, 15, 13, 11, 11 };
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 160-bit h0, h1, h2, h3, h4 (interim result) */
private int h0, h1, h2, h3, h4;
/** 512 bits work buffer = 16 x 32-bit words */
private int[] X = new int[16];
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public RipeMD160()
{
super(Registry.RIPEMD160_HASH, 20, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private RipeMD160(RipeMD160 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.h4 = md.h4;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return (new RipeMD160(this));
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
int A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, T, s, i;
// encode 64 bytes from input block into an array of 16 unsigned integers
for (i = 0; i < 16; i++)
{
X[i] = (in[offset++] & 0xFF) | (in[offset++] & 0xFF) << 8
| (in[offset++] & 0xFF) << 16 | in[offset++] << 24;
}
A = Ap = h0;
B = Bp = h1;
C = Cp = h2;
D = Dp = h3;
E = Ep = h4;
for (i = 0; i < 16; i++)
{ // rounds 0...15
s = S[i];
T = A + (B ^ C ^ D) + X[i];
A = E;
E = D;
D = C << 10 | C >>> 22;
C = B;
B = (T << s | T >>> (32 - s)) + A;
s = Sp[i];
T = Ap + (Bp ^ (Cp | ~Dp)) + X[Rp[i]] + 0x50A28BE6;
Ap = Ep;
Ep = Dp;
Dp = Cp << 10 | Cp >>> 22;
Cp = Bp;
Bp = (T << s | T >>> (32 - s)) + Ap;
}
for (; i < 32; i++)
{ // rounds 16...31
s = S[i];
T = A + ((B & C) | (~B & D)) + X[R[i]] + 0x5A827999;
A = E;
E = D;
D = C << 10 | C >>> 22;
C = B;
B = (T << s | T >>> (32 - s)) + A;
s = Sp[i];
T = Ap + ((Bp & Dp) | (Cp & ~Dp)) + X[Rp[i]] + 0x5C4DD124;
Ap = Ep;
Ep = Dp;
Dp = Cp << 10 | Cp >>> 22;
Cp = Bp;
Bp = (T << s | T >>> (32 - s)) + Ap;
}
for (; i < 48; i++)
{ // rounds 32...47
s = S[i];
T = A + ((B | ~C) ^ D) + X[R[i]] + 0x6ED9EBA1;
A = E;
E = D;
D = C << 10 | C >>> 22;
C = B;
B = (T << s | T >>> (32 - s)) + A;
s = Sp[i];
T = Ap + ((Bp | ~Cp) ^ Dp) + X[Rp[i]] + 0x6D703EF3;
Ap = Ep;
Ep = Dp;
Dp = Cp << 10 | Cp >>> 22;
Cp = Bp;
Bp = (T << s | T >>> (32 - s)) + Ap;
}
for (; i < 64; i++)
{ // rounds 48...63
s = S[i];
T = A + ((B & D) | (C & ~D)) + X[R[i]] + 0x8F1BBCDC;
A = E;
E = D;
D = C << 10 | C >>> 22;
C = B;
B = (T << s | T >>> (32 - s)) + A;
s = Sp[i];
T = Ap + ((Bp & Cp) | (~Bp & Dp)) + X[Rp[i]] + 0x7A6D76E9;
Ap = Ep;
Ep = Dp;
Dp = Cp << 10 | Cp >>> 22;
Cp = Bp;
Bp = (T << s | T >>> (32 - s)) + Ap;
}
for (; i < 80; i++)
{ // rounds 64...79
s = S[i];
T = A + (B ^ (C | ~D)) + X[R[i]] + 0xA953FD4E;
A = E;
E = D;
D = C << 10 | C >>> 22;
C = B;
B = (T << s | T >>> (32 - s)) + A;
s = Sp[i];
T = Ap + (Bp ^ Cp ^ Dp) + X[Rp[i]];
Ap = Ep;
Ep = Dp;
Dp = Cp << 10 | Cp >>> 22;
Cp = Bp;
Bp = (T << s | T >>> (32 - s)) + Ap;
}
T = h1 + C + Dp;
h1 = h2 + D + Ep;
h2 = h3 + E + Ap;
h3 = h4 + A + Bp;
h4 = h0 + B + Cp;
h0 = T;
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] result = new byte[padding + 8];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
long bits = count << 3;
result[padding++] = (byte) bits;
result[padding++] = (byte) (bits >>> 8);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 48);
result[padding] = (byte) (bits >>> 56);
return result;
}
protected byte[] getResult()
{
byte[] result = new byte[] { (byte) h0, (byte) (h0 >>> 8),
(byte) (h0 >>> 16), (byte) (h0 >>> 24),
(byte) h1, (byte) (h1 >>> 8),
(byte) (h1 >>> 16), (byte) (h1 >>> 24),
(byte) h2, (byte) (h2 >>> 8),
(byte) (h2 >>> 16), (byte) (h2 >>> 24),
(byte) h3, (byte) (h3 >>> 8),
(byte) (h3 >>> 16), (byte) (h3 >>> 24),
(byte) h4, (byte) (h4 >>> 8),
(byte) (h4 >>> 16), (byte) (h4 >>> 24) };
return result;
}
protected void resetContext()
{
// magic RIPEMD160 initialisation constants
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
h4 = 0xC3D2E1F0;
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean
(DIGEST0.equals(Util.toString(new RipeMD160().digest())));
}
return valid.booleanValue();
}
}

View file

@ -0,0 +1,308 @@
/* Sha160.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>The Secure Hash Algorithm (SHA-1) is required for use with the Digital
* Signature Algorithm (DSA) as specified in the Digital Signature Standard
* (DSS) and whenever a secure hash algorithm is required for federal
* applications. For a message of length less than 2^64 bits, the SHA-1
* produces a 160-bit condensed representation of the message called a message
* digest. The message digest is used during generation of a signature for the
* message. The SHA-1 is also used to compute a message digest for the received
* version of the message during the process of verifying the signature. Any
* change to the message in transit will, with very high probability, result in
* a different message digest, and the signature will fail to verify.</p>
*
* <p>The SHA-1 is designed to have the following properties: it is
* computationally infeasible to find a message which corresponds to a given
* message digest, or to find two different messages which produce the same
* message digest.</p>
*
* <p>References:</p>
*
* <ol>
* <li><a href="http://www.itl.nist.gov/fipspubs/fip180-1.htm">SECURE HASH
* STANDARD</a><br>
* Federal Information, Processing Standards Publication 180-1, 1995 April 17.
* </li>
* </ol>
*/
public class Sha160 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final int BLOCK_SIZE = 64; // inner block size in bytes
private static final String DIGEST0 = "A9993E364706816ABA3E25717850C26C9CD0D89D";
private static final int[] w = new int[80];
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 160-bit interim result. */
private int h0, h1, h2, h3, h4;
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public Sha160()
{
super(Registry.SHA160_HASH, 20, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private Sha160(Sha160 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.h4 = md.h4;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
public static final int[] G(int hh0, int hh1, int hh2, int hh3, int hh4,
byte[] in, int offset)
{
// int[] w = new int[80];
// int i, T;
// for (i = 0; i < 16; i++) {
// w[i] = in[offset++] << 24 |
// (in[offset++] & 0xFF) << 16 |
// (in[offset++] & 0xFF) << 8 |
// (in[offset++] & 0xFF);
// }
// for (i = 16; i < 80; i++) {
// T = w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16];
// w[i] = T << 1 | T >>> 31;
// }
// return sha(hh0, hh1, hh2, hh3, hh4, in, offset, w);
return sha(hh0, hh1, hh2, hh3, hh4, in, offset);
}
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new Sha160(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
// int i, T;
// for (i = 0; i < 16; i++) {
// W[i] = in[offset++] << 24 |
// (in[offset++] & 0xFF) << 16 |
// (in[offset++] & 0xFF) << 8 |
// (in[offset++] & 0xFF);
// }
// for (i = 16; i < 80; i++) {
// T = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
// W[i] = T << 1 | T >>> 31;
// }
// int[] result = sha(h0, h1, h2, h3, h4, in, offset, W);
int[] result = sha(h0, h1, h2, h3, h4, in, offset);
h0 = result[0];
h1 = result[1];
h2 = result[2];
h3 = result[3];
h4 = result[4];
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] result = new byte[padding + 8];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
long bits = count << 3;
result[padding++] = (byte) (bits >>> 56);
result[padding++] = (byte) (bits >>> 48);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 8);
result[padding] = (byte) bits;
return result;
}
protected byte[] getResult()
{
byte[] result = new byte[] { (byte) (h0 >>> 24), (byte) (h0 >>> 16),
(byte) (h0 >>> 8), (byte) h0,
(byte) (h1 >>> 24), (byte) (h1 >>> 16),
(byte) (h1 >>> 8), (byte) h1,
(byte) (h2 >>> 24), (byte) (h2 >>> 16),
(byte) (h2 >>> 8), (byte) h2,
(byte) (h3 >>> 24), (byte) (h3 >>> 16),
(byte) (h3 >>> 8), (byte) h3,
(byte) (h4 >>> 24), (byte) (h4 >>> 16),
(byte) (h4 >>> 8), (byte) h4 };
return result;
}
protected void resetContext()
{
// magic SHA-1/RIPEMD160 initialisation constants
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
h4 = 0xC3D2E1F0;
}
public boolean selfTest()
{
if (valid == null)
{
Sha160 md = new Sha160();
md.update((byte) 0x61); // a
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
valid = new Boolean(DIGEST0.equals(result));
}
return valid.booleanValue();
}
// SHA specific methods ----------------------------------------------------
private static final synchronized int[]
// sha(int hh0, int hh1, int hh2, int hh3, int hh4, byte[] in, int offset, int[] w) {
sha(int hh0, int hh1, int hh2, int hh3, int hh4, byte[] in, int offset)
{
int A = hh0;
int B = hh1;
int C = hh2;
int D = hh3;
int E = hh4;
int r, T;
for (r = 0; r < 16; r++)
{
w[r] = in[offset++] << 24 | (in[offset++] & 0xFF) << 16
| (in[offset++] & 0xFF) << 8 | (in[offset++] & 0xFF);
}
for (r = 16; r < 80; r++)
{
T = w[r - 3] ^ w[r - 8] ^ w[r - 14] ^ w[r - 16];
w[r] = T << 1 | T >>> 31;
}
// rounds 0-19
for (r = 0; r < 20; r++)
{
T = (A << 5 | A >>> 27) + ((B & C) | (~B & D)) + E + w[r] + 0x5A827999;
E = D;
D = C;
C = B << 30 | B >>> 2;
B = A;
A = T;
}
// rounds 20-39
for (r = 20; r < 40; r++)
{
T = (A << 5 | A >>> 27) + (B ^ C ^ D) + E + w[r] + 0x6ED9EBA1;
E = D;
D = C;
C = B << 30 | B >>> 2;
B = A;
A = T;
}
// rounds 40-59
for (r = 40; r < 60; r++)
{
T = (A << 5 | A >>> 27) + (B & C | B & D | C & D) + E + w[r]
+ 0x8F1BBCDC;
E = D;
D = C;
C = B << 30 | B >>> 2;
B = A;
A = T;
}
// rounds 60-79
for (r = 60; r < 80; r++)
{
T = (A << 5 | A >>> 27) + (B ^ C ^ D) + E + w[r] + 0xCA62C1D6;
E = D;
D = C;
C = B << 30 | B >>> 2;
B = A;
A = T;
}
return new int[] { hh0 + A, hh1 + B, hh2 + C, hh3 + D, hh4 + E };
}
}

View file

@ -0,0 +1,278 @@
/* Sha256.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>Implementation of SHA2-1 [SHA-256] per the IETF Draft Specification.</p>
*
* <p>References:</p>
* <ol>
* <li><a href="http://ftp.ipv4.heanet.ie/pub/ietf/internet-drafts/draft-ietf-ipsec-ciph-aes-cbc-03.txt">
* Descriptions of SHA-256, SHA-384, and SHA-512</a>,</li>
* <li>http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf</li>
* </ol>
*/
public class Sha256 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final int[] k = { 0x428a2f98, 0x71374491, 0xb5c0fbcf,
0xe9b5dba5, 0x3956c25b, 0x59f111f1,
0x923f82a4, 0xab1c5ed5, 0xd807aa98,
0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7,
0xc19bf174, 0xe49b69c1, 0xefbe4786,
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f,
0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8,
0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
0x06ca6351, 0x14292967, 0x27b70a85,
0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e,
0x92722c85, 0xa2bfe8a1, 0xa81a664b,
0xc24b8b70, 0xc76c51a3, 0xd192e819,
0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c,
0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
0x5b9cca4f, 0x682e6ff3, 0x748f82ee,
0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7,
0xc67178f2 };
private static final int BLOCK_SIZE = 64; // inner block size in bytes
private static final String DIGEST0 = "BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD";
private static final int[] w = new int[64];
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 256-bit interim result. */
private int h0, h1, h2, h3, h4, h5, h6, h7;
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public Sha256()
{
super(Registry.SHA256_HASH, 32, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private Sha256(Sha256 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.h4 = md.h4;
this.h5 = md.h5;
this.h6 = md.h6;
this.h7 = md.h7;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
public static final int[] G(int hh0, int hh1, int hh2, int hh3, int hh4,
int hh5, int hh6, int hh7, byte[] in, int offset)
{
return sha(hh0, hh1, hh2, hh3, hh4, hh5, hh6, hh7, in, offset);
}
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new Sha256(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
int[] result = sha(h0, h1, h2, h3, h4, h5, h6, h7, in, offset);
h0 = result[0];
h1 = result[1];
h2 = result[2];
h3 = result[3];
h4 = result[4];
h5 = result[5];
h6 = result[6];
h7 = result[7];
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] result = new byte[padding + 8];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
long bits = count << 3;
result[padding++] = (byte) (bits >>> 56);
result[padding++] = (byte) (bits >>> 48);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 8);
result[padding] = (byte) bits;
return result;
}
protected byte[] getResult()
{
return new byte[] { (byte) (h0 >>> 24), (byte) (h0 >>> 16),
(byte) (h0 >>> 8), (byte) h0, (byte) (h1 >>> 24),
(byte) (h1 >>> 16), (byte) (h1 >>> 8), (byte) h1,
(byte) (h2 >>> 24), (byte) (h2 >>> 16),
(byte) (h2 >>> 8), (byte) h2, (byte) (h3 >>> 24),
(byte) (h3 >>> 16), (byte) (h3 >>> 8), (byte) h3,
(byte) (h4 >>> 24), (byte) (h4 >>> 16),
(byte) (h4 >>> 8), (byte) h4, (byte) (h5 >>> 24),
(byte) (h5 >>> 16), (byte) (h5 >>> 8), (byte) h5,
(byte) (h6 >>> 24), (byte) (h6 >>> 16),
(byte) (h6 >>> 8), (byte) h6, (byte) (h7 >>> 24),
(byte) (h7 >>> 16), (byte) (h7 >>> 8), (byte) h7 };
}
protected void resetContext()
{
// magic SHA-256 initialisation constants
h0 = 0x6a09e667;
h1 = 0xbb67ae85;
h2 = 0x3c6ef372;
h3 = 0xa54ff53a;
h4 = 0x510e527f;
h5 = 0x9b05688c;
h6 = 0x1f83d9ab;
h7 = 0x5be0cd19;
}
public boolean selfTest()
{
if (valid == null)
{
Sha256 md = new Sha256();
md.update((byte) 0x61); // a
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
valid = new Boolean(DIGEST0.equals(result));
}
return valid.booleanValue();
}
// SHA specific methods ----------------------------------------------------
private static final synchronized int[] sha(int hh0, int hh1, int hh2,
int hh3, int hh4, int hh5,
int hh6, int hh7, byte[] in,
int offset)
{
int A = hh0;
int B = hh1;
int C = hh2;
int D = hh3;
int E = hh4;
int F = hh5;
int G = hh6;
int H = hh7;
int r, T, T2;
for (r = 0; r < 16; r++)
{
w[r] = (in[offset++] << 24 | (in[offset++] & 0xFF) << 16
| (in[offset++] & 0xFF) << 8 | (in[offset++] & 0xFF));
}
for (r = 16; r < 64; r++)
{
T = w[r - 2];
T2 = w[r - 15];
w[r] = ((((T >>> 17) | (T << 15)) ^ ((T >>> 19) | (T << 13)) ^ (T >>> 10))
+ w[r - 7]
+ (((T2 >>> 7) | (T2 << 25)) ^ ((T2 >>> 18) | (T2 << 14)) ^ (T2 >>> 3))
+ w[r - 16]);
}
for (r = 0; r < 64; r++)
{
T = (H
+ (((E >>> 6) | (E << 26)) ^ ((E >>> 11) | (E << 21)) ^ ((E >>> 25) | (E << 7)))
+ ((E & F) ^ (~E & G)) + k[r] + w[r]);
T2 = ((((A >>> 2) | (A << 30)) ^ ((A >>> 13) | (A << 19)) ^ ((A >>> 22) | (A << 10)))
+ ((A & B) ^ (A & C) ^ (B & C)));
H = G;
G = F;
F = E;
E = D + T;
D = C;
C = B;
B = A;
A = T + T2;
}
return new int[] { hh0 + A, hh1 + B, hh2 + C, hh3 + D, hh4 + E, hh5 + F,
hh6 + G, hh7 + H };
}
}

View file

@ -0,0 +1,322 @@
/* Sha384.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>Implementation of SHA2-2 [SHA-384] per the IETF Draft Specification.</p>
*
* <p>References:</p>
* <ol>
* <li><a href="http://ftp.ipv4.heanet.ie/pub/ietf/internet-drafts/draft-ietf-ipsec-ciph-aes-cbc-03.txt">
* Descriptions of SHA-256, SHA-384, and SHA-512</a>,</li>
* <li>http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf</li>
* </ol>
*/
public class Sha384 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final long[] k = { 0x428a2f98d728ae22L, 0x7137449123ef65cdL,
0xb5c0fbcfec4d3b2fL, 0xe9b5dba58189dbbcL,
0x3956c25bf348b538L, 0x59f111f1b605d019L,
0x923f82a4af194f9bL, 0xab1c5ed5da6d8118L,
0xd807aa98a3030242L, 0x12835b0145706fbeL,
0x243185be4ee4b28cL, 0x550c7dc3d5ffb4e2L,
0x72be5d74f27b896fL, 0x80deb1fe3b1696b1L,
0x9bdc06a725c71235L, 0xc19bf174cf692694L,
0xe49b69c19ef14ad2L, 0xefbe4786384f25e3L,
0x0fc19dc68b8cd5b5L, 0x240ca1cc77ac9c65L,
0x2de92c6f592b0275L, 0x4a7484aa6ea6e483L,
0x5cb0a9dcbd41fbd4L, 0x76f988da831153b5L,
0x983e5152ee66dfabL, 0xa831c66d2db43210L,
0xb00327c898fb213fL, 0xbf597fc7beef0ee4L,
0xc6e00bf33da88fc2L, 0xd5a79147930aa725L,
0x06ca6351e003826fL, 0x142929670a0e6e70L,
0x27b70a8546d22ffcL, 0x2e1b21385c26c926L,
0x4d2c6dfc5ac42aedL, 0x53380d139d95b3dfL,
0x650a73548baf63deL, 0x766a0abb3c77b2a8L,
0x81c2c92e47edaee6L, 0x92722c851482353bL,
0xa2bfe8a14cf10364L, 0xa81a664bbc423001L,
0xc24b8b70d0f89791L, 0xc76c51a30654be30L,
0xd192e819d6ef5218L, 0xd69906245565a910L,
0xf40e35855771202aL, 0x106aa07032bbd1b8L,
0x19a4c116b8d2d0c8L, 0x1e376c085141ab53L,
0x2748774cdf8eeb99L, 0x34b0bcb5e19b48a8L,
0x391c0cb3c5c95a63L, 0x4ed8aa4ae3418acbL,
0x5b9cca4f7763e373L, 0x682e6ff3d6b2b8a3L,
0x748f82ee5defb2fcL, 0x78a5636f43172f60L,
0x84c87814a1f0ab72L, 0x8cc702081a6439ecL,
0x90befffa23631e28L, 0xa4506cebde82bde9L,
0xbef9a3f7b2c67915L, 0xc67178f2e372532bL,
0xca273eceea26619cL, 0xd186b8c721c0c207L,
0xeada7dd6cde0eb1eL, 0xf57d4f7fee6ed178L,
0x06f067aa72176fbaL, 0x0a637dc5a2c898a6L,
0x113f9804bef90daeL, 0x1b710b35131c471bL,
0x28db77f523047d84L, 0x32caab7b40c72493L,
0x3c9ebe0a15c9bebcL, 0x431d67c49c100d4cL,
0x4cc5d4becb3e42b6L, 0x597f299cfc657e2aL,
0x5fcb6fab3ad6faecL, 0x6c44198c4a475817L };
private static final int BLOCK_SIZE = 128; // inner block size in bytes
private static final String DIGEST0 = "CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1631A8B605A43FF5BED"
+ "8086072BA1E7CC2358BAECA134C825A7";
private static final long[] w = new long[80];
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 512-bit interim result. */
private long h0, h1, h2, h3, h4, h5, h6, h7;
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public Sha384()
{
super(Registry.SHA384_HASH, 48, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private Sha384(Sha384 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.h4 = md.h4;
this.h5 = md.h5;
this.h6 = md.h6;
this.h7 = md.h7;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
public static final long[] G(long hh0, long hh1, long hh2, long hh3,
long hh4, long hh5, long hh6, long hh7,
byte[] in, int offset)
{
return sha(hh0, hh1, hh2, hh3, hh4, hh5, hh6, hh7, in, offset);
}
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new Sha384(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
long[] result = sha(h0, h1, h2, h3, h4, h5, h6, h7, in, offset);
h0 = result[0];
h1 = result[1];
h2 = result[2];
h3 = result[3];
h4 = result[4];
h5 = result[5];
h6 = result[6];
h7 = result[7];
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 112) ? (112 - n) : (240 - n);
byte[] result = new byte[padding + 16];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
// TODO: FIX Only ~35 bits of 128 bit counter usable this way
long bits = count << 3;
padding += 8;
result[padding++] = (byte) (bits >>> 56);
result[padding++] = (byte) (bits >>> 48);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 8);
result[padding] = (byte) bits;
return result;
}
protected byte[] getResult()
{
return new byte[] { (byte) (h0 >>> 56), (byte) (h0 >>> 48),
(byte) (h0 >>> 40), (byte) (h0 >>> 32),
(byte) (h0 >>> 24), (byte) (h0 >>> 16),
(byte) (h0 >>> 8), (byte) h0, (byte) (h1 >>> 56),
(byte) (h1 >>> 48), (byte) (h1 >>> 40),
(byte) (h1 >>> 32), (byte) (h1 >>> 24),
(byte) (h1 >>> 16), (byte) (h1 >>> 8), (byte) h1,
(byte) (h2 >>> 56), (byte) (h2 >>> 48),
(byte) (h2 >>> 40), (byte) (h2 >>> 32),
(byte) (h2 >>> 24), (byte) (h2 >>> 16),
(byte) (h2 >>> 8), (byte) h2, (byte) (h3 >>> 56),
(byte) (h3 >>> 48), (byte) (h3 >>> 40),
(byte) (h3 >>> 32), (byte) (h3 >>> 24),
(byte) (h3 >>> 16), (byte) (h3 >>> 8), (byte) h3,
(byte) (h4 >>> 56), (byte) (h4 >>> 48),
(byte) (h4 >>> 40), (byte) (h4 >>> 32),
(byte) (h4 >>> 24), (byte) (h4 >>> 16),
(byte) (h4 >>> 8), (byte) h4, (byte) (h5 >>> 56),
(byte) (h5 >>> 48), (byte) (h5 >>> 40),
(byte) (h5 >>> 32), (byte) (h5 >>> 24),
(byte) (h5 >>> 16), (byte) (h5 >>> 8), (byte) h5
// (byte)(h6 >>> 56), (byte)(h6 >>> 48), (byte)(h6 >>> 40), (byte)(h6 >>> 32),
// (byte)(h6 >>> 24), (byte)(h6 >>> 16), (byte)(h6 >>> 8), (byte) h6,
// (byte)(h7 >>> 56), (byte)(h7 >>> 48), (byte)(h7 >>> 40), (byte)(h7 >>> 32),
// (byte)(h7 >>> 24), (byte)(h7 >>> 16), (byte)(h7 >>> 8), (byte) h7
};
}
protected void resetContext()
{
// magic SHA-384 initialisation constants
h0 = 0xcbbb9d5dc1059ed8L;
h1 = 0x629a292a367cd507L;
h2 = 0x9159015a3070dd17L;
h3 = 0x152fecd8f70e5939L;
h4 = 0x67332667ffc00b31L;
h5 = 0x8eb44a8768581511L;
h6 = 0xdb0c2e0d64f98fa7L;
h7 = 0x47b5481dbefa4fa4L;
}
public boolean selfTest()
{
if (valid == null)
{
Sha384 md = new Sha384();
md.update((byte) 0x61); // a
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
valid = new Boolean(DIGEST0.equals(result));
}
return valid.booleanValue();
}
// SHA specific methods ----------------------------------------------------
private static final synchronized long[] sha(long hh0, long hh1, long hh2,
long hh3, long hh4, long hh5,
long hh6, long hh7, byte[] in,
int offset)
{
long A = hh0;
long B = hh1;
long C = hh2;
long D = hh3;
long E = hh4;
long F = hh5;
long G = hh6;
long H = hh7;
long T, T2;
int r;
for (r = 0; r < 16; r++)
{
w[r] = (long) in[offset++] << 56 | ((long) in[offset++] & 0xFF) << 48
| ((long) in[offset++] & 0xFF) << 40
| ((long) in[offset++] & 0xFF) << 32
| ((long) in[offset++] & 0xFF) << 24
| ((long) in[offset++] & 0xFF) << 16
| ((long) in[offset++] & 0xFF) << 8
| ((long) in[offset++] & 0xFF);
}
for (r = 16; r < 80; r++)
{
T = w[r - 2];
T2 = w[r - 15];
w[r] = (((T >>> 19) | (T << 45)) ^ ((T >>> 61) | (T << 3)) ^ (T >>> 6))
+ w[r - 7]
+ (((T2 >>> 1) | (T2 << 63)) ^ ((T2 >>> 8) | (T2 << 56)) ^ (T2 >>> 7))
+ w[r - 16];
}
for (r = 0; r < 80; r++)
{
T = H
+ (((E >>> 14) | (E << 50)) ^ ((E >>> 18) | (E << 46)) ^ ((E >>> 41) | (E << 23)))
+ ((E & F) ^ ((~E) & G)) + k[r] + w[r];
// T IS INCORRECT SOMEHOW
T2 = (((A >>> 28) | (A << 36)) ^ ((A >>> 34) | (A << 30)) ^ ((A >>> 39) | (A << 25)))
+ ((A & B) ^ (A & C) ^ (B & C));
H = G;
G = F;
F = E;
E = D + T;
D = C;
C = B;
B = A;
A = T + T2;
}
return new long[] { hh0 + A, hh1 + B, hh2 + C, hh3 + D, hh4 + E, hh5 + F,
hh6 + G, hh7 + H };
}
}

View file

@ -0,0 +1,322 @@
/* Sha512.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>Implementation of SHA2-3 [SHA-512] per the IETF Draft Specification.</p>
*
* <p>References:</p>
* <ol>
* <li><a href="http://ftp.ipv4.heanet.ie/pub/ietf/internet-drafts/draft-ietf-ipsec-ciph-aes-cbc-03.txt">
* Descriptions of SHA-256, SHA-384, and SHA-512</a>,</li>
* <li>http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf</li>
* </ol>
*/
public class Sha512 extends BaseHash
{
// Constants and variables
// -------------------------------------------------------------------------
private static final long[] k = { 0x428a2f98d728ae22L, 0x7137449123ef65cdL,
0xb5c0fbcfec4d3b2fL, 0xe9b5dba58189dbbcL,
0x3956c25bf348b538L, 0x59f111f1b605d019L,
0x923f82a4af194f9bL, 0xab1c5ed5da6d8118L,
0xd807aa98a3030242L, 0x12835b0145706fbeL,
0x243185be4ee4b28cL, 0x550c7dc3d5ffb4e2L,
0x72be5d74f27b896fL, 0x80deb1fe3b1696b1L,
0x9bdc06a725c71235L, 0xc19bf174cf692694L,
0xe49b69c19ef14ad2L, 0xefbe4786384f25e3L,
0x0fc19dc68b8cd5b5L, 0x240ca1cc77ac9c65L,
0x2de92c6f592b0275L, 0x4a7484aa6ea6e483L,
0x5cb0a9dcbd41fbd4L, 0x76f988da831153b5L,
0x983e5152ee66dfabL, 0xa831c66d2db43210L,
0xb00327c898fb213fL, 0xbf597fc7beef0ee4L,
0xc6e00bf33da88fc2L, 0xd5a79147930aa725L,
0x06ca6351e003826fL, 0x142929670a0e6e70L,
0x27b70a8546d22ffcL, 0x2e1b21385c26c926L,
0x4d2c6dfc5ac42aedL, 0x53380d139d95b3dfL,
0x650a73548baf63deL, 0x766a0abb3c77b2a8L,
0x81c2c92e47edaee6L, 0x92722c851482353bL,
0xa2bfe8a14cf10364L, 0xa81a664bbc423001L,
0xc24b8b70d0f89791L, 0xc76c51a30654be30L,
0xd192e819d6ef5218L, 0xd69906245565a910L,
0xf40e35855771202aL, 0x106aa07032bbd1b8L,
0x19a4c116b8d2d0c8L, 0x1e376c085141ab53L,
0x2748774cdf8eeb99L, 0x34b0bcb5e19b48a8L,
0x391c0cb3c5c95a63L, 0x4ed8aa4ae3418acbL,
0x5b9cca4f7763e373L, 0x682e6ff3d6b2b8a3L,
0x748f82ee5defb2fcL, 0x78a5636f43172f60L,
0x84c87814a1f0ab72L, 0x8cc702081a6439ecL,
0x90befffa23631e28L, 0xa4506cebde82bde9L,
0xbef9a3f7b2c67915L, 0xc67178f2e372532bL,
0xca273eceea26619cL, 0xd186b8c721c0c207L,
0xeada7dd6cde0eb1eL, 0xf57d4f7fee6ed178L,
0x06f067aa72176fbaL, 0x0a637dc5a2c898a6L,
0x113f9804bef90daeL, 0x1b710b35131c471bL,
0x28db77f523047d84L, 0x32caab7b40c72493L,
0x3c9ebe0a15c9bebcL, 0x431d67c49c100d4cL,
0x4cc5d4becb3e42b6L, 0x597f299cfc657e2aL,
0x5fcb6fab3ad6faecL, 0x6c44198c4a475817L };
private static final int BLOCK_SIZE = 128; // inner block size in bytes
private static final String DIGEST0 = "DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A"
+ "2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F";
private static final long[] w = new long[80];
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** 512-bit interim result. */
private long h0, h1, h2, h3, h4, h5, h6, h7;
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public Sha512()
{
super(Registry.SHA512_HASH, 64, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private Sha512(Sha512 md)
{
this();
this.h0 = md.h0;
this.h1 = md.h1;
this.h2 = md.h2;
this.h3 = md.h3;
this.h4 = md.h4;
this.h5 = md.h5;
this.h6 = md.h6;
this.h7 = md.h7;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
public static final long[] G(long hh0, long hh1, long hh2, long hh3,
long hh4, long hh5, long hh6, long hh7,
byte[] in, int offset)
{
return sha(hh0, hh1, hh2, hh3, hh4, hh5, hh6, hh7, in, offset);
}
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return new Sha512(this);
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
long[] result = sha(h0, h1, h2, h3, h4, h5, h6, h7, in, offset);
h0 = result[0];
h1 = result[1];
h2 = result[2];
h3 = result[3];
h4 = result[4];
h5 = result[5];
h6 = result[6];
h7 = result[7];
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 112) ? (112 - n) : (240 - n);
byte[] result = new byte[padding + 16];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save number of bits, casting the long to an array of 8 bytes
// TODO: FIX Only ~35 bits of 128 bit counter usable this way
long bits = count << 3;
padding += 8;
result[padding++] = (byte) (bits >>> 56);
result[padding++] = (byte) (bits >>> 48);
result[padding++] = (byte) (bits >>> 40);
result[padding++] = (byte) (bits >>> 32);
result[padding++] = (byte) (bits >>> 24);
result[padding++] = (byte) (bits >>> 16);
result[padding++] = (byte) (bits >>> 8);
result[padding] = (byte) bits;
return result;
}
protected byte[] getResult()
{
return new byte[] { (byte) (h0 >>> 56), (byte) (h0 >>> 48),
(byte) (h0 >>> 40), (byte) (h0 >>> 32),
(byte) (h0 >>> 24), (byte) (h0 >>> 16),
(byte) (h0 >>> 8), (byte) h0, (byte) (h1 >>> 56),
(byte) (h1 >>> 48), (byte) (h1 >>> 40),
(byte) (h1 >>> 32), (byte) (h1 >>> 24),
(byte) (h1 >>> 16), (byte) (h1 >>> 8), (byte) h1,
(byte) (h2 >>> 56), (byte) (h2 >>> 48),
(byte) (h2 >>> 40), (byte) (h2 >>> 32),
(byte) (h2 >>> 24), (byte) (h2 >>> 16),
(byte) (h2 >>> 8), (byte) h2, (byte) (h3 >>> 56),
(byte) (h3 >>> 48), (byte) (h3 >>> 40),
(byte) (h3 >>> 32), (byte) (h3 >>> 24),
(byte) (h3 >>> 16), (byte) (h3 >>> 8), (byte) h3,
(byte) (h4 >>> 56), (byte) (h4 >>> 48),
(byte) (h4 >>> 40), (byte) (h4 >>> 32),
(byte) (h4 >>> 24), (byte) (h4 >>> 16),
(byte) (h4 >>> 8), (byte) h4, (byte) (h5 >>> 56),
(byte) (h5 >>> 48), (byte) (h5 >>> 40),
(byte) (h5 >>> 32), (byte) (h5 >>> 24),
(byte) (h5 >>> 16), (byte) (h5 >>> 8), (byte) h5,
(byte) (h6 >>> 56), (byte) (h6 >>> 48),
(byte) (h6 >>> 40), (byte) (h6 >>> 32),
(byte) (h6 >>> 24), (byte) (h6 >>> 16),
(byte) (h6 >>> 8), (byte) h6, (byte) (h7 >>> 56),
(byte) (h7 >>> 48), (byte) (h7 >>> 40),
(byte) (h7 >>> 32), (byte) (h7 >>> 24),
(byte) (h7 >>> 16), (byte) (h7 >>> 8), (byte) h7 };
}
protected void resetContext()
{
// magic SHA-512 initialisation constants
h0 = 0x6a09e667f3bcc908L;
h1 = 0xbb67ae8584caa73bL;
h2 = 0x3c6ef372fe94f82bL;
h3 = 0xa54ff53a5f1d36f1L;
h4 = 0x510e527fade682d1L;
h5 = 0x9b05688c2b3e6c1fL;
h6 = 0x1f83d9abfb41bd6bL;
h7 = 0x5be0cd19137e2179L;
}
public boolean selfTest()
{
if (valid == null)
{
Sha512 md = new Sha512();
md.update((byte) 0x61); // a
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
valid = new Boolean(DIGEST0.equals(result));
}
return valid.booleanValue();
}
// SHA specific methods ----------------------------------------------------
private static final synchronized long[] sha(long hh0, long hh1, long hh2,
long hh3, long hh4, long hh5,
long hh6, long hh7, byte[] in,
int offset)
{
long A = hh0;
long B = hh1;
long C = hh2;
long D = hh3;
long E = hh4;
long F = hh5;
long G = hh6;
long H = hh7;
long T, T2;
int r;
for (r = 0; r < 16; r++)
{
w[r] = (long) in[offset++] << 56 | ((long) in[offset++] & 0xFF) << 48
| ((long) in[offset++] & 0xFF) << 40
| ((long) in[offset++] & 0xFF) << 32
| ((long) in[offset++] & 0xFF) << 24
| ((long) in[offset++] & 0xFF) << 16
| ((long) in[offset++] & 0xFF) << 8
| ((long) in[offset++] & 0xFF);
}
for (r = 16; r < 80; r++)
{
T = w[r - 2];
T2 = w[r - 15];
w[r] = (((T >>> 19) | (T << 45)) ^ ((T >>> 61) | (T << 3)) ^ (T >>> 6))
+ w[r - 7]
+ (((T2 >>> 1) | (T2 << 63)) ^ ((T2 >>> 8) | (T2 << 56)) ^ (T2 >>> 7))
+ w[r - 16];
}
for (r = 0; r < 80; r++)
{
T = H
+ (((E >>> 14) | (E << 50)) ^ ((E >>> 18) | (E << 46)) ^ ((E >>> 41) | (E << 23)))
+ ((E & F) ^ ((~E) & G)) + k[r] + w[r];
T2 = (((A >>> 28) | (A << 36)) ^ ((A >>> 34) | (A << 30)) ^ ((A >>> 39) | (A << 25)))
+ ((A & B) ^ (A & C) ^ (B & C));
H = G;
G = F;
F = E;
E = D + T;
D = C;
C = B;
B = A;
A = T + T2;
}
return new long[] { hh0 + A, hh1 + B, hh2 + C, hh3 + D, hh4 + E, hh5 + F,
hh6 + G, hh7 + H };
}
}

View file

@ -0,0 +1,943 @@
/* Tiger.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* The Tiger message digest. Tiger was designed by Ross Anderson and Eli
* Biham, with the goal of producing a secure, fast hash function that
* performs especially well on next-generation 64-bit architectures, but
* is still efficient on 32- and 16-bit architectures.
*
* <p>Tiger processes data in 512-bit blocks and produces a 192-bit
* digest.</p>
*
* <p>References:</p>
* <ol>
* <li><a
* href="http://www.cs.technion.ac.il/~biham/Reports/Tiger/">Tiger: A
* Fast New Hash Function</a>, Ross Anderson and Eli Biham.</a></li>
* </ol>
*/
public class Tiger extends BaseHash
{
// Constants and variables.
// -----------------------------------------------------------------------
private static final int HASH_SIZE = 24;
private static final int BLOCK_SIZE = 64;
/** Result when no data has been input. */
private static final String DIGEST0 = "3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3";
private static final long A = 0x0123456789ABCDEFL;
private static final long B = 0xFEDCBA9876543210L;
private static final long C = 0xF096A5B4C3B2E187L;
/** S-Box T1. */
private static final long[] T1 = { 0x02AAB17CF7E90C5EL, 0xAC424B03E243A8ECL,
0x72CD5BE30DD5FCD3L, 0x6D019B93F6F97F3AL,
0xCD9978FFD21F9193L, 0x7573A1C9708029E2L,
0xB164326B922A83C3L, 0x46883EEE04915870L,
0xEAACE3057103ECE6L, 0xC54169B808A3535CL,
0x4CE754918DDEC47CL, 0x0AA2F4DFDC0DF40CL,
0x10B76F18A74DBEFAL, 0xC6CCB6235AD1AB6AL,
0x13726121572FE2FFL, 0x1A488C6F199D921EL,
0x4BC9F9F4DA0007CAL, 0x26F5E6F6E85241C7L,
0x859079DBEA5947B6L, 0x4F1885C5C99E8C92L,
0xD78E761EA96F864BL, 0x8E36428C52B5C17DL,
0x69CF6827373063C1L, 0xB607C93D9BB4C56EL,
0x7D820E760E76B5EAL, 0x645C9CC6F07FDC42L,
0xBF38A078243342E0L, 0x5F6B343C9D2E7D04L,
0xF2C28AEB600B0EC6L, 0x6C0ED85F7254BCACL,
0x71592281A4DB4FE5L, 0x1967FA69CE0FED9FL,
0xFD5293F8B96545DBL, 0xC879E9D7F2A7600BL,
0x860248920193194EL, 0xA4F9533B2D9CC0B3L,
0x9053836C15957613L, 0xDB6DCF8AFC357BF1L,
0x18BEEA7A7A370F57L, 0x037117CA50B99066L,
0x6AB30A9774424A35L, 0xF4E92F02E325249BL,
0x7739DB07061CCAE1L, 0xD8F3B49CECA42A05L,
0xBD56BE3F51382F73L, 0x45FAED5843B0BB28L,
0x1C813D5C11BF1F83L, 0x8AF0E4B6D75FA169L,
0x33EE18A487AD9999L, 0x3C26E8EAB1C94410L,
0xB510102BC0A822F9L, 0x141EEF310CE6123BL,
0xFC65B90059DDB154L, 0xE0158640C5E0E607L,
0x884E079826C3A3CFL, 0x930D0D9523C535FDL,
0x35638D754E9A2B00L, 0x4085FCCF40469DD5L,
0xC4B17AD28BE23A4CL, 0xCAB2F0FC6A3E6A2EL,
0x2860971A6B943FCDL, 0x3DDE6EE212E30446L,
0x6222F32AE01765AEL, 0x5D550BB5478308FEL,
0xA9EFA98DA0EDA22AL, 0xC351A71686C40DA7L,
0x1105586D9C867C84L, 0xDCFFEE85FDA22853L,
0xCCFBD0262C5EEF76L, 0xBAF294CB8990D201L,
0xE69464F52AFAD975L, 0x94B013AFDF133E14L,
0x06A7D1A32823C958L, 0x6F95FE5130F61119L,
0xD92AB34E462C06C0L, 0xED7BDE33887C71D2L,
0x79746D6E6518393EL, 0x5BA419385D713329L,
0x7C1BA6B948A97564L, 0x31987C197BFDAC67L,
0xDE6C23C44B053D02L, 0x581C49FED002D64DL,
0xDD474D6338261571L, 0xAA4546C3E473D062L,
0x928FCE349455F860L, 0x48161BBACAAB94D9L,
0x63912430770E6F68L, 0x6EC8A5E602C6641CL,
0x87282515337DDD2BL, 0x2CDA6B42034B701BL,
0xB03D37C181CB096DL, 0xE108438266C71C6FL,
0x2B3180C7EB51B255L, 0xDF92B82F96C08BBCL,
0x5C68C8C0A632F3BAL, 0x5504CC861C3D0556L,
0xABBFA4E55FB26B8FL, 0x41848B0AB3BACEB4L,
0xB334A273AA445D32L, 0xBCA696F0A85AD881L,
0x24F6EC65B528D56CL, 0x0CE1512E90F4524AL,
0x4E9DD79D5506D35AL, 0x258905FAC6CE9779L,
0x2019295B3E109B33L, 0xF8A9478B73A054CCL,
0x2924F2F934417EB0L, 0x3993357D536D1BC4L,
0x38A81AC21DB6FF8BL, 0x47C4FBF17D6016BFL,
0x1E0FAADD7667E3F5L, 0x7ABCFF62938BEB96L,
0xA78DAD948FC179C9L, 0x8F1F98B72911E50DL,
0x61E48EAE27121A91L, 0x4D62F7AD31859808L,
0xECEBA345EF5CEAEBL, 0xF5CEB25EBC9684CEL,
0xF633E20CB7F76221L, 0xA32CDF06AB8293E4L,
0x985A202CA5EE2CA4L, 0xCF0B8447CC8A8FB1L,
0x9F765244979859A3L, 0xA8D516B1A1240017L,
0x0BD7BA3EBB5DC726L, 0xE54BCA55B86ADB39L,
0x1D7A3AFD6C478063L, 0x519EC608E7669EDDL,
0x0E5715A2D149AA23L, 0x177D4571848FF194L,
0xEEB55F3241014C22L, 0x0F5E5CA13A6E2EC2L,
0x8029927B75F5C361L, 0xAD139FABC3D6E436L,
0x0D5DF1A94CCF402FL, 0x3E8BD948BEA5DFC8L,
0xA5A0D357BD3FF77EL, 0xA2D12E251F74F645L,
0x66FD9E525E81A082L, 0x2E0C90CE7F687A49L,
0xC2E8BCBEBA973BC5L, 0x000001BCE509745FL,
0x423777BBE6DAB3D6L, 0xD1661C7EAEF06EB5L,
0xA1781F354DAACFD8L, 0x2D11284A2B16AFFCL,
0xF1FC4F67FA891D1FL, 0x73ECC25DCB920ADAL,
0xAE610C22C2A12651L, 0x96E0A810D356B78AL,
0x5A9A381F2FE7870FL, 0xD5AD62EDE94E5530L,
0xD225E5E8368D1427L, 0x65977B70C7AF4631L,
0x99F889B2DE39D74FL, 0x233F30BF54E1D143L,
0x9A9675D3D9A63C97L, 0x5470554FF334F9A8L,
0x166ACB744A4F5688L, 0x70C74CAAB2E4AEADL,
0xF0D091646F294D12L, 0x57B82A89684031D1L,
0xEFD95A5A61BE0B6BL, 0x2FBD12E969F2F29AL,
0x9BD37013FEFF9FE8L, 0x3F9B0404D6085A06L,
0x4940C1F3166CFE15L, 0x09542C4DCDF3DEFBL,
0xB4C5218385CD5CE3L, 0xC935B7DC4462A641L,
0x3417F8A68ED3B63FL, 0xB80959295B215B40L,
0xF99CDAEF3B8C8572L, 0x018C0614F8FCB95DL,
0x1B14ACCD1A3ACDF3L, 0x84D471F200BB732DL,
0xC1A3110E95E8DA16L, 0x430A7220BF1A82B8L,
0xB77E090D39DF210EL, 0x5EF4BD9F3CD05E9DL,
0x9D4FF6DA7E57A444L, 0xDA1D60E183D4A5F8L,
0xB287C38417998E47L, 0xFE3EDC121BB31886L,
0xC7FE3CCC980CCBEFL, 0xE46FB590189BFD03L,
0x3732FD469A4C57DCL, 0x7EF700A07CF1AD65L,
0x59C64468A31D8859L, 0x762FB0B4D45B61F6L,
0x155BAED099047718L, 0x68755E4C3D50BAA6L,
0xE9214E7F22D8B4DFL, 0x2ADDBF532EAC95F4L,
0x32AE3909B4BD0109L, 0x834DF537B08E3450L,
0xFA209DA84220728DL, 0x9E691D9B9EFE23F7L,
0x0446D288C4AE8D7FL, 0x7B4CC524E169785BL,
0x21D87F0135CA1385L, 0xCEBB400F137B8AA5L,
0x272E2B66580796BEL, 0x3612264125C2B0DEL,
0x057702BDAD1EFBB2L, 0xD4BABB8EACF84BE9L,
0x91583139641BC67BL, 0x8BDC2DE08036E024L,
0x603C8156F49F68EDL, 0xF7D236F7DBEF5111L,
0x9727C4598AD21E80L, 0xA08A0896670A5FD7L,
0xCB4A8F4309EBA9CBL, 0x81AF564B0F7036A1L,
0xC0B99AA778199ABDL, 0x959F1EC83FC8E952L,
0x8C505077794A81B9L, 0x3ACAAF8F056338F0L,
0x07B43F50627A6778L, 0x4A44AB49F5ECCC77L,
0x3BC3D6E4B679EE98L, 0x9CC0D4D1CF14108CL,
0x4406C00B206BC8A0L, 0x82A18854C8D72D89L,
0x67E366B35C3C432CL, 0xB923DD61102B37F2L,
0x56AB2779D884271DL, 0xBE83E1B0FF1525AFL,
0xFB7C65D4217E49A9L, 0x6BDBE0E76D48E7D4L,
0x08DF828745D9179EL, 0x22EA6A9ADD53BD34L,
0xE36E141C5622200AL, 0x7F805D1B8CB750EEL,
0xAFE5C7A59F58E837L, 0xE27F996A4FB1C23CL,
0xD3867DFB0775F0D0L, 0xD0E673DE6E88891AL,
0x123AEB9EAFB86C25L, 0x30F1D5D5C145B895L,
0xBB434A2DEE7269E7L, 0x78CB67ECF931FA38L,
0xF33B0372323BBF9CL, 0x52D66336FB279C74L,
0x505F33AC0AFB4EAAL, 0xE8A5CD99A2CCE187L,
0x534974801E2D30BBL, 0x8D2D5711D5876D90L,
0x1F1A412891BC038EL, 0xD6E2E71D82E56648L,
0x74036C3A497732B7L, 0x89B67ED96361F5ABL,
0xFFED95D8F1EA02A2L, 0xE72B3BD61464D43DL,
0xA6300F170BDC4820L, 0xEBC18760ED78A77AL };
/** S-Box T2. */
private static final long[] T2 = { 0xE6A6BE5A05A12138L, 0xB5A122A5B4F87C98L,
0x563C6089140B6990L, 0x4C46CB2E391F5DD5L,
0xD932ADDBC9B79434L, 0x08EA70E42015AFF5L,
0xD765A6673E478CF1L, 0xC4FB757EAB278D99L,
0xDF11C6862D6E0692L, 0xDDEB84F10D7F3B16L,
0x6F2EF604A665EA04L, 0x4A8E0F0FF0E0DFB3L,
0xA5EDEEF83DBCBA51L, 0xFC4F0A2A0EA4371EL,
0xE83E1DA85CB38429L, 0xDC8FF882BA1B1CE2L,
0xCD45505E8353E80DL, 0x18D19A00D4DB0717L,
0x34A0CFEDA5F38101L, 0x0BE77E518887CAF2L,
0x1E341438B3C45136L, 0xE05797F49089CCF9L,
0xFFD23F9DF2591D14L, 0x543DDA228595C5CDL,
0x661F81FD99052A33L, 0x8736E641DB0F7B76L,
0x15227725418E5307L, 0xE25F7F46162EB2FAL,
0x48A8B2126C13D9FEL, 0xAFDC541792E76EEAL,
0x03D912BFC6D1898FL, 0x31B1AAFA1B83F51BL,
0xF1AC2796E42AB7D9L, 0x40A3A7D7FCD2EBACL,
0x1056136D0AFBBCC5L, 0x7889E1DD9A6D0C85L,
0xD33525782A7974AAL, 0xA7E25D09078AC09BL,
0xBD4138B3EAC6EDD0L, 0x920ABFBE71EB9E70L,
0xA2A5D0F54FC2625CL, 0xC054E36B0B1290A3L,
0xF6DD59FF62FE932BL, 0x3537354511A8AC7DL,
0xCA845E9172FADCD4L, 0x84F82B60329D20DCL,
0x79C62CE1CD672F18L, 0x8B09A2ADD124642CL,
0xD0C1E96A19D9E726L, 0x5A786A9B4BA9500CL,
0x0E020336634C43F3L, 0xC17B474AEB66D822L,
0x6A731AE3EC9BAAC2L, 0x8226667AE0840258L,
0x67D4567691CAECA5L, 0x1D94155C4875ADB5L,
0x6D00FD985B813FDFL, 0x51286EFCB774CD06L,
0x5E8834471FA744AFL, 0xF72CA0AEE761AE2EL,
0xBE40E4CDAEE8E09AL, 0xE9970BBB5118F665L,
0x726E4BEB33DF1964L, 0x703B000729199762L,
0x4631D816F5EF30A7L, 0xB880B5B51504A6BEL,
0x641793C37ED84B6CL, 0x7B21ED77F6E97D96L,
0x776306312EF96B73L, 0xAE528948E86FF3F4L,
0x53DBD7F286A3F8F8L, 0x16CADCE74CFC1063L,
0x005C19BDFA52C6DDL, 0x68868F5D64D46AD3L,
0x3A9D512CCF1E186AL, 0x367E62C2385660AEL,
0xE359E7EA77DCB1D7L, 0x526C0773749ABE6EL,
0x735AE5F9D09F734BL, 0x493FC7CC8A558BA8L,
0xB0B9C1533041AB45L, 0x321958BA470A59BDL,
0x852DB00B5F46C393L, 0x91209B2BD336B0E5L,
0x6E604F7D659EF19FL, 0xB99A8AE2782CCB24L,
0xCCF52AB6C814C4C7L, 0x4727D9AFBE11727BL,
0x7E950D0C0121B34DL, 0x756F435670AD471FL,
0xF5ADD442615A6849L, 0x4E87E09980B9957AL,
0x2ACFA1DF50AEE355L, 0xD898263AFD2FD556L,
0xC8F4924DD80C8FD6L, 0xCF99CA3D754A173AL,
0xFE477BACAF91BF3CL, 0xED5371F6D690C12DL,
0x831A5C285E687094L, 0xC5D3C90A3708A0A4L,
0x0F7F903717D06580L, 0x19F9BB13B8FDF27FL,
0xB1BD6F1B4D502843L, 0x1C761BA38FFF4012L,
0x0D1530C4E2E21F3BL, 0x8943CE69A7372C8AL,
0xE5184E11FEB5CE66L, 0x618BDB80BD736621L,
0x7D29BAD68B574D0BL, 0x81BB613E25E6FE5BL,
0x071C9C10BC07913FL, 0xC7BEEB7909AC2D97L,
0xC3E58D353BC5D757L, 0xEB017892F38F61E8L,
0xD4EFFB9C9B1CC21AL, 0x99727D26F494F7ABL,
0xA3E063A2956B3E03L, 0x9D4A8B9A4AA09C30L,
0x3F6AB7D500090FB4L, 0x9CC0F2A057268AC0L,
0x3DEE9D2DEDBF42D1L, 0x330F49C87960A972L,
0xC6B2720287421B41L, 0x0AC59EC07C00369CL,
0xEF4EAC49CB353425L, 0xF450244EEF0129D8L,
0x8ACC46E5CAF4DEB6L, 0x2FFEAB63989263F7L,
0x8F7CB9FE5D7A4578L, 0x5BD8F7644E634635L,
0x427A7315BF2DC900L, 0x17D0C4AA2125261CL,
0x3992486C93518E50L, 0xB4CBFEE0A2D7D4C3L,
0x7C75D6202C5DDD8DL, 0xDBC295D8E35B6C61L,
0x60B369D302032B19L, 0xCE42685FDCE44132L,
0x06F3DDB9DDF65610L, 0x8EA4D21DB5E148F0L,
0x20B0FCE62FCD496FL, 0x2C1B912358B0EE31L,
0xB28317B818F5A308L, 0xA89C1E189CA6D2CFL,
0x0C6B18576AAADBC8L, 0xB65DEAA91299FAE3L,
0xFB2B794B7F1027E7L, 0x04E4317F443B5BEBL,
0x4B852D325939D0A6L, 0xD5AE6BEEFB207FFCL,
0x309682B281C7D374L, 0xBAE309A194C3B475L,
0x8CC3F97B13B49F05L, 0x98A9422FF8293967L,
0x244B16B01076FF7CL, 0xF8BF571C663D67EEL,
0x1F0D6758EEE30DA1L, 0xC9B611D97ADEB9B7L,
0xB7AFD5887B6C57A2L, 0x6290AE846B984FE1L,
0x94DF4CDEACC1A5FDL, 0x058A5BD1C5483AFFL,
0x63166CC142BA3C37L, 0x8DB8526EB2F76F40L,
0xE10880036F0D6D4EL, 0x9E0523C9971D311DL,
0x45EC2824CC7CD691L, 0x575B8359E62382C9L,
0xFA9E400DC4889995L, 0xD1823ECB45721568L,
0xDAFD983B8206082FL, 0xAA7D29082386A8CBL,
0x269FCD4403B87588L, 0x1B91F5F728BDD1E0L,
0xE4669F39040201F6L, 0x7A1D7C218CF04ADEL,
0x65623C29D79CE5CEL, 0x2368449096C00BB1L,
0xAB9BF1879DA503BAL, 0xBC23ECB1A458058EL,
0x9A58DF01BB401ECCL, 0xA070E868A85F143DL,
0x4FF188307DF2239EL, 0x14D565B41A641183L,
0xEE13337452701602L, 0x950E3DCF3F285E09L,
0x59930254B9C80953L, 0x3BF299408930DA6DL,
0xA955943F53691387L, 0xA15EDECAA9CB8784L,
0x29142127352BE9A0L, 0x76F0371FFF4E7AFBL,
0x0239F450274F2228L, 0xBB073AF01D5E868BL,
0xBFC80571C10E96C1L, 0xD267088568222E23L,
0x9671A3D48E80B5B0L, 0x55B5D38AE193BB81L,
0x693AE2D0A18B04B8L, 0x5C48B4ECADD5335FL,
0xFD743B194916A1CAL, 0x2577018134BE98C4L,
0xE77987E83C54A4ADL, 0x28E11014DA33E1B9L,
0x270CC59E226AA213L, 0x71495F756D1A5F60L,
0x9BE853FB60AFEF77L, 0xADC786A7F7443DBFL,
0x0904456173B29A82L, 0x58BC7A66C232BD5EL,
0xF306558C673AC8B2L, 0x41F639C6B6C9772AL,
0x216DEFE99FDA35DAL, 0x11640CC71C7BE615L,
0x93C43694565C5527L, 0xEA038E6246777839L,
0xF9ABF3CE5A3E2469L, 0x741E768D0FD312D2L,
0x0144B883CED652C6L, 0xC20B5A5BA33F8552L,
0x1AE69633C3435A9DL, 0x97A28CA4088CFDECL,
0x8824A43C1E96F420L, 0x37612FA66EEEA746L,
0x6B4CB165F9CF0E5AL, 0x43AA1C06A0ABFB4AL,
0x7F4DC26FF162796BL, 0x6CBACC8E54ED9B0FL,
0xA6B7FFEFD2BB253EL, 0x2E25BC95B0A29D4FL,
0x86D6A58BDEF1388CL, 0xDED74AC576B6F054L,
0x8030BDBC2B45805DL, 0x3C81AF70E94D9289L,
0x3EFF6DDA9E3100DBL, 0xB38DC39FDFCC8847L,
0x123885528D17B87EL, 0xF2DA0ED240B1B642L,
0x44CEFADCD54BF9A9L, 0x1312200E433C7EE6L,
0x9FFCC84F3A78C748L, 0xF0CD1F72248576BBL,
0xEC6974053638CFE4L, 0x2BA7B67C0CEC4E4CL,
0xAC2F4DF3E5CE32EDL, 0xCB33D14326EA4C11L,
0xA4E9044CC77E58BCL, 0x5F513293D934FCEFL,
0x5DC9645506E55444L, 0x50DE418F317DE40AL,
0x388CB31A69DDE259L, 0x2DB4A83455820A86L,
0x9010A91E84711AE9L, 0x4DF7F0B7B1498371L,
0xD62A2EABC0977179L, 0x22FAC097AA8D5C0EL };
/** S-Box T3. */
private static final long[] T3 = { 0xF49FCC2FF1DAF39BL, 0x487FD5C66FF29281L,
0xE8A30667FCDCA83FL, 0x2C9B4BE3D2FCCE63L,
0xDA3FF74B93FBBBC2L, 0x2FA165D2FE70BA66L,
0xA103E279970E93D4L, 0xBECDEC77B0E45E71L,
0xCFB41E723985E497L, 0xB70AAA025EF75017L,
0xD42309F03840B8E0L, 0x8EFC1AD035898579L,
0x96C6920BE2B2ABC5L, 0x66AF4163375A9172L,
0x2174ABDCCA7127FBL, 0xB33CCEA64A72FF41L,
0xF04A4933083066A5L, 0x8D970ACDD7289AF5L,
0x8F96E8E031C8C25EL, 0xF3FEC02276875D47L,
0xEC7BF310056190DDL, 0xF5ADB0AEBB0F1491L,
0x9B50F8850FD58892L, 0x4975488358B74DE8L,
0xA3354FF691531C61L, 0x0702BBE481D2C6EEL,
0x89FB24057DEDED98L, 0xAC3075138596E902L,
0x1D2D3580172772EDL, 0xEB738FC28E6BC30DL,
0x5854EF8F63044326L, 0x9E5C52325ADD3BBEL,
0x90AA53CF325C4623L, 0xC1D24D51349DD067L,
0x2051CFEEA69EA624L, 0x13220F0A862E7E4FL,
0xCE39399404E04864L, 0xD9C42CA47086FCB7L,
0x685AD2238A03E7CCL, 0x066484B2AB2FF1DBL,
0xFE9D5D70EFBF79ECL, 0x5B13B9DD9C481854L,
0x15F0D475ED1509ADL, 0x0BEBCD060EC79851L,
0xD58C6791183AB7F8L, 0xD1187C5052F3EEE4L,
0xC95D1192E54E82FFL, 0x86EEA14CB9AC6CA2L,
0x3485BEB153677D5DL, 0xDD191D781F8C492AL,
0xF60866BAA784EBF9L, 0x518F643BA2D08C74L,
0x8852E956E1087C22L, 0xA768CB8DC410AE8DL,
0x38047726BFEC8E1AL, 0xA67738B4CD3B45AAL,
0xAD16691CEC0DDE19L, 0xC6D4319380462E07L,
0xC5A5876D0BA61938L, 0x16B9FA1FA58FD840L,
0x188AB1173CA74F18L, 0xABDA2F98C99C021FL,
0x3E0580AB134AE816L, 0x5F3B05B773645ABBL,
0x2501A2BE5575F2F6L, 0x1B2F74004E7E8BA9L,
0x1CD7580371E8D953L, 0x7F6ED89562764E30L,
0xB15926FF596F003DL, 0x9F65293DA8C5D6B9L,
0x6ECEF04DD690F84CL, 0x4782275FFF33AF88L,
0xE41433083F820801L, 0xFD0DFE409A1AF9B5L,
0x4325A3342CDB396BL, 0x8AE77E62B301B252L,
0xC36F9E9F6655615AL, 0x85455A2D92D32C09L,
0xF2C7DEA949477485L, 0x63CFB4C133A39EBAL,
0x83B040CC6EBC5462L, 0x3B9454C8FDB326B0L,
0x56F56A9E87FFD78CL, 0x2DC2940D99F42BC6L,
0x98F7DF096B096E2DL, 0x19A6E01E3AD852BFL,
0x42A99CCBDBD4B40BL, 0xA59998AF45E9C559L,
0x366295E807D93186L, 0x6B48181BFAA1F773L,
0x1FEC57E2157A0A1DL, 0x4667446AF6201AD5L,
0xE615EBCACFB0F075L, 0xB8F31F4F68290778L,
0x22713ED6CE22D11EL, 0x3057C1A72EC3C93BL,
0xCB46ACC37C3F1F2FL, 0xDBB893FD02AAF50EL,
0x331FD92E600B9FCFL, 0xA498F96148EA3AD6L,
0xA8D8426E8B6A83EAL, 0xA089B274B7735CDCL,
0x87F6B3731E524A11L, 0x118808E5CBC96749L,
0x9906E4C7B19BD394L, 0xAFED7F7E9B24A20CL,
0x6509EADEEB3644A7L, 0x6C1EF1D3E8EF0EDEL,
0xB9C97D43E9798FB4L, 0xA2F2D784740C28A3L,
0x7B8496476197566FL, 0x7A5BE3E6B65F069DL,
0xF96330ED78BE6F10L, 0xEEE60DE77A076A15L,
0x2B4BEE4AA08B9BD0L, 0x6A56A63EC7B8894EL,
0x02121359BA34FEF4L, 0x4CBF99F8283703FCL,
0x398071350CAF30C8L, 0xD0A77A89F017687AL,
0xF1C1A9EB9E423569L, 0x8C7976282DEE8199L,
0x5D1737A5DD1F7ABDL, 0x4F53433C09A9FA80L,
0xFA8B0C53DF7CA1D9L, 0x3FD9DCBC886CCB77L,
0xC040917CA91B4720L, 0x7DD00142F9D1DCDFL,
0x8476FC1D4F387B58L, 0x23F8E7C5F3316503L,
0x032A2244E7E37339L, 0x5C87A5D750F5A74BL,
0x082B4CC43698992EL, 0xDF917BECB858F63CL,
0x3270B8FC5BF86DDAL, 0x10AE72BB29B5DD76L,
0x576AC94E7700362BL, 0x1AD112DAC61EFB8FL,
0x691BC30EC5FAA427L, 0xFF246311CC327143L,
0x3142368E30E53206L, 0x71380E31E02CA396L,
0x958D5C960AAD76F1L, 0xF8D6F430C16DA536L,
0xC8FFD13F1BE7E1D2L, 0x7578AE66004DDBE1L,
0x05833F01067BE646L, 0xBB34B5AD3BFE586DL,
0x095F34C9A12B97F0L, 0x247AB64525D60CA8L,
0xDCDBC6F3017477D1L, 0x4A2E14D4DECAD24DL,
0xBDB5E6D9BE0A1EEBL, 0x2A7E70F7794301ABL,
0xDEF42D8A270540FDL, 0x01078EC0A34C22C1L,
0xE5DE511AF4C16387L, 0x7EBB3A52BD9A330AL,
0x77697857AA7D6435L, 0x004E831603AE4C32L,
0xE7A21020AD78E312L, 0x9D41A70C6AB420F2L,
0x28E06C18EA1141E6L, 0xD2B28CBD984F6B28L,
0x26B75F6C446E9D83L, 0xBA47568C4D418D7FL,
0xD80BADBFE6183D8EL, 0x0E206D7F5F166044L,
0xE258A43911CBCA3EL, 0x723A1746B21DC0BCL,
0xC7CAA854F5D7CDD3L, 0x7CAC32883D261D9CL,
0x7690C26423BA942CL, 0x17E55524478042B8L,
0xE0BE477656A2389FL, 0x4D289B5E67AB2DA0L,
0x44862B9C8FBBFD31L, 0xB47CC8049D141365L,
0x822C1B362B91C793L, 0x4EB14655FB13DFD8L,
0x1ECBBA0714E2A97BL, 0x6143459D5CDE5F14L,
0x53A8FBF1D5F0AC89L, 0x97EA04D81C5E5B00L,
0x622181A8D4FDB3F3L, 0xE9BCD341572A1208L,
0x1411258643CCE58AL, 0x9144C5FEA4C6E0A4L,
0x0D33D06565CF620FL, 0x54A48D489F219CA1L,
0xC43E5EAC6D63C821L, 0xA9728B3A72770DAFL,
0xD7934E7B20DF87EFL, 0xE35503B61A3E86E5L,
0xCAE321FBC819D504L, 0x129A50B3AC60BFA6L,
0xCD5E68EA7E9FB6C3L, 0xB01C90199483B1C7L,
0x3DE93CD5C295376CL, 0xAED52EDF2AB9AD13L,
0x2E60F512C0A07884L, 0xBC3D86A3E36210C9L,
0x35269D9B163951CEL, 0x0C7D6E2AD0CDB5FAL,
0x59E86297D87F5733L, 0x298EF221898DB0E7L,
0x55000029D1A5AA7EL, 0x8BC08AE1B5061B45L,
0xC2C31C2B6C92703AL, 0x94CC596BAF25EF42L,
0x0A1D73DB22540456L, 0x04B6A0F9D9C4179AL,
0xEFFDAFA2AE3D3C60L, 0xF7C8075BB49496C4L,
0x9CC5C7141D1CD4E3L, 0x78BD1638218E5534L,
0xB2F11568F850246AL, 0xEDFABCFA9502BC29L,
0x796CE5F2DA23051BL, 0xAAE128B0DC93537CL,
0x3A493DA0EE4B29AEL, 0xB5DF6B2C416895D7L,
0xFCABBD25122D7F37L, 0x70810B58105DC4B1L,
0xE10FDD37F7882A90L, 0x524DCAB5518A3F5CL,
0x3C9E85878451255BL, 0x4029828119BD34E2L,
0x74A05B6F5D3CECCBL, 0xB610021542E13ECAL,
0x0FF979D12F59E2ACL, 0x6037DA27E4F9CC50L,
0x5E92975A0DF1847DL, 0xD66DE190D3E623FEL,
0x5032D6B87B568048L, 0x9A36B7CE8235216EL,
0x80272A7A24F64B4AL, 0x93EFED8B8C6916F7L,
0x37DDBFF44CCE1555L, 0x4B95DB5D4B99BD25L,
0x92D3FDA169812FC0L, 0xFB1A4A9A90660BB6L,
0x730C196946A4B9B2L, 0x81E289AA7F49DA68L,
0x64669A0F83B1A05FL, 0x27B3FF7D9644F48BL,
0xCC6B615C8DB675B3L, 0x674F20B9BCEBBE95L,
0x6F31238275655982L, 0x5AE488713E45CF05L,
0xBF619F9954C21157L, 0xEABAC46040A8EAE9L,
0x454C6FE9F2C0C1CDL, 0x419CF6496412691CL,
0xD3DC3BEF265B0F70L, 0x6D0E60F5C3578A9EL };
/** S-Box T4. */
private static final long[] T4 = { 0x5B0E608526323C55L, 0x1A46C1A9FA1B59F5L,
0xA9E245A17C4C8FFAL, 0x65CA5159DB2955D7L,
0x05DB0A76CE35AFC2L, 0x81EAC77EA9113D45L,
0x528EF88AB6AC0A0DL, 0xA09EA253597BE3FFL,
0x430DDFB3AC48CD56L, 0xC4B3A67AF45CE46FL,
0x4ECECFD8FBE2D05EL, 0x3EF56F10B39935F0L,
0x0B22D6829CD619C6L, 0x17FD460A74DF2069L,
0x6CF8CC8E8510ED40L, 0xD6C824BF3A6ECAA7L,
0x61243D581A817049L, 0x048BACB6BBC163A2L,
0xD9A38AC27D44CC32L, 0x7FDDFF5BAAF410ABL,
0xAD6D495AA804824BL, 0xE1A6A74F2D8C9F94L,
0xD4F7851235DEE8E3L, 0xFD4B7F886540D893L,
0x247C20042AA4BFDAL, 0x096EA1C517D1327CL,
0xD56966B4361A6685L, 0x277DA5C31221057DL,
0x94D59893A43ACFF7L, 0x64F0C51CCDC02281L,
0x3D33BCC4FF6189DBL, 0xE005CB184CE66AF1L,
0xFF5CCD1D1DB99BEAL, 0xB0B854A7FE42980FL,
0x7BD46A6A718D4B9FL, 0xD10FA8CC22A5FD8CL,
0xD31484952BE4BD31L, 0xC7FA975FCB243847L,
0x4886ED1E5846C407L, 0x28CDDB791EB70B04L,
0xC2B00BE2F573417FL, 0x5C9590452180F877L,
0x7A6BDDFFF370EB00L, 0xCE509E38D6D9D6A4L,
0xEBEB0F00647FA702L, 0x1DCC06CF76606F06L,
0xE4D9F28BA286FF0AL, 0xD85A305DC918C262L,
0x475B1D8732225F54L, 0x2D4FB51668CCB5FEL,
0xA679B9D9D72BBA20L, 0x53841C0D912D43A5L,
0x3B7EAA48BF12A4E8L, 0x781E0E47F22F1DDFL,
0xEFF20CE60AB50973L, 0x20D261D19DFFB742L,
0x16A12B03062A2E39L, 0x1960EB2239650495L,
0x251C16FED50EB8B8L, 0x9AC0C330F826016EL,
0xED152665953E7671L, 0x02D63194A6369570L,
0x5074F08394B1C987L, 0x70BA598C90B25CE1L,
0x794A15810B9742F6L, 0x0D5925E9FCAF8C6CL,
0x3067716CD868744EL, 0x910AB077E8D7731BL,
0x6A61BBDB5AC42F61L, 0x93513EFBF0851567L,
0xF494724B9E83E9D5L, 0xE887E1985C09648DL,
0x34B1D3C675370CFDL, 0xDC35E433BC0D255DL,
0xD0AAB84234131BE0L, 0x08042A50B48B7EAFL,
0x9997C4EE44A3AB35L, 0x829A7B49201799D0L,
0x263B8307B7C54441L, 0x752F95F4FD6A6CA6L,
0x927217402C08C6E5L, 0x2A8AB754A795D9EEL,
0xA442F7552F72943DL, 0x2C31334E19781208L,
0x4FA98D7CEAEE6291L, 0x55C3862F665DB309L,
0xBD0610175D53B1F3L, 0x46FE6CB840413F27L,
0x3FE03792DF0CFA59L, 0xCFE700372EB85E8FL,
0xA7BE29E7ADBCE118L, 0xE544EE5CDE8431DDL,
0x8A781B1B41F1873EL, 0xA5C94C78A0D2F0E7L,
0x39412E2877B60728L, 0xA1265EF3AFC9A62CL,
0xBCC2770C6A2506C5L, 0x3AB66DD5DCE1CE12L,
0xE65499D04A675B37L, 0x7D8F523481BFD216L,
0x0F6F64FCEC15F389L, 0x74EFBE618B5B13C8L,
0xACDC82B714273E1DL, 0xDD40BFE003199D17L,
0x37E99257E7E061F8L, 0xFA52626904775AAAL,
0x8BBBF63A463D56F9L, 0xF0013F1543A26E64L,
0xA8307E9F879EC898L, 0xCC4C27A4150177CCL,
0x1B432F2CCA1D3348L, 0xDE1D1F8F9F6FA013L,
0x606602A047A7DDD6L, 0xD237AB64CC1CB2C7L,
0x9B938E7225FCD1D3L, 0xEC4E03708E0FF476L,
0xFEB2FBDA3D03C12DL, 0xAE0BCED2EE43889AL,
0x22CB8923EBFB4F43L, 0x69360D013CF7396DL,
0x855E3602D2D4E022L, 0x073805BAD01F784CL,
0x33E17A133852F546L, 0xDF4874058AC7B638L,
0xBA92B29C678AA14AL, 0x0CE89FC76CFAADCDL,
0x5F9D4E0908339E34L, 0xF1AFE9291F5923B9L,
0x6E3480F60F4A265FL, 0xEEBF3A2AB29B841CL,
0xE21938A88F91B4ADL, 0x57DFEFF845C6D3C3L,
0x2F006B0BF62CAAF2L, 0x62F479EF6F75EE78L,
0x11A55AD41C8916A9L, 0xF229D29084FED453L,
0x42F1C27B16B000E6L, 0x2B1F76749823C074L,
0x4B76ECA3C2745360L, 0x8C98F463B91691BDL,
0x14BCC93CF1ADE66AL, 0x8885213E6D458397L,
0x8E177DF0274D4711L, 0xB49B73B5503F2951L,
0x10168168C3F96B6BL, 0x0E3D963B63CAB0AEL,
0x8DFC4B5655A1DB14L, 0xF789F1356E14DE5CL,
0x683E68AF4E51DAC1L, 0xC9A84F9D8D4B0FD9L,
0x3691E03F52A0F9D1L, 0x5ED86E46E1878E80L,
0x3C711A0E99D07150L, 0x5A0865B20C4E9310L,
0x56FBFC1FE4F0682EL, 0xEA8D5DE3105EDF9BL,
0x71ABFDB12379187AL, 0x2EB99DE1BEE77B9CL,
0x21ECC0EA33CF4523L, 0x59A4D7521805C7A1L,
0x3896F5EB56AE7C72L, 0xAA638F3DB18F75DCL,
0x9F39358DABE9808EL, 0xB7DEFA91C00B72ACL,
0x6B5541FD62492D92L, 0x6DC6DEE8F92E4D5BL,
0x353F57ABC4BEEA7EL, 0x735769D6DA5690CEL,
0x0A234AA642391484L, 0xF6F9508028F80D9DL,
0xB8E319A27AB3F215L, 0x31AD9C1151341A4DL,
0x773C22A57BEF5805L, 0x45C7561A07968633L,
0xF913DA9E249DBE36L, 0xDA652D9B78A64C68L,
0x4C27A97F3BC334EFL, 0x76621220E66B17F4L,
0x967743899ACD7D0BL, 0xF3EE5BCAE0ED6782L,
0x409F753600C879FCL, 0x06D09A39B5926DB6L,
0x6F83AEB0317AC588L, 0x01E6CA4A86381F21L,
0x66FF3462D19F3025L, 0x72207C24DDFD3BFBL,
0x4AF6B6D3E2ECE2EBL, 0x9C994DBEC7EA08DEL,
0x49ACE597B09A8BC4L, 0xB38C4766CF0797BAL,
0x131B9373C57C2A75L, 0xB1822CCE61931E58L,
0x9D7555B909BA1C0CL, 0x127FAFDD937D11D2L,
0x29DA3BADC66D92E4L, 0xA2C1D57154C2ECBCL,
0x58C5134D82F6FE24L, 0x1C3AE3515B62274FL,
0xE907C82E01CB8126L, 0xF8ED091913E37FCBL,
0x3249D8F9C80046C9L, 0x80CF9BEDE388FB63L,
0x1881539A116CF19EL, 0x5103F3F76BD52457L,
0x15B7E6F5AE47F7A8L, 0xDBD7C6DED47E9CCFL,
0x44E55C410228BB1AL, 0xB647D4255EDB4E99L,
0x5D11882BB8AAFC30L, 0xF5098BBB29D3212AL,
0x8FB5EA14E90296B3L, 0x677B942157DD025AL,
0xFB58E7C0A390ACB5L, 0x89D3674C83BD4A01L,
0x9E2DA4DF4BF3B93BL, 0xFCC41E328CAB4829L,
0x03F38C96BA582C52L, 0xCAD1BDBD7FD85DB2L,
0xBBB442C16082AE83L, 0xB95FE86BA5DA9AB0L,
0xB22E04673771A93FL, 0x845358C9493152D8L,
0xBE2A488697B4541EL, 0x95A2DC2DD38E6966L,
0xC02C11AC923C852BL, 0x2388B1990DF2A87BL,
0x7C8008FA1B4F37BEL, 0x1F70D0C84D54E503L,
0x5490ADEC7ECE57D4L, 0x002B3C27D9063A3AL,
0x7EAEA3848030A2BFL, 0xC602326DED2003C0L,
0x83A7287D69A94086L, 0xC57A5FCB30F57A8AL,
0xB56844E479EBE779L, 0xA373B40F05DCBCE9L,
0xD71A786E88570EE2L, 0x879CBACDBDE8F6A0L,
0x976AD1BCC164A32FL, 0xAB21E25E9666D78BL,
0x901063AAE5E5C33CL, 0x9818B34448698D90L,
0xE36487AE3E1E8ABBL, 0xAFBDF931893BDCB4L,
0x6345A0DC5FBBD519L, 0x8628FE269B9465CAL,
0x1E5D01603F9C51ECL, 0x4DE44006A15049B7L,
0xBF6C70E5F776CBB1L, 0x411218F2EF552BEDL,
0xCB0C0708705A36A3L, 0xE74D14754F986044L,
0xCD56D9430EA8280EL, 0xC12591D7535F5065L,
0xC83223F1720AEF96L, 0xC3A0396F7363A51FL };
// The cached self-test result.
private static Boolean valid;
// The context.
private long a, b, c;
// Constructors.
// -----------------------------------------------------------------------
/**
* Trivial 0-arguments constructor.
*/
public Tiger()
{
super(Registry.TIGER_HASH, HASH_SIZE, BLOCK_SIZE);
}
/**
* Private copying constructor for cloning.
*
* @param that The instance being cloned.
*/
private Tiger(Tiger that)
{
this();
this.a = that.a;
this.b = that.b;
this.c = that.c;
this.count = that.count;
this.buffer = (that.buffer != null) ? (byte[]) that.buffer.clone() : null;
}
// Instance methods implementing BaseHash.
// -----------------------------------------------------------------------
public Object clone()
{
return new Tiger(this);
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean(DIGEST0.equals(Util.toString(new Tiger().digest())));
}
return valid.booleanValue();
}
protected byte[] padBuffer()
{
int n = (int) (count % BLOCK_SIZE);
int padding = (n < 56) ? (56 - n) : (120 - n);
byte[] pad = new byte[padding + 8];
pad[0] = 1;
long bits = count << 3;
pad[padding++] = (byte) bits;
pad[padding++] = (byte) (bits >>> 8);
pad[padding++] = (byte) (bits >>> 16);
pad[padding++] = (byte) (bits >>> 24);
pad[padding++] = (byte) (bits >>> 32);
pad[padding++] = (byte) (bits >>> 40);
pad[padding++] = (byte) (bits >>> 48);
pad[padding] = (byte) (bits >>> 56);
return pad;
}
protected byte[] getResult()
{
return new byte[] { (byte) a, (byte) (a >>> 8), (byte) (a >>> 16),
(byte) (a >>> 24), (byte) (a >>> 32), (byte) (a >>> 40),
(byte) (a >>> 48), (byte) (a >>> 56), (byte) b,
(byte) (b >>> 8), (byte) (b >>> 16), (byte) (b >>> 24),
(byte) (b >>> 32), (byte) (b >>> 40), (byte) (b >>> 48),
(byte) (b >>> 56), (byte) c, (byte) (c >>> 8),
(byte) (c >>> 16), (byte) (c >>> 24), (byte) (c >>> 32),
(byte) (c >>> 40), (byte) (c >>> 48), (byte) (c >>> 56) };
}
protected void resetContext()
{
a = A;
b = B;
c = C;
}
protected void transform(byte[] in, int offset)
{
long x0, x1, x2, x3, x4, x5, x6, x7;
x0 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x1 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x2 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x3 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x4 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x5 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x6 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset++] & 0xFF) << 56);
x7 = ((long) in[offset++] & 0xFF) | ((long) (in[offset++] & 0xFF) << 8)
| ((long) (in[offset++] & 0xFF) << 16)
| ((long) (in[offset++] & 0xFF) << 24)
| ((long) (in[offset++] & 0xFF) << 32)
| ((long) (in[offset++] & 0xFF) << 40)
| ((long) (in[offset++] & 0xFF) << 48)
| ((long) (in[offset] & 0xFF) << 56);
// save_abc ::=
long aa = a, bb = b, cc = c;
// pass(aa, bb, cc, 5) ::=
cc ^= x0;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 5;
aa ^= x1;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 5;
bb ^= x2;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 5;
cc ^= x3;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 5;
aa ^= x4;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 5;
bb ^= x5;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 5;
cc ^= x6;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 5;
aa ^= x7;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 5;
// key_schedule ::=
x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5L;
x1 ^= x0;
x2 += x1;
x3 -= x2 ^ ((~x1) << 19);
x4 ^= x3;
x5 += x4;
x6 -= x5 ^ ((~x4) >>> 23);
x7 ^= x6;
x0 += x7;
x1 -= x0 ^ ((~x7) << 19);
x2 ^= x1;
x3 += x2;
x4 -= x3 ^ ((~x2) >>> 23);
x5 ^= x4;
x6 += x5;
x7 -= x6 ^ 0x0123456789ABCDEFL;
// pass(cc, aa, bb, 7) ::=
bb ^= x0;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 7;
cc ^= x1;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 7;
aa ^= x2;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 7;
bb ^= x3;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 7;
cc ^= x4;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 7;
aa ^= x5;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 7;
bb ^= x6;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 7;
cc ^= x7;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 7;
// key_schedule ::=
x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5L;
x1 ^= x0;
x2 += x1;
x3 -= x2 ^ ((~x1) << 19);
x4 ^= x3;
x5 += x4;
x6 -= x5 ^ ((~x4) >>> 23);
x7 ^= x6;
x0 += x7;
x1 -= x0 ^ ((~x7) << 19);
x2 ^= x1;
x3 += x2;
x4 -= x3 ^ ((~x2) >>> 23);
x5 ^= x4;
x6 += x5;
x7 -= x6 ^ 0x0123456789ABCDEFL;
// pass(bb,cc,aa,9) ::=
aa ^= x0;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 9;
bb ^= x1;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 9;
cc ^= x2;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 9;
aa ^= x3;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 9;
bb ^= x4;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 9;
cc ^= x5;
aa -= T1[(int) cc & 0xff] ^ T2[(int) (cc >> 16) & 0xff]
^ T3[(int) (cc >> 32) & 0xff] ^ T4[(int) (cc >> 48) & 0xff];
bb += T4[(int) (cc >> 8) & 0xff] ^ T3[(int) (cc >> 24) & 0xff]
^ T2[(int) (cc >> 40) & 0xff] ^ T1[(int) (cc >> 56) & 0xff];
bb *= 9;
aa ^= x6;
bb -= T1[(int) aa & 0xff] ^ T2[(int) (aa >> 16) & 0xff]
^ T3[(int) (aa >> 32) & 0xff] ^ T4[(int) (aa >> 48) & 0xff];
cc += T4[(int) (aa >> 8) & 0xff] ^ T3[(int) (aa >> 24) & 0xff]
^ T2[(int) (aa >> 40) & 0xff] ^ T1[(int) (aa >> 56) & 0xff];
cc *= 9;
bb ^= x7;
cc -= T1[(int) bb & 0xff] ^ T2[(int) (bb >> 16) & 0xff]
^ T3[(int) (bb >> 32) & 0xff] ^ T4[(int) (bb >> 48) & 0xff];
aa += T4[(int) (bb >> 8) & 0xff] ^ T3[(int) (bb >> 24) & 0xff]
^ T2[(int) (bb >> 40) & 0xff] ^ T1[(int) (bb >> 56) & 0xff];
aa *= 9;
// feedforward ::=
a ^= aa;
b = bb - b;
c += cc;
}
}

View file

@ -0,0 +1,626 @@
/* Whirlpool.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.hash;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
* <p>Whirlpool, a new 512-bit hashing function operating on messages less than
* 2 ** 256 bits in length. The function structure is designed according to the
* Wide Trail strategy and permits a wide variety of implementation trade-offs.
* </p>
*
* <p><b>IMPORTANT</b>: This implementation is not thread-safe.</p>
*
* <p>References:</p>
*
* <ol>
* <li><a href="http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html">
* The WHIRLPOOL Hashing Function</a>.<br>
* <a href="mailto:paulo.barreto@terra.com.br">Paulo S.L.M. Barreto</a> and
* <a href="mailto:vincent.rijmen@esat.kuleuven.ac.be">Vincent Rijmen</a>.</li>
* </ol>
*/
public final class Whirlpool extends BaseHash
{
// Debugging methods and variables
// -------------------------------------------------------------------------
private static final boolean DEBUG = false;
private static final int debuglevel = 3;
// Constants and variables
// -------------------------------------------------------------------------
private static final int BLOCK_SIZE = 64; // inner block size in bytes
/** The digest of the 0-bit long message. */
private static final String DIGEST0 = "470F0409ABAA446E49667D4EBE12A14387CEDBD10DD17B8243CAD550A089DC0F"
+ "EEA7AA40F6C2AAAB71C6EBD076E43C7CFCA0AD32567897DCB5969861049A0F5A";
private static final int R = 10; // default number of rounds
private static final String Sd = // p. 19 [WHIRLPOOL]
"\u1823\uc6E8\u87B8\u014F\u36A6\ud2F5\u796F\u9152"
+ "\u60Bc\u9B8E\uA30c\u7B35\u1dE0\ud7c2\u2E4B\uFE57"
+ "\u1577\u37E5\u9FF0\u4AdA\u58c9\u290A\uB1A0\u6B85"
+ "\uBd5d\u10F4\ucB3E\u0567\uE427\u418B\uA77d\u95d8"
+ "\uFBEE\u7c66\udd17\u479E\ucA2d\uBF07\uAd5A\u8333"
+ "\u6302\uAA71\uc819\u49d9\uF2E3\u5B88\u9A26\u32B0"
+ "\uE90F\ud580\uBEcd\u3448\uFF7A\u905F\u2068\u1AAE"
+ "\uB454\u9322\u64F1\u7312\u4008\uc3Ec\udBA1\u8d3d"
+ "\u9700\ucF2B\u7682\ud61B\uB5AF\u6A50\u45F3\u30EF"
+ "\u3F55\uA2EA\u65BA\u2Fc0\udE1c\uFd4d\u9275\u068A"
+ "\uB2E6\u0E1F\u62d4\uA896\uF9c5\u2559\u8472\u394c"
+ "\u5E78\u388c\ud1A5\uE261\uB321\u9c1E\u43c7\uFc04"
+ "\u5199\u6d0d\uFAdF\u7E24\u3BAB\ucE11\u8F4E\uB7EB"
+ "\u3c81\u94F7\uB913\u2cd3\uE76E\uc403\u5644\u7FA9"
+ "\u2ABB\uc153\udc0B\u9d6c\u3174\uF646\uAc89\u14E1"
+ "\u163A\u6909\u70B6\ud0Ed\ucc42\u98A4\u285c\uF886";
private static final long[] T0 = new long[256];
private static final long[] T1 = new long[256];
private static final long[] T2 = new long[256];
private static final long[] T3 = new long[256];
private static final long[] T4 = new long[256];
private static final long[] T5 = new long[256];
private static final long[] T6 = new long[256];
private static final long[] T7 = new long[256];
private static final long[] rc = new long[R];
/** caches the result of the correctness test, once executed. */
private static Boolean valid;
/** The 512-bit context as 8 longs. */
private long H0, H1, H2, H3, H4, H5, H6, H7;
/** Work area for computing the round key schedule. */
private long k00, k01, k02, k03, k04, k05, k06, k07;
private long Kr0, Kr1, Kr2, Kr3, Kr4, Kr5, Kr6, Kr7;
/** work area for transforming the 512-bit buffer. */
private long n0, n1, n2, n3, n4, n5, n6, n7;
private long nn0, nn1, nn2, nn3, nn4, nn5, nn6, nn7;
/** work area for holding block cipher's intermediate values. */
private long w0, w1, w2, w3, w4, w5, w6, w7;
// Static code - to intialise lookup tables --------------------------------
static
{
long time = System.currentTimeMillis();
int ROOT = 0x11d; // para. 2.1 [WHIRLPOOL]
int i, r, j;
long s, s2, s3, s4, s5, s8, s9, t;
char c;
final byte[] S = new byte[256];
for (i = 0; i < 256; i++)
{
c = Sd.charAt(i >>> 1);
s = ((i & 1) == 0 ? c >>> 8 : c) & 0xFFL;
s2 = s << 1;
if (s2 > 0xFFL)
{
s2 ^= ROOT;
}
s3 = s2 ^ s;
s4 = s2 << 1;
if (s4 > 0xFFL)
{
s4 ^= ROOT;
}
s5 = s4 ^ s;
s8 = s4 << 1;
if (s8 > 0xFFL)
{
s8 ^= ROOT;
}
s9 = s8 ^ s;
S[i] = (byte) s;
T0[i] = t = s << 56 | s << 48 | s3 << 40 | s << 32 | s5 << 24
| s8 << 16 | s9 << 8 | s5;
T1[i] = t >>> 8 | t << 56;
T2[i] = t >>> 16 | t << 48;
T3[i] = t >>> 24 | t << 40;
T4[i] = t >>> 32 | t << 32;
T5[i] = t >>> 40 | t << 24;
T6[i] = t >>> 48 | t << 16;
T7[i] = t >>> 56 | t << 8;
}
for (r = 1, i = 0, j = 0; r < R + 1; r++)
{
rc[i++] = (S[j++] & 0xFFL) << 56 | (S[j++] & 0xFFL) << 48
| (S[j++] & 0xFFL) << 40 | (S[j++] & 0xFFL) << 32
| (S[j++] & 0xFFL) << 24 | (S[j++] & 0xFFL) << 16
| (S[j++] & 0xFFL) << 8 | (S[j++] & 0xFFL);
}
time = System.currentTimeMillis() - time;
if (DEBUG && debuglevel > 8)
{
System.out.println("==========");
System.out.println();
System.out.println("Static data");
System.out.println();
System.out.println();
System.out.println("T0[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T0[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T1[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T1[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T2[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T2[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T3[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T3[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T4[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T4[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T5[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T6[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("T7[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
{
System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("rc[]:");
for (i = 0; i < R; i++)
{
System.out.println("0x" + Util.toString(rc[i]));
}
System.out.println();
System.out.println();
System.out.println("Total initialization time: " + time + " ms.");
System.out.println();
}
}
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public Whirlpool()
{
super(Registry.WHIRLPOOL_HASH, 20, BLOCK_SIZE);
}
/**
* <p>Private constructor for cloning purposes.</p>
*
* @param md the instance to clone.
*/
private Whirlpool(Whirlpool md)
{
this();
this.H0 = md.H0;
this.H1 = md.H1;
this.H2 = md.H2;
this.H3 = md.H3;
this.H4 = md.H4;
this.H5 = md.H5;
this.H6 = md.H6;
this.H7 = md.H7;
this.count = md.count;
this.buffer = (byte[]) md.buffer.clone();
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
// java.lang.Cloneable interface implementation ----------------------------
public Object clone()
{
return (new Whirlpool(this));
}
// Implementation of concrete methods in BaseHash --------------------------
protected void transform(byte[] in, int offset)
{
// apply mu to the input
n0 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n1 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n2 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n3 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n4 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n5 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n6 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
n7 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
| (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
| (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
| (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
// transform K into the key schedule Kr; 0 <= r <= R
k00 = H0;
k01 = H1;
k02 = H2;
k03 = H3;
k04 = H4;
k05 = H5;
k06 = H6;
k07 = H7;
nn0 = n0 ^ k00;
nn1 = n1 ^ k01;
nn2 = n2 ^ k02;
nn3 = n3 ^ k03;
nn4 = n4 ^ k04;
nn5 = n5 ^ k05;
nn6 = n6 ^ k06;
nn7 = n7 ^ k07;
// intermediate cipher output
w0 = w1 = w2 = w3 = w4 = w5 = w6 = w7 = 0L;
for (int r = 0; r < R; r++)
{
// 1. compute intermediate round key schedule by applying ro[rc]
// to the previous round key schedule --rc being the round constant
Kr0 = T0[(int) ((k00 >> 56) & 0xFFL)] ^ T1[(int) ((k07 >> 48) & 0xFFL)]
^ T2[(int) ((k06 >> 40) & 0xFFL)]
^ T3[(int) ((k05 >> 32) & 0xFFL)]
^ T4[(int) ((k04 >> 24) & 0xFFL)]
^ T5[(int) ((k03 >> 16) & 0xFFL)]
^ T6[(int) ((k02 >> 8) & 0xFFL)] ^ T7[(int) (k01 & 0xFFL)]
^ rc[r];
Kr1 = T0[(int) ((k01 >> 56) & 0xFFL)] ^ T1[(int) ((k00 >> 48) & 0xFFL)]
^ T2[(int) ((k07 >> 40) & 0xFFL)]
^ T3[(int) ((k06 >> 32) & 0xFFL)]
^ T4[(int) ((k05 >> 24) & 0xFFL)]
^ T5[(int) ((k04 >> 16) & 0xFFL)]
^ T6[(int) ((k03 >> 8) & 0xFFL)] ^ T7[(int) (k02 & 0xFFL)];
Kr2 = T0[(int) ((k02 >> 56) & 0xFFL)] ^ T1[(int) ((k01 >> 48) & 0xFFL)]
^ T2[(int) ((k00 >> 40) & 0xFFL)]
^ T3[(int) ((k07 >> 32) & 0xFFL)]
^ T4[(int) ((k06 >> 24) & 0xFFL)]
^ T5[(int) ((k05 >> 16) & 0xFFL)]
^ T6[(int) ((k04 >> 8) & 0xFFL)] ^ T7[(int) (k03 & 0xFFL)];
Kr3 = T0[(int) ((k03 >> 56) & 0xFFL)] ^ T1[(int) ((k02 >> 48) & 0xFFL)]
^ T2[(int) ((k01 >> 40) & 0xFFL)]
^ T3[(int) ((k00 >> 32) & 0xFFL)]
^ T4[(int) ((k07 >> 24) & 0xFFL)]
^ T5[(int) ((k06 >> 16) & 0xFFL)]
^ T6[(int) ((k05 >> 8) & 0xFFL)] ^ T7[(int) (k04 & 0xFFL)];
Kr4 = T0[(int) ((k04 >> 56) & 0xFFL)] ^ T1[(int) ((k03 >> 48) & 0xFFL)]
^ T2[(int) ((k02 >> 40) & 0xFFL)]
^ T3[(int) ((k01 >> 32) & 0xFFL)]
^ T4[(int) ((k00 >> 24) & 0xFFL)]
^ T5[(int) ((k07 >> 16) & 0xFFL)]
^ T6[(int) ((k06 >> 8) & 0xFFL)] ^ T7[(int) (k05 & 0xFFL)];
Kr5 = T0[(int) ((k05 >> 56) & 0xFFL)] ^ T1[(int) ((k04 >> 48) & 0xFFL)]
^ T2[(int) ((k03 >> 40) & 0xFFL)]
^ T3[(int) ((k02 >> 32) & 0xFFL)]
^ T4[(int) ((k01 >> 24) & 0xFFL)]
^ T5[(int) ((k00 >> 16) & 0xFFL)]
^ T6[(int) ((k07 >> 8) & 0xFFL)] ^ T7[(int) (k06 & 0xFFL)];
Kr6 = T0[(int) ((k06 >> 56) & 0xFFL)] ^ T1[(int) ((k05 >> 48) & 0xFFL)]
^ T2[(int) ((k04 >> 40) & 0xFFL)]
^ T3[(int) ((k03 >> 32) & 0xFFL)]
^ T4[(int) ((k02 >> 24) & 0xFFL)]
^ T5[(int) ((k01 >> 16) & 0xFFL)]
^ T6[(int) ((k00 >> 8) & 0xFFL)] ^ T7[(int) (k07 & 0xFFL)];
Kr7 = T0[(int) ((k07 >> 56) & 0xFFL)] ^ T1[(int) ((k06 >> 48) & 0xFFL)]
^ T2[(int) ((k05 >> 40) & 0xFFL)]
^ T3[(int) ((k04 >> 32) & 0xFFL)]
^ T4[(int) ((k03 >> 24) & 0xFFL)]
^ T5[(int) ((k02 >> 16) & 0xFFL)]
^ T6[(int) ((k01 >> 8) & 0xFFL)] ^ T7[(int) (k00 & 0xFFL)];
k00 = Kr0;
k01 = Kr1;
k02 = Kr2;
k03 = Kr3;
k04 = Kr4;
k05 = Kr5;
k06 = Kr6;
k07 = Kr7;
// 2. incrementally compute the cipher output
w0 = T0[(int) ((nn0 >> 56) & 0xFFL)] ^ T1[(int) ((nn7 >> 48) & 0xFFL)]
^ T2[(int) ((nn6 >> 40) & 0xFFL)]
^ T3[(int) ((nn5 >> 32) & 0xFFL)]
^ T4[(int) ((nn4 >> 24) & 0xFFL)]
^ T5[(int) ((nn3 >> 16) & 0xFFL)] ^ T6[(int) ((nn2 >> 8) & 0xFFL)]
^ T7[(int) (nn1 & 0xFFL)] ^ Kr0;
w1 = T0[(int) ((nn1 >> 56) & 0xFFL)] ^ T1[(int) ((nn0 >> 48) & 0xFFL)]
^ T2[(int) ((nn7 >> 40) & 0xFFL)]
^ T3[(int) ((nn6 >> 32) & 0xFFL)]
^ T4[(int) ((nn5 >> 24) & 0xFFL)]
^ T5[(int) ((nn4 >> 16) & 0xFFL)] ^ T6[(int) ((nn3 >> 8) & 0xFFL)]
^ T7[(int) (nn2 & 0xFFL)] ^ Kr1;
w2 = T0[(int) ((nn2 >> 56) & 0xFFL)] ^ T1[(int) ((nn1 >> 48) & 0xFFL)]
^ T2[(int) ((nn0 >> 40) & 0xFFL)]
^ T3[(int) ((nn7 >> 32) & 0xFFL)]
^ T4[(int) ((nn6 >> 24) & 0xFFL)]
^ T5[(int) ((nn5 >> 16) & 0xFFL)] ^ T6[(int) ((nn4 >> 8) & 0xFFL)]
^ T7[(int) (nn3 & 0xFFL)] ^ Kr2;
w3 = T0[(int) ((nn3 >> 56) & 0xFFL)] ^ T1[(int) ((nn2 >> 48) & 0xFFL)]
^ T2[(int) ((nn1 >> 40) & 0xFFL)]
^ T3[(int) ((nn0 >> 32) & 0xFFL)]
^ T4[(int) ((nn7 >> 24) & 0xFFL)]
^ T5[(int) ((nn6 >> 16) & 0xFFL)] ^ T6[(int) ((nn5 >> 8) & 0xFFL)]
^ T7[(int) (nn4 & 0xFFL)] ^ Kr3;
w4 = T0[(int) ((nn4 >> 56) & 0xFFL)] ^ T1[(int) ((nn3 >> 48) & 0xFFL)]
^ T2[(int) ((nn2 >> 40) & 0xFFL)]
^ T3[(int) ((nn1 >> 32) & 0xFFL)]
^ T4[(int) ((nn0 >> 24) & 0xFFL)]
^ T5[(int) ((nn7 >> 16) & 0xFFL)] ^ T6[(int) ((nn6 >> 8) & 0xFFL)]
^ T7[(int) (nn5 & 0xFFL)] ^ Kr4;
w5 = T0[(int) ((nn5 >> 56) & 0xFFL)] ^ T1[(int) ((nn4 >> 48) & 0xFFL)]
^ T2[(int) ((nn3 >> 40) & 0xFFL)]
^ T3[(int) ((nn2 >> 32) & 0xFFL)]
^ T4[(int) ((nn1 >> 24) & 0xFFL)]
^ T5[(int) ((nn0 >> 16) & 0xFFL)] ^ T6[(int) ((nn7 >> 8) & 0xFFL)]
^ T7[(int) (nn6 & 0xFFL)] ^ Kr5;
w6 = T0[(int) ((nn6 >> 56) & 0xFFL)] ^ T1[(int) ((nn5 >> 48) & 0xFFL)]
^ T2[(int) ((nn4 >> 40) & 0xFFL)]
^ T3[(int) ((nn3 >> 32) & 0xFFL)]
^ T4[(int) ((nn2 >> 24) & 0xFFL)]
^ T5[(int) ((nn1 >> 16) & 0xFFL)] ^ T6[(int) ((nn0 >> 8) & 0xFFL)]
^ T7[(int) (nn7 & 0xFFL)] ^ Kr6;
w7 = T0[(int) ((nn7 >> 56) & 0xFFL)] ^ T1[(int) ((nn6 >> 48) & 0xFFL)]
^ T2[(int) ((nn5 >> 40) & 0xFFL)]
^ T3[(int) ((nn4 >> 32) & 0xFFL)]
^ T4[(int) ((nn3 >> 24) & 0xFFL)]
^ T5[(int) ((nn2 >> 16) & 0xFFL)] ^ T6[(int) ((nn1 >> 8) & 0xFFL)]
^ T7[(int) (nn0 & 0xFFL)] ^ Kr7;
nn0 = w0;
nn1 = w1;
nn2 = w2;
nn3 = w3;
nn4 = w4;
nn5 = w5;
nn6 = w6;
nn7 = w7;
}
// apply the Miyaguchi-Preneel hash scheme
H0 ^= w0 ^ n0;
H1 ^= w1 ^ n1;
H2 ^= w2 ^ n2;
H3 ^= w3 ^ n3;
H4 ^= w4 ^ n4;
H5 ^= w5 ^ n5;
H6 ^= w6 ^ n6;
H7 ^= w7 ^ n7;
}
protected byte[] padBuffer()
{
// [WHIRLPOOL] p. 6:
// "...padded with a 1-bit, then with as few 0-bits as necessary to
// obtain a bit string whose length is an odd multiple of 256, and
// finally with the 256-bit right-justified binary representation of L."
// in this implementation we use 'count' as the number of bytes hashed
// so far. hence the minimal number of bytes added to the message proper
// are 33 (1 for the 1-bit followed by the 0-bits and the encoding of
// the count framed in a 256-bit block). our formula is then:
// count + 33 + padding = 0 (mod BLOCK_SIZE)
int n = (int) ((count + 33) % BLOCK_SIZE);
int padding = n == 0 ? 33 : BLOCK_SIZE - n + 33;
byte[] result = new byte[padding];
// padding is always binary 1 followed by binary 0s
result[0] = (byte) 0x80;
// save (right justified) the number of bits hashed
long bits = count * 8;
int i = padding - 8;
result[i++] = (byte) (bits >>> 56);
result[i++] = (byte) (bits >>> 48);
result[i++] = (byte) (bits >>> 40);
result[i++] = (byte) (bits >>> 32);
result[i++] = (byte) (bits >>> 24);
result[i++] = (byte) (bits >>> 16);
result[i++] = (byte) (bits >>> 8);
result[i] = (byte) bits;
return result;
}
protected byte[] getResult()
{
// apply inverse mu to the context
byte[] result = new byte[] { (byte) (H0 >>> 56), (byte) (H0 >>> 48),
(byte) (H0 >>> 40), (byte) (H0 >>> 32),
(byte) (H0 >>> 24), (byte) (H0 >>> 16),
(byte) (H0 >>> 8), (byte) H0,
(byte) (H1 >>> 56), (byte) (H1 >>> 48),
(byte) (H1 >>> 40), (byte) (H1 >>> 32),
(byte) (H1 >>> 24), (byte) (H1 >>> 16),
(byte) (H1 >>> 8), (byte) H1,
(byte) (H2 >>> 56), (byte) (H2 >>> 48),
(byte) (H2 >>> 40), (byte) (H2 >>> 32),
(byte) (H2 >>> 24), (byte) (H2 >>> 16),
(byte) (H2 >>> 8), (byte) H2,
(byte) (H3 >>> 56), (byte) (H3 >>> 48),
(byte) (H3 >>> 40), (byte) (H3 >>> 32),
(byte) (H3 >>> 24), (byte) (H3 >>> 16),
(byte) (H3 >>> 8), (byte) H3,
(byte) (H4 >>> 56), (byte) (H4 >>> 48),
(byte) (H4 >>> 40), (byte) (H4 >>> 32),
(byte) (H4 >>> 24), (byte) (H4 >>> 16),
(byte) (H4 >>> 8), (byte) H4,
(byte) (H5 >>> 56), (byte) (H5 >>> 48),
(byte) (H5 >>> 40), (byte) (H5 >>> 32),
(byte) (H5 >>> 24), (byte) (H5 >>> 16),
(byte) (H5 >>> 8), (byte) H5,
(byte) (H6 >>> 56), (byte) (H6 >>> 48),
(byte) (H6 >>> 40), (byte) (H6 >>> 32),
(byte) (H6 >>> 24), (byte) (H6 >>> 16),
(byte) (H6 >>> 8), (byte) H6,
(byte) (H7 >>> 56), (byte) (H7 >>> 48),
(byte) (H7 >>> 40), (byte) (H7 >>> 32),
(byte) (H7 >>> 24), (byte) (H7 >>> 16),
(byte) (H7 >>> 8), (byte) H7 };
return result;
}
protected void resetContext()
{
H0 = H1 = H2 = H3 = H4 = H5 = H6 = H7 = 0L;
}
public boolean selfTest()
{
if (valid == null)
{
valid = new Boolean(
DIGEST0.equals(Util.toString(new Whirlpool().digest())));
}
return valid.booleanValue();
}
}

View file

@ -0,0 +1,68 @@
/* HavalSpi.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* The implementation of the <code>HAVAL</code> <i>Service Provider Interface</i>
* (<b>SPI</b>) Adapter.<p>
*
* @version Revision: $
*/
public class HavalSpi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public HavalSpi()
{
super(Registry.HAVAL_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,69 @@
/* MD2Spi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* <p>The implementation of the MD2 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
*
* @version $Revision: 1.1 $
*/
public class MD2Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public MD2Spi()
{
super(Registry.MD2_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,69 @@
/* MD4Spi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* <p>The implementation of the MD4 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
*
* @version $Revision: 1.1 $
*/
public class MD4Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public MD4Spi()
{
super(Registry.MD4_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* MD5Spi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* The implementation of the MD5 <i>Service Provider Interface</i> (<b>SPI</b>)
* adapter.<p>
*
* @version $Revision: 1.1 $
*/
public class MD5Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public MD5Spi()
{
super(Registry.MD5_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,147 @@
/* MessageDigestAdapter.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.hash.IMessageDigest;
import gnu.java.security.hash.HashFactory;
import java.security.DigestException;
import java.security.MessageDigestSpi;
/**
* The implementation of a generic {@link java.security.MessageDigest} adapter
* class to wrap gnu.crypto hash instances.<p>
*
* This class defines the <i>Service Provider Interface</i> (<b>SPI</b>) for the
* {@link java.security.MessageDigest} class, which provides the functionality
* of a message digest algorithm, such as MD5 or SHA. Message digests are secure
* one-way hash functions that take arbitrary-sized data and output a fixed-
* length hash value.<p>
*
* All the abstract methods in the {@link java.security.MessageDigestSpi} class
* are implemented by this class and all its sub-classes.<p>
*
* All the implementations which subclass this object, and which are serviced by
* the GNU Crypto provider implement the {@link java.lang.Cloneable} interface.<p>
*
* @version $Revision: 1.1 $
*/
class MessageDigestAdapter extends MessageDigestSpi implements Cloneable
{
// Constants and variables
// -------------------------------------------------------------------------
/** Our underlying hash instance. */
private IMessageDigest adaptee;
// Constructor(s)
// -------------------------------------------------------------------------
/**
* Trivial protected constructor.
*
* @param mdName the canonical name of the hash algorithm.
*/
protected MessageDigestAdapter(String mdName)
{
this(HashFactory.getInstance(mdName));
}
/**
* Private constructor for cloning purposes.
*
* @param adaptee a clone of the underlying hash algorithm instance.
*/
private MessageDigestAdapter(IMessageDigest adaptee)
{
super();
this.adaptee = adaptee;
}
// Class methods
// -------------------------------------------------------------------------
// java.security.MessageDigestSpi interface implementation
// -------------------------------------------------------------------------
public Object clone()
{
return new MessageDigestAdapter((IMessageDigest) adaptee.clone());
}
public int engineGetDigestLength()
{
return adaptee.hashSize();
}
public void engineUpdate(byte input)
{
adaptee.update(input);
}
public void engineUpdate(byte[] input, int offset, int len)
{
adaptee.update(input, offset, len);
}
public byte[] engineDigest()
{
return adaptee.digest();
}
public int engineDigest(byte[] buf, int offset, int len)
throws DigestException
{
int result = adaptee.hashSize();
if (len < result)
{
throw new DigestException();
}
byte[] md = adaptee.digest();
System.arraycopy(md, 0, buf, offset, result);
return result;
}
public void engineReset()
{
adaptee.reset();
}
}

View file

@ -0,0 +1,68 @@
/* RipeMD128Spi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* The implementation of the RIPEMD-128 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
*
* @version $Revision: 1.1 $
*/
public class RipeMD128Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public RipeMD128Spi()
{
super(Registry.RIPEMD128_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* RipeMD160Spi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* The implementation of the RIPEMD-160 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
*
* @version $Revision: 1.1 $
*/
public class RipeMD160Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public RipeMD160Spi()
{
super(Registry.RIPEMD160_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* Sha160Spi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* The implementation of the SHA-1 (160-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
*
* @version $Revision: 1.1 $
*/
public class Sha160Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public Sha160Spi()
{
super(Registry.SHA160_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* Sha256Spi.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* <p>The implementation of the SHA-2-1 (256-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
*
* @version $Revision: 1.1 $
*/
public class Sha256Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public Sha256Spi()
{
super(Registry.SHA256_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* Sha384Spi.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* <p>The implementation of the SHA-2-2 (384-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
*
* @version $Revision: 1.1 $
*/
public class Sha384Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public Sha384Spi()
{
super(Registry.SHA384_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* Sha512Spi.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* <p>The implementation of the SHA-2-3 (512-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
*
* @version $Revision: 1.1 $
*/
public class Sha512Spi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public Sha512Spi()
{
super(Registry.SHA512_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,69 @@
/* TigerSpi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* <p>The implementation of the Tiger <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
*
* @version $Revision: 1.1 $
*/
public class TigerSpi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
/** Trivial 0-arguments constructor. */
public TigerSpi()
{
super(Registry.TIGER_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,68 @@
/* WhirlpoolSpi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.hash;
import gnu.java.security.Registry;
/**
* The implementation of the Whirlpool <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
*
* @version $Revision: 1.1 $
*/
public class WhirlpoolSpi extends MessageDigestAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public WhirlpoolSpi()
{
super(Registry.WHIRLPOOL_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,66 @@
/* HavalRandomSpi.java --
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.prng;
import gnu.java.security.Registry;
/**
* The implementation of the HAVAL-based SecureRandom <i>Service Provider
* Interface</i> (<b>SPI</b>) Adapter.<p>
*/
public class HavalRandomSpi extends SecureRandomAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public HavalRandomSpi()
{
super(Registry.HAVAL_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,66 @@
/* MD2RandomSpi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.prng;
import gnu.java.security.Registry;
/**
* The implementation of the MD2-based SecureRandom <i>Service Provider
* Interface</i> (<b>SPI</b>) adapter.<p>
*/
public class MD2RandomSpi extends SecureRandomAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public MD2RandomSpi()
{
super(Registry.MD2_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,66 @@
/* MD4RandomSpi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.prng;
import gnu.java.security.Registry;
/**
* The implementation of the MD4-based SecureRandom <i>Service Provider
* Interface</i> (<b>SPI</b>) adapter.<p>
*/
public class MD4RandomSpi extends SecureRandomAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public MD4RandomSpi()
{
super(Registry.MD4_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,66 @@
/* MD5RandomSpi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.prng;
import gnu.java.security.Registry;
/**
* The implementation of the MD5-based SecureRandom <i>Service Provider
* Interface</i> (<b>SPI</b>) adapter.<p>
*/
public class MD5RandomSpi extends SecureRandomAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public MD5RandomSpi()
{
super(Registry.MD5_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

View file

@ -0,0 +1,66 @@
/* RipeMD128RandomSpi.java --
Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.security.jce.prng;
import gnu.java.security.Registry;
/**
* <p>The implementation of the RIPEMD128-based SecureRandom <i>Service Provider
* Interface</i> (<b>SPI</b>) adapter.<p>
*/
public class RipeMD128RandomSpi extends SecureRandomAdapter
{
// Constants and variables
// -------------------------------------------------------------------------
// Constructor(s)
// -------------------------------------------------------------------------
public RipeMD128RandomSpi()
{
super(Registry.RIPEMD128_HASH);
}
// Class methods
// -------------------------------------------------------------------------
// Instance methods
// -------------------------------------------------------------------------
}

Some files were not shown because too many files have changed in this diff Show more