mirror of
https://github.com/openjdk/jdk.git
synced 2026-06-02 08:42:39 +00:00
Merge
This commit is contained in:
commit
2f5dfb27c2
@ -175,3 +175,4 @@ e4bae5c53fca8fcb9393d47fd36a34b9e2e8d4ec jdk8-b50
|
||||
e865efbc71059a414b3b2dd2e0adfcb3d2ab6ff9 jdk8-b51
|
||||
e8569a473cee7f4955bd9e76a9bdf6c6a07ced27 jdk8-b52
|
||||
2c6933c5106b81a8578b70996fe5b735fb3adb60 jdk8-b53
|
||||
70ad0ed1d6cef0e7712690d1bab21e4769708aad jdk8-b54
|
||||
|
||||
@ -125,6 +125,26 @@ ifeq ($(PLATFORM), windows)
|
||||
OTHER_LDLIBS += jli.lib
|
||||
endif
|
||||
|
||||
#
|
||||
# Applications expect to be able to link against libjawt without invoking
|
||||
# System.loadLibrary("jawt") first. This was the behaviour described in the
|
||||
# devloper documentation of JAWT and what worked with OpenJDK6.
|
||||
#
|
||||
ifeq ($(PLATFORM), solaris)
|
||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||
LDFLAGS += -R \$$ORIGIN/../lib/$(LIBARCH)
|
||||
LDFLAGS += -R \$$ORIGIN/../jre/lib/$(LIBARCH)
|
||||
else # ! ARCH_DATA_MODEL 64-bit
|
||||
LDFLAGS += -R \$$ORIGIN/../../lib/$(LIBARCH)
|
||||
LDFLAGS += -R \$$ORIGIN/../../jre/lib/$(LIBARCH)
|
||||
endif # ARCH_DATA_MODEL
|
||||
endif # PLATFORM SOLARIS
|
||||
ifeq ($(PLATFORM), linux)
|
||||
LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)
|
||||
LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH)
|
||||
endif # PLATFORM LINUX
|
||||
|
||||
|
||||
#
|
||||
# Launcher specific files.
|
||||
#
|
||||
|
||||
@ -73,7 +73,7 @@ ifeq ($(ARCH_DATA_MODEL),64)
|
||||
else ifeq ($(ARCH),universal)
|
||||
MAX_VM_MEMORY = 1024
|
||||
else
|
||||
MAX_VM_MEMORY = 612
|
||||
MAX_VM_MEMORY = 768
|
||||
endif
|
||||
|
||||
# List of all possible directories for javadoc to look for sources
|
||||
|
||||
@ -87,7 +87,7 @@ else
|
||||
endif
|
||||
SUBDIRS_desktop = audio $(RENDER_SUBDIR) image \
|
||||
$(LWAWT_PRE_SUBDIR) $(DISPLAY_LIBS) $(DGA_SUBDIR) $(LWAWT_SUBDIR) \
|
||||
jawt font jpeg cmm $(DISPLAY_TOOLS) beans
|
||||
jawt font jpeg cmm $(DISPLAY_TOOLS)
|
||||
SUBDIRS_management = management
|
||||
SUBDIRS_misc = $(ORG_SUBDIR) rmi $(JDBC_SUBDIR) tracing
|
||||
SUBDIRS_tools = native2ascii serialver tools jconsole
|
||||
|
||||
@ -1,43 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code 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
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
#
|
||||
# Makefile for building sun.beans.*
|
||||
#
|
||||
|
||||
BUILDDIR = ../..
|
||||
PACKAGE = sun.beans
|
||||
PRODUCT = sun
|
||||
include $(BUILDDIR)/common/Defs.gmk
|
||||
|
||||
#
|
||||
# Files
|
||||
#
|
||||
AUTO_FILES_JAVA_DIRS = sun/beans
|
||||
|
||||
#
|
||||
# Rules
|
||||
#
|
||||
include $(BUILDDIR)/common/Classes.gmk
|
||||
@ -30,6 +30,13 @@ PRODUCT = sun
|
||||
|
||||
include $(BUILDDIR)/common/Defs.gmk
|
||||
|
||||
#
|
||||
# libjawt links to other programs, but nothing links to it directly. An RPATH
|
||||
# entry has been added to the launcher so third-party programs linked against
|
||||
# it will be able to find it no matter where the JDK or the third-party program
|
||||
# is located.
|
||||
#
|
||||
|
||||
#
|
||||
# Files
|
||||
#
|
||||
|
||||
@ -34,7 +34,7 @@ import javax.swing.plaf.ComponentUI;
|
||||
|
||||
import sun.lwawt.macosx.CMenuItem;
|
||||
|
||||
class ScreenMenuItem extends MenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler {
|
||||
final class ScreenMenuItem extends MenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler {
|
||||
ScreenMenuPropertyListener fListener;
|
||||
JMenuItem fMenuItem;
|
||||
|
||||
@ -96,21 +96,31 @@ class ScreenMenuItem extends MenuItem implements ActionListener, ComponentListen
|
||||
fMenuItem.removeComponentListener(this);
|
||||
}
|
||||
|
||||
public void setAccelerator(final KeyStroke ks) {
|
||||
if (ks == null) {
|
||||
setShortcut(null);
|
||||
static void syncLabelAndKS(MenuItem menuItem, String label, KeyStroke ks) {
|
||||
final MenuComponentPeer peer = menuItem.getPeer();
|
||||
if (!(peer instanceof CMenuItem)) {
|
||||
//Is it possible?
|
||||
return;
|
||||
}
|
||||
|
||||
final MenuComponentPeer peer = getPeer();
|
||||
if (peer instanceof CMenuItem) {
|
||||
final CMenuItem ourPeer = (CMenuItem)peer;
|
||||
ourPeer.setLabel(fMenuItem.getText(), ks.getKeyChar(), ks.getKeyCode(), ks.getModifiers());
|
||||
final CMenuItem cmi = (CMenuItem) peer;
|
||||
if (ks == null) {
|
||||
cmi.setLabel(label);
|
||||
} else {
|
||||
setShortcut(new MenuShortcut(ks.getKeyCode(), (ks.getModifiers() & InputEvent.SHIFT_MASK) != 0));
|
||||
cmi.setLabel(label, ks.getKeyChar(), ks.getKeyCode(),
|
||||
ks.getModifiers());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void setLabel(final String label) {
|
||||
syncLabelAndKS(this, label, fMenuItem.getAccelerator());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAccelerator(final KeyStroke ks) {
|
||||
syncLabelAndKS(this, fMenuItem.getText(), ks);
|
||||
}
|
||||
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
fMenuItem.doClick(0); // This takes care of all the different events
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ import com.apple.laf.AquaMenuItemUI.IndeterminateListener;
|
||||
|
||||
import sun.lwawt.macosx.*;
|
||||
|
||||
class ScreenMenuItemCheckbox extends CheckboxMenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler, ItemListener {
|
||||
final class ScreenMenuItemCheckbox extends CheckboxMenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler, ItemListener {
|
||||
JMenuItem fMenuItem;
|
||||
MenuContainer fParent;
|
||||
|
||||
@ -110,19 +110,14 @@ class ScreenMenuItemCheckbox extends CheckboxMenuItem implements ActionListener,
|
||||
super.removeNotify();
|
||||
}
|
||||
|
||||
public void setAccelerator(final KeyStroke ks) {
|
||||
if (ks == null) {
|
||||
setShortcut(null);
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public synchronized void setLabel(final String label) {
|
||||
ScreenMenuItem.syncLabelAndKS(this, label, fMenuItem.getAccelerator());
|
||||
}
|
||||
|
||||
final MenuComponentPeer peer = getPeer();
|
||||
if (peer instanceof CMenuItem) {
|
||||
final CMenuItem ourPeer = (CMenuItem)peer;
|
||||
ourPeer.setLabel(fMenuItem.getText(), ks.getKeyChar(), ks.getKeyCode(), ks.getModifiers());
|
||||
} else {
|
||||
setShortcut(new MenuShortcut(ks.getKeyCode(), (ks.getModifiers() & InputEvent.SHIFT_MASK) != 0));
|
||||
}
|
||||
@Override
|
||||
public void setAccelerator(final KeyStroke ks) {
|
||||
ScreenMenuItem.syncLabelAndKS(this, fMenuItem.getText(), ks);
|
||||
}
|
||||
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
|
||||
@ -31,8 +31,12 @@ import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsDevice;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Image;
|
||||
import java.awt.ImageCapabilities;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Transparency;
|
||||
import java.awt.color.ColorSpace;
|
||||
import java.awt.image.BufferedImage;
|
||||
@ -44,6 +48,7 @@ import java.awt.image.WritableRaster;
|
||||
|
||||
import sun.awt.CGraphicsConfig;
|
||||
import sun.awt.CGraphicsDevice;
|
||||
import sun.awt.TextureSizeConstraining;
|
||||
import sun.awt.image.OffScreenImage;
|
||||
import sun.awt.image.SunVolatileImage;
|
||||
import sun.awt.image.SurfaceManager;
|
||||
@ -65,7 +70,7 @@ import sun.java2d.pipe.hw.AccelDeviceEventNotifier;
|
||||
import sun.lwawt.macosx.CPlatformView;
|
||||
|
||||
public class CGLGraphicsConfig extends CGraphicsConfig
|
||||
implements OGLGraphicsConfig
|
||||
implements OGLGraphicsConfig, TextureSizeConstraining
|
||||
{
|
||||
//private static final int kOpenGLSwapInterval = RuntimeOptions.getCurrentOptions().OpenGLSwapInterval;
|
||||
private static final int kOpenGLSwapInterval = 0; // TODO
|
||||
@ -242,6 +247,8 @@ public class CGLGraphicsConfig extends CGraphicsConfig
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
|
||||
updateTotalDisplayBounds();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -478,4 +485,50 @@ public class CGLGraphicsConfig extends CGraphicsConfig
|
||||
public void removeDeviceEventListener(AccelDeviceEventListener l) {
|
||||
AccelDeviceEventNotifier.removeListener(l);
|
||||
}
|
||||
|
||||
private static final Rectangle totalDisplayBounds = new Rectangle();
|
||||
|
||||
private static void updateTotalDisplayBounds() {
|
||||
synchronized (totalDisplayBounds) {
|
||||
Rectangle virtualBounds = new Rectangle();
|
||||
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
|
||||
for (GraphicsConfiguration gc : gd.getConfigurations()) {
|
||||
virtualBounds = virtualBounds.union(gc.getBounds());
|
||||
}
|
||||
}
|
||||
totalDisplayBounds.setBounds(virtualBounds);
|
||||
}
|
||||
}
|
||||
|
||||
// 7160609: GL still fails to create a square texture of this size,
|
||||
// so we use this value to cap the total display bounds.
|
||||
native private static int getMaxTextureSize();
|
||||
|
||||
@Override
|
||||
public int getMaxTextureWidth() {
|
||||
int width;
|
||||
|
||||
synchronized (totalDisplayBounds) {
|
||||
if (totalDisplayBounds.width == 0) {
|
||||
updateTotalDisplayBounds();
|
||||
}
|
||||
width = totalDisplayBounds.width;
|
||||
}
|
||||
|
||||
return Math.min(width, getMaxTextureSize());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxTextureHeight() {
|
||||
int height;
|
||||
|
||||
synchronized (totalDisplayBounds) {
|
||||
if (totalDisplayBounds.height == 0) {
|
||||
updateTotalDisplayBounds();
|
||||
}
|
||||
height = totalDisplayBounds.height;
|
||||
}
|
||||
|
||||
return Math.min(height, getMaxTextureSize());
|
||||
}
|
||||
}
|
||||
|
||||
@ -282,7 +282,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
* Note that we call setVisible() at the end of initialization.
|
||||
*/
|
||||
public final void initialize() {
|
||||
platformComponent.initialize(target, this, getPlatformWindow());
|
||||
platformComponent.initialize(getPlatformWindow());
|
||||
initializeImpl();
|
||||
setVisible(target.isVisible());
|
||||
}
|
||||
|
||||
@ -338,6 +338,18 @@ public class LWWindowPeer
|
||||
h = MINIMUM_HEIGHT;
|
||||
}
|
||||
|
||||
if (graphicsConfig instanceof TextureSizeConstraining) {
|
||||
final int maxW = ((TextureSizeConstraining)graphicsConfig).getMaxTextureWidth();
|
||||
final int maxH = ((TextureSizeConstraining)graphicsConfig).getMaxTextureHeight();
|
||||
|
||||
if (w > maxW) {
|
||||
w = maxW;
|
||||
}
|
||||
if (h > maxH) {
|
||||
h = maxH;
|
||||
}
|
||||
}
|
||||
|
||||
// Don't post ComponentMoved/Resized and Paint events
|
||||
// until we've got a notification from the delegate
|
||||
setBounds(x, y, w, h, op, false, false);
|
||||
@ -405,14 +417,33 @@ public class LWWindowPeer
|
||||
|
||||
@Override
|
||||
public void updateMinimumSize() {
|
||||
Dimension d = null;
|
||||
final Dimension min;
|
||||
if (getTarget().isMinimumSizeSet()) {
|
||||
d = getTarget().getMinimumSize();
|
||||
min = getTarget().getMinimumSize();
|
||||
min.width = Math.max(min.width, MINIMUM_WIDTH);
|
||||
min.height = Math.max(min.height, MINIMUM_HEIGHT);
|
||||
} else {
|
||||
min = new Dimension(MINIMUM_WIDTH, MINIMUM_HEIGHT);
|
||||
}
|
||||
if (d == null) {
|
||||
d = new Dimension(MINIMUM_WIDTH, MINIMUM_HEIGHT);
|
||||
|
||||
final int maxW, maxH;
|
||||
if (graphicsConfig instanceof TextureSizeConstraining) {
|
||||
maxW = ((TextureSizeConstraining)graphicsConfig).getMaxTextureWidth();
|
||||
maxH = ((TextureSizeConstraining)graphicsConfig).getMaxTextureHeight();
|
||||
} else {
|
||||
maxW = maxH = Integer.MAX_VALUE;
|
||||
}
|
||||
platformWindow.setMinimumSize(d.width, d.height);
|
||||
|
||||
final Dimension max;
|
||||
if (getTarget().isMaximumSizeSet()) {
|
||||
max = getTarget().getMaximumSize();
|
||||
max.width = Math.min(max.width, maxW);
|
||||
max.height = Math.min(max.height, maxH);
|
||||
} else {
|
||||
max = new Dimension(maxW, maxH);
|
||||
}
|
||||
|
||||
platformWindow.setSizeConstraints(min.width, min.height, max.width, max.height);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -23,15 +23,38 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
package sun.lwawt;
|
||||
|
||||
import java.awt.Component;
|
||||
|
||||
/**
|
||||
* Can be used to store information about native resource related to the
|
||||
* lightweight component.
|
||||
*/
|
||||
public interface PlatformComponent {
|
||||
|
||||
public void initialize(Component target, LWComponentPeer peer, PlatformWindow platformWindow);
|
||||
/**
|
||||
* Initializes platform component.
|
||||
*
|
||||
* @param platformWindow already initialized {@code PlatformWindow}.
|
||||
*/
|
||||
void initialize(PlatformWindow platformWindow);
|
||||
|
||||
public void setBounds(int x, int y, int w, int h);
|
||||
/**
|
||||
* Moves and resizes this component. The new location of the top-left corner
|
||||
* is specified by {@code x} and {@code y}, and the new size is specified by
|
||||
* {@code w} and {@code h}. The location is specified relative to the {@code
|
||||
* platformWindow}.
|
||||
*
|
||||
* @param x the X location of the component
|
||||
* @param y the Y location of the component
|
||||
* @param w the width of the component
|
||||
* @param h the height of the component
|
||||
*/
|
||||
void setBounds(int x, int y, int w, int h);
|
||||
|
||||
public void dispose();
|
||||
/**
|
||||
* Releases all of the native resources used by this {@code
|
||||
* PlatformComponent}.
|
||||
*/
|
||||
void dispose();
|
||||
}
|
||||
|
||||
@ -131,7 +131,10 @@ public interface PlatformWindow {
|
||||
|
||||
public void setResizable(boolean resizable);
|
||||
|
||||
public void setMinimumSize(int width, int height);
|
||||
/**
|
||||
* Applies the minimum and maximum size to the platform window.
|
||||
*/
|
||||
public void setSizeConstraints(int minW, int minH, int maxW, int maxH);
|
||||
|
||||
/**
|
||||
* Transforms the given Graphics object according to the native
|
||||
|
||||
@ -33,8 +33,8 @@ package sun.lwawt.macosx;
|
||||
public class CFRetainedResource {
|
||||
private static native void nativeCFRelease(final long ptr, final boolean disposeOnAppKitThread);
|
||||
|
||||
final boolean disposeOnAppKitThread;
|
||||
protected long ptr;
|
||||
private final boolean disposeOnAppKitThread;
|
||||
protected volatile long ptr;
|
||||
|
||||
/**
|
||||
* @param ptr CFRetained native object pointer
|
||||
|
||||
@ -30,12 +30,14 @@ import java.awt.peer.*;
|
||||
import java.awt.BufferCapabilities.FlipContents;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
import java.security.AccessController;
|
||||
import java.util.List;
|
||||
import java.io.*;
|
||||
|
||||
import sun.awt.CausedFocusEvent.Cause;
|
||||
import sun.awt.AWTAccessor;
|
||||
import sun.java2d.pipe.Region;
|
||||
import sun.security.action.GetBooleanAction;
|
||||
|
||||
class CFileDialog implements FileDialogPeer {
|
||||
|
||||
@ -53,11 +55,14 @@ class CFileDialog implements FileDialogPeer {
|
||||
if (title == null) {
|
||||
title = " ";
|
||||
}
|
||||
Boolean chooseDirectories = AccessController.doPrivileged(
|
||||
new GetBooleanAction("apple.awt.fileDialogForDirectories"));
|
||||
|
||||
String[] userFileNames = nativeRunFileDialog(title,
|
||||
dialogMode,
|
||||
target.isMultipleMode(),
|
||||
navigateApps,
|
||||
chooseDirectories,
|
||||
target.getFilenameFilter() != null,
|
||||
target.getDirectory(),
|
||||
target.getFile());
|
||||
@ -142,7 +147,8 @@ class CFileDialog implements FileDialogPeer {
|
||||
}
|
||||
|
||||
private native String[] nativeRunFileDialog(String title, int mode,
|
||||
boolean multipleMode, boolean shouldNavigateApps, boolean hasFilenameFilter,
|
||||
boolean multipleMode, boolean shouldNavigateApps,
|
||||
boolean canChooseDirectories, boolean hasFilenameFilter,
|
||||
String directory, String file);
|
||||
|
||||
@Override
|
||||
|
||||
@ -23,27 +23,24 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
package sun.lwawt.macosx;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Insets;
|
||||
|
||||
import sun.lwawt.PlatformComponent;
|
||||
import sun.lwawt.PlatformWindow;
|
||||
import sun.lwawt.LWComponentPeer;
|
||||
|
||||
import sun.lwawt.macosx.CFRetainedResource;
|
||||
/**
|
||||
* On OSX {@code CPlatformComponent} stores pointer to the native CAlayer which
|
||||
* can be used from JAWT.
|
||||
*/
|
||||
final class CPlatformComponent extends CFRetainedResource
|
||||
implements PlatformComponent {
|
||||
|
||||
public class CPlatformComponent extends CFRetainedResource implements PlatformComponent {
|
||||
private volatile PlatformWindow platformWindow;
|
||||
|
||||
Component target;
|
||||
LWComponentPeer peer;
|
||||
PlatformWindow platformWindow;
|
||||
|
||||
private native long nativeCreateComponent(long windowLayer);
|
||||
private native long nativeSetBounds(long ptr, int x, int y, int width, int height);
|
||||
|
||||
public CPlatformComponent() {
|
||||
CPlatformComponent() {
|
||||
super(0, true);
|
||||
}
|
||||
|
||||
@ -51,27 +48,28 @@ public class CPlatformComponent extends CFRetainedResource implements PlatformCo
|
||||
return ptr;
|
||||
}
|
||||
|
||||
public void initialize(Component target, LWComponentPeer peer, PlatformWindow platformWindow) {
|
||||
this.target = target;
|
||||
this.peer = peer;
|
||||
@Override
|
||||
public void initialize(final PlatformWindow platformWindow) {
|
||||
this.platformWindow = platformWindow;
|
||||
|
||||
long windowLayerPtr = platformWindow.getLayerPtr();
|
||||
setPtr(nativeCreateComponent(windowLayerPtr));
|
||||
setPtr(nativeCreateComponent(platformWindow.getLayerPtr()));
|
||||
}
|
||||
|
||||
// TODO: visibility, z-order
|
||||
|
||||
@Override
|
||||
public void setBounds(int x, int y, int width, int height) {
|
||||
public void setBounds(final int x, final int y, final int w, final int h) {
|
||||
// translates values from the coordinate system of the top-level window
|
||||
// to the coordinate system of the content view
|
||||
Insets insets = platformWindow.getPeer().getInsets();
|
||||
nativeSetBounds(getPointer(), x - insets.left, y - insets.top, width, height);
|
||||
final Insets insets = platformWindow.getPeer().getInsets();
|
||||
nativeSetBounds(getPointer(), x - insets.left, y - insets.top, w, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
private native long nativeCreateComponent(long windowLayer);
|
||||
|
||||
private native void nativeSetBounds(long ptr, int x, int y, int w, int h);
|
||||
}
|
||||
|
||||
@ -180,7 +180,7 @@ public class CPlatformEmbeddedFrame implements PlatformWindow {
|
||||
public void setResizable(boolean resizable) {}
|
||||
|
||||
@Override
|
||||
public void setMinimumSize(int width, int height) {}
|
||||
public void setSizeConstraints(int minW, int minH, int maxW, int maxH) {}
|
||||
|
||||
@Override
|
||||
public Graphics transformGraphics(Graphics g) {
|
||||
|
||||
@ -672,20 +672,15 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
|
||||
// Re-apply the size constraints and the size to ensure the space
|
||||
// occupied by the grow box is counted properly
|
||||
setMinimumSize(1, 1); // the method ignores its arguments
|
||||
peer.updateMinimumSize();
|
||||
|
||||
Rectangle bounds = peer.getBounds();
|
||||
setBounds(bounds.x, bounds.y, bounds.width, bounds.height);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMinimumSize(int width, int height) {
|
||||
//TODO width, height should be used
|
||||
//NOTE: setResizable() calls setMinimumSize(1,1) relaying on the logic below
|
||||
final long nsWindowPtr = getNSWindowPtr();
|
||||
final Dimension min = target.getMinimumSize();
|
||||
final Dimension max = target.getMaximumSize();
|
||||
nativeSetNSWindowMinMax(nsWindowPtr, min.getWidth(), min.getHeight(), max.getWidth(), max.getHeight());
|
||||
public void setSizeConstraints(int minW, int minH, int maxW, int maxH) {
|
||||
nativeSetNSWindowMinMax(getNSWindowPtr(), minW, minH, maxW, maxH);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -42,7 +42,7 @@ import java.util.concurrent.Callable;
|
||||
import sun.awt.*;
|
||||
import sun.lwawt.*;
|
||||
import sun.lwawt.LWWindowPeer.PeerType;
|
||||
|
||||
import sun.security.action.GetBooleanAction;
|
||||
|
||||
class NamedCursor extends Cursor {
|
||||
NamedCursor(String name) {
|
||||
@ -81,14 +81,6 @@ public class LWCToolkit extends LWToolkit {
|
||||
}
|
||||
}
|
||||
|
||||
static String getSystemProperty(final String name, final String deflt) {
|
||||
return AccessController.doPrivileged (new PrivilegedAction<String>() {
|
||||
public String run() {
|
||||
return System.getProperty(name, deflt);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public LWCToolkit() {
|
||||
SunToolkit.setDataTransfererClassName("sun.lwawt.macosx.CDataTransferer");
|
||||
|
||||
@ -700,8 +692,8 @@ public class LWCToolkit extends LWToolkit {
|
||||
*/
|
||||
public synchronized static boolean getSunAwtDisableCALayers() {
|
||||
if (sunAwtDisableCALayers == null) {
|
||||
sunAwtDisableCALayers =
|
||||
getBooleanSystemProperty("sun.awt.disableCALayers");
|
||||
sunAwtDisableCALayers = AccessController.doPrivileged(
|
||||
new GetBooleanAction("sun.awt.disableCALayers"));
|
||||
}
|
||||
return sunAwtDisableCALayers.booleanValue();
|
||||
}
|
||||
|
||||
@ -78,11 +78,10 @@
|
||||
|
||||
// translates values to the coordinate system of the "root" layer
|
||||
CGFloat newY = windowLayer.bounds.size.height - rect.origin.y - rect.size.height;
|
||||
CGRect newRect = CGRectMake(rect.origin.x, newY, rect.size.width, rect.size.height);
|
||||
|
||||
// REMIND: why do we need to inverse position?
|
||||
CGRect newRect = CGRectMake(-rect.origin.x, -newY, rect.size.width, rect.size.height);
|
||||
layer.frame = newRect;
|
||||
|
||||
layer.bounds = newRect;
|
||||
[AWTSurfaceLayers repaintLayersRecursively:layer];
|
||||
}
|
||||
|
||||
|
||||
@ -52,6 +52,9 @@
|
||||
// Should we navigate into apps?
|
||||
BOOL fNavigateApps;
|
||||
|
||||
// Can the dialog choose directories ?
|
||||
BOOL fChooseDirectories;
|
||||
|
||||
// Contains the absolute paths of the selected files as URLs
|
||||
NSArray *fURLs;
|
||||
}
|
||||
@ -65,6 +68,7 @@
|
||||
mode:(jint)inMode
|
||||
multipleMode:(BOOL)inMultipleMode
|
||||
shouldNavigate:(BOOL)inNavigateApps
|
||||
canChooseDirectories:(BOOL)inChooseDirectories
|
||||
withEnv:(JNIEnv*)env;
|
||||
|
||||
// Invoked from the main thread
|
||||
|
||||
@ -43,6 +43,7 @@
|
||||
mode:(jint)inMode
|
||||
multipleMode:(BOOL)inMultipleMode
|
||||
shouldNavigate:(BOOL)inNavigateApps
|
||||
canChooseDirectories:(BOOL)inChooseDirectories
|
||||
withEnv:(JNIEnv*)env;
|
||||
{
|
||||
if (self == [super init]) {
|
||||
@ -57,6 +58,7 @@
|
||||
fMode = inMode;
|
||||
fMultipleMode = inMultipleMode;
|
||||
fNavigateApps = inNavigateApps;
|
||||
fChooseDirectories = inChooseDirectories;
|
||||
fPanelResult = NSCancelButton;
|
||||
}
|
||||
|
||||
@ -109,7 +111,7 @@
|
||||
NSOpenPanel *openPanel = (NSOpenPanel *)thePanel;
|
||||
[openPanel setAllowsMultipleSelection:fMultipleMode];
|
||||
[openPanel setCanChooseFiles:YES];
|
||||
[openPanel setCanChooseDirectories:NO];
|
||||
[openPanel setCanChooseDirectories:fChooseDirectories];
|
||||
[openPanel setCanCreateDirectories:YES];
|
||||
}
|
||||
|
||||
@ -182,7 +184,8 @@
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_sun_lwawt_macosx_CFileDialog_nativeRunFileDialog
|
||||
(JNIEnv *env, jobject peer, jstring title, jint mode, jboolean multipleMode,
|
||||
jboolean navigateApps, jboolean hasFilter, jstring directory, jstring file)
|
||||
jboolean navigateApps, jboolean chooseDirectories, jboolean hasFilter,
|
||||
jstring directory, jstring file)
|
||||
{
|
||||
jobjectArray returnValue = NULL;
|
||||
|
||||
@ -200,6 +203,7 @@ JNF_COCOA_ENTER(env);
|
||||
mode:mode
|
||||
multipleMode:multipleMode
|
||||
shouldNavigate:navigateApps
|
||||
canChooseDirectories:chooseDirectories
|
||||
withEnv:env];
|
||||
|
||||
[JNFRunLoop performOnMainThread:@selector(safeSaveOrLoad)
|
||||
|
||||
@ -447,3 +447,20 @@ Java_sun_java2d_opengl_CGLGraphicsConfig_getOGLCapabilities
|
||||
return cglinfo->context->caps;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_sun_java2d_opengl_CGLGraphicsConfig_getMaxTextureSize
|
||||
(JNIEnv *env, jclass cglgc)
|
||||
{
|
||||
J2dTraceLn(J2D_TRACE_INFO, "CGLGraphicsConfig_getMaxTextureSize");
|
||||
|
||||
__block int max = 0;
|
||||
|
||||
[JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
|
||||
[sharedContext makeCurrentContext];
|
||||
j2d_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
|
||||
}];
|
||||
|
||||
return (jint)max;
|
||||
}
|
||||
|
||||
|
||||
@ -28,7 +28,6 @@
|
||||
|
||||
@interface NSApplicationAWT : NSApplication {
|
||||
NSString *fApplicationName;
|
||||
BOOL fUseDefaultIcon;
|
||||
NSWindow *eventTransparentWindow;
|
||||
}
|
||||
|
||||
|
||||
@ -52,7 +52,6 @@ BOOL postEventDuringEventSynthesis = NO;
|
||||
|
||||
AWT_ASSERT_APPKIT_THREAD;
|
||||
fApplicationName = nil;
|
||||
fUseDefaultIcon = NO;
|
||||
|
||||
// NSApplication will call _RegisterApplication with the application's bundle, but there may not be one.
|
||||
// So, we need to call it ourselves to ensure the app is set up properly.
|
||||
@ -147,10 +146,6 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
if (appName != NULL) {
|
||||
fApplicationName = [NSString stringWithUTF8String:appName];
|
||||
unsetenv(envVar);
|
||||
|
||||
// If this environment variable was set we were launched from the command line, so we
|
||||
// should use a generic app icon if one wasn't set.
|
||||
fUseDefaultIcon = YES;
|
||||
}
|
||||
|
||||
// If it wasn't specified as an argument, see if it was specified as a system property.
|
||||
@ -171,9 +166,6 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
if (lastPeriod.location != NSNotFound) {
|
||||
fApplicationName = [fApplicationName substringFromIndex:lastPeriod.location + 1];
|
||||
}
|
||||
// If this environment variable was set we were launched from the command line, so we
|
||||
// should use a generic app icon if one wasn't set.
|
||||
fUseDefaultIcon = YES;
|
||||
}
|
||||
}
|
||||
|
||||
@ -266,8 +258,11 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
// If the icon file wasn't specified as an argument and we need to get an icon
|
||||
// we'll use the generic java app icon.
|
||||
NSString *defaultIconPath = [NSString stringWithFormat:@"%@%@", SHARED_FRAMEWORK_BUNDLE, @"/Resources/GenericApp.icns"];
|
||||
if (fUseDefaultIcon && (theIconPath == nil)) {
|
||||
theIconPath = defaultIconPath;
|
||||
if (theIconPath == nil) {
|
||||
NSString* bundleIcon = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIconFile"];
|
||||
if (bundleIcon == nil) {
|
||||
theIconPath = defaultIconPath;
|
||||
}
|
||||
}
|
||||
|
||||
// Set up the dock icon if we have an icon name.
|
||||
|
||||
@ -68,12 +68,23 @@ int JLI_GetStdArgc();
|
||||
#define JLI_StrNCaseCmp(p1, p2, p3) strnicmp((p1), (p2), (p3))
|
||||
#define JLI_Snprintf _snprintf
|
||||
void JLI_CmdToArgs(char *cmdline);
|
||||
#else
|
||||
#define JLI_Lseek _lseeki64
|
||||
#else /* NIXES */
|
||||
#include <unistd.h>
|
||||
#include <strings.h>
|
||||
#define JLI_StrCaseCmp(p1, p2) strcasecmp((p1), (p2))
|
||||
#define JLI_StrNCaseCmp(p1, p2, p3) strncasecmp((p1), (p2), (p3))
|
||||
#define JLI_Snprintf snprintf
|
||||
#ifdef __solaris__
|
||||
#define JLI_Lseek llseek
|
||||
#endif
|
||||
#ifdef __linux__
|
||||
#define _LARGFILE64_SOURCE
|
||||
#define JLI_Lseek lseek64
|
||||
#endif
|
||||
#ifdef MACOSX
|
||||
#define JLI_Lseek lseek
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/*
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -37,6 +37,8 @@
|
||||
#define CENSIG 0x02014b50L /* "PK\001\002" */
|
||||
#define ENDSIG 0x06054b50L /* "PK\005\006" */
|
||||
|
||||
#define ZIP64_ENDSIG 0x06064b50L /* "PK\006\006" */
|
||||
#define ZIP64_LOCSIG 0x07064b50L /* "PK\006\007" */
|
||||
/*
|
||||
* Header sizes including signatures
|
||||
*/
|
||||
@ -45,12 +47,21 @@
|
||||
#define CENHDR 46
|
||||
#define ENDHDR 22
|
||||
|
||||
#define ZIP64_ENDHDR 56 // ZIP64 end header size
|
||||
#define ZIP64_LOCHDR 20 // ZIP64 end loc header size
|
||||
#define ZIP64_EXTHDR 24 // EXT header size
|
||||
#define ZIP64_EXTID 1 // Extra field Zip64 header ID
|
||||
|
||||
#define ZIP64_MAGICVAL 0xffffffffLL
|
||||
#define ZIP64_MAGICCOUNT 0xffff
|
||||
|
||||
/*
|
||||
* Header field access macros
|
||||
*/
|
||||
#define CH(b, n) (((unsigned char *)(b))[n])
|
||||
#define SH(b, n) (CH(b, n) | (CH(b, n+1) << 8))
|
||||
#define LG(b, n) (SH(b, n) | (SH(b, n+2) << 16))
|
||||
#define LG(b, n) ((SH(b, n) | (SH(b, n+2) << 16)) &0xffffffffUL)
|
||||
#define LL(b, n) (((jlong)LG(b, n)) | (((jlong)LG(b, n+4)) << 32))
|
||||
#define GETSIG(b) LG(b, 0)
|
||||
|
||||
/*
|
||||
@ -101,6 +112,26 @@
|
||||
#define ENDOFF(b) LG(b, 16) /* central directory offset */
|
||||
#define ENDCOM(b) SH(b, 20) /* size of zip file comment */
|
||||
|
||||
/*
|
||||
* Macros for getting Zip64 end of central directory header fields
|
||||
*/
|
||||
#define ZIP64_ENDLEN(b) LL(b, 4) /* size of zip64 end of central dir */
|
||||
#define ZIP64_ENDVEM(b) SH(b, 12) /* version made by */
|
||||
#define ZIP64_ENDVER(b) SH(b, 14) /* version needed to extract */
|
||||
#define ZIP64_ENDNMD(b) LG(b, 16) /* number of this disk */
|
||||
#define ZIP64_ENDDSK(b) LG(b, 20) /* disk number of start */
|
||||
#define ZIP64_ENDTOD(b) LL(b, 24) /* total number of entries on this disk */
|
||||
#define ZIP64_ENDTOT(b) LL(b, 32) /* total number of entries */
|
||||
#define ZIP64_ENDSIZ(b) LL(b, 40) /* central directory size in bytes */
|
||||
#define ZIP64_ENDOFF(b) LL(b, 48) /* offset of first CEN header */
|
||||
|
||||
/*
|
||||
* Macros for getting Zip64 end of central directory locator fields
|
||||
*/
|
||||
#define ZIP64_LOCDSK(b) LG(b, 4) /* disk number start */
|
||||
#define ZIP64_LOCOFF(b) LL(b, 8) /* offset of zip64 end */
|
||||
#define ZIP64_LOCTOT(b) LG(b, 16) /* total number of disks */
|
||||
|
||||
/*
|
||||
* A comment of maximum length of 64kb can follow the END record. This
|
||||
* is the furthest the END record can be from the end of the file.
|
||||
@ -119,7 +150,7 @@
|
||||
typedef struct zentry { /* Zip file entry */
|
||||
size_t isize; /* size of inflated data */
|
||||
size_t csize; /* size of compressed data (zero if uncompressed) */
|
||||
off_t offset; /* position of compressed data */
|
||||
jlong offset; /* position of compressed data */
|
||||
int how; /* compression method (if any) */
|
||||
} zentry;
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -61,7 +61,7 @@ inflate_file(int fd, zentry *entry, int *size_out)
|
||||
|
||||
if (entry->csize == (size_t) -1 || entry->isize == (size_t) -1 )
|
||||
return (NULL);
|
||||
if (lseek(fd, entry->offset, SEEK_SET) < (off_t)0)
|
||||
if (JLI_Lseek(fd, entry->offset, SEEK_SET) < (jlong)0)
|
||||
return (NULL);
|
||||
if ((in = malloc(entry->csize + 1)) == NULL)
|
||||
return (NULL);
|
||||
@ -110,6 +110,38 @@ inflate_file(int fd, zentry *entry, int *size_out)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
static jboolean zip64_present = JNI_FALSE;
|
||||
|
||||
/*
|
||||
* Checks to see if we have ZIP64 archive, and save
|
||||
* the check for later use
|
||||
*/
|
||||
static int
|
||||
haveZIP64(Byte *p) {
|
||||
jlong cenlen, cenoff, centot;
|
||||
cenlen = ENDSIZ(p);
|
||||
cenoff = ENDOFF(p);
|
||||
centot = ENDTOT(p);
|
||||
zip64_present = (cenlen == ZIP64_MAGICVAL ||
|
||||
cenoff == ZIP64_MAGICVAL ||
|
||||
centot == ZIP64_MAGICCOUNT);
|
||||
return zip64_present;
|
||||
}
|
||||
|
||||
static jlong
|
||||
find_end64(int fd, Byte *ep, jlong pos)
|
||||
{
|
||||
jlong end64pos;
|
||||
jlong bytes;
|
||||
if ((end64pos = JLI_Lseek(fd, pos - ZIP64_LOCHDR, SEEK_SET)) < (jlong)0)
|
||||
return -1;
|
||||
if ((bytes = read(fd, ep, ZIP64_LOCHDR)) < 0)
|
||||
return -1;
|
||||
if (GETSIG(ep) == ZIP64_LOCSIG)
|
||||
return end64pos;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* A very little used routine to handle the case that zip file has
|
||||
* a comment at the end. Believe it or not, the only way to find the
|
||||
@ -122,12 +154,12 @@ inflate_file(int fd, zentry *entry, int *size_out)
|
||||
* Returns the offset of the END record in the file on success,
|
||||
* -1 on failure.
|
||||
*/
|
||||
static off_t
|
||||
static jlong
|
||||
find_end(int fd, Byte *eb)
|
||||
{
|
||||
off_t len;
|
||||
off_t pos;
|
||||
off_t flen;
|
||||
jlong len;
|
||||
jlong pos;
|
||||
jlong flen;
|
||||
int bytes;
|
||||
Byte *cp;
|
||||
Byte *endpos;
|
||||
@ -136,14 +168,16 @@ find_end(int fd, Byte *eb)
|
||||
/*
|
||||
* 99.44% (or more) of the time, there will be no comment at the
|
||||
* end of the zip file. Try reading just enough to read the END
|
||||
* record from the end of the file.
|
||||
* record from the end of the file, at this time we should also
|
||||
* check to see if we have a ZIP64 archive.
|
||||
*/
|
||||
if ((pos = lseek(fd, -ENDHDR, SEEK_END)) < (off_t)0)
|
||||
if ((pos = JLI_Lseek(fd, -ENDHDR, SEEK_END)) < (jlong)0)
|
||||
return (-1);
|
||||
if ((bytes = read(fd, eb, ENDHDR)) < 0)
|
||||
return (-1);
|
||||
if (GETSIG(eb) == ENDSIG)
|
||||
return (pos);
|
||||
if (GETSIG(eb) == ENDSIG) {
|
||||
return haveZIP64(eb) ? find_end64(fd, eb, pos) : pos;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shucky-Darn,... There is a comment at the end of the zip file.
|
||||
@ -151,10 +185,10 @@ find_end(int fd, Byte *eb)
|
||||
* Allocate and fill a buffer with enough of the zip file
|
||||
* to meet the specification for a maximal comment length.
|
||||
*/
|
||||
if ((flen = lseek(fd, 0, SEEK_END)) < (off_t)0)
|
||||
if ((flen = JLI_Lseek(fd, 0, SEEK_END)) < (jlong)0)
|
||||
return (-1);
|
||||
len = (flen < END_MAXLEN) ? flen : END_MAXLEN;
|
||||
if (lseek(fd, -len, SEEK_END) < (off_t)0)
|
||||
if (JLI_Lseek(fd, -len, SEEK_END) < (jlong)0)
|
||||
return (-1);
|
||||
if ((buffer = malloc(END_MAXLEN)) == NULL)
|
||||
return (-1);
|
||||
@ -175,12 +209,92 @@ find_end(int fd, Byte *eb)
|
||||
(cp + ENDHDR + ENDCOM(cp) == endpos)) {
|
||||
(void) memcpy(eb, cp, ENDHDR);
|
||||
free(buffer);
|
||||
return (flen - (endpos - cp));
|
||||
pos = flen - (endpos - cp);
|
||||
return haveZIP64(eb) ? find_end64(fd, eb, pos) : pos;
|
||||
}
|
||||
free(buffer);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
#define BUFSIZE (3 * 65536 + CENHDR + SIGSIZ)
|
||||
#define MINREAD 1024
|
||||
|
||||
/*
|
||||
* Computes and positions at the start of the CEN header, ie. the central
|
||||
* directory, this will also return the offset if there is a zip file comment
|
||||
* at the end of the archive, for most cases this would be 0.
|
||||
*/
|
||||
static jlong
|
||||
compute_cen(int fd, Byte *bp)
|
||||
{
|
||||
int bytes;
|
||||
Byte *p;
|
||||
jlong base_offset;
|
||||
jlong offset;
|
||||
char buffer[MINREAD];
|
||||
p = buffer;
|
||||
/*
|
||||
* Read the END Header, which is the starting point for ZIP files.
|
||||
* (Clearly designed to make writing a zip file easier than reading
|
||||
* one. Now isn't that precious...)
|
||||
*/
|
||||
if ((base_offset = find_end(fd, bp)) == -1) {
|
||||
return (-1);
|
||||
}
|
||||
p = bp;
|
||||
/*
|
||||
* There is a historical, but undocumented, ability to allow for
|
||||
* additional "stuff" to be prepended to the zip/jar file. It seems
|
||||
* that this has been used to prepend an actual java launcher
|
||||
* executable to the jar on Windows. Although this is just another
|
||||
* form of statically linking a small piece of the JVM to the
|
||||
* application, we choose to continue to support it. Note that no
|
||||
* guarantees have been made (or should be made) to the customer that
|
||||
* this will continue to work.
|
||||
*
|
||||
* Therefore, calculate the base offset of the zip file (within the
|
||||
* expanded file) by assuming that the central directory is followed
|
||||
* immediately by the end record.
|
||||
*/
|
||||
if (zip64_present) {
|
||||
if ((offset = ZIP64_LOCOFF(p)) < (jlong)0) {
|
||||
return -1;
|
||||
}
|
||||
if (JLI_Lseek(fd, offset, SEEK_SET) < (jlong) 0) {
|
||||
return (-1);
|
||||
}
|
||||
if ((bytes = read(fd, buffer, MINREAD)) < 0) {
|
||||
return (-1);
|
||||
}
|
||||
if (GETSIG(buffer) != ZIP64_ENDSIG) {
|
||||
return -1;
|
||||
}
|
||||
if ((offset = ZIP64_ENDOFF(buffer)) < (jlong)0) {
|
||||
return -1;
|
||||
}
|
||||
if (JLI_Lseek(fd, offset, SEEK_SET) < (jlong)0) {
|
||||
return (-1);
|
||||
}
|
||||
p = buffer;
|
||||
base_offset = base_offset - ZIP64_ENDSIZ(p) - ZIP64_ENDOFF(p) - ZIP64_ENDHDR;
|
||||
} else {
|
||||
base_offset = base_offset - ENDSIZ(p) - ENDOFF(p);
|
||||
/*
|
||||
* The END Header indicates the start of the Central Directory
|
||||
* Headers. Remember that the desired Central Directory Header (CEN)
|
||||
* will almost always be the second one and the first one is a small
|
||||
* directory entry ("META-INF/"). Keep the code optimized for
|
||||
* that case.
|
||||
*
|
||||
* Seek to the beginning of the Central Directory.
|
||||
*/
|
||||
if (JLI_Lseek(fd, base_offset + ENDOFF(p), SEEK_SET) < (jlong) 0) {
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
return base_offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Locate the manifest file with the zip/jar file.
|
||||
*
|
||||
@ -208,9 +322,6 @@ find_end(int fd, Byte *eb)
|
||||
* a typical jar file (META-INF and META-INF/MANIFEST.MF). Keep this factoid
|
||||
* in mind when optimizing this code.
|
||||
*/
|
||||
#define BUFSIZE (3 * 65536 + CENHDR + SIGSIZ)
|
||||
#define MINREAD 1024
|
||||
|
||||
static int
|
||||
find_file(int fd, zentry *entry, const char *file_name)
|
||||
{
|
||||
@ -218,7 +329,7 @@ find_file(int fd, zentry *entry, const char *file_name)
|
||||
int res;
|
||||
int entry_size;
|
||||
int read_size;
|
||||
int base_offset;
|
||||
jlong base_offset;
|
||||
Byte *p;
|
||||
Byte *bp;
|
||||
Byte *buffer;
|
||||
@ -228,54 +339,18 @@ find_file(int fd, zentry *entry, const char *file_name)
|
||||
return(-1);
|
||||
}
|
||||
|
||||
p = buffer;
|
||||
bp = buffer;
|
||||
|
||||
/*
|
||||
* Read the END Header, which is the starting point for ZIP files.
|
||||
* (Clearly designed to make writing a zip file easier than reading
|
||||
* one. Now isn't that precious...)
|
||||
*/
|
||||
if ((base_offset = find_end(fd, bp)) == -1) {
|
||||
base_offset = compute_cen(fd, bp);
|
||||
if (base_offset == -1) {
|
||||
free(buffer);
|
||||
return (-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* There is a historical, but undocumented, ability to allow for
|
||||
* additional "stuff" to be prepended to the zip/jar file. It seems
|
||||
* that this has been used to prepend an actual java launcher
|
||||
* executable to the jar on Windows. Although this is just another
|
||||
* form of statically linking a small piece of the JVM to the
|
||||
* application, we choose to continue to support it. Note that no
|
||||
* guarantees have been made (or should be made) to the customer that
|
||||
* this will continue to work.
|
||||
*
|
||||
* Therefore, calculate the base offset of the zip file (within the
|
||||
* expanded file) by assuming that the central directory is followed
|
||||
* immediately by the end record.
|
||||
*/
|
||||
base_offset = base_offset - ENDSIZ(p) - ENDOFF(p);
|
||||
|
||||
/*
|
||||
* The END Header indicates the start of the Central Directory
|
||||
* Headers. Remember that the desired Central Directory Header (CEN)
|
||||
* will almost always be the second one and the first one is a small
|
||||
* directory entry ("META-INF/"). Keep the code optimized for
|
||||
* that case.
|
||||
*
|
||||
* Begin by seeking to the beginning of the Central Directory and
|
||||
* reading in the first buffer full of bits.
|
||||
*/
|
||||
if (lseek(fd, base_offset + ENDOFF(p), SEEK_SET) < (off_t)0) {
|
||||
free(buffer);
|
||||
return (-1);
|
||||
}
|
||||
if ((bytes = read(fd, bp, MINREAD)) < 0) {
|
||||
free(buffer);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
p = bp;
|
||||
/*
|
||||
* Loop through the Central Directory Headers. Note that a valid zip/jar
|
||||
* must have an ENDHDR (with ENDSIG) after the Central Directory.
|
||||
@ -319,7 +394,7 @@ find_file(int fd, zentry *entry, const char *file_name)
|
||||
*/
|
||||
if ((size_t)CENNAM(p) == JLI_StrLen(file_name) &&
|
||||
memcmp((p + CENHDR), file_name, JLI_StrLen(file_name)) == 0) {
|
||||
if (lseek(fd, base_offset + CENOFF(p), SEEK_SET) < (off_t)0) {
|
||||
if (JLI_Lseek(fd, base_offset + CENOFF(p), SEEK_SET) < (jlong)0) {
|
||||
free(buffer);
|
||||
return (-1);
|
||||
}
|
||||
@ -487,6 +562,9 @@ JLI_ParseManifest(char *jarfile, manifest_info *info)
|
||||
char *splashscreen_name = NULL;
|
||||
|
||||
if ((fd = open(jarfile, O_RDONLY
|
||||
#ifdef O_LARGEFILE
|
||||
| O_LARGEFILE /* large file mode on solaris */
|
||||
#endif
|
||||
#ifdef O_BINARY
|
||||
| O_BINARY /* use binary mode on windows */
|
||||
#endif
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -28,6 +28,8 @@ import com.sun.beans.finder.MethodFinder;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import sun.reflect.misc.MethodUtil;
|
||||
|
||||
/**
|
||||
* This class is intended to handle <method> element.
|
||||
* It describes invocation of the method.
|
||||
@ -101,7 +103,7 @@ final class MethodElementHandler extends NewElementHandler {
|
||||
if (method.isVarArgs()) {
|
||||
args = getArguments(args, method.getParameterTypes());
|
||||
}
|
||||
Object value = method.invoke(bean, args);
|
||||
Object value = MethodUtil.invoke(method, bean, args);
|
||||
return method.getReturnType().equals(void.class)
|
||||
? ValueObjectImpl.VOID
|
||||
: ValueObjectImpl.create(value);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "boolean" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "byte" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
import java.awt.*;
|
||||
import java.beans.*;
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "double" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -22,7 +22,7 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Graphics;
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "float" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
import java.awt.*;
|
||||
import java.beans.*;
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "int" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "long" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Abstract Property editor for a java builtin number types.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
/**
|
||||
* Property editor for a java builtin "short" type.
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package sun.beans.editors;
|
||||
package com.sun.beans.editors;
|
||||
|
||||
import java.beans.*;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -42,6 +42,7 @@ public final class BeanInfoFinder
|
||||
extends InstanceFinder<BeanInfo> {
|
||||
|
||||
private static final String DEFAULT = "sun.beans.infos";
|
||||
private static final String DEFAULT_NEW = "com.sun.beans.infos";
|
||||
|
||||
public BeanInfoFinder() {
|
||||
super(BeanInfo.class, true, "BeanInfo", DEFAULT);
|
||||
@ -53,10 +54,13 @@ public final class BeanInfoFinder
|
||||
|
||||
@Override
|
||||
protected BeanInfo instantiate(Class<?> type, String prefix, String name) {
|
||||
if (DEFAULT.equals(prefix)) {
|
||||
prefix = DEFAULT_NEW;
|
||||
}
|
||||
// this optimization will only use the BeanInfo search path
|
||||
// if is has changed from the original
|
||||
// or trying to get the ComponentBeanInfo
|
||||
BeanInfo info = !DEFAULT.equals(prefix) || "ComponentBeanInfo".equals(name)
|
||||
BeanInfo info = !DEFAULT_NEW.equals(prefix) || "ComponentBeanInfo".equals(name)
|
||||
? super.instantiate(type, prefix, name)
|
||||
: null;
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,8 @@
|
||||
*/
|
||||
package com.sun.beans.finder;
|
||||
|
||||
import static sun.reflect.misc.ReflectUtil.checkPackageAccess;
|
||||
|
||||
/**
|
||||
* This is utility class that provides {@code static} methods
|
||||
* to find a class with the specified name using the specified class loader.
|
||||
@ -54,6 +56,7 @@ public final class ClassFinder {
|
||||
* @see Thread#getContextClassLoader()
|
||||
*/
|
||||
public static Class<?> findClass(String name) throws ClassNotFoundException {
|
||||
checkPackageAccess(name);
|
||||
try {
|
||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||
if (loader == null) {
|
||||
@ -94,6 +97,7 @@ public final class ClassFinder {
|
||||
* @see Class#forName(String,boolean,ClassLoader)
|
||||
*/
|
||||
public static Class<?> findClass(String name, ClassLoader loader) throws ClassNotFoundException {
|
||||
checkPackageAccess(name);
|
||||
if (loader != null) {
|
||||
try {
|
||||
return Class.forName(name, false, loader);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -29,6 +29,8 @@ import com.sun.beans.WeakCache;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
|
||||
|
||||
/**
|
||||
* This utility class provides {@code static} methods
|
||||
* to find a public constructor with specified parameter types
|
||||
@ -61,7 +63,7 @@ public final class ConstructorFinder extends AbstractFinder<Constructor<?>> {
|
||||
if (Modifier.isAbstract(type.getModifiers())) {
|
||||
throw new NoSuchMethodException("Abstract class cannot be instantiated");
|
||||
}
|
||||
if (!Modifier.isPublic(type.getModifiers())) {
|
||||
if (!Modifier.isPublic(type.getModifiers()) || !isPackageAccessible(type)) {
|
||||
throw new NoSuchMethodException("Class is not accessible");
|
||||
}
|
||||
PrimitiveWrapperMap.replacePrimitivesWithWrappers(args);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,6 +27,8 @@ package com.sun.beans.finder;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
|
||||
|
||||
/**
|
||||
* This utility class provides {@code static} methods
|
||||
* to find a public field with specified name
|
||||
@ -56,7 +58,8 @@ public final class FieldFinder {
|
||||
if (!Modifier.isPublic(field.getModifiers())) {
|
||||
throw new NoSuchFieldException("Field '" + name + "' is not public");
|
||||
}
|
||||
if (!Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
|
||||
type = field.getDeclaringClass();
|
||||
if (!Modifier.isPublic(type.getModifiers()) || !isPackageAccessible(type)) {
|
||||
throw new NoSuchFieldException("Field '" + name + "' is not accessible");
|
||||
}
|
||||
return field;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -33,6 +33,8 @@ import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
|
||||
|
||||
/**
|
||||
* This utility class provides {@code static} methods
|
||||
* to find a public method with specified name and parameter types
|
||||
@ -120,7 +122,7 @@ public final class MethodFinder extends AbstractFinder<Method> {
|
||||
*/
|
||||
public static Method findAccessibleMethod(Method method) throws NoSuchMethodException {
|
||||
Class<?> type = method.getDeclaringClass();
|
||||
if (Modifier.isPublic(type.getModifiers())) {
|
||||
if (Modifier.isPublic(type.getModifiers()) && isPackageAccessible(type)) {
|
||||
return method;
|
||||
}
|
||||
if (Modifier.isStatic(method.getModifiers())) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -28,14 +28,14 @@ import com.sun.beans.WeakCache;
|
||||
|
||||
import java.beans.PropertyEditor;
|
||||
|
||||
import sun.beans.editors.BooleanEditor;
|
||||
import sun.beans.editors.ByteEditor;
|
||||
import sun.beans.editors.DoubleEditor;
|
||||
import sun.beans.editors.EnumEditor;
|
||||
import sun.beans.editors.FloatEditor;
|
||||
import sun.beans.editors.IntegerEditor;
|
||||
import sun.beans.editors.LongEditor;
|
||||
import sun.beans.editors.ShortEditor;
|
||||
import com.sun.beans.editors.BooleanEditor;
|
||||
import com.sun.beans.editors.ByteEditor;
|
||||
import com.sun.beans.editors.DoubleEditor;
|
||||
import com.sun.beans.editors.EnumEditor;
|
||||
import com.sun.beans.editors.FloatEditor;
|
||||
import com.sun.beans.editors.IntegerEditor;
|
||||
import com.sun.beans.editors.LongEditor;
|
||||
import com.sun.beans.editors.ShortEditor;
|
||||
|
||||
/**
|
||||
* This is utility class that provides functionality
|
||||
@ -48,10 +48,13 @@ import sun.beans.editors.ShortEditor;
|
||||
public final class PropertyEditorFinder
|
||||
extends InstanceFinder<PropertyEditor> {
|
||||
|
||||
private static final String DEFAULT = "sun.beans.editors";
|
||||
private static final String DEFAULT_NEW = "com.sun.beans.editors";
|
||||
|
||||
private final WeakCache<Class<?>, Class<?>> registry;
|
||||
|
||||
public PropertyEditorFinder() {
|
||||
super(PropertyEditor.class, false, "Editor", "sun.beans.editors");
|
||||
super(PropertyEditor.class, false, "Editor", DEFAULT);
|
||||
|
||||
this.registry = new WeakCache<Class<?>, Class<?>>();
|
||||
this.registry.put(Byte.TYPE, ByteEditor.class);
|
||||
@ -84,4 +87,9 @@ public final class PropertyEditorFinder
|
||||
}
|
||||
return editor;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PropertyEditor instantiate(Class<?> type, String prefix, String name) {
|
||||
return super.instantiate(type, DEFAULT.equals(prefix) ? DEFAULT_NEW : prefix, name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.beans.infos;
|
||||
package com.sun.beans.infos;
|
||||
|
||||
import java.beans.*;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -47,18 +47,122 @@ import javax.crypto.BadPaddingException;
|
||||
* @see OutputFeedback
|
||||
*/
|
||||
|
||||
public final class AESCipher extends CipherSpi {
|
||||
abstract class AESCipher extends CipherSpi {
|
||||
public static final class General extends AESCipher {
|
||||
public General() {
|
||||
super(-1);
|
||||
}
|
||||
}
|
||||
abstract static class OidImpl extends AESCipher {
|
||||
protected OidImpl(int keySize, String mode, String padding) {
|
||||
super(keySize);
|
||||
try {
|
||||
engineSetMode(mode);
|
||||
engineSetPadding(padding);
|
||||
} catch (GeneralSecurityException gse) {
|
||||
// internal error; re-throw as provider exception
|
||||
ProviderException pe =new ProviderException("Internal Error");
|
||||
pe.initCause(gse);
|
||||
throw pe;
|
||||
}
|
||||
}
|
||||
}
|
||||
public static final class AES128_ECB_NoPadding extends OidImpl {
|
||||
public AES128_ECB_NoPadding() {
|
||||
super(16, "ECB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES192_ECB_NoPadding extends OidImpl {
|
||||
public AES192_ECB_NoPadding() {
|
||||
super(24, "ECB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES256_ECB_NoPadding extends OidImpl {
|
||||
public AES256_ECB_NoPadding() {
|
||||
super(32, "ECB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES128_CBC_NoPadding extends OidImpl {
|
||||
public AES128_CBC_NoPadding() {
|
||||
super(16, "CBC", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES192_CBC_NoPadding extends OidImpl {
|
||||
public AES192_CBC_NoPadding() {
|
||||
super(24, "CBC", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES256_CBC_NoPadding extends OidImpl {
|
||||
public AES256_CBC_NoPadding() {
|
||||
super(32, "CBC", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES128_OFB_NoPadding extends OidImpl {
|
||||
public AES128_OFB_NoPadding() {
|
||||
super(16, "OFB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES192_OFB_NoPadding extends OidImpl {
|
||||
public AES192_OFB_NoPadding() {
|
||||
super(24, "OFB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES256_OFB_NoPadding extends OidImpl {
|
||||
public AES256_OFB_NoPadding() {
|
||||
super(32, "OFB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES128_CFB_NoPadding extends OidImpl {
|
||||
public AES128_CFB_NoPadding() {
|
||||
super(16, "CFB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES192_CFB_NoPadding extends OidImpl {
|
||||
public AES192_CFB_NoPadding() {
|
||||
super(24, "CFB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
public static final class AES256_CFB_NoPadding extends OidImpl {
|
||||
public AES256_CFB_NoPadding() {
|
||||
super(32, "CFB", "NOPADDING");
|
||||
}
|
||||
}
|
||||
|
||||
// utility method used by AESCipher and AESWrapCipher
|
||||
static final void checkKeySize(Key key, int fixedKeySize)
|
||||
throws InvalidKeyException {
|
||||
if (fixedKeySize != -1) {
|
||||
if (key == null) {
|
||||
throw new InvalidKeyException("The key must not be null");
|
||||
}
|
||||
byte[] value = key.getEncoded();
|
||||
if (value == null) {
|
||||
throw new InvalidKeyException("Key encoding must not be null");
|
||||
} else if (value.length != fixedKeySize) {
|
||||
throw new InvalidKeyException("The key must be " +
|
||||
fixedKeySize*8 + " bits");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* internal CipherCore object which does the real work.
|
||||
*/
|
||||
private CipherCore core = null;
|
||||
|
||||
/*
|
||||
* needed to support AES oids which associates a fixed key size
|
||||
* to the cipher object.
|
||||
*/
|
||||
private final int fixedKeySize; // in bytes, -1 if no restriction
|
||||
|
||||
/**
|
||||
* Creates an instance of AES cipher with default ECB mode and
|
||||
* PKCS5Padding.
|
||||
*/
|
||||
public AESCipher() {
|
||||
protected AESCipher(int keySize) {
|
||||
core = new CipherCore(new AESCrypt(), AESConstants.AES_BLOCK_SIZE);
|
||||
fixedKeySize = keySize;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -183,6 +287,7 @@ public final class AESCipher extends CipherSpi {
|
||||
*/
|
||||
protected void engineInit(int opmode, Key key, SecureRandom random)
|
||||
throws InvalidKeyException {
|
||||
checkKeySize(key, fixedKeySize);
|
||||
core.init(opmode, key, random);
|
||||
}
|
||||
|
||||
@ -214,6 +319,7 @@ public final class AESCipher extends CipherSpi {
|
||||
AlgorithmParameterSpec params,
|
||||
SecureRandom random)
|
||||
throws InvalidKeyException, InvalidAlgorithmParameterException {
|
||||
checkKeySize(key, fixedKeySize);
|
||||
core.init(opmode, key, params, random);
|
||||
}
|
||||
|
||||
@ -221,6 +327,7 @@ public final class AESCipher extends CipherSpi {
|
||||
AlgorithmParameters params,
|
||||
SecureRandom random)
|
||||
throws InvalidKeyException, InvalidAlgorithmParameterException {
|
||||
checkKeySize(key, fixedKeySize);
|
||||
core.init(opmode, key, params, random);
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -43,8 +43,27 @@ import javax.crypto.spec.*;
|
||||
*
|
||||
* @see AESCipher
|
||||
*/
|
||||
public final class AESWrapCipher extends CipherSpi {
|
||||
|
||||
abstract class AESWrapCipher extends CipherSpi {
|
||||
public static final class General extends AESWrapCipher {
|
||||
public General() {
|
||||
super(-1);
|
||||
}
|
||||
}
|
||||
public static final class AES128 extends AESWrapCipher {
|
||||
public AES128() {
|
||||
super(16);
|
||||
}
|
||||
}
|
||||
public static final class AES192 extends AESWrapCipher {
|
||||
public AES192() {
|
||||
super(24);
|
||||
}
|
||||
}
|
||||
public static final class AES256 extends AESWrapCipher {
|
||||
public AES256() {
|
||||
super(32);
|
||||
}
|
||||
}
|
||||
private static final byte[] IV = {
|
||||
(byte) 0xA6, (byte) 0xA6, (byte) 0xA6, (byte) 0xA6,
|
||||
(byte) 0xA6, (byte) 0xA6, (byte) 0xA6, (byte) 0xA6
|
||||
@ -62,12 +81,20 @@ public final class AESWrapCipher extends CipherSpi {
|
||||
*/
|
||||
private boolean decrypting = false;
|
||||
|
||||
/*
|
||||
* needed to support AES oids which associates a fixed key size
|
||||
* to the cipher object.
|
||||
*/
|
||||
private final int fixedKeySize; // in bytes, -1 if no restriction
|
||||
|
||||
/**
|
||||
* Creates an instance of AES KeyWrap cipher with default
|
||||
* mode, i.e. "ECB" and padding scheme, i.e. "NoPadding".
|
||||
*/
|
||||
public AESWrapCipher() {
|
||||
public AESWrapCipher(int keySize) {
|
||||
cipher = new AESCrypt();
|
||||
fixedKeySize = keySize;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -170,6 +197,7 @@ public final class AESWrapCipher extends CipherSpi {
|
||||
throw new UnsupportedOperationException("This cipher can " +
|
||||
"only be used for key wrapping and unwrapping");
|
||||
}
|
||||
AESCipher.checkKeySize(key, fixedKeySize);
|
||||
cipher.init(decrypting, key.getAlgorithm(), key.getEncoded());
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -80,10 +80,10 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
* @param random the source of randomness
|
||||
*/
|
||||
public void initialize(int keysize, SecureRandom random) {
|
||||
if ((keysize < 512) || (keysize > 1024) || (keysize % 64 != 0)) {
|
||||
if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
|
||||
throw new InvalidParameterException("Keysize must be multiple "
|
||||
+ "of 64, and can only range "
|
||||
+ "from 512 to 1024 "
|
||||
+ "from 512 to 2048 "
|
||||
+ "(inclusive)");
|
||||
}
|
||||
this.pSize = keysize;
|
||||
@ -115,11 +115,11 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
|
||||
params = (DHParameterSpec)algParams;
|
||||
pSize = params.getP().bitLength();
|
||||
if ((pSize < 512) || (pSize > 1024) ||
|
||||
if ((pSize < 512) || (pSize > 2048) ||
|
||||
(pSize % 64 != 0)) {
|
||||
throw new InvalidAlgorithmParameterException
|
||||
("Prime size must be multiple of 64, and can only range "
|
||||
+ "from 512 to 1024 (inclusive)");
|
||||
+ "from 512 to 2048 (inclusive)");
|
||||
}
|
||||
|
||||
// exponent size is optional, could be 0
|
||||
@ -156,10 +156,11 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
BigInteger g = params.getG();
|
||||
|
||||
if (lSize <= 0) {
|
||||
lSize = pSize >> 1;
|
||||
// use an exponent size of (pSize / 2) but at least 384 bits
|
||||
lSize = Math.max(384, pSize >> 1);
|
||||
// if lSize is larger than pSize, limit by pSize
|
||||
lSize = Math.min(lSize, pSize);
|
||||
if (lSize < 384) {
|
||||
lSize = 384;
|
||||
}
|
||||
}
|
||||
|
||||
BigInteger x;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -67,10 +67,10 @@ extends AlgorithmParameterGeneratorSpi {
|
||||
* @param random the source of randomness
|
||||
*/
|
||||
protected void engineInit(int keysize, SecureRandom random) {
|
||||
if ((keysize < 512) || (keysize > 1024) || (keysize % 64 != 0)) {
|
||||
if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
|
||||
throw new InvalidParameterException("Keysize must be multiple "
|
||||
+ "of 64, and can only range "
|
||||
+ "from 512 to 1024 "
|
||||
+ "from 512 to 2048 "
|
||||
+ "(inclusive)");
|
||||
}
|
||||
this.primeSize = keysize;
|
||||
@ -99,10 +99,10 @@ extends AlgorithmParameterGeneratorSpi {
|
||||
DHGenParameterSpec dhParamSpec = (DHGenParameterSpec)genParamSpec;
|
||||
|
||||
primeSize = dhParamSpec.getPrimeSize();
|
||||
if ((primeSize<512) || (primeSize>1024) || (primeSize%64 != 0)) {
|
||||
if ((primeSize<512) || (primeSize>2048) || (primeSize%64 != 0)) {
|
||||
throw new InvalidAlgorithmParameterException
|
||||
("Modulus size must be multiple of 64, and can only range "
|
||||
+ "from 512 to 1024 (inclusive)");
|
||||
+ "from 512 to 2048 (inclusive)");
|
||||
}
|
||||
|
||||
exponentSize = dhParamSpec.getExponentSize();
|
||||
|
||||
@ -167,17 +167,67 @@ public final class SunJCE extends Provider {
|
||||
put("Cipher.Blowfish SupportedPaddings", BLOCK_PADS);
|
||||
put("Cipher.Blowfish SupportedKeyFormats", "RAW");
|
||||
|
||||
put("Cipher.AES", "com.sun.crypto.provider.AESCipher");
|
||||
put("Cipher.AES", "com.sun.crypto.provider.AESCipher$General");
|
||||
put("Alg.Alias.Cipher.Rijndael", "AES");
|
||||
put("Cipher.AES SupportedModes", BLOCK_MODES128);
|
||||
put("Cipher.AES SupportedPaddings", BLOCK_PADS);
|
||||
put("Cipher.AES SupportedKeyFormats", "RAW");
|
||||
|
||||
put("Cipher.AESWrap", "com.sun.crypto.provider.AESWrapCipher");
|
||||
put("Cipher.AES_128/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_ECB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.1", "AES_128/ECB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.1", "AES_128/ECB/NoPadding");
|
||||
put("Cipher.AES_128/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_CBC_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.2", "AES_128/CBC/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.2", "AES_128/CBC/NoPadding");
|
||||
put("Cipher.AES_128/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_OFB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.3", "AES_128/OFB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.3", "AES_128/OFB/NoPadding");
|
||||
put("Cipher.AES_128/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_CFB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.4", "AES_128/CFB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.4", "AES_128/CFB/NoPadding");
|
||||
|
||||
put("Cipher.AES_192/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_ECB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.21", "AES_192/ECB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.21", "AES_192/ECB/NoPadding");
|
||||
put("Cipher.AES_192/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_CBC_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.22", "AES_192/CBC/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.22", "AES_192/CBC/NoPadding");
|
||||
put("Cipher.AES_192/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_OFB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.23", "AES_192/OFB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.23", "AES_192/OFB/NoPadding");
|
||||
put("Cipher.AES_192/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_CFB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.24", "AES_192/CFB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.24", "AES_192/CFB/NoPadding");
|
||||
|
||||
|
||||
put("Cipher.AES_256/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_ECB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.41", "AES_256/ECB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.41", "AES_256/ECB/NoPadding");
|
||||
put("Cipher.AES_256/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_CBC_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.42", "AES_256/CBC/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.42", "AES_256/CBC/NoPadding");
|
||||
put("Cipher.AES_256/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_OFB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.43", "AES_256/OFB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.43", "AES_256/OFB/NoPadding");
|
||||
put("Cipher.AES_256/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_CFB_NoPadding");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.44", "AES_256/CFB/NoPadding");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.44", "AES_256/CFB/NoPadding");
|
||||
|
||||
put("Cipher.AESWrap", "com.sun.crypto.provider.AESWrapCipher$General");
|
||||
put("Cipher.AESWrap SupportedModes", "ECB");
|
||||
put("Cipher.AESWrap SupportedPaddings", "NOPADDING");
|
||||
put("Cipher.AESWrap SupportedKeyFormats", "RAW");
|
||||
|
||||
put("Cipher.AESWrap_128", "com.sun.crypto.provider.AESWrapCipher$AES128");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.5", "AESWrap_128");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.5", "AESWrap_128");
|
||||
put("Cipher.AESWrap_192", "com.sun.crypto.provider.AESWrapCipher$AES192");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.25", "AESWrap_192");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.25", "AESWrap_192");
|
||||
put("Cipher.AESWrap_256", "com.sun.crypto.provider.AESWrapCipher$AES256");
|
||||
put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.45", "AESWrap_256");
|
||||
put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.45", "AESWrap_256");
|
||||
|
||||
put("Cipher.RC2",
|
||||
"com.sun.crypto.provider.RC2Cipher");
|
||||
put("Cipher.RC2 SupportedModes", BLOCK_MODES);
|
||||
@ -192,7 +242,7 @@ public final class SunJCE extends Provider {
|
||||
put("Cipher.ARCFOUR SupportedKeyFormats", "RAW");
|
||||
|
||||
/*
|
||||
* Key(pair) Generator engines
|
||||
* Key(pair) Generator engines
|
||||
*/
|
||||
put("KeyGenerator.DES",
|
||||
"com.sun.crypto.provider.DESKeyGenerator");
|
||||
@ -221,6 +271,8 @@ public final class SunJCE extends Provider {
|
||||
|
||||
put("KeyGenerator.HmacSHA1",
|
||||
"com.sun.crypto.provider.HmacSHA1KeyGenerator");
|
||||
put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.7", "HmacSHA1");
|
||||
put("Alg.Alias.KeyGenerator.1.2.840.113549.2.7", "HmacSHA1");
|
||||
|
||||
put("KeyGenerator.HmacSHA224",
|
||||
"com.sun.crypto.provider.KeyGeneratorCore$HmacSHA2KG$SHA224");
|
||||
@ -326,14 +378,12 @@ public final class SunJCE extends Provider {
|
||||
"com.sun.crypto.provider.AESParameters");
|
||||
put("Alg.Alias.AlgorithmParameters.Rijndael", "AES");
|
||||
|
||||
|
||||
put("AlgorithmParameters.RC2",
|
||||
"com.sun.crypto.provider.RC2Parameters");
|
||||
|
||||
put("AlgorithmParameters.OAEP",
|
||||
"com.sun.crypto.provider.OAEPParameters");
|
||||
|
||||
|
||||
/*
|
||||
* Key factories
|
||||
*/
|
||||
@ -403,6 +453,8 @@ public final class SunJCE extends Provider {
|
||||
*/
|
||||
put("Mac.HmacMD5", "com.sun.crypto.provider.HmacMD5");
|
||||
put("Mac.HmacSHA1", "com.sun.crypto.provider.HmacSHA1");
|
||||
put("Alg.Alias.Mac.OID.1.2.840.113549.2.7", "HmacSHA1");
|
||||
put("Alg.Alias.Mac.1.2.840.113549.2.7", "HmacSHA1");
|
||||
put("Mac.HmacSHA224",
|
||||
"com.sun.crypto.provider.HmacCore$HmacSHA224");
|
||||
put("Alg.Alias.Mac.OID.1.2.840.113549.2.8", "HmacSHA224");
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,7 +31,6 @@ import javax.naming.*;
|
||||
import java.io.*;
|
||||
import java.math.*;
|
||||
import java.util.*;
|
||||
import java.beans.*;
|
||||
|
||||
import javax.sql.rowset.*;
|
||||
|
||||
@ -83,12 +82,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
*/
|
||||
private ResultSetMetaData resMD;
|
||||
|
||||
/**
|
||||
* The property that helps to fire the property changed event when certain
|
||||
* properties are changed in the <code>JdbcRowSet</code> object. This property
|
||||
* is being added to satisfy Rave requirements.
|
||||
*/
|
||||
private PropertyChangeSupport propertyChangeSupport;
|
||||
|
||||
/**
|
||||
* The Vector holding the Match Columns
|
||||
@ -145,7 +138,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
throw new RuntimeException(ioe);
|
||||
}
|
||||
|
||||
propertyChangeSupport = new PropertyChangeSupport(this);
|
||||
|
||||
initParams();
|
||||
|
||||
@ -268,7 +260,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
throw new RuntimeException(ioe);
|
||||
}
|
||||
|
||||
propertyChangeSupport = new PropertyChangeSupport(this);
|
||||
|
||||
initParams();
|
||||
// set the defaults
|
||||
@ -343,7 +334,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
throw new RuntimeException(ioe);
|
||||
}
|
||||
|
||||
propertyChangeSupport = new PropertyChangeSupport(this);
|
||||
|
||||
initParams();
|
||||
|
||||
@ -360,10 +350,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
setMaxRows(0);
|
||||
setMaxFieldSize(0);
|
||||
|
||||
// to ensure connection to a db call connect now
|
||||
// and associate a conn with "this" object
|
||||
// in this case.
|
||||
conn = connect();
|
||||
setParams();
|
||||
|
||||
setReadOnly(true);
|
||||
@ -435,7 +421,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
throw new RuntimeException(ioe);
|
||||
}
|
||||
|
||||
propertyChangeSupport = new PropertyChangeSupport(this);
|
||||
|
||||
initParams();
|
||||
|
||||
@ -620,12 +605,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
|
||||
}
|
||||
|
||||
// An alternate solution is required instead of having the
|
||||
// connect method as protected.
|
||||
// This is a work around to assist Rave Team
|
||||
// :ah
|
||||
|
||||
protected Connection connect() throws SQLException {
|
||||
private Connection connect() throws SQLException {
|
||||
|
||||
// Get a JDBC connection.
|
||||
|
||||
@ -4056,9 +4036,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
// Added as per Rave requirements
|
||||
|
||||
if( conn.getHoldability() != HOLD_CURSORS_OVER_COMMIT) {
|
||||
ResultSet oldVal = rs;
|
||||
rs = null;
|
||||
// propertyChangeSupport.firePropertyChange("ResultSet",oldVal,rs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4119,9 +4097,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
// Makes the result ste handle null after rollback
|
||||
// Added as per Rave requirements
|
||||
|
||||
ResultSet oldVal = rs;
|
||||
rs = null;
|
||||
// propertyChangeSupport.firePropertyChange("ResultSet", oldVal,rs);
|
||||
}
|
||||
|
||||
|
||||
@ -4247,12 +4223,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
rs = resultSet;
|
||||
}
|
||||
|
||||
|
||||
// Over riding the setCommand from BaseRowSet for
|
||||
// firing the propertyChangeSupport Event for
|
||||
// Rave requirements when this property's value
|
||||
// changes.
|
||||
|
||||
/**
|
||||
* Sets this <code>JdbcRowSet</code> object's <code>command</code> property to
|
||||
* the given <code>String</code> object and clears the parameters, if any,
|
||||
@ -4277,28 +4247,19 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
* @see #getCommand
|
||||
*/
|
||||
public void setCommand(String command) throws SQLException {
|
||||
String oldVal;
|
||||
|
||||
if (getCommand() != null) {
|
||||
if(!getCommand().equals(command)) {
|
||||
oldVal = getCommand();
|
||||
super.setCommand(command);
|
||||
ps = null;
|
||||
rs = null;
|
||||
propertyChangeSupport.firePropertyChange("command", oldVal,command);
|
||||
}
|
||||
}
|
||||
else {
|
||||
super.setCommand(command);
|
||||
propertyChangeSupport.firePropertyChange("command", null,command);
|
||||
}
|
||||
}
|
||||
|
||||
// Over riding the setDataSourceName from BaseRowSet for
|
||||
// firing the propertyChangeSupport Event for
|
||||
// Rave requirements when this property's values
|
||||
// changes.
|
||||
|
||||
/**
|
||||
* Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code>
|
||||
* object to the given logical name and sets this <code>JdbcRowSet</code> object's
|
||||
@ -4329,28 +4290,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
* @see #getDataSourceName
|
||||
*/
|
||||
public void setDataSourceName(String dsName) throws SQLException{
|
||||
String oldVal;
|
||||
|
||||
if(getDataSourceName() != null) {
|
||||
if(!getDataSourceName().equals(dsName)) {
|
||||
oldVal = getDataSourceName();
|
||||
super.setDataSourceName(dsName);
|
||||
conn = null;
|
||||
ps = null;
|
||||
rs = null;
|
||||
propertyChangeSupport.firePropertyChange("dataSourceName",oldVal,dsName);
|
||||
}
|
||||
}
|
||||
else {
|
||||
super.setDataSourceName(dsName);
|
||||
propertyChangeSupport.firePropertyChange("dataSourceName",null,dsName);
|
||||
}
|
||||
}
|
||||
|
||||
// Over riding the setUrl from BaseRowSet for
|
||||
// firing the propertyChangeSupport Event for
|
||||
// Rave requirements when this property's values
|
||||
// changes.
|
||||
|
||||
/**
|
||||
* Sets the Url property for this <code>JdbcRowSet</code> object
|
||||
@ -4394,29 +4347,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
*/
|
||||
|
||||
public void setUrl(String url) throws SQLException {
|
||||
String oldVal;
|
||||
|
||||
if(getUrl() != null) {
|
||||
if(!getUrl().equals(url)) {
|
||||
oldVal = getUrl();
|
||||
super.setUrl(url);
|
||||
conn = null;
|
||||
ps = null;
|
||||
rs = null;
|
||||
propertyChangeSupport.firePropertyChange("url", oldVal, url);
|
||||
}
|
||||
}
|
||||
else {
|
||||
super.setUrl(url);
|
||||
propertyChangeSupport.firePropertyChange("url", null, url);
|
||||
}
|
||||
}
|
||||
|
||||
// Over riding the setUsername from BaseRowSet for
|
||||
// firing the propertyChangeSupport Event for
|
||||
// Rave requirements when this property's values
|
||||
// changes.
|
||||
|
||||
/**
|
||||
* Sets the username property for this <code>JdbcRowSet</code> object
|
||||
* to the given user name. Because it
|
||||
@ -4438,29 +4382,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
* @see #getUsername
|
||||
*/
|
||||
public void setUsername(String uname) {
|
||||
String oldVal;
|
||||
|
||||
if( getUsername() != null) {
|
||||
if(!getUsername().equals(uname)) {
|
||||
oldVal = getUsername();
|
||||
super.setUsername(uname);
|
||||
conn = null;
|
||||
ps = null;
|
||||
rs = null;
|
||||
propertyChangeSupport.firePropertyChange("username",oldVal,uname);
|
||||
}
|
||||
}
|
||||
else{
|
||||
super.setUsername(uname);
|
||||
propertyChangeSupport.firePropertyChange("username",null,uname);
|
||||
}
|
||||
}
|
||||
|
||||
// Over riding the setPassword from BaseRowSet for
|
||||
// firing the propertyChangeSupport Event for
|
||||
// Rave requirements when this property's values
|
||||
// changes.
|
||||
|
||||
/**
|
||||
* Sets the password property for this <code>JdbcRowSet</code> object
|
||||
* to the given <code>String</code> object. Because it
|
||||
@ -4481,21 +4416,17 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
* that must be supplied to the database to create a connection
|
||||
*/
|
||||
public void setPassword(String password) {
|
||||
String oldVal;
|
||||
|
||||
if ( getPassword() != null) {
|
||||
if(!getPassword().equals(password)) {
|
||||
oldVal = getPassword();
|
||||
super.setPassword(password);
|
||||
conn = null;
|
||||
ps = null;
|
||||
rs = null;
|
||||
propertyChangeSupport.firePropertyChange("password",oldVal,password);
|
||||
}
|
||||
}
|
||||
else{
|
||||
super.setPassword(password);
|
||||
propertyChangeSupport.firePropertyChange("password",null,password);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4528,7 +4459,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
|
||||
if(oldVal != type) {
|
||||
super.setType(type);
|
||||
propertyChangeSupport.firePropertyChange("type",oldVal,type);
|
||||
}
|
||||
|
||||
}
|
||||
@ -4561,78 +4491,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
|
||||
|
||||
if(oldVal != concur) {
|
||||
super.setConcurrency(concur);
|
||||
propertyChangeSupport.firePropertyChange("concurrency",oldVal,concur);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the transaction isolation property for this JDBC <code>RowSet</code> object to the given
|
||||
* constant. The DBMS will use this transaction isolation level for
|
||||
* transactions if it can.
|
||||
* <p>
|
||||
* For <code>RowSet</code> implementations such as
|
||||
* the <code>CachedRowSet</code> that operate in a disconnected environment,
|
||||
* the <code>SyncProvider</code> object being used
|
||||
* offers complementary locking and data integrity options. The
|
||||
* options described below are pertinent only to connected <code>RowSet</code>
|
||||
* objects (<code>JdbcRowSet</code> objects).
|
||||
*
|
||||
* @param transIso one of the following constants, listed in ascending order:
|
||||
* <code>Connection.TRANSACTION_NONE</code>,
|
||||
* <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
|
||||
* <code>Connection.TRANSACTION_READ_COMMITTED</code>,
|
||||
* <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or
|
||||
* <code>Connection.TRANSACTION_SERIALIZABLE</code>
|
||||
* @throws SQLException if the given parameter is not one of the Connection
|
||||
* constants
|
||||
* @see javax.sql.rowset.spi.SyncFactory
|
||||
* @see javax.sql.rowset.spi.SyncProvider
|
||||
* @see #getTransactionIsolation
|
||||
*/
|
||||
public void setTransactionIsolation(int transIso) throws SQLException {
|
||||
|
||||
int oldVal;
|
||||
|
||||
try {
|
||||
oldVal = getTransactionIsolation();
|
||||
}catch(NullPointerException ex) {
|
||||
oldVal = 0;
|
||||
}
|
||||
|
||||
if(oldVal != transIso) {
|
||||
super.setTransactionIsolation(transIso);
|
||||
propertyChangeSupport.firePropertyChange("transactionIsolation",oldVal,transIso);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the maximum number of rows that this <code>RowSet</code> object may contain to
|
||||
* the given number. If this limit is exceeded, the excess rows are
|
||||
* silently dropped.
|
||||
*
|
||||
* @param mRows an <code>int</code> indicating the current maximum number
|
||||
* of rows; zero means that there is no limit
|
||||
* @throws SQLException if an error occurs internally setting the
|
||||
* maximum limit on the number of rows that a JDBC <code>RowSet</code> object
|
||||
* can contain; or if <i>max</i> is less than <code>0</code>; or
|
||||
* if <i>max</i> is less than the <code>fetchSize</code> of the
|
||||
* <code>RowSet</code>
|
||||
*/
|
||||
public void setMaxRows(int mRows) throws SQLException {
|
||||
|
||||
int oldVal;
|
||||
|
||||
try {
|
||||
oldVal = getMaxRows();
|
||||
}catch(NullPointerException ex) {
|
||||
oldVal = 0;
|
||||
}
|
||||
|
||||
if(oldVal != mRows) {
|
||||
super.setMaxRows(mRows);
|
||||
propertyChangeSupport.firePropertyChange("maxRows",oldVal,mRows);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -35,8 +35,6 @@ import sun.util.logging.PlatformLogger;
|
||||
|
||||
import java.security.AccessControlContext;
|
||||
import java.security.AccessController;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* The root event class for all AWT events.
|
||||
@ -262,9 +260,11 @@ public abstract class AWTEvent extends EventObject {
|
||||
public void setPosted(AWTEvent ev) {
|
||||
ev.isPosted = true;
|
||||
}
|
||||
|
||||
public void setSystemGenerated(AWTEvent ev) {
|
||||
ev.isSystemGenerated = true;
|
||||
}
|
||||
|
||||
public boolean isSystemGenerated(AWTEvent ev) {
|
||||
return ev.isSystemGenerated;
|
||||
}
|
||||
@ -272,6 +272,15 @@ public abstract class AWTEvent extends EventObject {
|
||||
public AccessControlContext getAccessControlContext(AWTEvent ev) {
|
||||
return ev.getAccessControlContext();
|
||||
}
|
||||
|
||||
public byte[] getBData(AWTEvent ev) {
|
||||
return ev.bdata;
|
||||
}
|
||||
|
||||
public void setBData(AWTEvent ev, byte[] bdata) {
|
||||
ev.bdata = bdata;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +31,7 @@ import java.io.ObjectOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.IOException;
|
||||
import javax.accessibility.*;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
|
||||
/**
|
||||
@ -68,6 +69,13 @@ public class CheckboxMenuItem extends MenuItem implements ItemSelectable, Access
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
|
||||
AWTAccessor.setCheckboxMenuItemAccessor(
|
||||
new AWTAccessor.CheckboxMenuItemAccessor() {
|
||||
public boolean getState(CheckboxMenuItem cmi) {
|
||||
return cmi.state;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -150,7 +150,7 @@ import sun.util.logging.PlatformLogger;
|
||||
* import java.awt.event.*;
|
||||
* import java.io.Serializable;
|
||||
*
|
||||
* class MyApp java.io.Serializable
|
||||
* class MyApp implements java.io.Serializable
|
||||
* {
|
||||
* BigObjectThatShouldNotBeSerializedWithAButton bigOne;
|
||||
* Button aButton = new Button();
|
||||
|
||||
@ -24,10 +24,6 @@
|
||||
*/
|
||||
package java.awt;
|
||||
|
||||
import java.awt.AWTException;
|
||||
import java.awt.Point;
|
||||
import java.awt.Toolkit;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
@ -39,6 +35,7 @@ import java.util.StringTokenizer;
|
||||
import java.security.AccessController;
|
||||
|
||||
import sun.util.logging.PlatformLogger;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
/**
|
||||
* A class to encapsulate the bitmap representation of the mouse cursor.
|
||||
@ -199,6 +196,21 @@ public class Cursor implements java.io.Serializable {
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
|
||||
AWTAccessor.setCursorAccessor(
|
||||
new AWTAccessor.CursorAccessor() {
|
||||
public long getPData(Cursor cursor) {
|
||||
return cursor.pData;
|
||||
}
|
||||
|
||||
public void setPData(Cursor cursor, long pData) {
|
||||
cursor.pData = pData;
|
||||
}
|
||||
|
||||
public int getType(Cursor cursor) {
|
||||
return cursor.type;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -39,6 +39,7 @@ import sun.util.logging.PlatformLogger;
|
||||
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
import sun.awt.CausedFocusEvent;
|
||||
|
||||
/**
|
||||
@ -75,6 +76,15 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager {
|
||||
typeAheadMarkers = new LinkedList();
|
||||
private boolean consumeNextKeyTyped;
|
||||
|
||||
static {
|
||||
AWTAccessor.setDefaultKeyboardFocusManagerAccessor(
|
||||
new AWTAccessor.DefaultKeyboardFocusManagerAccessor() {
|
||||
public void consumeNextKeyTyped(DefaultKeyboardFocusManager dkfm, KeyEvent e) {
|
||||
dkfm.consumeNextKeyTyped(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static class TypeAheadMarker {
|
||||
long after;
|
||||
Component untilFocused;
|
||||
|
||||
@ -36,6 +36,8 @@ import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
import java.util.EmptyStackException;
|
||||
|
||||
import sun.awt.dnd.SunDropTargetEvent;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
import sun.awt.AppContext;
|
||||
@ -50,7 +52,6 @@ import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import java.security.AccessControlContext;
|
||||
import java.security.ProtectionDomain;
|
||||
|
||||
import sun.misc.SharedSecrets;
|
||||
import sun.misc.JavaSecurityAccess;
|
||||
@ -186,6 +187,17 @@ public class EventQueue {
|
||||
public boolean isDispatchThreadImpl(EventQueue eventQueue) {
|
||||
return eventQueue.isDispatchThreadImpl();
|
||||
}
|
||||
public void removeSourceEvents(EventQueue eventQueue,
|
||||
Object source,
|
||||
boolean removeAllEvents) {
|
||||
eventQueue.removeSourceEvents(source, removeAllEvents);
|
||||
}
|
||||
public boolean noEvents(EventQueue eventQueue) {
|
||||
return eventQueue.noEvents();
|
||||
}
|
||||
public void wakeup(EventQueue eventQueue, boolean isShutdown) {
|
||||
eventQueue.wakeup(isShutdown);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -464,7 +476,9 @@ public class EventQueue {
|
||||
case MouseEvent.MOUSE_MOVED:
|
||||
return MOVE;
|
||||
case MouseEvent.MOUSE_DRAGGED:
|
||||
return DRAG;
|
||||
// Return -1 for SunDropTargetEvent since they are usually synchronous
|
||||
// and we don't want to skip them by coalescing with MouseEvent or other drag events
|
||||
return e instanceof SunDropTargetEvent ? -1 : DRAG;
|
||||
default:
|
||||
return e instanceof PeerEvent ? PEER : -1;
|
||||
}
|
||||
|
||||
@ -56,7 +56,6 @@ import java.util.WeakHashMap;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.HeadlessToolkit;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.CausedFocusEvent;
|
||||
import sun.awt.KeyboardFocusManagerPeerProvider;
|
||||
@ -148,6 +147,9 @@ public abstract class KeyboardFocusManager
|
||||
public KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext ctx) {
|
||||
return KeyboardFocusManager.getCurrentKeyboardFocusManager(ctx);
|
||||
}
|
||||
public Container getCurrentFocusCycleRoot() {
|
||||
return KeyboardFocusManager.currentFocusCycleRoot;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@ -31,6 +31,7 @@ import java.util.Enumeration;
|
||||
import java.awt.peer.MenuPeer;
|
||||
import java.awt.event.KeyEvent;
|
||||
import javax.accessibility.*;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
/**
|
||||
* A <code>Menu</code> object is a pull-down menu component
|
||||
@ -62,6 +63,13 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
|
||||
AWTAccessor.setMenuAccessor(
|
||||
new AWTAccessor.MenuAccessor() {
|
||||
public Vector getItems(Menu menu) {
|
||||
return menu.items;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -28,6 +28,7 @@ import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
import sun.awt.AWTAccessor;
|
||||
import java.awt.peer.MenuBarPeer;
|
||||
import java.awt.event.KeyEvent;
|
||||
import javax.accessibility.*;
|
||||
@ -74,6 +75,16 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
AWTAccessor.setMenuBarAccessor(
|
||||
new AWTAccessor.MenuBarAccessor() {
|
||||
public Menu getHelpMenu(MenuBar menuBar) {
|
||||
return menuBar.helpMenu;
|
||||
}
|
||||
|
||||
public Vector getMenus(MenuBar menuBar) {
|
||||
return menuBar.menus;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -29,7 +29,6 @@ import java.awt.event.ActionEvent;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
import javax.accessibility.*;
|
||||
|
||||
@ -143,6 +142,9 @@ public abstract class MenuComponent implements java.io.Serializable {
|
||||
public MenuContainer getParent(MenuComponent menuComp) {
|
||||
return menuComp.parent;
|
||||
}
|
||||
public Font getFont_NoClientCode(MenuComponent menuComp) {
|
||||
return menuComp.getFont_NoClientCode();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -31,7 +31,7 @@ import java.io.ObjectOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.IOException;
|
||||
import javax.accessibility.*;
|
||||
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
/**
|
||||
* All items in a menu must belong to the class
|
||||
@ -76,6 +76,29 @@ public class MenuItem extends MenuComponent implements Accessible {
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
|
||||
AWTAccessor.setMenuItemAccessor(
|
||||
new AWTAccessor.MenuItemAccessor() {
|
||||
public boolean isEnabled(MenuItem item) {
|
||||
return item.enabled;
|
||||
}
|
||||
|
||||
public String getLabel(MenuItem item) {
|
||||
return item.label;
|
||||
}
|
||||
|
||||
public MenuShortcut getShortcut(MenuItem item) {
|
||||
return item.shortcut;
|
||||
}
|
||||
|
||||
public String getActionCommandImpl(MenuItem item) {
|
||||
return item.getActionCommandImpl();
|
||||
}
|
||||
|
||||
public boolean isItemEnabled(MenuItem item) {
|
||||
return item.isItemEnabled();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -33,6 +33,7 @@ import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.HeadlessToolkit;
|
||||
import sun.security.util.SecurityConstants;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
/**
|
||||
* The <code>SystemTray</code> class represents the system tray for a
|
||||
@ -127,6 +128,18 @@ public class SystemTray {
|
||||
|
||||
private static final TrayIcon[] EMPTY_TRAY_ARRAY = new TrayIcon[0];
|
||||
|
||||
static {
|
||||
AWTAccessor.setSystemTrayAccessor(
|
||||
new AWTAccessor.SystemTrayAccessor() {
|
||||
public void firePropertyChange(SystemTray tray,
|
||||
String propertyName,
|
||||
Object oldValue,
|
||||
Object newValue) {
|
||||
tray.firePropertyChange(propertyName, oldValue, newValue);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Private <code>SystemTray</code> constructor.
|
||||
*
|
||||
|
||||
@ -25,19 +25,11 @@
|
||||
|
||||
package java.awt;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.event.*;
|
||||
import java.awt.AWTEvent;
|
||||
import java.awt.AWTEventMulticaster;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.PopupMenu;
|
||||
import java.awt.Image;
|
||||
import java.util.EventListener;
|
||||
import java.awt.peer.TrayIconPeer;
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
import sun.awt.HeadlessToolkit;
|
||||
import java.util.EventObject;
|
||||
import java.security.AccessControlContext;
|
||||
@ -129,6 +121,16 @@ public class TrayIcon {
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
|
||||
AWTAccessor.setTrayIconAccessor(
|
||||
new AWTAccessor.TrayIconAccessor() {
|
||||
public void addNotify(TrayIcon trayIcon) throws AWTException {
|
||||
trayIcon.addNotify();
|
||||
}
|
||||
public void removeNotify(TrayIcon trayIcon) {
|
||||
trayIcon.removeNotify();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private TrayIcon()
|
||||
|
||||
@ -25,12 +25,12 @@
|
||||
|
||||
package java.awt.event;
|
||||
|
||||
import java.awt.Event;
|
||||
import java.awt.Component;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Toolkit;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
/**
|
||||
* An event which indicates that a keystroke occurred in a component.
|
||||
@ -914,6 +914,23 @@ public class KeyEvent extends InputEvent {
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
initIDs();
|
||||
}
|
||||
|
||||
AWTAccessor.setKeyEventAccessor(
|
||||
new AWTAccessor.KeyEventAccessor() {
|
||||
public void setRawCode(KeyEvent ev, long rawCode) {
|
||||
ev.rawCode = rawCode;
|
||||
}
|
||||
|
||||
public void setPrimaryLevelUnicode(KeyEvent ev,
|
||||
long primaryLevelUnicode) {
|
||||
ev.primaryLevelUnicode = primaryLevelUnicode;
|
||||
}
|
||||
|
||||
public void setExtendedKeyCode(KeyEvent ev,
|
||||
long extendedKeyCode) {
|
||||
ev.extendedKeyCode = extendedKeyCode;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -657,7 +657,7 @@ public class PropertyDescriptor extends FeatureDescriptor {
|
||||
throw new IntrospectionException("bad write method arg count: "
|
||||
+ writeMethod);
|
||||
}
|
||||
if (propertyType != null && propertyType != params[0]) {
|
||||
if (propertyType != null && !params[0].isAssignableFrom(propertyType)) {
|
||||
throw new IntrospectionException("type mismatch between read and write methods");
|
||||
}
|
||||
propertyType = params[0];
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -62,6 +62,9 @@ import java.security.*;
|
||||
* interface is all that is needed when you accept defaults for algorithm-specific
|
||||
* parameters.
|
||||
*
|
||||
* <p>Note: Some earlier implementations of this interface may not support
|
||||
* larger sizes of DSA parameters such as 2048 and 3072-bit.
|
||||
*
|
||||
* @see java.security.KeyPairGenerator
|
||||
*/
|
||||
public interface DSAKeyPairGenerator {
|
||||
@ -78,7 +81,7 @@ public interface DSAKeyPairGenerator {
|
||||
* can be null.
|
||||
*
|
||||
* @exception InvalidParameterException if the <code>params</code>
|
||||
* value is invalid or null.
|
||||
* value is invalid, null, or unsupported.
|
||||
*/
|
||||
public void initialize(DSAParams params, SecureRandom random)
|
||||
throws InvalidParameterException;
|
||||
@ -97,7 +100,7 @@ public interface DSAKeyPairGenerator {
|
||||
* default parameters for modulus lengths of 512 and 1024 bits.
|
||||
*
|
||||
* @param modlen the modulus length in bits. Valid values are any
|
||||
* multiple of 8 between 512 and 1024, inclusive.
|
||||
* multiple of 64 between 512 and 1024, inclusive, 2048, and 3072.
|
||||
*
|
||||
* @param random the random bit source to use to generate key bits;
|
||||
* can be null.
|
||||
@ -105,10 +108,9 @@ public interface DSAKeyPairGenerator {
|
||||
* @param genParams whether or not to generate new parameters for
|
||||
* the modulus length requested.
|
||||
*
|
||||
* @exception InvalidParameterException if <code>modlen</code> is not
|
||||
* between 512 and 1024, or if <code>genParams</code> is false and
|
||||
* there are no precomputed parameters for the requested modulus
|
||||
* length.
|
||||
* @exception InvalidParameterException if <code>modlen</code> is
|
||||
* invalid, or unsupported, or if <code>genParams</code> is false and there
|
||||
* are no precomputed parameters for the requested modulus length.
|
||||
*/
|
||||
public void initialize(int modlen, boolean genParams, SecureRandom random)
|
||||
throws InvalidParameterException;
|
||||
|
||||
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code 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
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.security.spec;
|
||||
|
||||
/**
|
||||
* This immutable class specifies the set of parameters used for
|
||||
* generating DSA parameters as specified in
|
||||
* <a href="http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf">FIPS 186-3 Digital Signature Standard (DSS)</a>.
|
||||
*
|
||||
* @see AlgorithmParameterSpec
|
||||
*
|
||||
* @since 8
|
||||
*/
|
||||
public final class DSAGenParameterSpec implements AlgorithmParameterSpec {
|
||||
|
||||
private final int pLen;
|
||||
private final int qLen;
|
||||
private final int seedLen;
|
||||
|
||||
/**
|
||||
* Creates a domain parameter specification for DSA parameter
|
||||
* generation using <code>primePLen</code> and <code>subprimeQLen</code>.
|
||||
* The value of <code>subprimeQLen</code> is also used as the default
|
||||
* length of the domain parameter seed in bits.
|
||||
* @param primePLen the desired length of the prime P in bits.
|
||||
* @param subprimeQLen the desired length of the sub-prime Q in bits.
|
||||
* @exception IllegalArgumentException if <code>primePLen</code>
|
||||
* or <code>subprimeQLen</code> is illegal per the specification of
|
||||
* FIPS 186-3.
|
||||
*/
|
||||
public DSAGenParameterSpec(int primePLen, int subprimeQLen) {
|
||||
this(primePLen, subprimeQLen, subprimeQLen);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a domain parameter specification for DSA parameter
|
||||
* generation using <code>primePLen</code>, <code>subprimeQLen</code>,
|
||||
* and <code>seedLen</code>.
|
||||
* @param primePLen the desired length of the prime P in bits.
|
||||
* @param subprimeQLen the desired length of the sub-prime Q in bits.
|
||||
* @param seedLen the desired length of the domain parameter seed in bits,
|
||||
* shall be equal to or greater than <code>subprimeQLen</code>.
|
||||
* @exception IllegalArgumentException if <code>primePLenLen</code>,
|
||||
* <code>subprimeQLen</code>, or <code>seedLen</code> is illegal per the
|
||||
* specification of FIPS 186-3.
|
||||
*/
|
||||
public DSAGenParameterSpec(int primePLen, int subprimeQLen, int seedLen) {
|
||||
switch (primePLen) {
|
||||
case 1024:
|
||||
if (subprimeQLen != 160) {
|
||||
throw new IllegalArgumentException
|
||||
("subprimeQLen must be 160 when primePLen=1024");
|
||||
}
|
||||
break;
|
||||
case 2048:
|
||||
if (subprimeQLen != 224 && subprimeQLen != 256) {
|
||||
throw new IllegalArgumentException
|
||||
("subprimeQLen must be 224 or 256 when primePLen=2048");
|
||||
}
|
||||
break;
|
||||
case 3072:
|
||||
if (subprimeQLen != 256) {
|
||||
throw new IllegalArgumentException
|
||||
("subprimeQLen must be 256 when primePLen=3072");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException
|
||||
("primePLen must be 1024, 2048, or 3072");
|
||||
}
|
||||
if (seedLen < subprimeQLen) {
|
||||
throw new IllegalArgumentException
|
||||
("seedLen must be equal to or greater than subprimeQLen");
|
||||
}
|
||||
this.pLen = primePLen;
|
||||
this.qLen = subprimeQLen;
|
||||
this.seedLen = seedLen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the desired length of the prime P of the
|
||||
* to-be-generated DSA domain parameters in bits.
|
||||
* @return the length of the prime P.
|
||||
*/
|
||||
public int getPrimePLength() {
|
||||
return pLen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the desired length of the sub-prime Q of the
|
||||
* to-be-generated DSA domain parameters in bits.
|
||||
* @return the length of the sub-prime Q.
|
||||
*/
|
||||
public int getSubprimeQLength() {
|
||||
return qLen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the desired length of the domain parameter seed in bits.
|
||||
* @return the length of the domain parameter seed.
|
||||
*/
|
||||
public int getSeedLength() {
|
||||
return seedLen;
|
||||
}
|
||||
}
|
||||
@ -25,6 +25,8 @@
|
||||
|
||||
package javax.swing;
|
||||
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
/**
|
||||
* An enumeration for keys used as client properties within the Swing
|
||||
* implementation.
|
||||
@ -86,6 +88,15 @@ enum ClientPropertyKey {
|
||||
*/
|
||||
private final boolean reportValueNotSerializable;
|
||||
|
||||
static {
|
||||
AWTAccessor.setClientPropertyKeyAccessor(
|
||||
new AWTAccessor.ClientPropertyKeyAccessor() {
|
||||
public Object getJComponent_TRANSFER_HANDLER() {
|
||||
return JComponent_TRANSFER_HANDLER;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a key with the {@code reportValueNotSerializable} property
|
||||
* set to {@code false}.
|
||||
|
||||
@ -8590,7 +8590,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
|
||||
* <code>null</code> if this object is not on the screen
|
||||
*/
|
||||
public Point getLocationOnScreen() {
|
||||
if (parent != null) {
|
||||
if (parent != null && parent.isShowing()) {
|
||||
Point parentLocation = parent.getLocationOnScreen();
|
||||
Point componentLocation = getLocation();
|
||||
componentLocation.translate(parentLocation.x, parentLocation.y);
|
||||
@ -9391,7 +9391,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
|
||||
* <code>null</code> if this object is not on the screen
|
||||
*/
|
||||
public Point getLocationOnScreen() {
|
||||
if (parent != null) {
|
||||
if (parent != null && parent.isShowing()) {
|
||||
Point parentLocation = parent.getLocationOnScreen();
|
||||
Point componentLocation = getLocation();
|
||||
componentLocation.translate(parentLocation.x, parentLocation.y);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -29,12 +29,15 @@ import sun.misc.Unsafe;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.KeyboardFocusManager;
|
||||
import java.awt.DefaultKeyboardFocusManager;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.peer.ComponentPeer;
|
||||
import java.security.AccessControlContext;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* The AWTAccessor utility class.
|
||||
@ -314,7 +317,7 @@ public final class AWTAccessor {
|
||||
void setTrayIconWindow(Window w, boolean isTrayIconWindow);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* An accessor for the AWTEvent class.
|
||||
*/
|
||||
public interface AWTEventAccessor {
|
||||
@ -334,12 +337,20 @@ public final class AWTAccessor {
|
||||
*/
|
||||
boolean isSystemGenerated(AWTEvent ev);
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
* Returns the acc this event was constructed with.
|
||||
*/
|
||||
AccessControlContext getAccessControlContext(AWTEvent ev);
|
||||
|
||||
/**
|
||||
* Returns binary data associated with this event;
|
||||
*/
|
||||
byte[] getBData(AWTEvent ev);
|
||||
|
||||
/**
|
||||
* Associates binary data with this event;
|
||||
*/
|
||||
void setBData(AWTEvent ev, byte[] bdata);
|
||||
}
|
||||
|
||||
public interface InputEventAccessor {
|
||||
@ -367,11 +378,11 @@ public final class AWTAccessor {
|
||||
Rectangle getMaximizedBounds(Frame frame);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* An interface of accessor for the java.awt.KeyboardFocusManager class.
|
||||
*/
|
||||
public interface KeyboardFocusManagerAccessor {
|
||||
/*
|
||||
/**
|
||||
* Indicates whether the native implementation should
|
||||
* proceed with a pending focus request for the heavyweight.
|
||||
*/
|
||||
@ -381,7 +392,7 @@ public final class AWTAccessor {
|
||||
boolean focusedWindowChangeAllowed,
|
||||
long time,
|
||||
CausedFocusEvent.Cause cause);
|
||||
/*
|
||||
/**
|
||||
* Delivers focus for the lightweight descendant of the heavyweight
|
||||
* synchronously.
|
||||
*/
|
||||
@ -390,23 +401,28 @@ public final class AWTAccessor {
|
||||
boolean temporary,
|
||||
boolean focusedWindowChangeAllowed,
|
||||
long time);
|
||||
/*
|
||||
/**
|
||||
* Removes the last focus request for the heavyweight from the queue.
|
||||
*/
|
||||
void removeLastFocusRequest(Component heavyweight);
|
||||
|
||||
/*
|
||||
/**
|
||||
* Sets the most recent focus owner in the window.
|
||||
*/
|
||||
void setMostRecentFocusOwner(Window window, Component component);
|
||||
|
||||
/*
|
||||
/**
|
||||
* Returns current KFM of the specified AppContext.
|
||||
*/
|
||||
KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext ctx);
|
||||
|
||||
/**
|
||||
* Return the current focus cycle root
|
||||
*/
|
||||
Container getCurrentFocusCycleRoot();
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* An accessor for the MenuComponent class.
|
||||
*/
|
||||
public interface MenuComponentAccessor {
|
||||
@ -424,20 +440,42 @@ public final class AWTAccessor {
|
||||
* Returns the menu container of the menu component
|
||||
*/
|
||||
MenuContainer getParent(MenuComponent menuComp);
|
||||
|
||||
/**
|
||||
* Gets the font used for this menu component.
|
||||
*/
|
||||
Font getFont_NoClientCode(MenuComponent menuComp);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* An accessor for the EventQueue class
|
||||
*/
|
||||
public interface EventQueueAccessor {
|
||||
/*
|
||||
/**
|
||||
* Gets the event dispatch thread.
|
||||
*/
|
||||
Thread getDispatchThread(EventQueue eventQueue);
|
||||
/*
|
||||
|
||||
/**
|
||||
* Checks if the current thread is EDT for the given EQ.
|
||||
*/
|
||||
public boolean isDispatchThreadImpl(EventQueue eventQueue);
|
||||
|
||||
/**
|
||||
* Removes any pending events for the specified source object.
|
||||
*/
|
||||
void removeSourceEvents(EventQueue eventQueue, Object source, boolean removeAllEvents);
|
||||
|
||||
/**
|
||||
* Returns whether an event is pending on any of the separate Queues.
|
||||
*/
|
||||
boolean noEvents(EventQueue eventQueue);
|
||||
|
||||
/**
|
||||
* Called from PostEventQueue.postEvent to notify that a new event
|
||||
* appeared.
|
||||
*/
|
||||
void wakeup(EventQueue eventQueue, boolean isShutdown);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -486,6 +524,148 @@ public final class AWTAccessor {
|
||||
final int type);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the CheckboxMenuItem class
|
||||
*/
|
||||
public interface CheckboxMenuItemAccessor {
|
||||
/**
|
||||
* Returns whether menu item is checked
|
||||
*/
|
||||
boolean getState(CheckboxMenuItem cmi);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the Cursor class
|
||||
*/
|
||||
public interface CursorAccessor {
|
||||
/**
|
||||
* Returns pData of the Cursor class
|
||||
*/
|
||||
long getPData(Cursor cursor);
|
||||
|
||||
/**
|
||||
* Sets pData to the Cursor class
|
||||
*/
|
||||
void setPData(Cursor cursor, long pData);
|
||||
|
||||
/**
|
||||
* Return type of the Cursor class
|
||||
*/
|
||||
int getType(Cursor cursor);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the MenuBar class
|
||||
*/
|
||||
public interface MenuBarAccessor {
|
||||
/**
|
||||
* Returns help menu
|
||||
*/
|
||||
Menu getHelpMenu(MenuBar menuBar);
|
||||
|
||||
/**
|
||||
* Returns menus
|
||||
*/
|
||||
Vector getMenus(MenuBar menuBar);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the MenuItem class
|
||||
*/
|
||||
public interface MenuItemAccessor {
|
||||
/**
|
||||
* Returns whether menu item is enabled
|
||||
*/
|
||||
boolean isEnabled(MenuItem item);
|
||||
|
||||
/**
|
||||
* Gets the command name of the action event that is fired
|
||||
* by this menu item.
|
||||
*/
|
||||
String getActionCommandImpl(MenuItem item);
|
||||
|
||||
/**
|
||||
* Returns true if the item and all its ancestors are
|
||||
* enabled, false otherwise
|
||||
*/
|
||||
boolean isItemEnabled(MenuItem item);
|
||||
|
||||
/**
|
||||
* Returns label
|
||||
*/
|
||||
String getLabel(MenuItem item);
|
||||
|
||||
/**
|
||||
* Returns shortcut
|
||||
*/
|
||||
MenuShortcut getShortcut(MenuItem item);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the Menu class
|
||||
*/
|
||||
public interface MenuAccessor {
|
||||
/**
|
||||
* Returns vector of the items that are part of the Menu
|
||||
*/
|
||||
Vector getItems(Menu menu);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the KeyEvent class
|
||||
*/
|
||||
public interface KeyEventAccessor {
|
||||
/**
|
||||
* Sets rawCode field for KeyEvent
|
||||
*/
|
||||
void setRawCode(KeyEvent ev, long rawCode);
|
||||
|
||||
/**
|
||||
* Sets primaryLevelUnicode field for KeyEvent
|
||||
*/
|
||||
void setPrimaryLevelUnicode(KeyEvent ev, long primaryLevelUnicode);
|
||||
|
||||
/**
|
||||
* Sets extendedKeyCode field for KeyEvent
|
||||
*/
|
||||
void setExtendedKeyCode(KeyEvent ev, long extendedKeyCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the ClientPropertyKey class
|
||||
*/
|
||||
public interface ClientPropertyKeyAccessor {
|
||||
/**
|
||||
* Retrieves JComponent_TRANSFER_HANDLER enum object
|
||||
*/
|
||||
Object getJComponent_TRANSFER_HANDLER();
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the SystemTray class
|
||||
*/
|
||||
public interface SystemTrayAccessor {
|
||||
/**
|
||||
* Support for reporting bound property changes for Object properties.
|
||||
*/
|
||||
void firePropertyChange(SystemTray tray, String propertyName, Object oldValue, Object newValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the TrayIcon class
|
||||
*/
|
||||
public interface TrayIconAccessor {
|
||||
void addNotify(TrayIcon trayIcon) throws AWTException;
|
||||
void removeNotify(TrayIcon trayIcon);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the DefaultKeyboardFocusManager class
|
||||
*/
|
||||
public interface DefaultKeyboardFocusManagerAccessor {
|
||||
public void consumeNextKeyTyped(DefaultKeyboardFocusManager dkfm, KeyEvent e);
|
||||
}
|
||||
|
||||
/*
|
||||
* Accessor instances are initialized in the static initializers of
|
||||
* corresponding AWT classes by using setters defined below.
|
||||
@ -502,6 +682,16 @@ public final class AWTAccessor {
|
||||
private static PopupMenuAccessor popupMenuAccessor;
|
||||
private static FileDialogAccessor fileDialogAccessor;
|
||||
private static ScrollPaneAdjustableAccessor scrollPaneAdjustableAccessor;
|
||||
private static CheckboxMenuItemAccessor checkboxMenuItemAccessor;
|
||||
private static CursorAccessor cursorAccessor;
|
||||
private static MenuBarAccessor menuBarAccessor;
|
||||
private static MenuItemAccessor menuItemAccessor;
|
||||
private static MenuAccessor menuAccessor;
|
||||
private static KeyEventAccessor keyEventAccessor;
|
||||
private static ClientPropertyKeyAccessor clientPropertyKeyAccessor;
|
||||
private static SystemTrayAccessor systemTrayAccessor;
|
||||
private static TrayIconAccessor trayIconAccessor;
|
||||
private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
|
||||
|
||||
/*
|
||||
* Set an accessor object for the java.awt.Component class.
|
||||
@ -709,4 +899,174 @@ public final class AWTAccessor {
|
||||
}
|
||||
return scrollPaneAdjustableAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.CheckboxMenuItem class.
|
||||
*/
|
||||
public static void setCheckboxMenuItemAccessor(CheckboxMenuItemAccessor cmia) {
|
||||
checkboxMenuItemAccessor = cmia;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.CheckboxMenuItem class.
|
||||
*/
|
||||
public static CheckboxMenuItemAccessor getCheckboxMenuItemAccessor() {
|
||||
if (checkboxMenuItemAccessor == null) {
|
||||
unsafe.ensureClassInitialized(CheckboxMenuItemAccessor.class);
|
||||
}
|
||||
return checkboxMenuItemAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.Cursor class.
|
||||
*/
|
||||
public static void setCursorAccessor(CursorAccessor ca) {
|
||||
cursorAccessor = ca;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.Cursor class.
|
||||
*/
|
||||
public static CursorAccessor getCursorAccessor() {
|
||||
if (cursorAccessor == null) {
|
||||
unsafe.ensureClassInitialized(CursorAccessor.class);
|
||||
}
|
||||
return cursorAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.MenuBar class.
|
||||
*/
|
||||
public static void setMenuBarAccessor(MenuBarAccessor mba) {
|
||||
menuBarAccessor = mba;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.MenuBar class.
|
||||
*/
|
||||
public static MenuBarAccessor getMenuBarAccessor() {
|
||||
if (menuBarAccessor == null) {
|
||||
unsafe.ensureClassInitialized(MenuBarAccessor.class);
|
||||
}
|
||||
return menuBarAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.MenuItem class.
|
||||
*/
|
||||
public static void setMenuItemAccessor(MenuItemAccessor mia) {
|
||||
menuItemAccessor = mia;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.MenuItem class.
|
||||
*/
|
||||
public static MenuItemAccessor getMenuItemAccessor() {
|
||||
if (menuItemAccessor == null) {
|
||||
unsafe.ensureClassInitialized(MenuItemAccessor.class);
|
||||
}
|
||||
return menuItemAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.Menu class.
|
||||
*/
|
||||
public static void setMenuAccessor(MenuAccessor ma) {
|
||||
menuAccessor = ma;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.Menu class.
|
||||
*/
|
||||
public static MenuAccessor getMenuAccessor() {
|
||||
if (menuAccessor == null) {
|
||||
unsafe.ensureClassInitialized(MenuAccessor.class);
|
||||
}
|
||||
return menuAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.event.KeyEvent class.
|
||||
*/
|
||||
public static void setKeyEventAccessor(KeyEventAccessor kea) {
|
||||
keyEventAccessor = kea;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.event.KeyEvent class.
|
||||
*/
|
||||
public static KeyEventAccessor getKeyEventAccessor() {
|
||||
if (keyEventAccessor == null) {
|
||||
unsafe.ensureClassInitialized(KeyEventAccessor.class);
|
||||
}
|
||||
return keyEventAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the javax.swing.ClientPropertyKey class.
|
||||
*/
|
||||
public static void setClientPropertyKeyAccessor(ClientPropertyKeyAccessor cpka) {
|
||||
clientPropertyKeyAccessor = cpka;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the javax.swing.ClientPropertyKey class.
|
||||
*/
|
||||
public static ClientPropertyKeyAccessor getClientPropertyKeyAccessor() {
|
||||
if (clientPropertyKeyAccessor == null) {
|
||||
unsafe.ensureClassInitialized(ClientPropertyKeyAccessor.class);
|
||||
}
|
||||
return clientPropertyKeyAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.SystemTray class.
|
||||
*/
|
||||
public static void setSystemTrayAccessor(SystemTrayAccessor sta) {
|
||||
systemTrayAccessor = sta;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.SystemTray class.
|
||||
*/
|
||||
public static SystemTrayAccessor getSystemTrayAccessor() {
|
||||
if (systemTrayAccessor == null) {
|
||||
unsafe.ensureClassInitialized(SystemTrayAccessor.class);
|
||||
}
|
||||
return systemTrayAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.TrayIcon class.
|
||||
*/
|
||||
public static void setTrayIconAccessor(TrayIconAccessor tia) {
|
||||
trayIconAccessor = tia;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.TrayIcon class.
|
||||
*/
|
||||
public static TrayIconAccessor getTrayIconAccessor() {
|
||||
if (trayIconAccessor == null) {
|
||||
unsafe.ensureClassInitialized(TrayIconAccessor.class);
|
||||
}
|
||||
return trayIconAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an accessor object for the java.awt.DefaultKeyboardFocusManager class.
|
||||
*/
|
||||
public static void setDefaultKeyboardFocusManagerAccessor(DefaultKeyboardFocusManagerAccessor dkfma) {
|
||||
defaultKeyboardFocusManagerAccessor = dkfma;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the java.awt.DefaultKeyboardFocusManager class.
|
||||
*/
|
||||
public static DefaultKeyboardFocusManagerAccessor getDefaultKeyboardFocusManagerAccessor() {
|
||||
if (defaultKeyboardFocusManagerAccessor == null) {
|
||||
unsafe.ensureClassInitialized(DefaultKeyboardFocusManagerAccessor.class);
|
||||
}
|
||||
return defaultKeyboardFocusManagerAccessor;
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,12 +29,6 @@ import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
import java.awt.peer.*;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Field;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.util.Set;
|
||||
@ -66,8 +60,6 @@ public abstract class EmbeddedFrame extends Frame
|
||||
implements KeyEventDispatcher, PropertyChangeListener {
|
||||
|
||||
private boolean isCursorAllowed = true;
|
||||
private static Field fieldPeer;
|
||||
private static Field currentCycleRoot;
|
||||
private boolean supportsXEmbed = false;
|
||||
private KeyboardFocusManager appletKFM;
|
||||
// JDK 1.1 compatibility
|
||||
@ -213,39 +205,8 @@ public abstract class EmbeddedFrame extends Frame
|
||||
*/
|
||||
public boolean dispatchKeyEvent(KeyEvent e) {
|
||||
|
||||
// We can't guarantee that this is called on the same AppContext as EmbeddedFrame
|
||||
// belongs to. That's why we can't use public methods to find current focus cycle
|
||||
// root. Instead, we access KFM's private field directly.
|
||||
if (currentCycleRoot == null) {
|
||||
currentCycleRoot = AccessController.doPrivileged(new PrivilegedAction<Field>() {
|
||||
public Field run() {
|
||||
try {
|
||||
Field unaccessibleRoot = KeyboardFocusManager.class.
|
||||
getDeclaredField("currentFocusCycleRoot");
|
||||
if (unaccessibleRoot != null) {
|
||||
unaccessibleRoot.setAccessible(true);
|
||||
}
|
||||
return unaccessibleRoot;
|
||||
} catch (NoSuchFieldException e1) {
|
||||
assert false;
|
||||
} catch (SecurityException e2) {
|
||||
assert false;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Container currentRoot = null;
|
||||
if (currentCycleRoot != null) {
|
||||
try {
|
||||
// The field is static, so we can pass null to Field.get() as the argument.
|
||||
currentRoot = (Container)currentCycleRoot.get(null);
|
||||
} catch (IllegalAccessException e3) {
|
||||
// This is impossible: currentCycleRoot would be null if setAccessible failed.
|
||||
assert false;
|
||||
}
|
||||
}
|
||||
Container currentRoot = AWTAccessor.getKeyboardFocusManagerAccessor()
|
||||
.getCurrentFocusCycleRoot();
|
||||
|
||||
// if we are not in EmbeddedFrame's cycle, we should not try to leave.
|
||||
if (this != currentRoot) {
|
||||
@ -389,32 +350,8 @@ public abstract class EmbeddedFrame extends Frame
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
protected void setPeer(final ComponentPeer p){
|
||||
if (fieldPeer == null) {
|
||||
fieldPeer = AccessController.doPrivileged(new PrivilegedAction<Field>() {
|
||||
public Field run() {
|
||||
try {
|
||||
Field lnkPeer = Component.class.getDeclaredField("peer");
|
||||
if (lnkPeer != null) {
|
||||
lnkPeer.setAccessible(true);
|
||||
}
|
||||
return lnkPeer;
|
||||
} catch (NoSuchFieldException e) {
|
||||
assert false;
|
||||
} catch (SecurityException e) {
|
||||
assert false;
|
||||
}
|
||||
return null;
|
||||
}//run
|
||||
});
|
||||
}
|
||||
try{
|
||||
if (fieldPeer != null){
|
||||
fieldPeer.set(EmbeddedFrame.this, p);
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
assert false;
|
||||
}
|
||||
}; //setPeer method ends
|
||||
AWTAccessor.getComponentAccessor().setPeer(EmbeddedFrame.this, p);
|
||||
};
|
||||
|
||||
/**
|
||||
* Synthesize native message to activate or deactivate EmbeddedFrame window
|
||||
|
||||
@ -51,14 +51,8 @@ import sun.awt.im.InputContext;
|
||||
import sun.awt.image.*;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
import sun.security.action.GetBooleanAction;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.PrivilegedActionException;
|
||||
import java.security.PrivilegedExceptionAction;
|
||||
|
||||
public abstract class SunToolkit extends Toolkit
|
||||
implements WindowClosingSupport, WindowClosingListener,
|
||||
@ -80,7 +74,6 @@ public abstract class SunToolkit extends Toolkit
|
||||
*/
|
||||
public static final int GRAB_EVENT_MASK = 0x80000000;
|
||||
|
||||
private static Method wakeupMethod;
|
||||
/* The key to put()/get() the PostEventQueue into/from the AppContext.
|
||||
*/
|
||||
private static final String POST_EVENT_QUEUE_KEY = "PostEventQueue";
|
||||
@ -295,52 +288,8 @@ public abstract class SunToolkit extends Toolkit
|
||||
return appContext;
|
||||
}
|
||||
|
||||
public static Field getField(final Class<?> klass, final String fieldName) {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<Field>() {
|
||||
public Field run() {
|
||||
try {
|
||||
Field field = klass.getDeclaredField(fieldName);
|
||||
assert (field != null);
|
||||
field.setAccessible(true);
|
||||
return field;
|
||||
} catch (SecurityException e) {
|
||||
assert false;
|
||||
} catch (NoSuchFieldException e) {
|
||||
assert false;
|
||||
}
|
||||
return null;
|
||||
}//run
|
||||
});
|
||||
}
|
||||
|
||||
static void wakeupEventQueue(EventQueue q, boolean isShutdown){
|
||||
if (wakeupMethod == null){
|
||||
wakeupMethod = AccessController.doPrivileged(new PrivilegedAction<Method>() {
|
||||
public Method run() {
|
||||
try {
|
||||
Method method = EventQueue.class.getDeclaredMethod("wakeup",new Class [] {Boolean.TYPE} );
|
||||
if (method != null) {
|
||||
method.setAccessible(true);
|
||||
}
|
||||
return method;
|
||||
} catch (NoSuchMethodException e) {
|
||||
assert false;
|
||||
} catch (SecurityException e) {
|
||||
assert false;
|
||||
}
|
||||
return null;
|
||||
}//run
|
||||
});
|
||||
}
|
||||
try{
|
||||
if (wakeupMethod != null){
|
||||
wakeupMethod.invoke(q, new Object[]{Boolean.valueOf(isShutdown)});
|
||||
}
|
||||
} catch (InvocationTargetException e){
|
||||
assert false;
|
||||
} catch (IllegalAccessException e) {
|
||||
assert false;
|
||||
}
|
||||
AWTAccessor.getEventQueueAccessor().wakeup(q, isShutdown);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1460,22 +1409,6 @@ public abstract class SunToolkit extends Toolkit
|
||||
|| comp instanceof Window);
|
||||
}
|
||||
|
||||
public static Method getMethod(final Class<?> clz, final String methodName, final Class[] params) {
|
||||
Method res = null;
|
||||
try {
|
||||
res = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>() {
|
||||
public Method run() throws Exception {
|
||||
Method m = clz.getDeclaredMethod(methodName, params);
|
||||
m.setAccessible(true);
|
||||
return m;
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public static class OperationTimedOut extends RuntimeException {
|
||||
public OperationTimedOut(String msg) {
|
||||
@ -1622,21 +1555,9 @@ public abstract class SunToolkit extends Toolkit
|
||||
private boolean queueEmpty = false;
|
||||
private final Object waitLock = "Wait Lock";
|
||||
|
||||
static Method eqNoEvents;
|
||||
|
||||
private boolean isEQEmpty() {
|
||||
EventQueue queue = getSystemEventQueueImpl();
|
||||
synchronized(SunToolkit.class) {
|
||||
if (eqNoEvents == null) {
|
||||
eqNoEvents = getMethod(java.awt.EventQueue.class, "noEvents", null);
|
||||
}
|
||||
}
|
||||
try {
|
||||
return (Boolean)eqNoEvents.invoke(queue);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
return AWTAccessor.getEventQueueAccessor().noEvents(queue);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1892,20 +1813,14 @@ public abstract class SunToolkit extends Toolkit
|
||||
* consumeNextKeyTyped() method is not currently used,
|
||||
* however Swing could use it in the future.
|
||||
*/
|
||||
private static Method consumeNextKeyTypedMethod = null;
|
||||
public static synchronized void consumeNextKeyTyped(KeyEvent keyEvent) {
|
||||
if (consumeNextKeyTypedMethod == null) {
|
||||
consumeNextKeyTypedMethod = getMethod(DefaultKeyboardFocusManager.class,
|
||||
"consumeNextKeyTyped",
|
||||
new Class<?>[] {KeyEvent.class});
|
||||
}
|
||||
try {
|
||||
consumeNextKeyTypedMethod.invoke(KeyboardFocusManager.getCurrentKeyboardFocusManager(),
|
||||
keyEvent);
|
||||
} catch (IllegalAccessException iae) {
|
||||
iae.printStackTrace();
|
||||
} catch (InvocationTargetException ite) {
|
||||
ite.printStackTrace();
|
||||
AWTAccessor.getDefaultKeyboardFocusManagerAccessor().consumeNextKeyTyped(
|
||||
(DefaultKeyboardFocusManager)KeyboardFocusManager.
|
||||
getCurrentKeyboardFocusManager(),
|
||||
keyEvent);
|
||||
} catch (ClassCastException cce) {
|
||||
cce.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1925,24 +1840,6 @@ public abstract class SunToolkit extends Toolkit
|
||||
return (Window)comp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of the system property indicated by the specified key.
|
||||
*/
|
||||
public static String getSystemProperty(final String key) {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||||
public String run() {
|
||||
return System.getProperty(key);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the boolean value of the system property indicated by the specified key.
|
||||
*/
|
||||
protected static Boolean getBooleanSystemProperty(String key) {
|
||||
return AccessController.doPrivileged(new GetBooleanAction(key));
|
||||
}
|
||||
|
||||
private static Boolean sunAwtDisableMixing = null;
|
||||
|
||||
/**
|
||||
@ -1951,7 +1848,8 @@ public abstract class SunToolkit extends Toolkit
|
||||
*/
|
||||
public synchronized static boolean getSunAwtDisableMixing() {
|
||||
if (sunAwtDisableMixing == null) {
|
||||
sunAwtDisableMixing = getBooleanSystemProperty("sun.awt.disableMixing");
|
||||
sunAwtDisableMixing = AccessController.doPrivileged(
|
||||
new GetBooleanAction("sun.awt.disableMixing"));
|
||||
}
|
||||
return sunAwtDisableMixing.booleanValue();
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,25 +23,23 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.awt.X11;
|
||||
package sun.awt;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import sun.awt.SunToolkit;
|
||||
/**
|
||||
* A GraphicsConfiguration implements the TextureSizeConstraining
|
||||
* interface to indicate that it imposes certain limitations on the
|
||||
* maximum size of supported textures.
|
||||
*/
|
||||
public interface TextureSizeConstraining {
|
||||
|
||||
/**
|
||||
* Returns the maximum width of any texture image.
|
||||
*/
|
||||
public int getMaxTextureWidth();
|
||||
|
||||
/**
|
||||
* Returns the maximum height of any texture image.
|
||||
*/
|
||||
public int getMaxTextureHeight();
|
||||
|
||||
class XTextTransferHelper {
|
||||
private static Object transferHandlerKey = null;
|
||||
static Object getTransferHandlerKey() {
|
||||
if (transferHandlerKey == null) {
|
||||
try {
|
||||
Class clazz = Class.forName("javax.swing.ClientPropertyKey");
|
||||
Field field = SunToolkit.getField(clazz, "JComponent_TRANSFER_HANDLER");
|
||||
transferHandlerKey = field.get(null);
|
||||
} catch (IllegalAccessException ex) {
|
||||
return null;
|
||||
} catch (ClassNotFoundException cnfe) {
|
||||
cnfe.printStackTrace();
|
||||
}
|
||||
}
|
||||
return transferHandlerKey;
|
||||
}
|
||||
}
|
||||
@ -134,6 +134,9 @@ final class SunECEntries {
|
||||
"sun.security.ec.ECDSASignature$Raw");
|
||||
map.put("Signature.SHA1withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA1");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.1", "SHA1withECDSA");
|
||||
map.put("Alg.Alias.Signature.1.2.840.10045.4.1", "SHA1withECDSA");
|
||||
|
||||
map.put("Signature.SHA224withECDSA",
|
||||
"sun.security.ec.ECDSASignature$SHA224");
|
||||
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.1", "SHA224withECDSA");
|
||||
|
||||
@ -164,6 +164,10 @@ final class P11Cipher extends CipherSpi {
|
||||
// if we do the padding
|
||||
private int bytesBuffered;
|
||||
|
||||
// length of key size in bytes; currently only used by AES given its oid
|
||||
// specification mandates a fixed size of the key
|
||||
private int fixedKeySize = -1;
|
||||
|
||||
P11Cipher(Token token, String algorithm, long mechanism)
|
||||
throws PKCS11Exception, NoSuchAlgorithmException {
|
||||
super();
|
||||
@ -172,19 +176,26 @@ final class P11Cipher extends CipherSpi {
|
||||
this.mechanism = mechanism;
|
||||
|
||||
String algoParts[] = algorithm.split("/");
|
||||
keyAlgorithm = algoParts[0];
|
||||
|
||||
if (keyAlgorithm.equals("AES")) {
|
||||
if (algoParts[0].startsWith("AES")) {
|
||||
blockSize = 16;
|
||||
} else if (keyAlgorithm.equals("RC4") ||
|
||||
keyAlgorithm.equals("ARCFOUR")) {
|
||||
blockSize = 0;
|
||||
} else { // DES, DESede, Blowfish
|
||||
blockSize = 8;
|
||||
}
|
||||
this.blockMode =
|
||||
int index = algoParts[0].indexOf('_');
|
||||
if (index != -1) {
|
||||
// should be well-formed since we specify what we support
|
||||
fixedKeySize = Integer.parseInt(algoParts[0].substring(index+1))/8;
|
||||
}
|
||||
keyAlgorithm = "AES";
|
||||
} else {
|
||||
keyAlgorithm = algoParts[0];
|
||||
if (keyAlgorithm.equals("RC4") ||
|
||||
keyAlgorithm.equals("ARCFOUR")) {
|
||||
blockSize = 0;
|
||||
} else { // DES, DESede, Blowfish
|
||||
blockSize = 8;
|
||||
}
|
||||
this.blockMode =
|
||||
(algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
|
||||
|
||||
}
|
||||
String defPadding = (blockSize == 0 ? "NoPadding" : "PKCS5Padding");
|
||||
String paddingStr =
|
||||
(algoParts.length > 2 ? algoParts[2] : defPadding);
|
||||
@ -333,6 +344,9 @@ final class P11Cipher extends CipherSpi {
|
||||
SecureRandom random)
|
||||
throws InvalidKeyException, InvalidAlgorithmParameterException {
|
||||
cancelOperation();
|
||||
if (fixedKeySize != -1 && key.getEncoded().length != fixedKeySize) {
|
||||
throw new InvalidKeyException("Key size is invalid");
|
||||
}
|
||||
switch (opmode) {
|
||||
case Cipher.ENCRYPT_MODE:
|
||||
encrypt = true;
|
||||
|
||||
@ -399,12 +399,8 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
return System.identityHashCode(this);
|
||||
}
|
||||
|
||||
private static String[] s(String s1) {
|
||||
return new String[] {s1};
|
||||
}
|
||||
|
||||
private static String[] s(String s1, String s2) {
|
||||
return new String[] {s1, s2};
|
||||
private static String[] s(String ...aliases) {
|
||||
return aliases;
|
||||
}
|
||||
|
||||
private static final class Descriptor {
|
||||
@ -521,7 +517,8 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
m(CKM_MD2));
|
||||
d(MD, "MD5", P11Digest,
|
||||
m(CKM_MD5));
|
||||
d(MD, "SHA1", P11Digest, s("SHA", "SHA-1"),
|
||||
d(MD, "SHA1", P11Digest,
|
||||
s("SHA", "SHA-1", "1.3.14.3.2.26", "OID.1.3.14.3.2.26"),
|
||||
m(CKM_SHA_1));
|
||||
|
||||
d(MD, "SHA-224", P11Digest,
|
||||
@ -540,6 +537,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
d(MAC, "HmacMD5", P11MAC,
|
||||
m(CKM_MD5_HMAC));
|
||||
d(MAC, "HmacSHA1", P11MAC,
|
||||
s("1.2.840.113549.2.7", "OID.1.2.840.113549.2.7"),
|
||||
m(CKM_SHA_1_HMAC));
|
||||
d(MAC, "HmacSHA224", P11MAC,
|
||||
s("1.2.840.113549.2.8", "OID.1.2.840.113549.2.8"),
|
||||
@ -561,6 +559,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
d(KPG, "RSA", P11KeyPairGenerator,
|
||||
m(CKM_RSA_PKCS_KEY_PAIR_GEN));
|
||||
d(KPG, "DSA", P11KeyPairGenerator,
|
||||
s("1.3.14.3.2.12", "1.2.840.10040.4.1", "OID.1.2.840.10040.4.1"),
|
||||
m(CKM_DSA_KEY_PAIR_GEN));
|
||||
d(KPG, "DH", P11KeyPairGenerator, s("DiffieHellman"),
|
||||
m(CKM_DH_PKCS_KEY_PAIR_GEN));
|
||||
@ -583,6 +582,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
d(KF, "RSA", P11RSAKeyFactory,
|
||||
m(CKM_RSA_PKCS_KEY_PAIR_GEN, CKM_RSA_PKCS, CKM_RSA_X_509));
|
||||
d(KF, "DSA", P11DSAKeyFactory,
|
||||
s("1.3.14.3.2.12", "1.2.840.10040.4.1", "OID.1.2.840.10040.4.1"),
|
||||
m(CKM_DSA_KEY_PAIR_GEN, CKM_DSA, CKM_DSA_SHA1));
|
||||
d(KF, "DH", P11DHKeyFactory, s("DiffieHellman"),
|
||||
m(CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_DERIVE));
|
||||
@ -609,6 +609,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
d(SKF, "DESede", P11SecretKeyFactory,
|
||||
m(CKM_DES3_CBC));
|
||||
d(SKF, "AES", P11SecretKeyFactory,
|
||||
s("2.16.840.1.101.3.4.1", "OID.2.16.840.1.101.3.4.1"),
|
||||
m(CKM_AES_CBC));
|
||||
d(SKF, "Blowfish", P11SecretKeyFactory,
|
||||
m(CKM_BLOWFISH_CBC));
|
||||
@ -635,10 +636,28 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
m(CKM_DES3_ECB));
|
||||
d(CIP, "AES/CBC/NoPadding", P11Cipher,
|
||||
m(CKM_AES_CBC));
|
||||
d(CIP, "AES_128/CBC/NoPadding", P11Cipher,
|
||||
s("2.16.840.1.101.3.4.1.2", "OID.2.16.840.1.101.3.4.1.2"),
|
||||
m(CKM_AES_CBC));
|
||||
d(CIP, "AES_192/CBC/NoPadding", P11Cipher,
|
||||
s("2.16.840.1.101.3.4.1.22", "OID.2.16.840.1.101.3.4.1.22"),
|
||||
m(CKM_AES_CBC));
|
||||
d(CIP, "AES_256/CBC/NoPadding", P11Cipher,
|
||||
s("2.16.840.1.101.3.4.1.42", "OID.2.16.840.1.101.3.4.1.42"),
|
||||
m(CKM_AES_CBC));
|
||||
d(CIP, "AES/CBC/PKCS5Padding", P11Cipher,
|
||||
m(CKM_AES_CBC_PAD, CKM_AES_CBC));
|
||||
d(CIP, "AES/ECB/NoPadding", P11Cipher,
|
||||
m(CKM_AES_ECB));
|
||||
d(CIP, "AES_128/ECB/NoPadding", P11Cipher,
|
||||
s("2.16.840.1.101.3.4.1.1", "OID.2.16.840.1.101.3.4.1.1"),
|
||||
m(CKM_AES_ECB));
|
||||
d(CIP, "AES_192/ECB/NoPadding", P11Cipher,
|
||||
s("2.16.840.1.101.3.4.1.21", "OID.2.16.840.1.101.3.4.1.21"),
|
||||
m(CKM_AES_ECB));
|
||||
d(CIP, "AES_256/ECB/NoPadding", P11Cipher,
|
||||
s("2.16.840.1.101.3.4.1.41", "OID.2.16.840.1.101.3.4.1.41"),
|
||||
m(CKM_AES_ECB));
|
||||
d(CIP, "AES/ECB/PKCS5Padding", P11Cipher, s("AES"),
|
||||
m(CKM_AES_ECB));
|
||||
d(CIP, "AES/CTR/NoPadding", P11Cipher,
|
||||
@ -654,13 +673,16 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
d(CIP, "RSA/ECB/NoPadding", P11RSACipher,
|
||||
m(CKM_RSA_X_509));
|
||||
|
||||
d(SIG, "RawDSA", P11Signature, s("NONEwithDSA"),
|
||||
d(SIG, "RawDSA", P11Signature, s("NONEwithDSA"),
|
||||
m(CKM_DSA));
|
||||
d(SIG, "DSA", P11Signature, s("SHA1withDSA"),
|
||||
d(SIG, "DSA", P11Signature,
|
||||
s("SHA1withDSA", "1.3.14.3.2.13", "1.3.14.3.2.27",
|
||||
"1.2.840.10040.4.3", "OID.1.2.840.10040.4.3"),
|
||||
m(CKM_DSA_SHA1, CKM_DSA));
|
||||
d(SIG, "NONEwithECDSA", P11Signature,
|
||||
m(CKM_ECDSA));
|
||||
d(SIG, "SHA1withECDSA", P11Signature, s("ECDSA"),
|
||||
d(SIG, "SHA1withECDSA", P11Signature,
|
||||
s("ECDSA", "1.2.840.10045.4.1", "OID.1.2.840.10045.4.1"),
|
||||
m(CKM_ECDSA_SHA1, CKM_ECDSA));
|
||||
d(SIG, "SHA224withECDSA", P11Signature,
|
||||
s("1.2.840.10045.4.3.1", "OID.1.2.840.10045.4.3.1"),
|
||||
@ -675,10 +697,14 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
s("1.2.840.10045.4.3.4", "OID.1.2.840.10045.4.3.4"),
|
||||
m(CKM_ECDSA));
|
||||
d(SIG, "MD2withRSA", P11Signature,
|
||||
s("1.2.840.113549.1.1.2", "OID.1.2.840.113549.1.1.2"),
|
||||
m(CKM_MD2_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
|
||||
d(SIG, "MD5withRSA", P11Signature,
|
||||
s("1.2.840.113549.1.1.4", "OID.1.2.840.113549.1.1.4"),
|
||||
m(CKM_MD5_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
|
||||
d(SIG, "SHA1withRSA", P11Signature,
|
||||
s("1.2.840.113549.1.1.5", "OID.1.2.840.113549.1.1.5",
|
||||
"1.3.14.3.2.29"),
|
||||
m(CKM_SHA1_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
|
||||
d(SIG, "SHA224withRSA", P11Signature,
|
||||
s("1.2.840.113549.1.1.14", "OID.1.2.840.113549.1.1.14"),
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -45,14 +45,15 @@ import sun.security.jca.JCAUtil;
|
||||
|
||||
/**
|
||||
* The Digital Signature Standard (using the Digital Signature
|
||||
* Algorithm), as described in fips186 of the National Instute of
|
||||
* Standards and Technology (NIST), using fips180-1 (SHA-1).
|
||||
* Algorithm), as described in fips186-3 of the National Instute of
|
||||
* Standards and Technology (NIST), using SHA digest algorithms
|
||||
* from FIPS180-3.
|
||||
*
|
||||
* This file contains both the signature implementation for the
|
||||
* commonly used SHA1withDSA (DSS) as well as RawDSA, used by TLS
|
||||
* among others. RawDSA expects the 20 byte SHA-1 digest as input
|
||||
* via update rather than the original data like other signature
|
||||
* implementations.
|
||||
* commonly used SHA1withDSA (DSS), SHA224withDSA, SHA256withDSA,
|
||||
* as well as RawDSA, used by TLS among others. RawDSA expects
|
||||
* the 20 byte SHA-1 digest as input via update rather than the
|
||||
* original data like other signature implementations.
|
||||
*
|
||||
* @author Benjamin Renaud
|
||||
*
|
||||
@ -78,129 +79,19 @@ abstract class DSA extends SignatureSpi {
|
||||
/* The private key, if any */
|
||||
private BigInteger presetX;
|
||||
|
||||
/* The random seed used to generate k */
|
||||
private int[] Kseed;
|
||||
|
||||
/* The random seed used to generate k (specified by application) */
|
||||
private byte[] KseedAsByteArray;
|
||||
|
||||
/*
|
||||
* The random seed used to generate k
|
||||
* (prevent the same Kseed from being used twice in a row
|
||||
*/
|
||||
private int[] previousKseed;
|
||||
|
||||
/* The RNG used to output a seed for generating k */
|
||||
private SecureRandom signingRandom;
|
||||
|
||||
/* The message digest object used */
|
||||
private final MessageDigest md;
|
||||
|
||||
/**
|
||||
* Construct a blank DSA object. It must be
|
||||
* initialized before being usable for signing or verifying.
|
||||
*/
|
||||
DSA() {
|
||||
DSA(MessageDigest md) {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the 20 byte hash value and reset the digest.
|
||||
*/
|
||||
abstract byte[] getDigest() throws SignatureException;
|
||||
|
||||
/**
|
||||
* Reset the digest.
|
||||
*/
|
||||
abstract void resetDigest();
|
||||
|
||||
/**
|
||||
* Standard SHA1withDSA implementation.
|
||||
*/
|
||||
public static final class SHA1withDSA extends DSA {
|
||||
|
||||
/* The SHA hash for the data */
|
||||
private final MessageDigest dataSHA;
|
||||
|
||||
public SHA1withDSA() throws NoSuchAlgorithmException {
|
||||
dataSHA = MessageDigest.getInstance("SHA-1");
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a byte to be signed or verified.
|
||||
*/
|
||||
protected void engineUpdate(byte b) {
|
||||
dataSHA.update(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update an array of bytes to be signed or verified.
|
||||
*/
|
||||
protected void engineUpdate(byte[] data, int off, int len) {
|
||||
dataSHA.update(data, off, len);
|
||||
}
|
||||
|
||||
protected void engineUpdate(ByteBuffer b) {
|
||||
dataSHA.update(b);
|
||||
}
|
||||
|
||||
byte[] getDigest() {
|
||||
return dataSHA.digest();
|
||||
}
|
||||
|
||||
void resetDigest() {
|
||||
dataSHA.reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* RawDSA implementation.
|
||||
*
|
||||
* RawDSA requires the data to be exactly 20 bytes long. If it is
|
||||
* not, a SignatureException is thrown when sign()/verify() is called
|
||||
* per JCA spec.
|
||||
*/
|
||||
public static final class RawDSA extends DSA {
|
||||
|
||||
// length of the SHA-1 digest (20 bytes)
|
||||
private final static int SHA1_LEN = 20;
|
||||
|
||||
// 20 byte digest buffer
|
||||
private final byte[] digestBuffer;
|
||||
|
||||
// offset into the buffer
|
||||
private int ofs;
|
||||
|
||||
public RawDSA() {
|
||||
digestBuffer = new byte[SHA1_LEN];
|
||||
}
|
||||
|
||||
protected void engineUpdate(byte b) {
|
||||
if (ofs == SHA1_LEN) {
|
||||
ofs = SHA1_LEN + 1;
|
||||
return;
|
||||
}
|
||||
digestBuffer[ofs++] = b;
|
||||
}
|
||||
|
||||
protected void engineUpdate(byte[] data, int off, int len) {
|
||||
if (ofs + len > SHA1_LEN) {
|
||||
ofs = SHA1_LEN + 1;
|
||||
return;
|
||||
}
|
||||
System.arraycopy(data, off, digestBuffer, ofs, len);
|
||||
ofs += len;
|
||||
}
|
||||
|
||||
byte[] getDigest() throws SignatureException {
|
||||
if (ofs != SHA1_LEN) {
|
||||
throw new SignatureException
|
||||
("Data for RawDSA must be exactly 20 bytes long");
|
||||
}
|
||||
ofs = 0;
|
||||
return digestBuffer;
|
||||
}
|
||||
|
||||
void resetDigest() {
|
||||
ofs = 0;
|
||||
}
|
||||
this.md = md;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -217,13 +108,25 @@ abstract class DSA extends SignatureSpi {
|
||||
throw new InvalidKeyException("not a DSA private key: " +
|
||||
privateKey);
|
||||
}
|
||||
|
||||
java.security.interfaces.DSAPrivateKey priv =
|
||||
(java.security.interfaces.DSAPrivateKey)privateKey;
|
||||
|
||||
// check for algorithm specific constraints before doing initialization
|
||||
DSAParams params = priv.getParams();
|
||||
if (params == null) {
|
||||
throw new InvalidKeyException("DSA private key lacks parameters");
|
||||
}
|
||||
checkKey(params);
|
||||
|
||||
this.params = params;
|
||||
this.presetX = priv.getX();
|
||||
this.presetY = null;
|
||||
initialize(priv.getParams());
|
||||
this.presetP = params.getP();
|
||||
this.presetQ = params.getQ();
|
||||
this.presetG = params.getG();
|
||||
this.md.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the DSA object with a DSA public key.
|
||||
*
|
||||
@ -240,16 +143,42 @@ abstract class DSA extends SignatureSpi {
|
||||
}
|
||||
java.security.interfaces.DSAPublicKey pub =
|
||||
(java.security.interfaces.DSAPublicKey)publicKey;
|
||||
|
||||
// check for algorithm specific constraints before doing initialization
|
||||
DSAParams params = pub.getParams();
|
||||
if (params == null) {
|
||||
throw new InvalidKeyException("DSA public key lacks parameters");
|
||||
}
|
||||
checkKey(params);
|
||||
|
||||
this.params = params;
|
||||
this.presetY = pub.getY();
|
||||
this.presetX = null;
|
||||
initialize(pub.getParams());
|
||||
this.presetP = params.getP();
|
||||
this.presetQ = params.getQ();
|
||||
this.presetG = params.getG();
|
||||
this.md.reset();
|
||||
}
|
||||
|
||||
private void initialize(DSAParams params) throws InvalidKeyException {
|
||||
resetDigest();
|
||||
setParams(params);
|
||||
/**
|
||||
* Update a byte to be signed or verified.
|
||||
*/
|
||||
protected void engineUpdate(byte b) {
|
||||
md.update(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update an array of bytes to be signed or verified.
|
||||
*/
|
||||
protected void engineUpdate(byte[] data, int off, int len) {
|
||||
md.update(data, off, len);
|
||||
}
|
||||
|
||||
protected void engineUpdate(ByteBuffer b) {
|
||||
md.update(b);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sign all the data thus far updated. The signature is formatted
|
||||
* according to the Canonical Encoding Rules, returned as a DER
|
||||
@ -352,23 +281,51 @@ abstract class DSA extends SignatureSpi {
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected void engineSetParameter(String key, Object param) {
|
||||
throw new InvalidParameterException("No parameter accepted");
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected Object engineGetParameter(String key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void checkKey(DSAParams params) throws InvalidKeyException {
|
||||
// FIPS186-3 states in sec4.2 that a hash function which provides
|
||||
// a lower security strength than the (L, N) pair ordinarily should
|
||||
// not be used.
|
||||
int valueN = params.getQ().bitLength();
|
||||
if (valueN > md.getDigestLength()*8) {
|
||||
throw new InvalidKeyException("Key is too strong for this signature algorithm");
|
||||
}
|
||||
}
|
||||
|
||||
private BigInteger generateR(BigInteger p, BigInteger q, BigInteger g,
|
||||
BigInteger k) {
|
||||
BigInteger temp = g.modPow(k, p);
|
||||
return temp.remainder(q);
|
||||
}
|
||||
return temp.mod(q);
|
||||
}
|
||||
|
||||
private BigInteger generateS(BigInteger x, BigInteger q,
|
||||
BigInteger r, BigInteger k) throws SignatureException {
|
||||
|
||||
byte[] s2 = getDigest();
|
||||
BigInteger temp = new BigInteger(1, s2);
|
||||
byte[] s2;
|
||||
try {
|
||||
s2 = md.digest();
|
||||
} catch (RuntimeException re) {
|
||||
// Only for RawDSA due to its 20-byte length restriction
|
||||
throw new SignatureException(re.getMessage());
|
||||
}
|
||||
// get the leftmost min(N, outLen) bits of the digest value
|
||||
int nBytes = q.bitLength()/8;
|
||||
if (nBytes < s2.length) {
|
||||
s2 = Arrays.copyOfRange(s2, 0, nBytes);
|
||||
}
|
||||
BigInteger z = new BigInteger(1, s2);
|
||||
BigInteger k1 = k.modInverse(q);
|
||||
|
||||
BigInteger s = x.multiply(r);
|
||||
s = temp.add(s);
|
||||
s = k1.multiply(s);
|
||||
return s.remainder(q);
|
||||
return x.multiply(r).add(z).multiply(k1).mod(q);
|
||||
}
|
||||
|
||||
private BigInteger generateW(BigInteger p, BigInteger q,
|
||||
@ -380,54 +337,41 @@ abstract class DSA extends SignatureSpi {
|
||||
BigInteger q, BigInteger g, BigInteger w, BigInteger r)
|
||||
throws SignatureException {
|
||||
|
||||
byte[] s2 = getDigest();
|
||||
BigInteger temp = new BigInteger(1, s2);
|
||||
byte[] s2;
|
||||
try {
|
||||
s2 = md.digest();
|
||||
} catch (RuntimeException re) {
|
||||
// Only for RawDSA due to its 20-byte length restriction
|
||||
throw new SignatureException(re.getMessage());
|
||||
}
|
||||
// get the leftmost min(N, outLen) bits of the digest value
|
||||
int nBytes = q.bitLength()/8;
|
||||
if (nBytes < s2.length) {
|
||||
s2 = Arrays.copyOfRange(s2, 0, nBytes);
|
||||
}
|
||||
BigInteger z = new BigInteger(1, s2);
|
||||
|
||||
temp = temp.multiply(w);
|
||||
BigInteger u1 = temp.remainder(q);
|
||||
|
||||
BigInteger u2 = (r.multiply(w)).remainder(q);
|
||||
BigInteger u1 = z.multiply(w).mod(q);
|
||||
BigInteger u2 = (r.multiply(w)).mod(q);
|
||||
|
||||
BigInteger t1 = g.modPow(u1,p);
|
||||
BigInteger t2 = y.modPow(u2,p);
|
||||
BigInteger t3 = t1.multiply(t2);
|
||||
BigInteger t5 = t3.remainder(p);
|
||||
return t5.remainder(q);
|
||||
BigInteger t5 = t3.mod(p);
|
||||
return t5.mod(q);
|
||||
}
|
||||
|
||||
/*
|
||||
* Please read bug report 4044247 for an alternative, faster,
|
||||
* NON-FIPS approved method to generate K
|
||||
*/
|
||||
private BigInteger generateK(BigInteger q) {
|
||||
|
||||
BigInteger k = null;
|
||||
|
||||
// The application specified a Kseed for us to use.
|
||||
// Note that we do not allow usage of the same Kseed twice in a row
|
||||
if (Kseed != null && !Arrays.equals(Kseed, previousKseed)) {
|
||||
k = generateK(Kseed, q);
|
||||
if (k.signum() > 0 && k.compareTo(q) < 0) {
|
||||
previousKseed = new int [Kseed.length];
|
||||
System.arraycopy(Kseed, 0, previousKseed, 0, Kseed.length);
|
||||
return k;
|
||||
}
|
||||
}
|
||||
|
||||
// The application did not specify a Kseed for us to use.
|
||||
// We'll generate a new Kseed by getting random bytes from
|
||||
// a SecureRandom object.
|
||||
// NOTE: This following impl is defined in FIPS 186-3 AppendixB.2.2.
|
||||
// Original DSS algos such as SHA1withDSA and RawDSA uses a different
|
||||
// algorithm defined in FIPS 186-1 Sec3.2, and thus need to override this.
|
||||
protected BigInteger generateK(BigInteger q) {
|
||||
SecureRandom random = getSigningRandom();
|
||||
byte[] kValue = new byte[q.bitLength()/8];
|
||||
|
||||
while (true) {
|
||||
int[] seed = new int[5];
|
||||
|
||||
for (int i = 0; i < 5; i++)
|
||||
seed[i] = random.nextInt();
|
||||
k = generateK(seed, q);
|
||||
random.nextBytes(kValue);
|
||||
BigInteger k = new BigInteger(1, kValue).mod(q);
|
||||
if (k.signum() > 0 && k.compareTo(q) < 0) {
|
||||
previousKseed = new int [seed.length];
|
||||
System.arraycopy(seed, 0, previousKseed, 0, seed.length);
|
||||
return k;
|
||||
}
|
||||
}
|
||||
@ -435,7 +379,7 @@ abstract class DSA extends SignatureSpi {
|
||||
|
||||
// Use the application-specified SecureRandom Object if provided.
|
||||
// Otherwise, use our default SecureRandom Object.
|
||||
private SecureRandom getSigningRandom() {
|
||||
protected SecureRandom getSigningRandom() {
|
||||
if (signingRandom == null) {
|
||||
if (appRandom != null) {
|
||||
signingRandom = appRandom;
|
||||
@ -446,171 +390,6 @@ abstract class DSA extends SignatureSpi {
|
||||
return signingRandom;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute k for a DSA signature.
|
||||
*
|
||||
* @param seed the seed for generating k. This seed should be
|
||||
* secure. This is what is refered to as the KSEED in the DSA
|
||||
* specification.
|
||||
*
|
||||
* @param g the g parameter from the DSA key pair.
|
||||
*/
|
||||
private BigInteger generateK(int[] seed, BigInteger q) {
|
||||
|
||||
// check out t in the spec.
|
||||
int[] t = { 0xEFCDAB89, 0x98BADCFE, 0x10325476,
|
||||
0xC3D2E1F0, 0x67452301 };
|
||||
//
|
||||
int[] tmp = DSA.SHA_7(seed, t);
|
||||
byte[] tmpBytes = new byte[tmp.length * 4];
|
||||
for (int i = 0; i < tmp.length; i++) {
|
||||
int k = tmp[i];
|
||||
for (int j = 0; j < 4; j++) {
|
||||
tmpBytes[(i * 4) + j] = (byte) (k >>> (24 - (j * 8)));
|
||||
}
|
||||
}
|
||||
BigInteger k = new BigInteger(1, tmpBytes).mod(q);
|
||||
return k;
|
||||
}
|
||||
|
||||
// Constants for each round
|
||||
private static final int round1_kt = 0x5a827999;
|
||||
private static final int round2_kt = 0x6ed9eba1;
|
||||
private static final int round3_kt = 0x8f1bbcdc;
|
||||
private static final int round4_kt = 0xca62c1d6;
|
||||
|
||||
/**
|
||||
* Computes set 1 thru 7 of SHA-1 on m1. */
|
||||
static int[] SHA_7(int[] m1, int[] h) {
|
||||
|
||||
int[] W = new int[80];
|
||||
System.arraycopy(m1,0,W,0,m1.length);
|
||||
int temp = 0;
|
||||
|
||||
for (int t = 16; t <= 79; t++){
|
||||
temp = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16];
|
||||
W[t] = ((temp << 1) | (temp >>>(32 - 1)));
|
||||
}
|
||||
|
||||
int a = h[0],b = h[1],c = h[2], d = h[3], e = h[4];
|
||||
for (int i = 0; i < 20; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
((b&c)|((~b)&d))+ e + W[i] + round1_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
|
||||
// Round 2
|
||||
for (int i = 20; i < 40; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
(b ^ c ^ d) + e + W[i] + round2_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
|
||||
// Round 3
|
||||
for (int i = 40; i < 60; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
((b&c)|(b&d)|(c&d)) + e + W[i] + round3_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
|
||||
// Round 4
|
||||
for (int i = 60; i < 80; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
(b ^ c ^ d) + e + W[i] + round4_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
int[] md = new int[5];
|
||||
md[0] = h[0] + a;
|
||||
md[1] = h[1] + b;
|
||||
md[2] = h[2] + c;
|
||||
md[3] = h[3] + d;
|
||||
md[4] = h[4] + e;
|
||||
return md;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This implementation recognizes the following parameter:<dl>
|
||||
*
|
||||
* <dt><tt>Kseed</tt>
|
||||
*
|
||||
* <dd>a byte array.
|
||||
*
|
||||
* </dl>
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
@Deprecated
|
||||
protected void engineSetParameter(String key, Object param) {
|
||||
if (key.equals("KSEED")) {
|
||||
if (param instanceof byte[]) {
|
||||
Kseed = byteArray2IntArray((byte[])param);
|
||||
KseedAsByteArray = (byte[])param;
|
||||
} else {
|
||||
debug("unrecognized param: " + key);
|
||||
throw new InvalidParameterException("Kseed not a byte array");
|
||||
}
|
||||
} else {
|
||||
throw new InvalidParameterException("invalid parameter");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value of the requested parameter. Recognized
|
||||
* parameters are:
|
||||
*
|
||||
* <dl>
|
||||
*
|
||||
* <dt><tt>Kseed</tt>
|
||||
*
|
||||
* <dd>a byte array.
|
||||
*
|
||||
* </dl>
|
||||
*
|
||||
* @return the value of the requested parameter.
|
||||
*
|
||||
* @see java.security.SignatureEngine
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
@Deprecated
|
||||
protected Object engineGetParameter(String key) {
|
||||
if (key.equals("KSEED")) {
|
||||
return KseedAsByteArray;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the algorithm object.
|
||||
*/
|
||||
private void setParams(DSAParams params) throws InvalidKeyException {
|
||||
if (params == null) {
|
||||
throw new InvalidKeyException("DSA public key lacks parameters");
|
||||
}
|
||||
this.params = params;
|
||||
this.presetP = params.getP();
|
||||
this.presetQ = params.getQ();
|
||||
this.presetG = params.getG();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a human readable rendition of the engine.
|
||||
*/
|
||||
@ -632,38 +411,6 @@ abstract class DSA extends SignatureSpi {
|
||||
return printable;
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility routine for converting a byte array into an int array
|
||||
*/
|
||||
private int[] byteArray2IntArray(byte[] byteArray) {
|
||||
|
||||
int j = 0;
|
||||
byte[] newBA;
|
||||
int mod = byteArray.length % 4;
|
||||
|
||||
// guarantee that the incoming byteArray is a multiple of 4
|
||||
// (pad with 0's)
|
||||
switch (mod) {
|
||||
case 3: newBA = new byte[byteArray.length + 1]; break;
|
||||
case 2: newBA = new byte[byteArray.length + 2]; break;
|
||||
case 1: newBA = new byte[byteArray.length + 3]; break;
|
||||
default: newBA = new byte[byteArray.length + 0]; break;
|
||||
}
|
||||
System.arraycopy(byteArray, 0, newBA, 0, byteArray.length);
|
||||
|
||||
// copy each set of 4 bytes in the byte array into an integer
|
||||
int[] newSeed = new int[newBA.length / 4];
|
||||
for (int i = 0; i < newBA.length; i += 4) {
|
||||
newSeed[j] = newBA[i + 3] & 0xFF;
|
||||
newSeed[j] |= (newBA[i + 2] << 8) & 0xFF00;
|
||||
newSeed[j] |= (newBA[i + 1] << 16) & 0xFF0000;
|
||||
newSeed[j] |= (newBA[i + 0] << 24) & 0xFF000000;
|
||||
j++;
|
||||
}
|
||||
|
||||
return newSeed;
|
||||
}
|
||||
|
||||
private static void debug(Exception e) {
|
||||
if (debug) {
|
||||
e.printStackTrace();
|
||||
@ -675,4 +422,325 @@ abstract class DSA extends SignatureSpi {
|
||||
System.err.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Standard SHA224withDSA implementation as defined in FIPS186-3.
|
||||
*/
|
||||
public static final class SHA224withDSA extends DSA {
|
||||
public SHA224withDSA() throws NoSuchAlgorithmException {
|
||||
super(MessageDigest.getInstance("SHA-224"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Standard SHA256withDSA implementation as defined in FIPS186-3.
|
||||
*/
|
||||
public static final class SHA256withDSA extends DSA {
|
||||
public SHA256withDSA() throws NoSuchAlgorithmException {
|
||||
super(MessageDigest.getInstance("SHA-256"));
|
||||
}
|
||||
}
|
||||
|
||||
static class LegacyDSA extends DSA {
|
||||
/* The random seed used to generate k */
|
||||
private int[] kSeed;
|
||||
/* The random seed used to generate k (specified by application) */
|
||||
private byte[] kSeedAsByteArray;
|
||||
/*
|
||||
* The random seed used to generate k
|
||||
* (prevent the same Kseed from being used twice in a row
|
||||
*/
|
||||
private int[] kSeedLast;
|
||||
|
||||
public LegacyDSA(MessageDigest md) throws NoSuchAlgorithmException {
|
||||
super(md);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected void engineSetParameter(String key, Object param) {
|
||||
if (key.equals("KSEED")) {
|
||||
if (param instanceof byte[]) {
|
||||
kSeed = byteArray2IntArray((byte[])param);
|
||||
kSeedAsByteArray = (byte[])param;
|
||||
} else {
|
||||
debug("unrecognized param: " + key);
|
||||
throw new InvalidParameterException("kSeed not a byte array");
|
||||
}
|
||||
} else {
|
||||
throw new InvalidParameterException("Unsupported parameter");
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected Object engineGetParameter(String key) {
|
||||
if (key.equals("KSEED")) {
|
||||
return kSeedAsByteArray;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkKey(DSAParams params) throws InvalidKeyException {
|
||||
int valueL = params.getP().bitLength();
|
||||
if (valueL > 1024) {
|
||||
throw new InvalidKeyException("Key is too long for this algorithm");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Please read bug report 4044247 for an alternative, faster,
|
||||
* NON-FIPS approved method to generate K
|
||||
*/
|
||||
@Override
|
||||
protected BigInteger generateK(BigInteger q) {
|
||||
BigInteger k = null;
|
||||
|
||||
// The application specified a kSeed for us to use.
|
||||
// Note: we dis-allow usage of the same Kseed twice in a row
|
||||
if (kSeed != null && !Arrays.equals(kSeed, kSeedLast)) {
|
||||
k = generateKUsingKSeed(kSeed, q);
|
||||
if (k.signum() > 0 && k.compareTo(q) < 0) {
|
||||
kSeedLast = kSeed.clone();
|
||||
return k;
|
||||
}
|
||||
}
|
||||
|
||||
// The application did not specify a Kseed for us to use.
|
||||
// We'll generate a new Kseed by getting random bytes from
|
||||
// a SecureRandom object.
|
||||
SecureRandom random = getSigningRandom();
|
||||
|
||||
while (true) {
|
||||
int[] seed = new int[5];
|
||||
|
||||
for (int i = 0; i < 5; i++) seed[i] = random.nextInt();
|
||||
|
||||
k = generateKUsingKSeed(seed, q);
|
||||
if (k.signum() > 0 && k.compareTo(q) < 0) {
|
||||
kSeedLast = seed;
|
||||
return k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute k for the DSA signature as defined in the original DSS,
|
||||
* i.e. FIPS186.
|
||||
*
|
||||
* @param seed the seed for generating k. This seed should be
|
||||
* secure. This is what is refered to as the KSEED in the DSA
|
||||
* specification.
|
||||
*
|
||||
* @param g the g parameter from the DSA key pair.
|
||||
*/
|
||||
private BigInteger generateKUsingKSeed(int[] seed, BigInteger q) {
|
||||
|
||||
// check out t in the spec.
|
||||
int[] t = { 0xEFCDAB89, 0x98BADCFE, 0x10325476,
|
||||
0xC3D2E1F0, 0x67452301 };
|
||||
//
|
||||
int[] tmp = SHA_7(seed, t);
|
||||
byte[] tmpBytes = new byte[tmp.length * 4];
|
||||
for (int i = 0; i < tmp.length; i++) {
|
||||
int k = tmp[i];
|
||||
for (int j = 0; j < 4; j++) {
|
||||
tmpBytes[(i * 4) + j] = (byte) (k >>> (24 - (j * 8)));
|
||||
}
|
||||
}
|
||||
BigInteger k = new BigInteger(1, tmpBytes).mod(q);
|
||||
return k;
|
||||
}
|
||||
|
||||
// Constants for each round
|
||||
private static final int round1_kt = 0x5a827999;
|
||||
private static final int round2_kt = 0x6ed9eba1;
|
||||
private static final int round3_kt = 0x8f1bbcdc;
|
||||
private static final int round4_kt = 0xca62c1d6;
|
||||
|
||||
/**
|
||||
* Computes set 1 thru 7 of SHA-1 on m1. */
|
||||
static int[] SHA_7(int[] m1, int[] h) {
|
||||
|
||||
int[] W = new int[80];
|
||||
System.arraycopy(m1,0,W,0,m1.length);
|
||||
int temp = 0;
|
||||
|
||||
for (int t = 16; t <= 79; t++){
|
||||
temp = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16];
|
||||
W[t] = ((temp << 1) | (temp >>>(32 - 1)));
|
||||
}
|
||||
|
||||
int a = h[0],b = h[1],c = h[2], d = h[3], e = h[4];
|
||||
for (int i = 0; i < 20; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
((b&c)|((~b)&d))+ e + W[i] + round1_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
|
||||
// Round 2
|
||||
for (int i = 20; i < 40; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
(b ^ c ^ d) + e + W[i] + round2_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
|
||||
// Round 3
|
||||
for (int i = 40; i < 60; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
((b&c)|(b&d)|(c&d)) + e + W[i] + round3_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
|
||||
// Round 4
|
||||
for (int i = 60; i < 80; i++) {
|
||||
temp = ((a<<5) | (a>>>(32-5))) +
|
||||
(b ^ c ^ d) + e + W[i] + round4_kt;
|
||||
e = d;
|
||||
d = c;
|
||||
c = ((b<<30) | (b>>>(32-30)));
|
||||
b = a;
|
||||
a = temp;
|
||||
}
|
||||
int[] md = new int[5];
|
||||
md[0] = h[0] + a;
|
||||
md[1] = h[1] + b;
|
||||
md[2] = h[2] + c;
|
||||
md[3] = h[3] + d;
|
||||
md[4] = h[4] + e;
|
||||
return md;
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility routine for converting a byte array into an int array
|
||||
*/
|
||||
private int[] byteArray2IntArray(byte[] byteArray) {
|
||||
|
||||
int j = 0;
|
||||
byte[] newBA;
|
||||
int mod = byteArray.length % 4;
|
||||
|
||||
// guarantee that the incoming byteArray is a multiple of 4
|
||||
// (pad with 0's)
|
||||
switch (mod) {
|
||||
case 3: newBA = new byte[byteArray.length + 1]; break;
|
||||
case 2: newBA = new byte[byteArray.length + 2]; break;
|
||||
case 1: newBA = new byte[byteArray.length + 3]; break;
|
||||
default: newBA = new byte[byteArray.length + 0]; break;
|
||||
}
|
||||
System.arraycopy(byteArray, 0, newBA, 0, byteArray.length);
|
||||
|
||||
// copy each set of 4 bytes in the byte array into an integer
|
||||
int[] newSeed = new int[newBA.length / 4];
|
||||
for (int i = 0; i < newBA.length; i += 4) {
|
||||
newSeed[j] = newBA[i + 3] & 0xFF;
|
||||
newSeed[j] |= (newBA[i + 2] << 8) & 0xFF00;
|
||||
newSeed[j] |= (newBA[i + 1] << 16) & 0xFF0000;
|
||||
newSeed[j] |= (newBA[i + 0] << 24) & 0xFF000000;
|
||||
j++;
|
||||
}
|
||||
|
||||
return newSeed;
|
||||
}
|
||||
}
|
||||
|
||||
public static final class SHA1withDSA extends LegacyDSA {
|
||||
public SHA1withDSA() throws NoSuchAlgorithmException {
|
||||
super(MessageDigest.getInstance("SHA-1"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* RawDSA implementation.
|
||||
*
|
||||
* RawDSA requires the data to be exactly 20 bytes long. If it is
|
||||
* not, a SignatureException is thrown when sign()/verify() is called
|
||||
* per JCA spec.
|
||||
*/
|
||||
public static final class RawDSA extends LegacyDSA {
|
||||
// Internal special-purpose MessageDigest impl for RawDSA
|
||||
// Only override whatever methods used
|
||||
// NOTE: no clone support
|
||||
public static final class NullDigest20 extends MessageDigest {
|
||||
// 20 byte digest buffer
|
||||
private final byte[] digestBuffer = new byte[20];
|
||||
|
||||
// offset into the buffer; use Integer.MAX_VALUE to indicate
|
||||
// out-of-bound condition
|
||||
private int ofs = 0;
|
||||
|
||||
protected NullDigest20() {
|
||||
super("NullDigest20");
|
||||
}
|
||||
protected void engineUpdate(byte input) {
|
||||
if (ofs == digestBuffer.length) {
|
||||
ofs = Integer.MAX_VALUE;
|
||||
} else {
|
||||
digestBuffer[ofs++] = input;
|
||||
}
|
||||
}
|
||||
protected void engineUpdate(byte[] input, int offset, int len) {
|
||||
if (ofs + len > digestBuffer.length) {
|
||||
ofs = Integer.MAX_VALUE;
|
||||
} else {
|
||||
System.arraycopy(input, offset, digestBuffer, ofs, len);
|
||||
ofs += len;
|
||||
}
|
||||
}
|
||||
protected final void engineUpdate(ByteBuffer input) {
|
||||
int inputLen = input.remaining();
|
||||
if (ofs + inputLen > digestBuffer.length) {
|
||||
ofs = Integer.MAX_VALUE;
|
||||
} else {
|
||||
input.get(digestBuffer, ofs, inputLen);
|
||||
ofs += inputLen;
|
||||
}
|
||||
}
|
||||
protected byte[] engineDigest() throws RuntimeException {
|
||||
if (ofs != digestBuffer.length) {
|
||||
throw new RuntimeException
|
||||
("Data for RawDSA must be exactly 20 bytes long");
|
||||
}
|
||||
reset();
|
||||
return digestBuffer;
|
||||
}
|
||||
protected int engineDigest(byte[] buf, int offset, int len)
|
||||
throws DigestException {
|
||||
if (ofs != digestBuffer.length) {
|
||||
throw new DigestException
|
||||
("Data for RawDSA must be exactly 20 bytes long");
|
||||
}
|
||||
if (len < digestBuffer.length) {
|
||||
throw new DigestException
|
||||
("Output buffer too small; must be at least 20 bytes");
|
||||
}
|
||||
System.arraycopy(digestBuffer, 0, buf, offset, digestBuffer.length);
|
||||
reset();
|
||||
return digestBuffer.length;
|
||||
}
|
||||
|
||||
protected void engineReset() {
|
||||
ofs = 0;
|
||||
}
|
||||
protected final int engineGetDigestLength() {
|
||||
return digestBuffer.length;
|
||||
}
|
||||
}
|
||||
|
||||
public RawDSA() throws NoSuchAlgorithmException {
|
||||
super(new NullDigest20());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -48,8 +48,9 @@ import sun.security.jca.JCAUtil;
|
||||
public class DSAKeyPairGenerator extends KeyPairGenerator
|
||||
implements java.security.interfaces.DSAKeyPairGenerator {
|
||||
|
||||
/* The modulus length */
|
||||
private int modlen;
|
||||
/* Length for prime P and subPrime Q in bits */
|
||||
private int plen;
|
||||
private int qlen;
|
||||
|
||||
/* whether to force new parameters to be generated for each KeyPair */
|
||||
private boolean forceNewParameters;
|
||||
@ -65,20 +66,23 @@ implements java.security.interfaces.DSAKeyPairGenerator {
|
||||
initialize(1024, null);
|
||||
}
|
||||
|
||||
private static void checkStrength(int strength) {
|
||||
if ((strength < 512) || (strength > 1024) || (strength % 64 != 0)) {
|
||||
private static void checkStrength(int sizeP, int sizeQ) {
|
||||
if ((sizeP >= 512) && (sizeP <= 1024) && (sizeP % 64 == 0)
|
||||
&& sizeQ == 160) {
|
||||
// traditional - allow for backward compatibility
|
||||
// L=multiples of 64 and between 512 and 1024 (inclusive)
|
||||
// N=160
|
||||
} else if (sizeP == 2048 && (sizeQ == 224 || sizeQ == 256)) {
|
||||
// L=2048, N=224 or 256
|
||||
} else {
|
||||
throw new InvalidParameterException
|
||||
("Modulus size must range from 512 to 1024 "
|
||||
+ "and be a multiple of 64");
|
||||
("Unsupported prime and subprime size combination: " +
|
||||
sizeP + ", " + sizeQ);
|
||||
}
|
||||
}
|
||||
|
||||
public void initialize(int modlen, SecureRandom random) {
|
||||
checkStrength(modlen);
|
||||
this.random = random;
|
||||
this.modlen = modlen;
|
||||
this.params = null;
|
||||
this.forceNewParameters = false;
|
||||
initialize(modlen, false, random);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,18 +90,27 @@ implements java.security.interfaces.DSAKeyPairGenerator {
|
||||
* is false, a set of pre-computed parameters is used.
|
||||
*/
|
||||
public void initialize(int modlen, boolean genParams, SecureRandom random) {
|
||||
checkStrength(modlen);
|
||||
int subPrimeLen = -1;
|
||||
if (modlen <= 1024) {
|
||||
subPrimeLen = 160;
|
||||
} else if (modlen == 2048) {
|
||||
subPrimeLen = 224;
|
||||
}
|
||||
checkStrength(modlen, subPrimeLen);
|
||||
if (genParams) {
|
||||
params = null;
|
||||
} else {
|
||||
params = ParameterCache.getCachedDSAParameterSpec(modlen);
|
||||
params = ParameterCache.getCachedDSAParameterSpec(modlen,
|
||||
subPrimeLen);
|
||||
if (params == null) {
|
||||
throw new InvalidParameterException
|
||||
("No precomputed parameters for requested modulus size "
|
||||
+ "available");
|
||||
}
|
||||
|
||||
}
|
||||
this.modlen = modlen;
|
||||
this.plen = modlen;
|
||||
this.qlen = subPrimeLen;
|
||||
this.random = random;
|
||||
this.forceNewParameters = genParams;
|
||||
}
|
||||
@ -136,9 +149,11 @@ implements java.security.interfaces.DSAKeyPairGenerator {
|
||||
}
|
||||
|
||||
private void initialize0(DSAParameterSpec params, SecureRandom random) {
|
||||
int modlen = params.getP().bitLength();
|
||||
checkStrength(modlen);
|
||||
this.modlen = modlen;
|
||||
int sizeP = params.getP().bitLength();
|
||||
int sizeQ = params.getQ().bitLength();
|
||||
checkStrength(sizeP, sizeQ);
|
||||
this.plen = sizeP;
|
||||
this.qlen = sizeQ;
|
||||
this.params = params;
|
||||
this.random = random;
|
||||
this.forceNewParameters = false;
|
||||
@ -156,11 +171,11 @@ implements java.security.interfaces.DSAKeyPairGenerator {
|
||||
try {
|
||||
if (forceNewParameters) {
|
||||
// generate new parameters each time
|
||||
spec = ParameterCache.getNewDSAParameterSpec(modlen, random);
|
||||
spec = ParameterCache.getNewDSAParameterSpec(plen, qlen, random);
|
||||
} else {
|
||||
if (params == null) {
|
||||
params =
|
||||
ParameterCache.getDSAParameterSpec(modlen, random);
|
||||
ParameterCache.getDSAParameterSpec(plen, qlen, random);
|
||||
}
|
||||
spec = params;
|
||||
}
|
||||
@ -203,43 +218,14 @@ implements java.security.interfaces.DSAKeyPairGenerator {
|
||||
*/
|
||||
private BigInteger generateX(SecureRandom random, BigInteger q) {
|
||||
BigInteger x = null;
|
||||
byte[] temp = new byte[qlen];
|
||||
while (true) {
|
||||
int[] seed = new int[5];
|
||||
for (int i = 0; i < 5; i++) {
|
||||
seed[i] = random.nextInt();
|
||||
}
|
||||
x = generateX(seed, q);
|
||||
random.nextBytes(temp);
|
||||
x = new BigInteger(1, temp).mod(q);
|
||||
if (x.signum() > 0 && (x.compareTo(q) < 0)) {
|
||||
break;
|
||||
return x;
|
||||
}
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a seed, generate the private key component of the key
|
||||
* pair. In the terminology used in the DSA specification
|
||||
* (FIPS-186) seed is the XSEED quantity.
|
||||
*
|
||||
* @param seed the seed to use to generate the private key.
|
||||
*/
|
||||
BigInteger generateX(int[] seed, BigInteger q) {
|
||||
|
||||
// check out t in the spec.
|
||||
int[] t = { 0x67452301, 0xEFCDAB89, 0x98BADCFE,
|
||||
0x10325476, 0xC3D2E1F0 };
|
||||
//
|
||||
|
||||
int[] tmp = DSA.SHA_7(seed, t);
|
||||
byte[] tmpBytes = new byte[tmp.length * 4];
|
||||
for (int i = 0; i < tmp.length; i++) {
|
||||
int k = tmp[i];
|
||||
for (int j = 0; j < 4; j++) {
|
||||
tmpBytes[(i * 4) + j] = (byte) (k >>> (24 - (j * 8)));
|
||||
}
|
||||
}
|
||||
BigInteger x = new BigInteger(1, tmpBytes).mod(q);
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,10 +32,12 @@ import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.SecureRandom;
|
||||
import java.security.spec.AlgorithmParameterSpec;
|
||||
import java.security.spec.InvalidParameterSpecException;
|
||||
import java.security.spec.DSAParameterSpec;
|
||||
import java.security.spec.DSAGenParameterSpec;
|
||||
|
||||
/**
|
||||
* This class generates parameters for the DSA algorithm. It uses a default
|
||||
@ -54,8 +56,14 @@ import java.security.spec.DSAParameterSpec;
|
||||
|
||||
public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
|
||||
// the modulus length
|
||||
private int modLen = 1024; // default
|
||||
// the default parameters
|
||||
private static final DSAGenParameterSpec DEFAULTS =
|
||||
new DSAGenParameterSpec(1024, 160, 160);
|
||||
|
||||
// the length of prime P, subPrime Q, and seed in bits
|
||||
private int valueL = -1;
|
||||
private int valueN = -1;
|
||||
private int seedLen = -1;
|
||||
|
||||
// the source of randomness
|
||||
private SecureRandom random;
|
||||
@ -65,11 +73,7 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
private static final BigInteger ONE = BigInteger.valueOf(1);
|
||||
private static final BigInteger TWO = BigInteger.valueOf(2);
|
||||
|
||||
// Make a SHA-1 hash function
|
||||
private SHA sha;
|
||||
|
||||
public DSAParameterGenerator() {
|
||||
this.sha = new SHA();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,19 +84,18 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
* @param random the source of randomness
|
||||
*/
|
||||
protected void engineInit(int strength, SecureRandom random) {
|
||||
/*
|
||||
* Bruce Schneier, "Applied Cryptography", 2nd Edition,
|
||||
* Description of DSA:
|
||||
* [...] The algorithm uses the following parameter:
|
||||
* p=a prime number L bits long, when L ranges from 512 to 1024 and is
|
||||
* a multiple of 64. [...]
|
||||
*/
|
||||
if ((strength < 512) || (strength > 1024) || (strength % 64 != 0)) {
|
||||
if ((strength >= 512) && (strength <= 1024) && (strength % 64 == 0)) {
|
||||
this.valueN = 160;
|
||||
} else if (strength == 2048) {
|
||||
this.valueN = 224;
|
||||
// } else if (strength == 3072) {
|
||||
// this.valueN = 256;
|
||||
} else {
|
||||
throw new InvalidParameterException
|
||||
("Prime size must range from 512 to 1024 "
|
||||
+ "and be a multiple of 64");
|
||||
("Prime size should be 512 - 1024, or 2048");
|
||||
}
|
||||
this.modLen = strength;
|
||||
this.valueL = strength;
|
||||
this.seedLen = valueN;
|
||||
this.random = random;
|
||||
}
|
||||
|
||||
@ -100,7 +103,7 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
* Initializes this parameter generator with a set of
|
||||
* algorithm-specific parameter generation values.
|
||||
*
|
||||
* @param params the set of algorithm-specific parameter generation values
|
||||
* @param genParamSpec the set of algorithm-specific parameter generation values
|
||||
* @param random the source of randomness
|
||||
*
|
||||
* @exception InvalidAlgorithmParameterException if the given parameter
|
||||
@ -109,7 +112,19 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
protected void engineInit(AlgorithmParameterSpec genParamSpec,
|
||||
SecureRandom random)
|
||||
throws InvalidAlgorithmParameterException {
|
||||
if (!(genParamSpec instanceof DSAGenParameterSpec)) {
|
||||
throw new InvalidAlgorithmParameterException("Invalid parameter");
|
||||
}
|
||||
DSAGenParameterSpec dsaGenParams = (DSAGenParameterSpec) genParamSpec;
|
||||
if (dsaGenParams.getPrimePLength() > 2048) {
|
||||
throw new InvalidParameterException
|
||||
("Prime size should be 512 - 1024, or 2048");
|
||||
}
|
||||
// directly initialize using the already validated values
|
||||
this.valueL = dsaGenParams.getPrimePLength();
|
||||
this.valueN = dsaGenParams.getSubprimeQLength();
|
||||
this.seedLen = dsaGenParams.getSeedLength();
|
||||
this.random = random;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,15 +138,21 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
if (this.random == null) {
|
||||
this.random = new SecureRandom();
|
||||
}
|
||||
|
||||
BigInteger[] pAndQ = generatePandQ(this.random, this.modLen);
|
||||
if (valueL == -1) {
|
||||
try {
|
||||
engineInit(DEFAULTS, this.random);
|
||||
} catch (InvalidAlgorithmParameterException iape) {
|
||||
// should never happen
|
||||
}
|
||||
}
|
||||
BigInteger[] pAndQ = generatePandQ(this.random, valueL,
|
||||
valueN, seedLen);
|
||||
BigInteger paramP = pAndQ[0];
|
||||
BigInteger paramQ = pAndQ[1];
|
||||
BigInteger paramG = generateG(paramP, paramQ);
|
||||
|
||||
DSAParameterSpec dsaParamSpec = new DSAParameterSpec(paramP,
|
||||
paramQ,
|
||||
paramG);
|
||||
DSAParameterSpec dsaParamSpec =
|
||||
new DSAParameterSpec(paramP, paramQ, paramG);
|
||||
algParams = AlgorithmParameters.getInstance("DSA", "SUN");
|
||||
algParams.init(dsaParamSpec);
|
||||
} catch (InvalidParameterSpecException e) {
|
||||
@ -156,102 +177,98 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
*
|
||||
* @param random the source of randomness to generate the
|
||||
* seed
|
||||
* @param L the size of <code>p</code>, in bits.
|
||||
* @param valueL the size of <code>p</code>, in bits.
|
||||
* @param valueN the size of <code>q</code>, in bits.
|
||||
* @param seedLen the length of <code>seed</code>, in bits.
|
||||
*
|
||||
* @return an array of BigInteger, with <code>p</code> at index 0 and
|
||||
* <code>q</code> at index 1.
|
||||
*/
|
||||
BigInteger[] generatePandQ(SecureRandom random, int L) {
|
||||
BigInteger[] result = null;
|
||||
byte[] seed = new byte[20];
|
||||
|
||||
while(result == null) {
|
||||
for (int i = 0; i < 20; i++) {
|
||||
seed[i] = (byte)random.nextInt();
|
||||
}
|
||||
result = generatePandQ(seed, L);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generates the prime and subprime parameters for DSA.
|
||||
*
|
||||
* <p>The seed parameter corresponds to the <code>SEED</code> parameter
|
||||
* referenced in the FIPS specification of the DSA algorithm,
|
||||
* and L is the size of <code>p</code>, in bits.
|
||||
*
|
||||
* @param seed the seed to generate the parameters
|
||||
* @param L the size of <code>p</code>, in bits.
|
||||
*
|
||||
* @return an array of BigInteger, with <code>p</code> at index 0,
|
||||
* <code>q</code> at index 1, the seed at index 2, and the counter value
|
||||
* at index 3, or null if the seed does not yield suitable numbers.
|
||||
* at index 3.
|
||||
*/
|
||||
BigInteger[] generatePandQ(byte[] seed, int L) {
|
||||
private static BigInteger[] generatePandQ(SecureRandom random, int valueL,
|
||||
int valueN, int seedLen) {
|
||||
String hashAlg = null;
|
||||
if (valueN == 160) {
|
||||
hashAlg = "SHA";
|
||||
} else if (valueN == 224) {
|
||||
hashAlg = "SHA-224";
|
||||
} else if (valueN == 256) {
|
||||
hashAlg = "SHA-256";
|
||||
}
|
||||
MessageDigest hashObj = null;
|
||||
try {
|
||||
hashObj = MessageDigest.getInstance(hashAlg);
|
||||
} catch (NoSuchAlgorithmException nsae) {
|
||||
// should never happen
|
||||
nsae.printStackTrace();
|
||||
}
|
||||
|
||||
/* Useful variables */
|
||||
int g = seed.length * 8;
|
||||
int n = (L - 1) / 160;
|
||||
int b = (L - 1) % 160;
|
||||
/* Step 3, 4: Useful variables */
|
||||
int outLen = hashObj.getDigestLength()*8;
|
||||
int n = (valueL - 1) / outLen;
|
||||
int b = (valueL - 1) % outLen;
|
||||
byte[] seedBytes = new byte[seedLen/8];
|
||||
BigInteger twoSl = TWO.pow(seedLen);
|
||||
int primeCertainty = 80; // for 1024-bit prime P
|
||||
if (valueL == 2048) {
|
||||
primeCertainty = 112;
|
||||
//} else if (valueL == 3072) {
|
||||
// primeCertainty = 128;
|
||||
}
|
||||
|
||||
BigInteger SEED = new BigInteger(1, seed);
|
||||
BigInteger TWOG = TWO.pow(2 * g);
|
||||
BigInteger resultP, resultQ, seed = null;
|
||||
int counter;
|
||||
while (true) {
|
||||
do {
|
||||
/* Step 5 */
|
||||
random.nextBytes(seedBytes);
|
||||
seed = new BigInteger(1, seedBytes);
|
||||
|
||||
/* Step 2 (Step 1 is getting seed). */
|
||||
byte[] U1 = SHA(seed);
|
||||
byte[] U2 = SHA(toByteArray((SEED.add(ONE)).mod(TWOG)));
|
||||
/* Step 6 */
|
||||
BigInteger U = new BigInteger(1, hashObj.digest(seedBytes)).
|
||||
mod(TWO.pow(valueN - 1));
|
||||
|
||||
xor(U1, U2);
|
||||
byte[] U = U1;
|
||||
/* Step 7 */
|
||||
resultQ = TWO.pow(valueN - 1).add(U).add(ONE). subtract(U.mod(TWO));
|
||||
} while (!resultQ.isProbablePrime(primeCertainty));
|
||||
|
||||
/* Step 3: For q by setting the msb and lsb to 1 */
|
||||
U[0] |= 0x80;
|
||||
U[19] |= 1;
|
||||
BigInteger q = new BigInteger(1, U);
|
||||
|
||||
/* Step 5 */
|
||||
if (!q.isProbablePrime(80)) {
|
||||
return null;
|
||||
|
||||
} else {
|
||||
BigInteger V[] = new BigInteger[n + 1];
|
||||
BigInteger offset = TWO;
|
||||
|
||||
/* Step 6 */
|
||||
for (int counter = 0; counter < 4096; counter++) {
|
||||
|
||||
/* Step 7 */
|
||||
for (int k = 0; k <= n; k++) {
|
||||
BigInteger K = BigInteger.valueOf(k);
|
||||
BigInteger tmp = (SEED.add(offset).add(K)).mod(TWOG);
|
||||
V[k] = new BigInteger(1, SHA(toByteArray(tmp)));
|
||||
}
|
||||
|
||||
/* Step 8 */
|
||||
BigInteger W = V[0];
|
||||
for (int i = 1; i < n; i++) {
|
||||
W = W.add(V[i].multiply(TWO.pow(i * 160)));
|
||||
}
|
||||
W = W.add((V[n].mod(TWO.pow(b))).multiply(TWO.pow(n * 160)));
|
||||
|
||||
BigInteger TWOLm1 = TWO.pow(L - 1);
|
||||
BigInteger X = W.add(TWOLm1);
|
||||
|
||||
/* Step 9 */
|
||||
BigInteger c = X.mod(q.multiply(TWO));
|
||||
BigInteger p = X.subtract(c.subtract(ONE));
|
||||
|
||||
/* Step 10 - 13 */
|
||||
if (p.compareTo(TWOLm1) > -1 && p.isProbablePrime(80)) {
|
||||
BigInteger[] result = {p, q, SEED,
|
||||
BigInteger.valueOf(counter)};
|
||||
return result;
|
||||
}
|
||||
offset = offset.add(BigInteger.valueOf(n)).add(ONE);
|
||||
/* Step 10 */
|
||||
BigInteger offset = ONE;
|
||||
/* Step 11 */
|
||||
for (counter = 0; counter < 4*valueL; counter++) {
|
||||
BigInteger V[] = new BigInteger[n + 1];
|
||||
/* Step 11.1 */
|
||||
for (int j = 0; j <= n; j++) {
|
||||
BigInteger J = BigInteger.valueOf(j);
|
||||
BigInteger tmp = (seed.add(offset).add(J)).mod(twoSl);
|
||||
byte[] vjBytes = hashObj.digest(toByteArray(tmp));
|
||||
V[j] = new BigInteger(1, vjBytes);
|
||||
}
|
||||
/* Step 11.2 */
|
||||
BigInteger W = V[0];
|
||||
for (int i = 1; i < n; i++) {
|
||||
W = W.add(V[i].multiply(TWO.pow(i * outLen)));
|
||||
}
|
||||
W = W.add((V[n].mod(TWO.pow(b))).multiply(TWO.pow(n * outLen)));
|
||||
/* Step 11.3 */
|
||||
BigInteger twoLm1 = TWO.pow(valueL - 1);
|
||||
BigInteger X = W.add(twoLm1);
|
||||
/* Step 11.4, 11.5 */
|
||||
BigInteger c = X.mod(resultQ.multiply(TWO));
|
||||
resultP = X.subtract(c.subtract(ONE));
|
||||
/* Step 11.6, 11.7 */
|
||||
if (resultP.compareTo(twoLm1) > -1
|
||||
&& resultP.isProbablePrime(primeCertainty)) {
|
||||
/* Step 11.8 */
|
||||
BigInteger[] result = {resultP, resultQ, seed,
|
||||
BigInteger.valueOf(counter)};
|
||||
return result;
|
||||
}
|
||||
/* Step 11.9 */
|
||||
offset = offset.add(BigInteger.valueOf(n)).add(ONE);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -262,31 +279,24 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
*
|
||||
* @param the <code>g</code>
|
||||
*/
|
||||
BigInteger generateG(BigInteger p, BigInteger q) {
|
||||
private static BigInteger generateG(BigInteger p, BigInteger q) {
|
||||
BigInteger h = ONE;
|
||||
/* Step 1 */
|
||||
BigInteger pMinusOneOverQ = (p.subtract(ONE)).divide(q);
|
||||
BigInteger g = ONE;
|
||||
while (g.compareTo(TWO) < 0) {
|
||||
g = h.modPow(pMinusOneOverQ, p);
|
||||
BigInteger resultG = ONE;
|
||||
while (resultG.compareTo(TWO) < 0) {
|
||||
/* Step 3 */
|
||||
resultG = h.modPow(pMinusOneOverQ, p);
|
||||
h = h.add(ONE);
|
||||
}
|
||||
return g;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the SHA-1 digest of some data
|
||||
*/
|
||||
private byte[] SHA(byte[] array) {
|
||||
sha.engineReset();
|
||||
sha.engineUpdate(array, 0, array.length);
|
||||
return sha.engineDigest();
|
||||
return resultG;
|
||||
}
|
||||
|
||||
/*
|
||||
* Converts the result of a BigInteger.toByteArray call to an exact
|
||||
* signed magnitude representation for any positive number.
|
||||
*/
|
||||
private byte[] toByteArray(BigInteger bigInt) {
|
||||
private static byte[] toByteArray(BigInteger bigInt) {
|
||||
byte[] result = bigInt.toByteArray();
|
||||
if (result[0] == 0) {
|
||||
byte[] tmp = new byte[result.length - 1];
|
||||
@ -295,13 +305,4 @@ public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* XORs U2 into U1
|
||||
*/
|
||||
private void xor(byte[] U1, byte[] U2) {
|
||||
for (int i = 0; i < U1.length; i++) {
|
||||
U1[i] ^= U2[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,6 +26,7 @@
|
||||
package sun.security.provider;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.math.BigInteger;
|
||||
|
||||
import java.security.*;
|
||||
@ -55,11 +56,17 @@ public final class ParameterCache {
|
||||
private final static Map<Integer,DHParameterSpec> dhCache;
|
||||
|
||||
/**
|
||||
* Return cached DSA parameters for the given keylength, or null if none
|
||||
* are available in the cache.
|
||||
* Return cached DSA parameters for the given length combination of
|
||||
* prime and subprime, or null if none are available in the cache.
|
||||
*/
|
||||
public static DSAParameterSpec getCachedDSAParameterSpec(int keyLength) {
|
||||
return dsaCache.get(Integer.valueOf(keyLength));
|
||||
public static DSAParameterSpec getCachedDSAParameterSpec(int primeLen,
|
||||
int subprimeLen) {
|
||||
// ensure the sum is unique in all cases, i.e.
|
||||
// case#1: (512 <= p <= 1024) AND q=160
|
||||
// case#2: p=2048 AND q=224
|
||||
// case#3: p=2048 AND q=256
|
||||
// (NOT-YET-SUPPORTED)case#4: p=3072 AND q=256
|
||||
return dsaCache.get(Integer.valueOf(primeLen+subprimeLen));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -71,18 +78,39 @@ public final class ParameterCache {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return DSA parameters for the given keylength. Uses cache if possible,
|
||||
* generates new parameters and adds them to the cache otherwise.
|
||||
* Return DSA parameters for the given primeLen. Uses cache if
|
||||
* possible, generates new parameters and adds them to the cache
|
||||
* otherwise.
|
||||
*/
|
||||
public static DSAParameterSpec getDSAParameterSpec(int keyLength,
|
||||
public static DSAParameterSpec getDSAParameterSpec(int primeLen,
|
||||
SecureRandom random)
|
||||
throws NoSuchAlgorithmException, InvalidParameterSpecException {
|
||||
DSAParameterSpec spec = getCachedDSAParameterSpec(keyLength);
|
||||
throws NoSuchAlgorithmException, InvalidParameterSpecException,
|
||||
InvalidAlgorithmParameterException {
|
||||
if (primeLen <= 1024) {
|
||||
return getDSAParameterSpec(primeLen, 160, random);
|
||||
} else if (primeLen == 2048) {
|
||||
return getDSAParameterSpec(primeLen, 224, random);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return DSA parameters for the given primeLen and subprimeLen.
|
||||
* Uses cache if possible, generates new parameters and adds them to the
|
||||
* cache otherwise.
|
||||
*/
|
||||
public static DSAParameterSpec getDSAParameterSpec(int primeLen,
|
||||
int subprimeLen, SecureRandom random)
|
||||
throws NoSuchAlgorithmException, InvalidParameterSpecException,
|
||||
InvalidAlgorithmParameterException {
|
||||
DSAParameterSpec spec =
|
||||
getCachedDSAParameterSpec(primeLen, subprimeLen);
|
||||
if (spec != null) {
|
||||
return spec;
|
||||
}
|
||||
spec = getNewDSAParameterSpec(keyLength, random);
|
||||
dsaCache.put(Integer.valueOf(keyLength), spec);
|
||||
spec = getNewDSAParameterSpec(primeLen, subprimeLen, random);
|
||||
dsaCache.put(Integer.valueOf(primeLen + subprimeLen), spec);
|
||||
return spec;
|
||||
}
|
||||
|
||||
@ -107,28 +135,28 @@ public final class ParameterCache {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return new DSA parameters for the given keylength. Do not lookup in
|
||||
* cache and do not cache the newly generated parameters. This method
|
||||
* really only exists for the legacy method
|
||||
* Return new DSA parameters for the given length combination of prime and
|
||||
* sub prime. Do not lookup in cache and do not cache the newly generated
|
||||
* parameters. This method really only exists for the legacy method
|
||||
* DSAKeyPairGenerator.initialize(int, boolean, SecureRandom).
|
||||
*/
|
||||
public static DSAParameterSpec getNewDSAParameterSpec(int keyLength,
|
||||
SecureRandom random)
|
||||
throws NoSuchAlgorithmException, InvalidParameterSpecException {
|
||||
public static DSAParameterSpec getNewDSAParameterSpec(int primeLen,
|
||||
int subprimeLen, SecureRandom random)
|
||||
throws NoSuchAlgorithmException, InvalidParameterSpecException,
|
||||
InvalidAlgorithmParameterException {
|
||||
AlgorithmParameterGenerator gen =
|
||||
AlgorithmParameterGenerator.getInstance("DSA");
|
||||
gen.init(keyLength, random);
|
||||
DSAGenParameterSpec genParams =
|
||||
new DSAGenParameterSpec(primeLen, subprimeLen);
|
||||
gen.init(genParams, random);
|
||||
AlgorithmParameters params = gen.generateParameters();
|
||||
DSAParameterSpec spec = params.getParameterSpec(DSAParameterSpec.class);
|
||||
return spec;
|
||||
}
|
||||
|
||||
static {
|
||||
// XXX change to ConcurrentHashMap once available
|
||||
dhCache = Collections.synchronizedMap
|
||||
(new HashMap<Integer,DHParameterSpec>());
|
||||
dsaCache = Collections.synchronizedMap
|
||||
(new HashMap<Integer,DSAParameterSpec>());
|
||||
dhCache = new ConcurrentHashMap<Integer,DHParameterSpec>();
|
||||
dsaCache = new ConcurrentHashMap<Integer,DSAParameterSpec>();
|
||||
|
||||
/*
|
||||
* We support precomputed parameter for 512, 768 and 1024 bit
|
||||
@ -210,17 +238,99 @@ public final class ParameterCache {
|
||||
"83dfe15ae59f06928b665e807b552564014c3bfecf" +
|
||||
"492a", 16);
|
||||
|
||||
dsaCache.put(Integer.valueOf(512),
|
||||
dsaCache.put(Integer.valueOf(512+160),
|
||||
new DSAParameterSpec(p512, q512, g512));
|
||||
dsaCache.put(Integer.valueOf(768),
|
||||
dsaCache.put(Integer.valueOf(768+160),
|
||||
new DSAParameterSpec(p768, q768, g768));
|
||||
dsaCache.put(Integer.valueOf(1024),
|
||||
dsaCache.put(Integer.valueOf(1024+160),
|
||||
new DSAParameterSpec(p1024, q1024, g1024));
|
||||
/*
|
||||
* L = 2048, N = 224
|
||||
* SEED = 584236080cfa43c09b02354135f4cc5198a19efada08bd866d601ba4
|
||||
* counter = 2666
|
||||
*/
|
||||
BigInteger p2048_224 =
|
||||
new BigInteger("8f7935d9b9aae9bfabed887acf4951b6f32ec59e3b" +
|
||||
"af3718e8eac4961f3efd3606e74351a9c4183339b8" +
|
||||
"09e7c2ae1c539ba7475b85d011adb8b47987754984" +
|
||||
"695cac0e8f14b3360828a22ffa27110a3d62a99345" +
|
||||
"3409a0fe696c4658f84bdd20819c3709a01057b195" +
|
||||
"adcd00233dba5484b6291f9d648ef883448677979c" +
|
||||
"ec04b434a6ac2e75e9985de23db0292fc1118c9ffa" +
|
||||
"9d8181e7338db792b730d7b9e349592f6809987215" +
|
||||
"3915ea3d6b8b4653c633458f803b32a4c2e0f27290" +
|
||||
"256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea1" +
|
||||
"43de4b66ff04903ed5cf1623e158d487c608e97f21" +
|
||||
"1cd81dca23cb6e380765f822e342be484c05763939" +
|
||||
"601cd667", 16);
|
||||
|
||||
BigInteger q2048_224 =
|
||||
new BigInteger("baf696a68578f7dfdee7fa67c977c785ef32b233ba" +
|
||||
"e580c0bcd5695d", 16);
|
||||
|
||||
BigInteger g2048_224 =
|
||||
new BigInteger("16a65c58204850704e7502a39757040d34da3a3478" +
|
||||
"c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f" +
|
||||
"37eeb1e09f3182d23c9043cb642f88004160edf9ca" +
|
||||
"09b32076a79c32a627f2473e91879ba2c4e744bd20" +
|
||||
"81544cb55b802c368d1fa83ed489e94e0fa0688e32" +
|
||||
"428a5c78c478c68d0527b71c9a3abb0b0be12c4468" +
|
||||
"9639e7d3ce74db101a65aa2b87f64c6826db3ec72f" +
|
||||
"4b5599834bb4edb02f7c90e9a496d3a55d535bebfc" +
|
||||
"45d4f619f63f3dedbb873925c2f224e07731296da8" +
|
||||
"87ec1e4748f87efb5fdeb75484316b2232dee553dd" +
|
||||
"af02112b0d1f02da30973224fe27aeda8b9d4b2922" +
|
||||
"d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1" +
|
||||
"ef17dbde", 16);
|
||||
dsaCache.put(Integer.valueOf(2048+224),
|
||||
new DSAParameterSpec(p2048_224, q2048_224, g2048_224));
|
||||
|
||||
/*
|
||||
* L = 2048, N = 256
|
||||
* SEED = b0b4417601b59cbc9d8ac8f935cadaec4f5fbb2f23785609ae466748d9b5a536
|
||||
* counter = 497
|
||||
*/
|
||||
BigInteger p2048_256 =
|
||||
new BigInteger("95475cf5d93e596c3fcd1d902add02f427f5f3c721" +
|
||||
"0313bb45fb4d5bb2e5fe1cbd678cd4bbdd84c9836b" +
|
||||
"e1f31c0777725aeb6c2fc38b85f48076fa76bcd814" +
|
||||
"6cc89a6fb2f706dd719898c2083dc8d896f84062e2" +
|
||||
"c9c94d137b054a8d8096adb8d51952398eeca852a0" +
|
||||
"af12df83e475aa65d4ec0c38a9560d5661186ff98b" +
|
||||
"9fc9eb60eee8b030376b236bc73be3acdbd74fd61c" +
|
||||
"1d2475fa3077b8f080467881ff7e1ca56fee066d79" +
|
||||
"506ade51edbb5443a563927dbc4ba520086746175c" +
|
||||
"8885925ebc64c6147906773496990cb714ec667304" +
|
||||
"e261faee33b3cbdf008e0c3fa90650d97d3909c927" +
|
||||
"5bf4ac86ffcb3d03e6dfc8ada5934242dd6d3bcca2" +
|
||||
"a406cb0b", 16);
|
||||
|
||||
BigInteger q2048_256 =
|
||||
new BigInteger("f8183668ba5fc5bb06b5981e6d8b795d30b8978d43" +
|
||||
"ca0ec572e37e09939a9773", 16);
|
||||
|
||||
BigInteger g2048_256 =
|
||||
new BigInteger("42debb9da5b3d88cc956e08787ec3f3a09bba5f48b" +
|
||||
"889a74aaf53174aa0fbe7e3c5b8fcd7a53bef563b0" +
|
||||
"e98560328960a9517f4014d3325fc7962bf1e04937" +
|
||||
"0d76d1314a76137e792f3f0db859d095e4a5b93202" +
|
||||
"4f079ecf2ef09c797452b0770e1350782ed57ddf79" +
|
||||
"4979dcef23cb96f183061965c4ebc93c9c71c56b92" +
|
||||
"5955a75f94cccf1449ac43d586d0beee43251b0b22" +
|
||||
"87349d68de0d144403f13e802f4146d882e057af19" +
|
||||
"b6f6275c6676c8fa0e3ca2713a3257fd1b27d0639f" +
|
||||
"695e347d8d1cf9ac819a26ca9b04cb0eb9b7b03598" +
|
||||
"8d15bbac65212a55239cfc7e58fae38d7250ab9991" +
|
||||
"ffbc97134025fe8ce04c4399ad96569be91a546f49" +
|
||||
"78693c7a", 16);
|
||||
dsaCache.put(Integer.valueOf(2048+256),
|
||||
new DSAParameterSpec(p2048_256, q2048_256, g2048_256));
|
||||
|
||||
// use DSA parameters for DH as well
|
||||
dhCache.put(Integer.valueOf(512), new DHParameterSpec(p512, g512));
|
||||
dhCache.put(Integer.valueOf(768), new DHParameterSpec(p768, g768));
|
||||
dhCache.put(Integer.valueOf(1024), new DHParameterSpec(p1024, g1024));
|
||||
dhCache.put(Integer.valueOf(2048), new DHParameterSpec(p2048_224, g2048_224));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -47,6 +47,10 @@ import java.security.*;
|
||||
* SHA-2 family of hash functions includes SHA-224, SHA-256, SHA-384,
|
||||
* and SHA-512.
|
||||
*
|
||||
* - SHA-224withDSA/SHA-256withDSA are the signature schemes
|
||||
* described in FIPS 186-3. The associated object identifiers are
|
||||
* "OID.2.16.840.1.101.3.4.3.1", and "OID.2.16.840.1.101.3.4.3.2".
|
||||
|
||||
* - DSA is the key generation scheme as described in FIPS 186.
|
||||
* Aliases for DSA include the OID strings "OID.1.3.14.3.2.12"
|
||||
* and "OID.1.2.840.10040.4.1".
|
||||
@ -106,11 +110,15 @@ final class SunEntries {
|
||||
map.put("Signature.SHA1withDSA", "sun.security.provider.DSA$SHA1withDSA");
|
||||
map.put("Signature.NONEwithDSA", "sun.security.provider.DSA$RawDSA");
|
||||
map.put("Alg.Alias.Signature.RawDSA", "NONEwithDSA");
|
||||
map.put("Signature.SHA224withDSA", "sun.security.provider.DSA$SHA224withDSA");
|
||||
map.put("Signature.SHA256withDSA", "sun.security.provider.DSA$SHA256withDSA");
|
||||
|
||||
String dsaKeyClasses = "java.security.interfaces.DSAPublicKey" +
|
||||
"|java.security.interfaces.DSAPrivateKey";
|
||||
map.put("Signature.SHA1withDSA SupportedKeyClasses", dsaKeyClasses);
|
||||
map.put("Signature.NONEwithDSA SupportedKeyClasses", dsaKeyClasses);
|
||||
map.put("Signature.SHA224withDSA SupportedKeyClasses", dsaKeyClasses);
|
||||
map.put("Signature.SHA256withDSA SupportedKeyClasses", dsaKeyClasses);
|
||||
|
||||
map.put("Alg.Alias.Signature.DSA", "SHA1withDSA");
|
||||
map.put("Alg.Alias.Signature.DSS", "SHA1withDSA");
|
||||
@ -124,6 +132,10 @@ final class SunEntries {
|
||||
map.put("Alg.Alias.Signature.1.2.840.10040.4.3", "SHA1withDSA");
|
||||
map.put("Alg.Alias.Signature.1.3.14.3.2.13", "SHA1withDSA");
|
||||
map.put("Alg.Alias.Signature.1.3.14.3.2.27", "SHA1withDSA");
|
||||
map.put("Alg.Alias.Signature.OID.2.16.840.1.101.3.4.3.1", "SHA224withDSA");
|
||||
map.put("Alg.Alias.Signature.2.16.840.1.101.3.4.3.1", "SHA224withDSA");
|
||||
map.put("Alg.Alias.Signature.OID.2.16.840.1.101.3.4.3.2", "SHA256withDSA");
|
||||
map.put("Alg.Alias.Signature.2.16.840.1.101.3.4.3.2", "SHA256withDSA");
|
||||
|
||||
/*
|
||||
* Key Pair Generator engines
|
||||
@ -143,6 +155,8 @@ final class SunEntries {
|
||||
|
||||
map.put("Alg.Alias.MessageDigest.SHA-1", "SHA");
|
||||
map.put("Alg.Alias.MessageDigest.SHA1", "SHA");
|
||||
map.put("Alg.Alias.MessageDigest.1.3.14.3.2.26", "SHA");
|
||||
map.put("Alg.Alias.MessageDigest.OID.1.3.14.3.2.26", "SHA");
|
||||
|
||||
map.put("MessageDigest.SHA-224", "sun.security.provider.SHA2$SHA224");
|
||||
map.put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.4", "SHA-224");
|
||||
@ -169,15 +183,17 @@ final class SunEntries {
|
||||
*/
|
||||
map.put("AlgorithmParameters.DSA",
|
||||
"sun.security.provider.DSAParameters");
|
||||
map.put("Alg.Alias.AlgorithmParameters.1.3.14.3.2.12", "DSA");
|
||||
map.put("Alg.Alias.AlgorithmParameters.OID.1.2.840.10040.4.1", "DSA");
|
||||
map.put("Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1", "DSA");
|
||||
map.put("Alg.Alias.AlgorithmParameters.1.3.14.3.2.12", "DSA");
|
||||
|
||||
/*
|
||||
* Key factories
|
||||
*/
|
||||
map.put("KeyFactory.DSA", "sun.security.provider.DSAKeyFactory");
|
||||
map.put("Alg.Alias.KeyFactory.1.3.14.3.2.12", "DSA");
|
||||
map.put("Alg.Alias.KeyFactory.OID.1.2.840.10040.4.1", "DSA");
|
||||
map.put("Alg.Alias.KeyFactory.1.2.840.10040.4.1", "DSA");
|
||||
map.put("Alg.Alias.KeyFactory.1.3.14.3.2.12", "DSA");
|
||||
|
||||
/*
|
||||
* Certificates
|
||||
@ -234,9 +250,13 @@ final class SunEntries {
|
||||
/*
|
||||
* KeySize
|
||||
*/
|
||||
map.put("Signature.NONEwithDSA KeySize", "1024");
|
||||
map.put("Signature.SHA1withDSA KeySize", "1024");
|
||||
map.put("KeyPairGenerator.DSA KeySize", "1024");
|
||||
map.put("AlgorithmParameterGenerator.DSA KeySize", "1024");
|
||||
map.put("Signature.SHA224withDSA KeySize", "2048");
|
||||
map.put("Signature.SHA256withDSA KeySize", "2048");
|
||||
|
||||
map.put("KeyPairGenerator.DSA KeySize", "2048");
|
||||
map.put("AlgorithmParameterGenerator.DSA KeySize", "2048");
|
||||
|
||||
/*
|
||||
* Implementation type: software or hardware
|
||||
|
||||
@ -498,6 +498,9 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
if (name.equalsIgnoreCase("EC")) {
|
||||
return EC_oid;
|
||||
}
|
||||
if (name.equalsIgnoreCase("ECDH")) {
|
||||
return AlgorithmId.ECDH_oid;
|
||||
}
|
||||
|
||||
// Common signature types
|
||||
if (name.equalsIgnoreCase("MD5withRSA")
|
||||
@ -517,6 +520,12 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
|| name.equalsIgnoreCase("SHA-1/DSA")) {
|
||||
return AlgorithmId.sha1WithDSA_oid;
|
||||
}
|
||||
if (name.equalsIgnoreCase("SHA224WithDSA")) {
|
||||
return AlgorithmId.sha224WithDSA_oid;
|
||||
}
|
||||
if (name.equalsIgnoreCase("SHA256WithDSA")) {
|
||||
return AlgorithmId.sha256WithDSA_oid;
|
||||
}
|
||||
if (name.equalsIgnoreCase("SHA1WithRSA")
|
||||
|| name.equalsIgnoreCase("SHA1/RSA")) {
|
||||
return AlgorithmId.sha1WithRSAEncryption_oid;
|
||||
@ -647,6 +656,7 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
public static final ObjectIdentifier DSA_oid;
|
||||
public static final ObjectIdentifier DSA_OIW_oid;
|
||||
public static final ObjectIdentifier EC_oid = oid(1, 2, 840, 10045, 2, 1);
|
||||
public static final ObjectIdentifier ECDH_oid = oid(1, 3, 132, 1, 12);
|
||||
public static final ObjectIdentifier RSA_oid;
|
||||
public static final ObjectIdentifier RSAEncryption_oid;
|
||||
|
||||
@ -687,6 +697,10 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
public static final ObjectIdentifier shaWithDSA_OIW_oid;
|
||||
public static final ObjectIdentifier sha1WithDSA_OIW_oid;
|
||||
public static final ObjectIdentifier sha1WithDSA_oid;
|
||||
public static final ObjectIdentifier sha224WithDSA_oid =
|
||||
oid(2, 16, 840, 1, 101, 3, 4, 3, 1);
|
||||
public static final ObjectIdentifier sha256WithDSA_oid =
|
||||
oid(2, 16, 840, 1, 101, 3, 4, 3, 2);
|
||||
|
||||
public static final ObjectIdentifier sha1WithECDSA_oid =
|
||||
oid(1, 2, 840, 10045, 4, 1);
|
||||
@ -718,7 +732,6 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
public static ObjectIdentifier pbeWithSHA1AndRC2_40_oid =
|
||||
ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 12, 1, 6});
|
||||
|
||||
|
||||
static {
|
||||
/*
|
||||
* Note the preferred OIDs are named simply with no "OIW" or
|
||||
@ -878,6 +891,8 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
nameTable.put(DSA_oid, "DSA");
|
||||
nameTable.put(DSA_OIW_oid, "DSA");
|
||||
nameTable.put(EC_oid, "EC");
|
||||
nameTable.put(ECDH_oid, "ECDH");
|
||||
|
||||
nameTable.put(sha1WithECDSA_oid, "SHA1withECDSA");
|
||||
nameTable.put(sha224WithECDSA_oid, "SHA224withECDSA");
|
||||
nameTable.put(sha256WithECDSA_oid, "SHA256withECDSA");
|
||||
@ -888,6 +903,8 @@ public class AlgorithmId implements Serializable, DerEncoder {
|
||||
nameTable.put(sha1WithDSA_oid, "SHA1withDSA");
|
||||
nameTable.put(sha1WithDSA_OIW_oid, "SHA1withDSA");
|
||||
nameTable.put(shaWithDSA_OIW_oid, "SHA1withDSA");
|
||||
nameTable.put(sha224WithDSA_oid, "SHA224withDSA");
|
||||
nameTable.put(sha256WithDSA_oid, "SHA256withDSA");
|
||||
nameTable.put(sha1WithRSAEncryption_oid, "SHA1withRSA");
|
||||
nameTable.put(sha1WithRSAEncryption_OIW_oid, "SHA1withRSA");
|
||||
nameTable.put(sha224WithRSAEncryption_oid, "SHA224withRSA");
|
||||
|
||||
@ -1,177 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code 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
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.security.x509;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Enumeration;
|
||||
|
||||
import sun.security.util.*;
|
||||
|
||||
/**
|
||||
* This class defines the subject/issuer unique identity attribute
|
||||
* for the Certificate.
|
||||
*
|
||||
* @author Amit Kapoor
|
||||
* @author Hemma Prafullchandra
|
||||
* @see CertAttrSet
|
||||
*/
|
||||
public class CertificateIssuerUniqueIdentity implements CertAttrSet<String> {
|
||||
private UniqueIdentity id;
|
||||
|
||||
/**
|
||||
* Identifier for this attribute, to be used with the
|
||||
* get, set, delete methods of Certificate, x509 type.
|
||||
*/
|
||||
public static final String IDENT = "x509.info.issuerID";
|
||||
/**
|
||||
* Sub attributes name for this CertAttrSet.
|
||||
*/
|
||||
public static final String NAME = "issuerID";
|
||||
public static final String ID = "id";
|
||||
|
||||
/**
|
||||
* Default constructor for the certificate attribute.
|
||||
*
|
||||
* @param key the UniqueIdentity
|
||||
*/
|
||||
public CertificateIssuerUniqueIdentity(UniqueIdentity id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object, decoding the values from the passed DER stream.
|
||||
*
|
||||
* @param in the DerInputStream to read the UniqueIdentity from.
|
||||
* @exception IOException on decoding errors.
|
||||
*/
|
||||
public CertificateIssuerUniqueIdentity(DerInputStream in)
|
||||
throws IOException {
|
||||
id = new UniqueIdentity(in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object, decoding the values from the passed stream.
|
||||
*
|
||||
* @param in the InputStream to read the UniqueIdentity from.
|
||||
* @exception IOException on decoding errors.
|
||||
*/
|
||||
public CertificateIssuerUniqueIdentity(InputStream in)
|
||||
throws IOException {
|
||||
DerValue val = new DerValue(in);
|
||||
id = new UniqueIdentity(val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object, decoding the values from the passed DER value.
|
||||
*
|
||||
* @param in the DerValue to read the UniqueIdentity from.
|
||||
* @exception IOException on decoding errors.
|
||||
*/
|
||||
public CertificateIssuerUniqueIdentity(DerValue val)
|
||||
throws IOException {
|
||||
id = new UniqueIdentity(val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the identity as user readable string.
|
||||
*/
|
||||
public String toString() {
|
||||
if (id == null) return "";
|
||||
return (id.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode the identity in DER form to the stream.
|
||||
*
|
||||
* @param out the DerOutputStream to marshal the contents to.
|
||||
* @exception IOException on errors.
|
||||
*/
|
||||
public void encode(OutputStream out) throws IOException {
|
||||
DerOutputStream tmp = new DerOutputStream();
|
||||
id.encode(tmp,DerValue.createTag(DerValue.TAG_CONTEXT,false,(byte)1));
|
||||
|
||||
out.write(tmp.toByteArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the attribute value.
|
||||
*/
|
||||
public void set(String name, Object obj) throws IOException {
|
||||
if (!(obj instanceof UniqueIdentity)) {
|
||||
throw new IOException("Attribute must be of type UniqueIdentity.");
|
||||
}
|
||||
if (name.equalsIgnoreCase(ID)) {
|
||||
id = (UniqueIdentity)obj;
|
||||
} else {
|
||||
throw new IOException("Attribute name not recognized by " +
|
||||
"CertAttrSet: CertificateIssuerUniqueIdentity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attribute value.
|
||||
*/
|
||||
public UniqueIdentity get(String name) throws IOException {
|
||||
if (name.equalsIgnoreCase(ID)) {
|
||||
return (id);
|
||||
} else {
|
||||
throw new IOException("Attribute name not recognized by " +
|
||||
"CertAttrSet: CertificateIssuerUniqueIdentity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the attribute value.
|
||||
*/
|
||||
public void delete(String name) throws IOException {
|
||||
if (name.equalsIgnoreCase(ID)) {
|
||||
id = null;
|
||||
} else {
|
||||
throw new IOException("Attribute name not recognized by " +
|
||||
"CertAttrSet: CertificateIssuerUniqueIdentity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an enumeration of names of attributes existing within this
|
||||
* attribute.
|
||||
*/
|
||||
public Enumeration<String> getElements() {
|
||||
AttributeNameEnumeration elements = new AttributeNameEnumeration();
|
||||
elements.addElement(ID);
|
||||
|
||||
return (elements.elements());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of this attribute.
|
||||
*/
|
||||
public String getName() {
|
||||
return (NAME);
|
||||
}
|
||||
}
|
||||
@ -1,176 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code 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
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package sun.security.x509;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Enumeration;
|
||||
|
||||
import sun.security.util.*;
|
||||
|
||||
/**
|
||||
* This class defines the subject/issuer unique identity attribute
|
||||
* for the Certificate.
|
||||
*
|
||||
* @author Amit Kapoor
|
||||
* @author Hemma Prafullchandra
|
||||
* @see CertAttrSet
|
||||
*/
|
||||
public class CertificateSubjectUniqueIdentity implements CertAttrSet<String> {
|
||||
/**
|
||||
* Identifier for this attribute, to be used with the
|
||||
* get, set, delete methods of Certificate, x509 type.
|
||||
*/
|
||||
public static final String IDENT = "x509.info.subjectID";
|
||||
/**
|
||||
* Sub attributes name for this CertAttrSet.
|
||||
*/
|
||||
public static final String NAME = "subjectID";
|
||||
public static final String ID = "id";
|
||||
|
||||
private UniqueIdentity id;
|
||||
|
||||
/**
|
||||
* Default constructor for the certificate attribute.
|
||||
*
|
||||
* @param key the UniqueIdentity
|
||||
*/
|
||||
public CertificateSubjectUniqueIdentity(UniqueIdentity id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object, decoding the values from the passed DER stream.
|
||||
*
|
||||
* @param in the DerInputStream to read the UniqueIdentity from.
|
||||
* @exception IOException on decoding errors.
|
||||
*/
|
||||
public CertificateSubjectUniqueIdentity(DerInputStream in)
|
||||
throws IOException {
|
||||
id = new UniqueIdentity(in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object, decoding the values from the passed stream.
|
||||
*
|
||||
* @param in the InputStream to read the UniqueIdentity from.
|
||||
* @exception IOException on decoding errors.
|
||||
*/
|
||||
public CertificateSubjectUniqueIdentity(InputStream in)
|
||||
throws IOException {
|
||||
DerValue val = new DerValue(in);
|
||||
id = new UniqueIdentity(val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object, decoding the values from the passed DER value.
|
||||
*
|
||||
* @param in the DerValue to read the UniqueIdentity from.
|
||||
* @exception IOException on decoding errors.
|
||||
*/
|
||||
public CertificateSubjectUniqueIdentity(DerValue val)
|
||||
throws IOException {
|
||||
id = new UniqueIdentity(val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the identity as user readable string.
|
||||
*/
|
||||
public String toString() {
|
||||
if (id == null) return "";
|
||||
return(id.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode the identity in DER form to the stream.
|
||||
*
|
||||
* @param out the DerOutputStream to marshal the contents to.
|
||||
* @exception IOException on errors.
|
||||
*/
|
||||
public void encode(OutputStream out) throws IOException {
|
||||
DerOutputStream tmp = new DerOutputStream();
|
||||
id.encode(tmp,DerValue.createTag(DerValue.TAG_CONTEXT,false,(byte)2));
|
||||
|
||||
out.write(tmp.toByteArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the attribute value.
|
||||
*/
|
||||
public void set(String name, Object obj) throws IOException {
|
||||
if (!(obj instanceof UniqueIdentity)) {
|
||||
throw new IOException("Attribute must be of type UniqueIdentity.");
|
||||
}
|
||||
if (name.equalsIgnoreCase(ID)) {
|
||||
id = (UniqueIdentity)obj;
|
||||
} else {
|
||||
throw new IOException("Attribute name not recognized by " +
|
||||
"CertAttrSet: CertificateSubjectUniqueIdentity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attribute value.
|
||||
*/
|
||||
public UniqueIdentity get(String name) throws IOException {
|
||||
if (name.equalsIgnoreCase(ID)) {
|
||||
return(id);
|
||||
} else {
|
||||
throw new IOException("Attribute name not recognized by " +
|
||||
"CertAttrSet: CertificateSubjectUniqueIdentity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the attribute value.
|
||||
*/
|
||||
public void delete(String name) throws IOException {
|
||||
if (name.equalsIgnoreCase(ID)) {
|
||||
id = null;
|
||||
} else {
|
||||
throw new IOException("Attribute name not recognized by " +
|
||||
"CertAttrSet: CertificateSubjectUniqueIdentity.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an enumeration of names of attributes existing within this
|
||||
* attribute.
|
||||
*/
|
||||
public Enumeration<String> getElements() {
|
||||
AttributeNameEnumeration elements = new AttributeNameEnumeration();
|
||||
elements.addElement(ID);
|
||||
|
||||
return (elements.elements());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of this attribute.
|
||||
*/
|
||||
public String getName() {
|
||||
return (NAME);
|
||||
}
|
||||
}
|
||||
@ -1070,8 +1070,7 @@ public class X509CertImpl extends X509Certificate implements DerEncoder {
|
||||
return null;
|
||||
try {
|
||||
UniqueIdentity id = (UniqueIdentity)info.get(
|
||||
CertificateIssuerUniqueIdentity.NAME
|
||||
+ DOT + CertificateIssuerUniqueIdentity.ID);
|
||||
X509CertInfo.ISSUER_ID);
|
||||
if (id == null)
|
||||
return null;
|
||||
else
|
||||
@ -1091,8 +1090,7 @@ public class X509CertImpl extends X509Certificate implements DerEncoder {
|
||||
return null;
|
||||
try {
|
||||
UniqueIdentity id = (UniqueIdentity)info.get(
|
||||
CertificateSubjectUniqueIdentity.NAME
|
||||
+ DOT + CertificateSubjectUniqueIdentity.ID);
|
||||
X509CertInfo.SUBJECT_ID);
|
||||
if (id == null)
|
||||
return null;
|
||||
else
|
||||
|
||||
@ -75,8 +75,8 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
public static final String VALIDITY = CertificateValidity.NAME;
|
||||
public static final String SUBJECT = CertificateSubjectName.NAME;
|
||||
public static final String KEY = CertificateX509Key.NAME;
|
||||
public static final String ISSUER_ID = CertificateIssuerUniqueIdentity.NAME;
|
||||
public static final String SUBJECT_ID = CertificateSubjectUniqueIdentity.NAME;
|
||||
public static final String ISSUER_ID = "issuerID";
|
||||
public static final String SUBJECT_ID = "subjectID";
|
||||
public static final String EXTENSIONS = CertificateExtensions.NAME;
|
||||
|
||||
// X509.v1 data
|
||||
@ -89,8 +89,8 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
protected CertificateX509Key pubKey = null;
|
||||
|
||||
// X509.v2 & v3 extensions
|
||||
protected CertificateIssuerUniqueIdentity issuerUniqueId = null;
|
||||
protected CertificateSubjectUniqueIdentity subjectUniqueId = null;
|
||||
protected UniqueIdentity issuerUniqueId = null;
|
||||
protected UniqueIdentity subjectUniqueId = null;
|
||||
|
||||
// X509.v3 extensions
|
||||
protected CertificateExtensions extensions = null;
|
||||
@ -431,19 +431,11 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
break;
|
||||
|
||||
case ATTR_ISSUER_ID:
|
||||
if (suffix == null) {
|
||||
setIssuerUniqueId(val);
|
||||
} else {
|
||||
issuerUniqueId.set(suffix, val);
|
||||
}
|
||||
setIssuerUniqueId(val);
|
||||
break;
|
||||
|
||||
case ATTR_SUBJECT_ID:
|
||||
if (suffix == null) {
|
||||
setSubjectUniqueId(val);
|
||||
} else {
|
||||
subjectUniqueId.set(suffix, val);
|
||||
}
|
||||
setSubjectUniqueId(val);
|
||||
break;
|
||||
|
||||
case ATTR_EXTENSIONS:
|
||||
@ -529,18 +521,10 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
}
|
||||
break;
|
||||
case (ATTR_ISSUER_ID):
|
||||
if (suffix == null) {
|
||||
issuerUniqueId = null;
|
||||
} else {
|
||||
issuerUniqueId.delete(suffix);
|
||||
}
|
||||
issuerUniqueId = null;
|
||||
break;
|
||||
case (ATTR_SUBJECT_ID):
|
||||
if (suffix == null) {
|
||||
subjectUniqueId = null;
|
||||
} else {
|
||||
subjectUniqueId.delete(suffix);
|
||||
}
|
||||
subjectUniqueId = null;
|
||||
break;
|
||||
case (ATTR_EXTENSIONS):
|
||||
if (suffix == null) {
|
||||
@ -626,23 +610,9 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
return(serialNum.get(suffix));
|
||||
}
|
||||
case (ATTR_ISSUER_ID):
|
||||
if (suffix == null) {
|
||||
return(issuerUniqueId);
|
||||
} else {
|
||||
if (issuerUniqueId == null)
|
||||
return null;
|
||||
else
|
||||
return(issuerUniqueId.get(suffix));
|
||||
}
|
||||
return(issuerUniqueId);
|
||||
case (ATTR_SUBJECT_ID):
|
||||
if (suffix == null) {
|
||||
return(subjectUniqueId);
|
||||
} else {
|
||||
if (subjectUniqueId == null)
|
||||
return null;
|
||||
else
|
||||
return(subjectUniqueId.get(suffix));
|
||||
}
|
||||
return(subjectUniqueId);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@ -711,7 +681,7 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
// Get the issuerUniqueId if present
|
||||
tmp = in.getDerValue();
|
||||
if (tmp.isContextSpecific((byte)1)) {
|
||||
issuerUniqueId = new CertificateIssuerUniqueIdentity(tmp);
|
||||
issuerUniqueId = new UniqueIdentity(tmp);
|
||||
if (in.available() == 0)
|
||||
return;
|
||||
tmp = in.getDerValue();
|
||||
@ -719,7 +689,7 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
|
||||
// Get the subjectUniqueId if present.
|
||||
if (tmp.isContextSpecific((byte)2)) {
|
||||
subjectUniqueId = new CertificateSubjectUniqueIdentity(tmp);
|
||||
subjectUniqueId = new UniqueIdentity(tmp);
|
||||
if (in.available() == 0)
|
||||
return;
|
||||
tmp = in.getDerValue();
|
||||
@ -814,10 +784,12 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
|
||||
// Encode issuerUniqueId & subjectUniqueId.
|
||||
if (issuerUniqueId != null) {
|
||||
issuerUniqueId.encode(tmp);
|
||||
issuerUniqueId.encode(tmp, DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
false,(byte)1));
|
||||
}
|
||||
if (subjectUniqueId != null) {
|
||||
subjectUniqueId.encode(tmp);
|
||||
subjectUniqueId.encode(tmp, DerValue.createTag(DerValue.TAG_CONTEXT,
|
||||
false,(byte)2));
|
||||
}
|
||||
|
||||
// Write all the extensions.
|
||||
@ -946,11 +918,11 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
if (version.compare(CertificateVersion.V2) < 0) {
|
||||
throw new CertificateException("Invalid version");
|
||||
}
|
||||
if (!(val instanceof CertificateIssuerUniqueIdentity)) {
|
||||
if (!(val instanceof UniqueIdentity)) {
|
||||
throw new CertificateException(
|
||||
"IssuerUniqueId class type invalid.");
|
||||
}
|
||||
issuerUniqueId = (CertificateIssuerUniqueIdentity)val;
|
||||
issuerUniqueId = (UniqueIdentity)val;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -963,11 +935,11 @@ public class X509CertInfo implements CertAttrSet<String> {
|
||||
if (version.compare(CertificateVersion.V2) < 0) {
|
||||
throw new CertificateException("Invalid version");
|
||||
}
|
||||
if (!(val instanceof CertificateSubjectUniqueIdentity)) {
|
||||
if (!(val instanceof UniqueIdentity)) {
|
||||
throw new CertificateException(
|
||||
"SubjectUniqueId class type invalid.");
|
||||
}
|
||||
subjectUniqueId = (CertificateSubjectUniqueIdentity)val;
|
||||
subjectUniqueId = (UniqueIdentity)val;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -29,6 +29,8 @@
|
||||
#ifdef MACOSX
|
||||
#include <unistd.h>
|
||||
#include <sys/param.h>
|
||||
#else
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#include <mlib_types.h>
|
||||
#include <mlib_sys_proto.h>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -80,6 +80,7 @@
|
||||
# include <sys/types.h>
|
||||
# include <sys/stat.h>
|
||||
# include <fcntl.h>
|
||||
# include "jni.h"
|
||||
# include "manifest_info.h"
|
||||
#endif
|
||||
|
||||
|
||||
@ -29,25 +29,10 @@ import java.awt.*;
|
||||
import java.awt.peer.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
class XCheckboxMenuItemPeer extends XMenuItemPeer implements CheckboxMenuItemPeer {
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* Data members
|
||||
*
|
||||
************************************************/
|
||||
|
||||
/*
|
||||
* CheckboxMenuItem's fields
|
||||
*/
|
||||
private final static Field f_state;
|
||||
static {
|
||||
f_state = SunToolkit.getField(CheckboxMenuItem.class, "state");
|
||||
}
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* Construction
|
||||
@ -74,16 +59,8 @@ class XCheckboxMenuItemPeer extends XMenuItemPeer implements CheckboxMenuItemPee
|
||||
*
|
||||
************************************************/
|
||||
boolean getTargetState() {
|
||||
MenuItem target = getTarget();
|
||||
if (target == null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return f_state.getBoolean(target);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
return AWTAccessor.getCheckboxMenuItemAccessor()
|
||||
.getState((CheckboxMenuItem)getTarget());
|
||||
}
|
||||
|
||||
/************************************************
|
||||
|
||||
@ -29,13 +29,8 @@ import java.awt.*;
|
||||
import java.awt.dnd.DropTarget;
|
||||
import java.awt.dnd.DropTargetListener;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.ColorModel;
|
||||
import java.awt.image.ImageObserver;
|
||||
import java.awt.image.ImageProducer;
|
||||
import java.awt.image.VolatileImage;
|
||||
import java.awt.peer.*;
|
||||
import sun.awt.*;
|
||||
import java.lang.reflect.*;
|
||||
import sun.awt.AWTAccessor;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
import java.util.*;
|
||||
import static sun.awt.X11.XEmbedHelper.*;
|
||||
@ -454,16 +449,8 @@ public class XEmbedCanvasPeer extends XCanvasPeer implements WindowFocusListener
|
||||
}
|
||||
}
|
||||
|
||||
static Field bdataField;
|
||||
static byte[] getBData(KeyEvent e) {
|
||||
try {
|
||||
if (bdataField == null) {
|
||||
bdataField = SunToolkit.getField(java.awt.AWTEvent.class, "bdata");
|
||||
}
|
||||
return (byte[])bdataField.get(e);
|
||||
} catch (IllegalAccessException ex) {
|
||||
return null;
|
||||
}
|
||||
return AWTAccessor.getAWTEventAccessor().getBData(e);
|
||||
}
|
||||
|
||||
void forwardKeyEvent(KeyEvent e) {
|
||||
|
||||
@ -29,7 +29,7 @@ import java.awt.*;
|
||||
import java.util.HashMap;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.lang.reflect.*;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
public class XEmbeddingContainer extends XEmbedHelper implements XEventDispatcher {
|
||||
HashMap children = new HashMap();
|
||||
@ -127,20 +127,8 @@ public class XEmbeddingContainer extends XEmbedHelper implements XEventDispatche
|
||||
}
|
||||
}
|
||||
|
||||
static Field bdata;
|
||||
byte[] getBData(KeyEvent e) {
|
||||
try {
|
||||
if (bdata == null) {
|
||||
bdata = SunToolkit.getField(java.awt.AWTEvent.class, "bdata");
|
||||
}
|
||||
return (byte[])bdata.get(e);
|
||||
} catch (IllegalAccessException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
void forwardKeyEvent(long child, KeyEvent e) {
|
||||
byte[] bdata = getBData(e);
|
||||
byte[] bdata = AWTAccessor.getAWTEventAccessor().getBData(e);
|
||||
long data = Native.toData(bdata);
|
||||
if (data == 0) {
|
||||
return;
|
||||
|
||||
@ -27,10 +27,7 @@ package sun.awt.X11;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.peer.ComponentPeer;
|
||||
import java.awt.peer.LightweightPeer;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
import sun.awt.GlobalCursorManager;
|
||||
@ -38,23 +35,6 @@ import sun.awt.SunToolkit;
|
||||
|
||||
public final class XGlobalCursorManager extends GlobalCursorManager {
|
||||
|
||||
private static Field field_pData;
|
||||
private static Field field_type;
|
||||
private static Class cursorClass;
|
||||
private static Method method_setPData;
|
||||
static {
|
||||
cursorClass = java.awt.Cursor.class;
|
||||
field_pData = SunToolkit.getField(cursorClass, "pData");
|
||||
field_type = SunToolkit.getField(cursorClass, "type");
|
||||
method_setPData = SunToolkit.getMethod(cursorClass, "setPData", new Class[] {long.class});
|
||||
if (field_pData == null || field_type == null || method_setPData == null) {
|
||||
System.out.println("Unable to initialize XGlobalCursorManager: ");
|
||||
Thread.dumpStack();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// cached nativeContainer
|
||||
private WeakReference<Component> nativeContainer;
|
||||
|
||||
@ -213,8 +193,8 @@ public final class XGlobalCursorManager extends GlobalCursorManager {
|
||||
long pData = 0;
|
||||
int type = 0;
|
||||
try {
|
||||
pData = field_pData.getLong(c);
|
||||
type = field_type.getInt(c);
|
||||
pData = AWTAccessor.getCursorAccessor().getPData(c);
|
||||
type = AWTAccessor.getCursorAccessor().getType(c);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@ -284,7 +264,7 @@ public final class XGlobalCursorManager extends GlobalCursorManager {
|
||||
|
||||
static void setPData(Cursor c, long pData) {
|
||||
try {
|
||||
method_setPData.invoke(c, pData);
|
||||
AWTAccessor.getCursorAccessor().setPData(c, pData);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@ -28,10 +28,9 @@ import java.awt.*;
|
||||
import java.awt.peer.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Vector;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
public class XMenuBarPeer extends XBaseMenuWindow implements MenuBarPeer {
|
||||
|
||||
@ -67,15 +66,6 @@ public class XMenuBarPeer extends XBaseMenuWindow implements MenuBarPeer {
|
||||
private final static int BAR_ITEM_MARGIN_TOP = 2;
|
||||
private final static int BAR_ITEM_MARGIN_BOTTOM = 2;
|
||||
|
||||
//fields
|
||||
private static Field f_helpMenu;
|
||||
private static Field f_menus;
|
||||
|
||||
static {
|
||||
f_helpMenu = SunToolkit.getField(MenuBar.class, "helpMenu");
|
||||
f_menus = SunToolkit.getField(MenuBar.class, "menus");
|
||||
}
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* Mapping data
|
||||
@ -204,16 +194,12 @@ public class XMenuBarPeer extends XBaseMenuWindow implements MenuBarPeer {
|
||||
*/
|
||||
void postInit(XCreateWindowParams params) {
|
||||
super.postInit(params);
|
||||
Vector targetMenuVector = null;
|
||||
Menu targetHelpMenu = null;
|
||||
try {
|
||||
// Get menus from the target.
|
||||
targetMenuVector = (Vector)f_menus.get(menuBarTarget);
|
||||
targetHelpMenu = (Menu)f_helpMenu.get(menuBarTarget);
|
||||
reloadItems(targetMenuVector);
|
||||
} catch (IllegalAccessException iae) {
|
||||
iae.printStackTrace();
|
||||
}
|
||||
// Get menus from the target.
|
||||
Vector targetMenuVector = AWTAccessor.getMenuBarAccessor()
|
||||
.getMenus(menuBarTarget);
|
||||
Menu targetHelpMenu = AWTAccessor.getMenuBarAccessor()
|
||||
.getHelpMenu(menuBarTarget);
|
||||
reloadItems(targetMenuVector);
|
||||
if (targetHelpMenu != null) {
|
||||
addHelpMenu(targetHelpMenu);
|
||||
}
|
||||
|
||||
@ -28,10 +28,7 @@ import java.awt.*;
|
||||
import java.awt.peer.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
public class XMenuItemPeer implements MenuItemPeer {
|
||||
|
||||
@ -81,24 +78,6 @@ public class XMenuItemPeer implements MenuItemPeer {
|
||||
private final static int SEPARATOR_WIDTH = 20;
|
||||
private final static int SEPARATOR_HEIGHT = 5;
|
||||
|
||||
/*
|
||||
* MenuItem's fields & methods
|
||||
*/
|
||||
private final static Field f_enabled;
|
||||
private final static Field f_label;
|
||||
private final static Field f_shortcut;
|
||||
private final static Method m_getFont;
|
||||
private final static Method m_isItemEnabled;
|
||||
private final static Method m_getActionCommand;
|
||||
static {
|
||||
f_enabled = SunToolkit.getField(MenuItem.class, "enabled");
|
||||
f_label = SunToolkit.getField(MenuItem.class, "label");
|
||||
f_shortcut = SunToolkit.getField(MenuItem.class, "shortcut");
|
||||
|
||||
m_getFont = SunToolkit.getMethod(MenuComponent.class, "getFont_NoClientCode", null);
|
||||
m_getActionCommand = SunToolkit.getMethod(MenuItem.class, "getActionCommandImpl", null);
|
||||
m_isItemEnabled = SunToolkit.getMethod(MenuItem.class, "isItemEnabled", null);
|
||||
}
|
||||
/************************************************
|
||||
*
|
||||
* Text Metrics
|
||||
@ -216,39 +195,22 @@ public class XMenuItemPeer implements MenuItemPeer {
|
||||
if (target == null) {
|
||||
return XWindow.getDefaultFont();
|
||||
}
|
||||
try {
|
||||
return (Font)m_getFont.invoke(target, new Object[0]);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return XWindow.getDefaultFont();
|
||||
return AWTAccessor.getMenuComponentAccessor().getFont_NoClientCode(target);
|
||||
}
|
||||
|
||||
String getTargetLabel() {
|
||||
if (target == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
String label = (String)f_label.get(target);
|
||||
return (label == null) ? "" : label;
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "";
|
||||
String label = AWTAccessor.getMenuItemAccessor().getLabel(target);
|
||||
return (label == null) ? "" : label;
|
||||
}
|
||||
|
||||
boolean isTargetEnabled() {
|
||||
if (target == null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return f_enabled.getBoolean(target);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
return AWTAccessor.getMenuItemAccessor().isEnabled(target);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -260,40 +222,21 @@ public class XMenuItemPeer implements MenuItemPeer {
|
||||
if (target == null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return ((Boolean)m_isItemEnabled.invoke(target, new Object[0])).booleanValue();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
return AWTAccessor.getMenuItemAccessor().isItemEnabled(target);
|
||||
}
|
||||
|
||||
String getTargetActionCommand() {
|
||||
if (target == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
return (String) m_getActionCommand.invoke(target,(Object[]) null);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "";
|
||||
return AWTAccessor.getMenuItemAccessor().getActionCommandImpl(target);
|
||||
}
|
||||
|
||||
MenuShortcut getTargetShortcut() {
|
||||
if (target == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return (MenuShortcut)f_shortcut.get(target);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
return AWTAccessor.getMenuItemAccessor().getShortcut(target);
|
||||
}
|
||||
|
||||
String getShortcutText() {
|
||||
|
||||
@ -27,10 +27,9 @@ package sun.awt.X11;
|
||||
import java.awt.*;
|
||||
import java.awt.peer.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Vector;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.AWTAccessor;
|
||||
|
||||
public class XMenuPeer extends XMenuItemPeer implements MenuPeer {
|
||||
|
||||
@ -46,16 +45,6 @@ public class XMenuPeer extends XMenuItemPeer implements MenuPeer {
|
||||
*/
|
||||
XMenuWindow menuWindow;
|
||||
|
||||
|
||||
/*
|
||||
* Menu's fields & methods
|
||||
*/
|
||||
private final static Field f_items;
|
||||
|
||||
static {
|
||||
f_items = SunToolkit.getField(Menu.class, "items");
|
||||
}
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* Construction
|
||||
@ -153,12 +142,7 @@ public class XMenuPeer extends XMenuItemPeer implements MenuPeer {
|
||||
*
|
||||
************************************************/
|
||||
Vector getTargetItems() {
|
||||
try {
|
||||
return (Vector)f_items.get(getTarget());
|
||||
} catch (IllegalAccessException iae) {
|
||||
iae.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return AWTAccessor.getMenuAccessor().getItems((Menu)getTarget());
|
||||
}
|
||||
|
||||
/************************************************
|
||||
|
||||
@ -28,15 +28,10 @@ import java.awt.*;
|
||||
import java.awt.peer.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
import java.util.Vector;
|
||||
import sun.awt.AWTAccessor;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
public class XPopupMenuPeer extends XMenuWindow implements PopupMenuPeer {
|
||||
|
||||
/************************************************
|
||||
@ -66,24 +61,6 @@ public class XPopupMenuPeer extends XMenuWindow implements PopupMenuPeer {
|
||||
private final static int CAPTION_MARGIN_TOP = 4;
|
||||
private final static int CAPTION_SEPARATOR_HEIGHT = 6;
|
||||
|
||||
/*
|
||||
* Menu's fields & methods
|
||||
*/
|
||||
//Fix for 6184485: Popup menu is not disabled on XToolkit even when calling setEnabled (false)
|
||||
private final static Field f_enabled;
|
||||
//Fix for 6267144: PIT: Popup menu label is not shown, XToolkit
|
||||
private final static Field f_label;
|
||||
private final static Method m_getFont;
|
||||
private final static Field f_items;
|
||||
|
||||
static {
|
||||
f_enabled = SunToolkit.getField(MenuItem.class, "enabled");
|
||||
f_label = SunToolkit.getField(MenuItem.class, "label");
|
||||
f_items = SunToolkit.getField(Menu.class, "items");
|
||||
m_getFont = SunToolkit.getMethod(MenuComponent.class, "getFont_NoClientCode", null);
|
||||
}
|
||||
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* Construction
|
||||
@ -96,7 +73,7 @@ public class XPopupMenuPeer extends XMenuWindow implements PopupMenuPeer {
|
||||
|
||||
/************************************************
|
||||
*
|
||||
* Implementaion of interface methods
|
||||
* Implementation of interface methods
|
||||
*
|
||||
************************************************/
|
||||
/*
|
||||
@ -189,27 +166,16 @@ public class XPopupMenuPeer extends XMenuWindow implements PopupMenuPeer {
|
||||
if (popupMenuTarget == null) {
|
||||
return XWindow.getDefaultFont();
|
||||
}
|
||||
try {
|
||||
return (Font)m_getFont.invoke(popupMenuTarget, new Object[0]);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return XWindow.getDefaultFont();
|
||||
return AWTAccessor.getMenuComponentAccessor()
|
||||
.getFont_NoClientCode(popupMenuTarget);
|
||||
}
|
||||
|
||||
//Fix for 6267144: PIT: Popup menu label is not shown, XToolkit
|
||||
String getTargetLabel() {
|
||||
if (target == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
String label = (String)f_label.get(popupMenuTarget);
|
||||
return (label == null) ? "" : label;
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "";
|
||||
return AWTAccessor.getMenuItemAccessor().getLabel(popupMenuTarget);
|
||||
}
|
||||
|
||||
//Fix for 6184485: Popup menu is not disabled on XToolkit even when calling setEnabled (false)
|
||||
@ -217,21 +183,14 @@ public class XPopupMenuPeer extends XMenuWindow implements PopupMenuPeer {
|
||||
if (popupMenuTarget == null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return f_enabled.getBoolean(popupMenuTarget);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
return AWTAccessor.getMenuItemAccessor().isEnabled(popupMenuTarget);
|
||||
}
|
||||
|
||||
Vector getMenuTargetItems() {
|
||||
try {
|
||||
return (Vector)f_items.get(popupMenuTarget);
|
||||
} catch (IllegalAccessException iae) {
|
||||
iae.printStackTrace();
|
||||
if (popupMenuTarget == null) {
|
||||
return null;
|
||||
}
|
||||
return AWTAccessor.getMenuAccessor().getItems(popupMenuTarget);
|
||||
}
|
||||
|
||||
/************************************************
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user