Merge
This commit is contained in:
commit
8d2e7d667d
@ -129,6 +129,9 @@ JAVACFLAGS += $(OTHER_JAVACFLAGS)
|
|||||||
# Needed for javah
|
# Needed for javah
|
||||||
JAVAHFLAGS += -bootclasspath $(CLASSBINDIR)
|
JAVAHFLAGS += -bootclasspath $(CLASSBINDIR)
|
||||||
|
|
||||||
|
# Needed for JAVADOC and BOOT_JAVACFLAGS
|
||||||
|
NO_PROPRIETARY_API_WARNINGS = -XDignore.symbol.file=true
|
||||||
|
|
||||||
# Langtools
|
# Langtools
|
||||||
ifdef LANGTOOLS_DIST
|
ifdef LANGTOOLS_DIST
|
||||||
JAVAC_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/javac.jar
|
JAVAC_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/javac.jar
|
||||||
@ -192,6 +195,8 @@ endif
|
|||||||
BOOT_JAVACFLAGS += -encoding ascii
|
BOOT_JAVACFLAGS += -encoding ascii
|
||||||
BOOT_JAR_JFLAGS += $(JAR_JFLAGS)
|
BOOT_JAR_JFLAGS += $(JAR_JFLAGS)
|
||||||
|
|
||||||
|
BOOT_JAVACFLAGS += $(NO_PROPRIETARY_API_WARNINGS)
|
||||||
|
|
||||||
BOOT_JAVA_CMD = $(BOOTDIR)/bin/java $(JAVA_TOOLS_FLAGS)
|
BOOT_JAVA_CMD = $(BOOTDIR)/bin/java $(JAVA_TOOLS_FLAGS)
|
||||||
BOOT_JAVAC_CMD = $(BOOTDIR)/bin/javac $(JAVAC_JVM_FLAGS) $(BOOT_JAVACFLAGS)
|
BOOT_JAVAC_CMD = $(BOOTDIR)/bin/javac $(JAVAC_JVM_FLAGS) $(BOOT_JAVACFLAGS)
|
||||||
BOOT_JAR_CMD = $(BOOTDIR)/bin/jar
|
BOOT_JAR_CMD = $(BOOTDIR)/bin/jar
|
||||||
|
@ -45,6 +45,7 @@ endif
|
|||||||
DOCSTMPDIR = $(TEMPDIR)/doctmp
|
DOCSTMPDIR = $(TEMPDIR)/doctmp
|
||||||
|
|
||||||
COMMON_JAVADOCFLAGS = \
|
COMMON_JAVADOCFLAGS = \
|
||||||
|
$(NO_PROPRIETARY_API_WARNINGS) \
|
||||||
-source 1.5 \
|
-source 1.5 \
|
||||||
-quiet \
|
-quiet \
|
||||||
-use \
|
-use \
|
||||||
|
@ -47,7 +47,7 @@ swing-1.2-beans-debug:
|
|||||||
LOCAL_JAVADOC = $(JAVADOC_CMD) $(JAVADOCFLAGS)
|
LOCAL_JAVADOC = $(JAVADOC_CMD) $(JAVADOCFLAGS)
|
||||||
# get the absolute path to the jar command.
|
# get the absolute path to the jar command.
|
||||||
PREFIX = 1.2
|
PREFIX = 1.2
|
||||||
JAVADOCFLAGS = $(LANGUAGE_VERSION)
|
JAVADOCFLAGS = $(NO_PROPRIETARY_API_WARNINGS) $(LANGUAGE_VERSION)
|
||||||
SWINGPKG = javax/swing
|
SWINGPKG = javax/swing
|
||||||
LOCAL_JAVAC_FLAGS = $(OTHER_JAVACFLAGS)
|
LOCAL_JAVAC_FLAGS = $(OTHER_JAVACFLAGS)
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ a:visited,a:visited code{color:#917E9C}
|
|||||||
<table width="708" border="0" cellspacing="0" cellpadding="3">
|
<table width="708" border="0" cellspacing="0" cellpadding="3">
|
||||||
<tr valign="top">
|
<tr valign="top">
|
||||||
<td width="126" height="35">
|
<td width="126" height="35">
|
||||||
<form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
|
<form name="form1" method="post" action="@@REGISTRATION_URL@@">
|
||||||
<input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
|
<input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
|
||||||
<input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" value="Register My JDK">
|
<input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" value="Register My JDK">
|
||||||
</form></td>
|
</form></td>
|
||||||
|
@ -62,7 +62,7 @@ a:visited,a:visited code{color:#917E9C}
|
|||||||
<p class="style1">必要になるのは、Sun 開発者向けネットワークアカウントまたはその他の Sun オンラインアカウントだけです。 まだアカウントがない場合は、アカウントの作成が求められます。 </p>
|
<p class="style1">必要になるのは、Sun 開発者向けネットワークアカウントまたはその他の Sun オンラインアカウントだけです。 まだアカウントがない場合は、アカウントの作成が求められます。 </p>
|
||||||
<table width="708" border="0" cellspacing="0" cellpadding="3">
|
<table width="708" border="0" cellspacing="0" cellpadding="3">
|
||||||
<tr valign="top">
|
<tr valign="top">
|
||||||
<td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
|
<td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@">
|
||||||
<input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
|
<input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
|
||||||
<input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" value="JDK 製品登録">
|
<input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" value="JDK 製品登録">
|
||||||
</form></td>
|
</form></td>
|
||||||
|
@ -63,7 +63,7 @@ a:visited,a:visited code{color:#917E9C}
|
|||||||
<p class="style1">您需要具有 Sun 开发者网络或其他 Sun 联机帐户。如果您没有,系统将提示您创建一个。 </p>
|
<p class="style1">您需要具有 Sun 开发者网络或其他 Sun 联机帐户。如果您没有,系统将提示您创建一个。 </p>
|
||||||
<table width="708" border="0" cellspacing="0" cellpadding="3">
|
<table width="708" border="0" cellspacing="0" cellpadding="3">
|
||||||
<tr valign="top">
|
<tr valign="top">
|
||||||
<td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
|
<td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@">
|
||||||
<input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
|
<input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
|
||||||
<input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" value="注册我的 JDK">
|
<input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" value="注册我的 JDK">
|
||||||
</form></td>
|
</form></td>
|
||||||
|
@ -3059,14 +3059,12 @@ public final
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public Annotation[] getAnnotations() {
|
public Annotation[] getAnnotations() {
|
||||||
initAnnotationsIfNecessary();
|
initAnnotationsIfNecessary();
|
||||||
return annotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
|
return AnnotationParser.toArray(annotations);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3074,7 +3072,7 @@ public final
|
|||||||
*/
|
*/
|
||||||
public Annotation[] getDeclaredAnnotations() {
|
public Annotation[] getDeclaredAnnotations() {
|
||||||
initAnnotationsIfNecessary();
|
initAnnotationsIfNecessary();
|
||||||
return declaredAnnotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
|
return AnnotationParser.toArray(declaredAnnotations);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Annotations cache
|
// Annotations cache
|
||||||
|
@ -626,13 +626,11 @@ public final
|
|||||||
return (T) declaredAnnotations().get(annotationClass);
|
return (T) declaredAnnotations().get(annotationClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public Annotation[] getDeclaredAnnotations() {
|
public Annotation[] getDeclaredAnnotations() {
|
||||||
return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
|
return AnnotationParser.toArray(declaredAnnotations());
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient Map<Class, Annotation> declaredAnnotations;
|
private transient Map<Class, Annotation> declaredAnnotations;
|
||||||
|
@ -1018,13 +1018,11 @@ class Field extends AccessibleObject implements Member {
|
|||||||
return (T) declaredAnnotations().get(annotationClass);
|
return (T) declaredAnnotations().get(annotationClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public Annotation[] getDeclaredAnnotations() {
|
public Annotation[] getDeclaredAnnotations() {
|
||||||
return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
|
return AnnotationParser.toArray(declaredAnnotations());
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient Map<Class, Annotation> declaredAnnotations;
|
private transient Map<Class, Annotation> declaredAnnotations;
|
||||||
|
@ -705,13 +705,11 @@ public final
|
|||||||
return (T) declaredAnnotations().get(annotationClass);
|
return (T) declaredAnnotations().get(annotationClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public Annotation[] getDeclaredAnnotations() {
|
public Annotation[] getDeclaredAnnotations() {
|
||||||
return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
|
return AnnotationParser.toArray(declaredAnnotations());
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient Map<Class, Annotation> declaredAnnotations;
|
private transient Map<Class, Annotation> declaredAnnotations;
|
||||||
|
@ -113,7 +113,6 @@ import sun.security.util.SecurityConstants;
|
|||||||
* <p>Similarly, if the following permission:
|
* <p>Similarly, if the following permission:
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* p1 = new SocketPermission("puffin.eng.sun.com:7777", "connect,accept");
|
|
||||||
* p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");
|
* p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -214,18 +214,18 @@ public abstract class Permission implements Guard, java.io.Serializable {
|
|||||||
/**
|
/**
|
||||||
* Returns a string describing this Permission. The convention is to
|
* Returns a string describing this Permission. The convention is to
|
||||||
* specify the class name, the permission name, and the actions in
|
* specify the class name, the permission name, and the actions in
|
||||||
* the following format: '("ClassName" "name" "actions")'.
|
* the following format: '("ClassName" "name" "actions")', or
|
||||||
|
* '("ClassName" "name")' if actions list is null or empty.
|
||||||
*
|
*
|
||||||
* @return information about this Permission.
|
* @return information about this Permission.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
String actions = getActions();
|
String actions = getActions();
|
||||||
if ((actions == null) || (actions.length() == 0)) { // OPTIONAL
|
if ((actions == null) || (actions.length() == 0)) { // OPTIONAL
|
||||||
return "(" + getClass().getName() + " " + name + ")";
|
return "(\"" + getClass().getName() + "\" \"" + name + "\")";
|
||||||
} else {
|
} else {
|
||||||
return "(" + getClass().getName() + " " + name + " " +
|
return "(\"" + getClass().getName() + "\" \"" + name +
|
||||||
actions + ")";
|
"\" \"" + actions + "\")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,6 @@ public class ArrayList<E> extends AbstractList<E>
|
|||||||
modCount++;
|
modCount++;
|
||||||
int oldCapacity = elementData.length;
|
int oldCapacity = elementData.length;
|
||||||
if (minCapacity > oldCapacity) {
|
if (minCapacity > oldCapacity) {
|
||||||
Object oldData[] = elementData;
|
|
||||||
int newCapacity = (oldCapacity * 3)/2 + 1;
|
int newCapacity = (oldCapacity * 3)/2 + 1;
|
||||||
if (newCapacity < minCapacity)
|
if (newCapacity < minCapacity)
|
||||||
newCapacity = minCapacity;
|
newCapacity = minCapacity;
|
||||||
|
@ -1222,8 +1222,10 @@ public abstract class AbstractQueuedLongSynchronizer
|
|||||||
// The correctness of this depends on head being initialized
|
// The correctness of this depends on head being initialized
|
||||||
// before tail and on head.next being accurate if the current
|
// before tail and on head.next being accurate if the current
|
||||||
// thread is first in queue.
|
// thread is first in queue.
|
||||||
Node h, s;
|
Node t = tail; // Read fields in reverse initialization order
|
||||||
return (h = head) != tail &&
|
Node h = head;
|
||||||
|
Node s;
|
||||||
|
return h != t &&
|
||||||
((s = h.next) == null || s.thread != Thread.currentThread());
|
((s = h.next) == null || s.thread != Thread.currentThread());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1445,8 +1445,10 @@ public abstract class AbstractQueuedSynchronizer
|
|||||||
// The correctness of this depends on head being initialized
|
// The correctness of this depends on head being initialized
|
||||||
// before tail and on head.next being accurate if the current
|
// before tail and on head.next being accurate if the current
|
||||||
// thread is first in queue.
|
// thread is first in queue.
|
||||||
Node h, s;
|
Node t = tail; // Read fields in reverse initialization order
|
||||||
return (h = head) != tail &&
|
Node h = head;
|
||||||
|
Node s;
|
||||||
|
return h != t &&
|
||||||
((s = h.next) == null || s.thread != Thread.currentThread());
|
((s = h.next) == null || s.thread != Thread.currentThread());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2007-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -55,18 +54,24 @@ public enum LauncherHelper {
|
|||||||
INSTANCE;
|
INSTANCE;
|
||||||
private static final String defaultBundleName =
|
private static final String defaultBundleName =
|
||||||
"sun.launcher.resources.launcher";
|
"sun.launcher.resources.launcher";
|
||||||
private static ResourceBundle javarb =
|
|
||||||
ResourceBundle.getBundle(defaultBundleName);
|
|
||||||
private static final String MAIN_CLASS = "Main-Class";
|
private static final String MAIN_CLASS = "Main-Class";
|
||||||
|
|
||||||
private static StringBuilder outBuf = new StringBuilder();
|
private static StringBuilder outBuf = new StringBuilder();
|
||||||
|
|
||||||
|
private static ResourceBundle javarb = null;
|
||||||
|
private static synchronized ResourceBundle getLauncherResourceBundle() {
|
||||||
|
if (javarb == null) {
|
||||||
|
javarb = ResourceBundle.getBundle(defaultBundleName);
|
||||||
|
}
|
||||||
|
return javarb;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A private helper method to get a localized message and also
|
* A private helper method to get a localized message and also
|
||||||
* apply any arguments that we might pass.
|
* apply any arguments that we might pass.
|
||||||
*/
|
*/
|
||||||
private static String getLocalizedMessage(String key, Object... args) {
|
private static String getLocalizedMessage(String key, Object... args) {
|
||||||
String msg = javarb.getString(key);
|
String msg = getLauncherResourceBundle().getString(key);
|
||||||
return (args != null) ? MessageFormat.format(msg, args) : msg;
|
return (args != null) ? MessageFormat.format(msg, args) : msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,8 +77,6 @@ public class ClassLoaderUtil {
|
|||||||
jarsClosed.clear();
|
jarsClosed.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println ("classLoader = " + classLoader);
|
|
||||||
System.out.println ("SharedSecrets.getJavaNetAccess()="+SharedSecrets.getJavaNetAccess());
|
|
||||||
URLClassPath ucp = SharedSecrets.getJavaNetAccess()
|
URLClassPath ucp = SharedSecrets.getJavaNetAccess()
|
||||||
.getURLClassPath(classLoader);
|
.getURLClassPath(classLoader);
|
||||||
ArrayList loaders = ucp.loaders;
|
ArrayList loaders = ucp.loaders;
|
||||||
|
@ -1867,10 +1867,16 @@ public class FloatingDecimal{
|
|||||||
* Grammar is compatible with hexadecimal floating-point constants
|
* Grammar is compatible with hexadecimal floating-point constants
|
||||||
* described in section 6.4.4.2 of the C99 specification.
|
* described in section 6.4.4.2 of the C99 specification.
|
||||||
*/
|
*/
|
||||||
private static Pattern hexFloatPattern = Pattern.compile(
|
private static Pattern hexFloatPattern = null;
|
||||||
|
private static synchronized Pattern getHexFloatPattern() {
|
||||||
|
if (hexFloatPattern == null) {
|
||||||
|
hexFloatPattern = Pattern.compile(
|
||||||
//1 234 56 7 8 9
|
//1 234 56 7 8 9
|
||||||
"([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
|
"([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
return hexFloatPattern;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert string s to a suitable floating decimal; uses the
|
* Convert string s to a suitable floating decimal; uses the
|
||||||
@ -1880,7 +1886,7 @@ public class FloatingDecimal{
|
|||||||
static FloatingDecimal parseHexString(String s) {
|
static FloatingDecimal parseHexString(String s) {
|
||||||
// Verify string is a member of the hexadecimal floating-point
|
// Verify string is a member of the hexadecimal floating-point
|
||||||
// string language.
|
// string language.
|
||||||
Matcher m = hexFloatPattern.matcher(s);
|
Matcher m = getHexFloatPattern().matcher(s);
|
||||||
boolean validInput = m.matches();
|
boolean validInput = m.matches();
|
||||||
|
|
||||||
if (!validInput) {
|
if (!validInput) {
|
||||||
|
@ -788,4 +788,16 @@ public class AnnotationParser {
|
|||||||
for (int i = 0; i < length; i++)
|
for (int i = 0; i < length; i++)
|
||||||
skipMemberValue(buf);
|
skipMemberValue(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This method converts the annotation map returned by the parseAnnotations()
|
||||||
|
* method to an array. It is called by Field.getDeclaredAnnotations(),
|
||||||
|
* Method.getDeclaredAnnotations(), and Constructor.getDeclaredAnnotations().
|
||||||
|
* This avoids the reflection classes to load the Annotation class until
|
||||||
|
* it is needed.
|
||||||
|
*/
|
||||||
|
private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
|
||||||
|
public static Annotation[] toArray(Map<Class, Annotation> annotations) {
|
||||||
|
return annotations.values().toArray(EMPTY_ANNOTATION_ARRAY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -26,6 +26,7 @@
|
|||||||
package sun.security.pkcs11;
|
package sun.security.pkcs11;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.lang.ref.*;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -67,9 +68,6 @@ abstract class P11Key implements Key {
|
|||||||
// type of key, one of (PUBLIC, PRIVATE, SECRET)
|
// type of key, one of (PUBLIC, PRIVATE, SECRET)
|
||||||
final String type;
|
final String type;
|
||||||
|
|
||||||
// session in which the key was created, relevant for session objects
|
|
||||||
final Session session;
|
|
||||||
|
|
||||||
// token instance
|
// token instance
|
||||||
final Token token;
|
final Token token;
|
||||||
|
|
||||||
@ -85,10 +83,12 @@ abstract class P11Key implements Key {
|
|||||||
// flags indicating whether the key is a token object, sensitive, extractable
|
// flags indicating whether the key is a token object, sensitive, extractable
|
||||||
final boolean tokenObject, sensitive, extractable;
|
final boolean tokenObject, sensitive, extractable;
|
||||||
|
|
||||||
|
// weak reference notification clean up for session keys
|
||||||
|
private final SessionKeyRef sessionKeyRef;
|
||||||
|
|
||||||
P11Key(String type, Session session, long keyID, String algorithm,
|
P11Key(String type, Session session, long keyID, String algorithm,
|
||||||
int keyLength, CK_ATTRIBUTE[] attributes) {
|
int keyLength, CK_ATTRIBUTE[] attributes) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.session = session;
|
|
||||||
this.token = session.token;
|
this.token = session.token;
|
||||||
this.keyID = keyID;
|
this.keyID = keyID;
|
||||||
this.algorithm = algorithm;
|
this.algorithm = algorithm;
|
||||||
@ -111,7 +111,9 @@ abstract class P11Key implements Key {
|
|||||||
this.sensitive = sensitive;
|
this.sensitive = sensitive;
|
||||||
this.extractable = extractable;
|
this.extractable = extractable;
|
||||||
if (tokenObject == false) {
|
if (tokenObject == false) {
|
||||||
session.addObject();
|
sessionKeyRef = new SessionKeyRef(this, keyID, session);
|
||||||
|
} else {
|
||||||
|
sessionKeyRef = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,24 +238,6 @@ abstract class P11Key implements Key {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void finalize() throws Throwable {
|
|
||||||
if (tokenObject || (token.isValid() == false)) {
|
|
||||||
super.finalize();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Session newSession = null;
|
|
||||||
try {
|
|
||||||
newSession = token.getOpSession();
|
|
||||||
token.p11.C_DestroyObject(newSession.id(), keyID);
|
|
||||||
} catch (PKCS11Exception e) {
|
|
||||||
// ignore
|
|
||||||
} finally {
|
|
||||||
token.releaseSession(newSession);
|
|
||||||
session.removeObject();
|
|
||||||
super.finalize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static CK_ATTRIBUTE[] A0 = new CK_ATTRIBUTE[0];
|
private final static CK_ATTRIBUTE[] A0 = new CK_ATTRIBUTE[0];
|
||||||
|
|
||||||
private static CK_ATTRIBUTE[] getAttributes(Session session, long keyID,
|
private static CK_ATTRIBUTE[] getAttributes(Session session, long keyID,
|
||||||
@ -1055,5 +1039,65 @@ abstract class P11Key implements Key {
|
|||||||
+ "\n parameters: " + params;
|
+ "\n parameters: " + params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final class SessionKeyRef extends WeakReference<P11Key>
|
||||||
|
implements Comparable<SessionKeyRef> {
|
||||||
|
private static ReferenceQueue<P11Key> refQueue =
|
||||||
|
new ReferenceQueue<P11Key>();
|
||||||
|
private static Set<SessionKeyRef> refList =
|
||||||
|
Collections.synchronizedSortedSet(new TreeSet<SessionKeyRef>());
|
||||||
|
|
||||||
|
static ReferenceQueue<P11Key> referenceQueue() {
|
||||||
|
return refQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final private int MAX_ITERATIONS = 2;
|
||||||
|
|
||||||
|
private static void drainRefQueueBounded() {
|
||||||
|
int iterations = 0;
|
||||||
|
while (iterations < MAX_ITERATIONS) {
|
||||||
|
SessionKeyRef next = (SessionKeyRef) refQueue.poll();
|
||||||
|
if (next != null) next.dispose();
|
||||||
|
++iterations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle to the native key
|
||||||
|
private long keyID;
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
SessionKeyRef(P11Key key , long keyID, Session session) {
|
||||||
|
super(key, refQueue);
|
||||||
|
this.keyID = keyID;
|
||||||
|
this.session = session;
|
||||||
|
this.session.addObject();
|
||||||
|
refList.add(this);
|
||||||
|
// TBD: run at some interval and not every time?
|
||||||
|
drainRefQueueBounded();
|
||||||
|
}
|
||||||
|
|
||||||
|
void dispose() {
|
||||||
|
refList.remove(this);
|
||||||
|
if (session.token.isValid()) {
|
||||||
|
Session newSession = null;
|
||||||
|
try {
|
||||||
|
newSession = session.token.getOpSession();
|
||||||
|
session.token.p11.C_DestroyObject(newSession.id(), keyID);
|
||||||
|
} catch (PKCS11Exception e) {
|
||||||
|
// ignore
|
||||||
|
} finally {
|
||||||
|
session.token.releaseSession(newSession);
|
||||||
|
session.removeObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compareTo(SessionKeyRef other) {
|
||||||
|
if (this.keyID == other.keyID) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return (this.keyID < other.keyID) ? -1 : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -191,7 +191,9 @@ final class P11RSACipher extends CipherSpi {
|
|||||||
throw new InvalidKeyException
|
throw new InvalidKeyException
|
||||||
("Unwrap has to be used with private keys");
|
("Unwrap has to be used with private keys");
|
||||||
}
|
}
|
||||||
encrypt = false;
|
// No further setup needed for C_Unwrap(). We'll initialize later
|
||||||
|
// if we can't use C_Unwrap().
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
throw new InvalidKeyException("Unsupported mode: " + opmode);
|
throw new InvalidKeyException("Unsupported mode: " + opmode);
|
||||||
}
|
}
|
||||||
@ -452,7 +454,7 @@ final class P11RSACipher extends CipherSpi {
|
|||||||
long keyID = token.p11.C_UnwrapKey(s.id(),
|
long keyID = token.p11.C_UnwrapKey(s.id(),
|
||||||
new CK_MECHANISM(mechanism), p11Key.keyID, wrappedKey,
|
new CK_MECHANISM(mechanism), p11Key.keyID, wrappedKey,
|
||||||
attributes);
|
attributes);
|
||||||
return P11Key.secretKey(session, keyID, algorithm, 48 << 3,
|
return P11Key.secretKey(s, keyID, algorithm, 48 << 3,
|
||||||
attributes);
|
attributes);
|
||||||
} catch (PKCS11Exception e) {
|
} catch (PKCS11Exception e) {
|
||||||
throw new InvalidKeyException("unwrap() failed", e);
|
throw new InvalidKeyException("unwrap() failed", e);
|
||||||
@ -461,6 +463,7 @@ final class P11RSACipher extends CipherSpi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX implement unwrap using C_Unwrap() for all keys
|
// XXX implement unwrap using C_Unwrap() for all keys
|
||||||
|
implInit(Cipher.DECRYPT_MODE, p11Key);
|
||||||
if (wrappedKey.length > maxInputSize) {
|
if (wrappedKey.length > maxInputSize) {
|
||||||
throw new InvalidKeyException("Key is too long for unwrapping");
|
throw new InvalidKeyException("Key is too long for unwrapping");
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ final class P11SecretKeyFactory extends SecretKeyFactorySpi {
|
|||||||
session = token.getObjSession();
|
session = token.getObjSession();
|
||||||
long newKeyID = token.p11.C_CopyObject(session.id(),
|
long newKeyID = token.p11.C_CopyObject(session.id(),
|
||||||
p11Key.keyID, extraAttrs);
|
p11Key.keyID, extraAttrs);
|
||||||
p11Key = (P11Key) (P11Key.secretKey(p11Key.session,
|
p11Key = (P11Key) (P11Key.secretKey(session,
|
||||||
newKeyID, p11Key.algorithm, p11Key.keyLength,
|
newKeyID, p11Key.algorithm, p11Key.keyLength,
|
||||||
extraAttrs));
|
extraAttrs));
|
||||||
} catch (PKCS11Exception p11e) {
|
} catch (PKCS11Exception p11e) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -68,6 +68,9 @@ import java.io.*;
|
|||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
|
import java.nio.file.DirectoryStream;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Random;
|
||||||
import sun.security.util.Debug;
|
import sun.security.util.Debug;
|
||||||
|
|
||||||
abstract class SeedGenerator {
|
abstract class SeedGenerator {
|
||||||
@ -180,10 +183,27 @@ abstract class SeedGenerator {
|
|||||||
|
|
||||||
// The temporary dir
|
// The temporary dir
|
||||||
File f = new File(p.getProperty("java.io.tmpdir"));
|
File f = new File(p.getProperty("java.io.tmpdir"));
|
||||||
String[] sa = f.list();
|
int count = 0;
|
||||||
for(int i = 0; i < sa.length; i++)
|
DirectoryStream<Path> ds
|
||||||
md.update(sa[i].getBytes());
|
= f.toPath().newDirectoryStream();
|
||||||
|
try {
|
||||||
|
// We use a Random object to choose what file names
|
||||||
|
// should be used. Otherwise on a machine with too
|
||||||
|
// many files, the same first 1024 files always get
|
||||||
|
// used. Any, We make sure the first 512 files are
|
||||||
|
// always used.
|
||||||
|
Random r = new Random();
|
||||||
|
for (Path path: ds) {
|
||||||
|
if (count < 512 || r.nextBoolean()) {
|
||||||
|
md.update(path.getName().toString().getBytes());
|
||||||
|
}
|
||||||
|
if (count++ > 1024) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
ds.close();
|
||||||
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
md.update((byte)ex.hashCode());
|
md.update((byte)ex.hashCode());
|
||||||
}
|
}
|
||||||
|
@ -1910,7 +1910,9 @@ public final class KeyTool {
|
|||||||
ObjectIdentifier oid = attr.getAttributeId();
|
ObjectIdentifier oid = attr.getAttributeId();
|
||||||
if (oid.equals(PKCS9Attribute.EXTENSION_REQUEST_OID)) {
|
if (oid.equals(PKCS9Attribute.EXTENSION_REQUEST_OID)) {
|
||||||
CertificateExtensions exts = (CertificateExtensions)attr.getAttributeValue();
|
CertificateExtensions exts = (CertificateExtensions)attr.getAttributeValue();
|
||||||
printExtensions(rb.getString("Extension Request:"), exts, out);
|
if (exts != null) {
|
||||||
|
printExtensions(rb.getString("Extension Request:"), exts, out);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
out.println(attr.getAttributeId());
|
out.println(attr.getAttributeId());
|
||||||
out.println(attr.getAttributeValue());
|
out.println(attr.getAttributeValue());
|
||||||
@ -2495,7 +2497,9 @@ public final class KeyTool {
|
|||||||
X509CertImpl.INFO);
|
X509CertImpl.INFO);
|
||||||
CertificateExtensions exts = (CertificateExtensions)
|
CertificateExtensions exts = (CertificateExtensions)
|
||||||
certInfo.get(X509CertInfo.EXTENSIONS);
|
certInfo.get(X509CertInfo.EXTENSIONS);
|
||||||
printExtensions(rb.getString("Extensions: "), exts, out);
|
if (exts != null) {
|
||||||
|
printExtensions(rb.getString("Extensions: "), exts, out);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -81,6 +81,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptInit
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, &ckMechanism,
|
rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, &ckMechanism,
|
||||||
ckKeyHandle);
|
ckKeyHandle);
|
||||||
@ -126,14 +127,29 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Encrypt
|
|||||||
|
|
||||||
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
||||||
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
||||||
|
if (inBufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
inBufP = IBUF;
|
inBufP = IBUF;
|
||||||
}
|
}
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (inBufP != IBUF) { free(inBufP); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ckEncryptedPartLen = jOutLen;
|
ckEncryptedPartLen = jOutLen;
|
||||||
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
||||||
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
||||||
|
if (outBufP == NULL) {
|
||||||
|
if (inBufP != IBUF) {
|
||||||
|
free(inBufP);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
outBufP = OBUF;
|
outBufP = OBUF;
|
||||||
}
|
}
|
||||||
@ -193,10 +209,18 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate
|
|||||||
} else {
|
} else {
|
||||||
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
||||||
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
||||||
|
if (inBufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
inBufP = IBUF;
|
inBufP = IBUF;
|
||||||
}
|
}
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (directIn == 0 && inBufP != IBUF) { free(inBufP); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ckEncryptedPartLen = jOutLen;
|
ckEncryptedPartLen = jOutLen;
|
||||||
@ -205,6 +229,13 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate
|
|||||||
} else {
|
} else {
|
||||||
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
||||||
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
||||||
|
if (outBufP == NULL) {
|
||||||
|
if (directIn == 0 && inBufP != IBUF) {
|
||||||
|
free(inBufP);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
outBufP = OBUF;
|
outBufP = OBUF;
|
||||||
}
|
}
|
||||||
@ -317,6 +348,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptInit
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, &ckMechanism,
|
rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, &ckMechanism,
|
||||||
ckKeyHandle);
|
ckKeyHandle);
|
||||||
@ -362,14 +394,29 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1Decrypt
|
|||||||
|
|
||||||
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
||||||
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
||||||
|
if (inBufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
inBufP = IBUF;
|
inBufP = IBUF;
|
||||||
}
|
}
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (inBufP != IBUF) { free(inBufP); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ckPartLen = jOutLen;
|
ckPartLen = jOutLen;
|
||||||
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
||||||
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
||||||
|
if (outBufP == NULL) {
|
||||||
|
if (inBufP != IBUF) {
|
||||||
|
free(inBufP);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
outBufP = OBUF;
|
outBufP = OBUF;
|
||||||
}
|
}
|
||||||
@ -429,10 +476,18 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate
|
|||||||
} else {
|
} else {
|
||||||
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
if (jInLen > MAX_STACK_BUFFER_LEN) {
|
||||||
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
||||||
|
if (inBufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
inBufP = IBUF;
|
inBufP = IBUF;
|
||||||
}
|
}
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (directIn == 0 && inBufP != IBUF) { free(inBufP); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ckDecryptedPartLen = jOutLen;
|
ckDecryptedPartLen = jOutLen;
|
||||||
@ -441,6 +496,13 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate
|
|||||||
} else {
|
} else {
|
||||||
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
if (jOutLen > MAX_STACK_BUFFER_LEN) {
|
||||||
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
|
||||||
|
if (outBufP == NULL) {
|
||||||
|
if (directIn == 0 && inBufP != IBUF) {
|
||||||
|
free(inBufP);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
outBufP = OBUF;
|
outBufP = OBUF;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -75,6 +75,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestInit
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
|
rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
|
||||||
|
|
||||||
@ -82,7 +83,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestInit
|
|||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -114,6 +115,7 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestSingle
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return 0; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
|
rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
|
||||||
|
|
||||||
@ -121,29 +123,32 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestSingle
|
|||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; }
|
||||||
|
|
||||||
if (jInLen <= MAX_STACK_BUFFER_LEN) {
|
if (jInLen <= MAX_STACK_BUFFER_LEN) {
|
||||||
bufP = BUF;
|
bufP = BUF;
|
||||||
} else {
|
} else {
|
||||||
/* always use single part op, even for large data */
|
/* always use single part op, even for large data */
|
||||||
bufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
bufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
|
||||||
|
if (bufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)bufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)bufP);
|
||||||
rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
if (bufP != BUF) { free(bufP); }
|
||||||
if (bufP != BUF) {
|
|
||||||
free(bufP);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);
|
rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
if (bufP != BUF) {
|
(*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);
|
||||||
free(bufP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bufP != BUF) { free(bufP); }
|
||||||
|
|
||||||
return ckDigestLength;
|
return ckDigestLength;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -183,17 +188,23 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestUpdate
|
|||||||
bufP = BUF;
|
bufP = BUF;
|
||||||
} else {
|
} else {
|
||||||
bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
|
bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
|
||||||
bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
|
bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
|
||||||
|
if (bufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (jInLen > 0) {
|
while (jInLen > 0) {
|
||||||
jsize chunkLen = min(bufLen, jInLen);
|
jsize chunkLen = min(bufLen, jInLen);
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (bufP != BUF) { free(bufP); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, bufP, chunkLen);
|
rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, bufP, chunkLen);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
if (bufP != BUF) {
|
if (bufP != BUF) { free(bufP); }
|
||||||
free(bufP);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
jInOfs += chunkLen;
|
jInOfs += chunkLen;
|
||||||
@ -229,7 +240,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestKey
|
|||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DigestKey)(ckSessionHandle, ckKeyHandle);
|
rv = (*ckpFunctions->C_DigestKey)(ckSessionHandle, ckKeyHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -257,10 +268,9 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestFinal
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DigestFinal)(ckSessionHandle, BUF, &ckDigestLength);
|
rv = (*ckpFunctions->C_DigestFinal)(ckSessionHandle, BUF, &ckDigestLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0 ; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
(*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);
|
||||||
(*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);
|
}
|
||||||
|
|
||||||
return ckDigestLength;
|
return ckDigestLength;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -288,12 +298,13 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SeedRandom
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jSeed, &ckpSeed, &ckSeedLength);
|
jByteArrayToCKByteArray(env, jSeed, &ckpSeed, &ckSeedLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SeedRandom)(ckSessionHandle, ckpSeed, ckSeedLength);
|
rv = (*ckpFunctions->C_SeedRandom)(ckSessionHandle, ckpSeed, ckSeedLength);
|
||||||
|
|
||||||
free(ckpSeed);
|
free(ckpSeed);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -322,6 +333,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateRandom
|
|||||||
|
|
||||||
jRandomBufferLength = (*env)->GetArrayLength(env, jRandomData);
|
jRandomBufferLength = (*env)->GetArrayLength(env, jRandomData);
|
||||||
jRandomBuffer = (*env)->GetByteArrayElements(env, jRandomData, NULL);
|
jRandomBuffer = (*env)->GetByteArrayElements(env, jRandomData, NULL);
|
||||||
|
if (jRandomBuffer == NULL) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GenerateRandom)(ckSessionHandle,
|
rv = (*ckpFunctions->C_GenerateRandom)(ckSessionHandle,
|
||||||
(CK_BYTE_PTR) jRandomBuffer,
|
(CK_BYTE_PTR) jRandomBuffer,
|
||||||
@ -330,6 +342,6 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateRandom
|
|||||||
/* copy back generated bytes */
|
/* copy back generated bytes */
|
||||||
(*env)->ReleaseByteArrayElements(env, jRandomData, jRandomBuffer, 0);
|
(*env)->ReleaseByteArrayElements(env, jRandomData, jRandomBuffer, 0);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -73,7 +73,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestEn
|
|||||||
CK_SESSION_HANDLE ckSessionHandle;
|
CK_SESSION_HANDLE ckSessionHandle;
|
||||||
CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
|
CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
|
||||||
CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
|
CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
|
||||||
jbyteArray jEncryptedPart;
|
jbyteArray jEncryptedPart = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -81,20 +81,28 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestEn
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
|
jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
|
rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
|
free(ckpPart);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
|
ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
|
||||||
|
if (ckpEncryptedPart == NULL) {
|
||||||
|
free(ckpPart);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
|
rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
|
jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
|
||||||
|
}
|
||||||
free(ckpPart);
|
free(ckpPart);
|
||||||
free(ckpEncryptedPart);
|
free(ckpEncryptedPart);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jEncryptedPart ;
|
return jEncryptedPart ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -117,7 +125,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptD
|
|||||||
CK_SESSION_HANDLE ckSessionHandle;
|
CK_SESSION_HANDLE ckSessionHandle;
|
||||||
CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
|
CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
|
||||||
CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
|
CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
|
||||||
jbyteArray jPart;
|
jbyteArray jPart = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -125,19 +133,27 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptD
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
|
jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
|
rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
|
free(ckpEncryptedPart);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
|
ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
|
||||||
|
if (ckpPart == NULL) {
|
||||||
|
free(ckpEncryptedPart);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
|
rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
|
jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
|
||||||
free(ckpPart);
|
}
|
||||||
free(ckpEncryptedPart);
|
free(ckpEncryptedPart);
|
||||||
|
free(ckpPart);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jPart ;
|
return jPart ;
|
||||||
}
|
}
|
||||||
@ -161,7 +177,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignEncr
|
|||||||
CK_SESSION_HANDLE ckSessionHandle;
|
CK_SESSION_HANDLE ckSessionHandle;
|
||||||
CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
|
CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
|
||||||
CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
|
CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
|
||||||
jbyteArray jEncryptedPart;
|
jbyteArray jEncryptedPart = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -169,20 +185,28 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignEncr
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
|
jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
|
rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
|
free(ckpPart);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
|
ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
|
||||||
|
if (ckpEncryptedPart == NULL) {
|
||||||
|
free(ckpPart);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
|
rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
|
jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
|
||||||
|
}
|
||||||
free(ckpPart);
|
free(ckpPart);
|
||||||
free(ckpEncryptedPart);
|
free(ckpEncryptedPart);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jEncryptedPart ;
|
return jEncryptedPart ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -205,7 +229,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptV
|
|||||||
CK_SESSION_HANDLE ckSessionHandle;
|
CK_SESSION_HANDLE ckSessionHandle;
|
||||||
CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
|
CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
|
||||||
CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
|
CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
|
||||||
jbyteArray jPart;
|
jbyteArray jPart = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -213,19 +237,28 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptV
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
|
jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
|
rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
|
free(ckpEncryptedPart);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
|
ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
|
||||||
|
if (ckpPart == NULL) {
|
||||||
|
free(ckpEncryptedPart);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
|
rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
|
||||||
|
|
||||||
jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
free(ckpPart);
|
jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
|
||||||
|
}
|
||||||
free(ckpEncryptedPart);
|
free(ckpEncryptedPart);
|
||||||
|
free(ckpPart);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jPart ;
|
return jPart ;
|
||||||
}
|
}
|
||||||
@ -252,7 +285,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetFunctionSta
|
|||||||
|
|
||||||
/* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
|
/* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
|
||||||
rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle);
|
rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -277,6 +310,6 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CancelFunction
|
|||||||
|
|
||||||
/* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
|
/* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
|
||||||
rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle);
|
rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -102,6 +102,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_initializeLibrary
|
|||||||
|
|
||||||
jclass fetchClass(JNIEnv *env, const char *name) {
|
jclass fetchClass(JNIEnv *env, const char *name) {
|
||||||
jclass tmpClass = (*env)->FindClass(env, name);
|
jclass tmpClass = (*env)->FindClass(env, name);
|
||||||
|
if (tmpClass == NULL) { return NULL; }
|
||||||
return (*env)->NewGlobalRef(env, tmpClass);
|
return (*env)->NewGlobalRef(env, tmpClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,14 +111,18 @@ void prefetchFields(JNIEnv *env, jclass thisClass) {
|
|||||||
|
|
||||||
/* PKCS11 */
|
/* PKCS11 */
|
||||||
pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J");
|
pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J");
|
||||||
|
if (pNativeDataID == NULL) { return; }
|
||||||
|
|
||||||
/* CK_MECHANISM */
|
/* CK_MECHANISM */
|
||||||
tmpClass = (*env)->FindClass(env, CLASS_MECHANISM);
|
tmpClass = (*env)->FindClass(env, CLASS_MECHANISM);
|
||||||
|
if (tmpClass == NULL) { return; }
|
||||||
mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J");
|
mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J");
|
||||||
|
if (mech_mechanismID == NULL) { return; }
|
||||||
mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter",
|
mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter",
|
||||||
"Ljava/lang/Object;");
|
"Ljava/lang/Object;");
|
||||||
|
if (mech_pParameterID == NULL) { return; }
|
||||||
jByteArrayClass = fetchClass(env, "[B");
|
jByteArrayClass = fetchClass(env, "[B");
|
||||||
|
if (jByteArrayClass == NULL) { return; }
|
||||||
jLongClass = fetchClass(env, "java/lang/Long");
|
jLongClass = fetchClass(env, "java/lang/Long");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,10 +257,9 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetInfo
|
|||||||
if (ckpFunctions == NULL) { return NULL; }
|
if (ckpFunctions == NULL) { return NULL; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo);
|
rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo);
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
|
||||||
jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
|
}
|
||||||
|
|
||||||
return jInfoObject ;
|
return jInfoObject ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,28 +283,31 @@ jobject ckInfoPtrToJInfo(JNIEnv *env, const CK_INFO_PTR ckpInfo)
|
|||||||
|
|
||||||
/* load CK_INFO class */
|
/* load CK_INFO class */
|
||||||
jInfoClass = (*env)->FindClass(env, CLASS_INFO);
|
jInfoClass = (*env)->FindClass(env, CLASS_INFO);
|
||||||
assert(jInfoClass != 0);
|
if (jInfoClass == NULL) { return NULL; };
|
||||||
|
|
||||||
/* load CK_INFO constructor */
|
/* load CK_INFO constructor */
|
||||||
jCtrId = (*env)->GetMethodID
|
jCtrId = (*env)->GetMethodID
|
||||||
(env, jInfoClass, "<init>",
|
(env, jInfoClass, "<init>",
|
||||||
"(Lsun/security/pkcs11/wrapper/CK_VERSION;[CJ[CLsun/security/pkcs11/wrapper/CK_VERSION;)V");
|
"(Lsun/security/pkcs11/wrapper/CK_VERSION;[CJ[CLsun/security/pkcs11/wrapper/CK_VERSION;)V");
|
||||||
|
if (jCtrId == NULL) { return NULL; }
|
||||||
assert(jCtrId != 0);
|
|
||||||
|
|
||||||
/* prep all fields */
|
/* prep all fields */
|
||||||
jCryptokiVer = ckVersionPtrToJVersion(env, &(ckpInfo->cryptokiVersion));
|
jCryptokiVer = ckVersionPtrToJVersion(env, &(ckpInfo->cryptokiVersion));
|
||||||
|
if (jCryptokiVer == NULL) { return NULL; }
|
||||||
jVendor =
|
jVendor =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpInfo->manufacturerID[0]), 32);
|
ckUTF8CharArrayToJCharArray(env, &(ckpInfo->manufacturerID[0]), 32);
|
||||||
|
if (jVendor == NULL) { return NULL; }
|
||||||
jFlags = ckULongToJLong(ckpInfo->flags);
|
jFlags = ckULongToJLong(ckpInfo->flags);
|
||||||
jLibraryDesc =
|
jLibraryDesc =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpInfo->libraryDescription[0]), 32);
|
ckUTF8CharArrayToJCharArray(env, &(ckpInfo->libraryDescription[0]), 32);
|
||||||
|
if (jLibraryDesc == NULL) { return NULL; }
|
||||||
jLibraryVer = ckVersionPtrToJVersion(env, &(ckpInfo->libraryVersion));
|
jLibraryVer = ckVersionPtrToJVersion(env, &(ckpInfo->libraryVersion));
|
||||||
|
if (jLibraryVer == NULL) { return NULL; }
|
||||||
|
|
||||||
/* create new CK_INFO object */
|
/* create new CK_INFO object */
|
||||||
jInfoObject = (*env)->NewObject(env, jInfoClass, jCtrId, jCryptokiVer,
|
jInfoObject = (*env)->NewObject(env, jInfoClass, jCtrId, jCryptokiVer,
|
||||||
jVendor, jFlags, jLibraryDesc, jLibraryVer);
|
jVendor, jFlags, jLibraryDesc, jLibraryVer);
|
||||||
assert(jInfoObject != 0);
|
if (jInfoObject == NULL) { return NULL; }
|
||||||
|
|
||||||
/* free local references */
|
/* free local references */
|
||||||
(*env)->DeleteLocalRef(env, jInfoClass);
|
(*env)->DeleteLocalRef(env, jInfoClass);
|
||||||
@ -343,15 +350,18 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotList
|
|||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
||||||
|
|
||||||
ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));
|
ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));
|
||||||
|
if (ckpSlotList == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, ckpSlotList,
|
rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, ckpSlotList,
|
||||||
&ckTokenNumber);
|
&ckTokenNumber);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
|
jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
|
||||||
|
}
|
||||||
free(ckpSlotList);
|
free(ckpSlotList);
|
||||||
|
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jSlotList ;
|
return jSlotList ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -380,10 +390,9 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotInfo
|
|||||||
ckSlotID = jLongToCKULong(jSlotID);
|
ckSlotID = jLongToCKULong(jSlotID);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetSlotInfo)(ckSlotID, &ckSlotInfo);
|
rv = (*ckpFunctions->C_GetSlotInfo)(ckSlotID, &ckSlotInfo);
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
|
||||||
jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
|
}
|
||||||
|
|
||||||
return jSlotInfoObject ;
|
return jSlotInfoObject ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,28 +419,32 @@ ckSlotInfoPtrToJSlotInfo
|
|||||||
|
|
||||||
/* load CK_SLOT_INFO class */
|
/* load CK_SLOT_INFO class */
|
||||||
jSlotInfoClass = (*env)->FindClass(env, CLASS_SLOT_INFO);
|
jSlotInfoClass = (*env)->FindClass(env, CLASS_SLOT_INFO);
|
||||||
assert(jSlotInfoClass != 0);
|
if (jSlotInfoClass == NULL) { return NULL; };
|
||||||
|
|
||||||
/* load CK_SLOT_INFO constructor */
|
/* load CK_SLOT_INFO constructor */
|
||||||
jCtrId = (*env)->GetMethodID
|
jCtrId = (*env)->GetMethodID
|
||||||
(env, jSlotInfoClass, "<init>",
|
(env, jSlotInfoClass, "<init>",
|
||||||
"([C[CJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;)V");
|
"([C[CJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;)V");
|
||||||
assert(jCtrId != 0);
|
if (jCtrId == NULL) { return NULL; }
|
||||||
|
|
||||||
/* prep all fields */
|
/* prep all fields */
|
||||||
jSlotDesc =
|
jSlotDesc =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->slotDescription[0]), 64);
|
ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->slotDescription[0]), 64);
|
||||||
|
if (jSlotDesc == NULL) { return NULL; }
|
||||||
jVendor =
|
jVendor =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->manufacturerID[0]), 32);
|
ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->manufacturerID[0]), 32);
|
||||||
|
if (jVendor == NULL) { return NULL; }
|
||||||
jFlags = ckULongToJLong(ckpSlotInfo->flags);
|
jFlags = ckULongToJLong(ckpSlotInfo->flags);
|
||||||
jHardwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->hardwareVersion));
|
jHardwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->hardwareVersion));
|
||||||
|
if (jHardwareVer == NULL) { return NULL; }
|
||||||
jFirmwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->firmwareVersion));
|
jFirmwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->firmwareVersion));
|
||||||
|
if (jFirmwareVer == NULL) { return NULL; }
|
||||||
|
|
||||||
/* create new CK_SLOT_INFO object */
|
/* create new CK_SLOT_INFO object */
|
||||||
jSlotInfoObject = (*env)->NewObject
|
jSlotInfoObject = (*env)->NewObject
|
||||||
(env, jSlotInfoClass, jCtrId, jSlotDesc, jVendor, jFlags,
|
(env, jSlotInfoClass, jCtrId, jSlotDesc, jVendor, jFlags,
|
||||||
jHardwareVer, jFirmwareVer);
|
jHardwareVer, jFirmwareVer);
|
||||||
assert(jSlotInfoObject != 0);
|
if (jSlotInfoObject == NULL) { return NULL; }
|
||||||
|
|
||||||
/* free local references */
|
/* free local references */
|
||||||
(*env)->DeleteLocalRef(env, jSlotInfoClass);
|
(*env)->DeleteLocalRef(env, jSlotInfoClass);
|
||||||
@ -460,7 +473,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetTokenInfo
|
|||||||
{
|
{
|
||||||
CK_SLOT_ID ckSlotID;
|
CK_SLOT_ID ckSlotID;
|
||||||
CK_TOKEN_INFO ckTokenInfo;
|
CK_TOKEN_INFO ckTokenInfo;
|
||||||
jobject jInfoTokenObject;
|
jobject jInfoTokenObject = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -469,10 +482,9 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetTokenInfo
|
|||||||
ckSlotID = jLongToCKULong(jSlotID);
|
ckSlotID = jLongToCKULong(jSlotID);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetTokenInfo)(ckSlotID, &ckTokenInfo);
|
rv = (*ckpFunctions->C_GetTokenInfo)(ckSlotID, &ckTokenInfo);
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
|
||||||
jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
|
}
|
||||||
|
|
||||||
return jInfoTokenObject ;
|
return jInfoTokenObject ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,21 +524,25 @@ ckTokenInfoPtrToJTokenInfo
|
|||||||
|
|
||||||
/* load CK_TOKEN_INFO class */
|
/* load CK_TOKEN_INFO class */
|
||||||
jTokenInfoClass = (*env)->FindClass(env, CLASS_TOKEN_INFO);
|
jTokenInfoClass = (*env)->FindClass(env, CLASS_TOKEN_INFO);
|
||||||
assert(jTokenInfoClass != 0);
|
if (jTokenInfoClass == NULL) { return NULL; };
|
||||||
|
|
||||||
/* load CK_TOKEN_INFO constructor */
|
/* load CK_TOKEN_INFO constructor */
|
||||||
jCtrId = (*env)->GetMethodID
|
jCtrId = (*env)->GetMethodID
|
||||||
(env, jTokenInfoClass, "<init>",
|
(env, jTokenInfoClass, "<init>",
|
||||||
"([C[C[C[CJJJJJJJJJJJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;[C)V");
|
"([C[C[C[CJJJJJJJJJJJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;[C)V");
|
||||||
assert(jCtrId != 0);
|
if (jCtrId == NULL) { return NULL; };
|
||||||
|
|
||||||
/* prep all fields */
|
/* prep all fields */
|
||||||
jLabel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->label[0]), 32);
|
jLabel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->label[0]), 32);
|
||||||
|
if (jLabel == NULL) { return NULL; };
|
||||||
jVendor =
|
jVendor =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->manufacturerID[0]), 32);
|
ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->manufacturerID[0]), 32);
|
||||||
|
if (jVendor == NULL) { return NULL; };
|
||||||
jModel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->model[0]), 16);
|
jModel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->model[0]), 16);
|
||||||
|
if (jModel == NULL) { return NULL; };
|
||||||
jSerialNo =
|
jSerialNo =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->serialNumber[0]), 16);
|
ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->serialNumber[0]), 16);
|
||||||
|
if (jSerialNo == NULL) { return NULL; };
|
||||||
jFlags = ckULongToJLong(ckpTokenInfo->flags);
|
jFlags = ckULongToJLong(ckpTokenInfo->flags);
|
||||||
jMaxSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxSessionCount);
|
jMaxSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxSessionCount);
|
||||||
jSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulSessionCount);
|
jSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulSessionCount);
|
||||||
@ -540,10 +556,13 @@ ckTokenInfoPtrToJTokenInfo
|
|||||||
jFreePrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePrivateMemory);
|
jFreePrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePrivateMemory);
|
||||||
jHardwareVer =
|
jHardwareVer =
|
||||||
ckVersionPtrToJVersion(env, &(ckpTokenInfo->hardwareVersion));
|
ckVersionPtrToJVersion(env, &(ckpTokenInfo->hardwareVersion));
|
||||||
|
if (jHardwareVer == NULL) { return NULL; }
|
||||||
jFirmwareVer =
|
jFirmwareVer =
|
||||||
ckVersionPtrToJVersion(env, &(ckpTokenInfo->firmwareVersion));
|
ckVersionPtrToJVersion(env, &(ckpTokenInfo->firmwareVersion));
|
||||||
|
if (jFirmwareVer == NULL) { return NULL; }
|
||||||
jUtcTime =
|
jUtcTime =
|
||||||
ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->utcTime[0]), 16);
|
ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->utcTime[0]), 16);
|
||||||
|
if (jUtcTime == NULL) { return NULL; }
|
||||||
|
|
||||||
/* create new CK_TOKEN_INFO object */
|
/* create new CK_TOKEN_INFO object */
|
||||||
jTokenInfoObject =
|
jTokenInfoObject =
|
||||||
@ -553,7 +572,7 @@ ckTokenInfoPtrToJTokenInfo
|
|||||||
jMaxPinLen, jMinPinLen,
|
jMaxPinLen, jMinPinLen,
|
||||||
jTotalPubMem, jFreePubMem, jTotalPrivMem, jFreePrivMem,
|
jTotalPubMem, jFreePubMem, jTotalPrivMem, jFreePrivMem,
|
||||||
jHardwareVer, jFirmwareVer, jUtcTime);
|
jHardwareVer, jFirmwareVer, jUtcTime);
|
||||||
assert(jTokenInfoObject != 0);
|
if (jTokenInfoObject == NULL) { return NULL; }
|
||||||
|
|
||||||
/* free local references */
|
/* free local references */
|
||||||
(*env)->DeleteLocalRef(env, jTokenInfoClass);
|
(*env)->DeleteLocalRef(env, jTokenInfoClass);
|
||||||
@ -584,7 +603,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1WaitForSlotEvent
|
|||||||
{
|
{
|
||||||
CK_FLAGS ckFlags;
|
CK_FLAGS ckFlags;
|
||||||
CK_SLOT_ID ckSlotID;
|
CK_SLOT_ID ckSlotID;
|
||||||
jlong jSlotID;
|
jlong jSlotID = 0L;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -593,9 +612,9 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1WaitForSlotEvent
|
|||||||
ckFlags = jLongToCKULong(jFlags);
|
ckFlags = jLongToCKULong(jFlags);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_WaitForSlotEvent)(ckFlags, &ckSlotID, NULL_PTR);
|
rv = (*ckpFunctions->C_WaitForSlotEvent)(ckFlags, &ckSlotID, NULL_PTR);
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jSlotID = ckULongToJLong(ckSlotID);
|
||||||
jSlotID = ckULongToJLong(ckSlotID);
|
}
|
||||||
|
|
||||||
return jSlotID ;
|
return jSlotID ;
|
||||||
}
|
}
|
||||||
@ -632,16 +651,19 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismList
|
|||||||
|
|
||||||
ckpMechanismList = (CK_MECHANISM_TYPE_PTR)
|
ckpMechanismList = (CK_MECHANISM_TYPE_PTR)
|
||||||
malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));
|
malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));
|
||||||
|
if (ckpMechanismList == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, ckpMechanismList,
|
rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, ckpMechanismList,
|
||||||
&ckMechanismNumber);
|
&ckMechanismNumber);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
|
jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
|
||||||
ckMechanismNumber);
|
ckMechanismNumber);
|
||||||
|
}
|
||||||
free(ckpMechanismList);
|
free(ckpMechanismList);
|
||||||
|
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jMechanismList ;
|
return jMechanismList ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -663,7 +685,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismInfo
|
|||||||
CK_SLOT_ID ckSlotID;
|
CK_SLOT_ID ckSlotID;
|
||||||
CK_MECHANISM_TYPE ckMechanismType;
|
CK_MECHANISM_TYPE ckMechanismType;
|
||||||
CK_MECHANISM_INFO ckMechanismInfo;
|
CK_MECHANISM_INFO ckMechanismInfo;
|
||||||
jobject jMechanismInfo;
|
jobject jMechanismInfo = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -674,10 +696,9 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismInfo
|
|||||||
|
|
||||||
rv = (*ckpFunctions->C_GetMechanismInfo)(ckSlotID, ckMechanismType,
|
rv = (*ckpFunctions->C_GetMechanismInfo)(ckSlotID, ckMechanismType,
|
||||||
&ckMechanismInfo);
|
&ckMechanismInfo);
|
||||||
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
|
||||||
jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
|
}
|
||||||
|
|
||||||
return jMechanismInfo ;
|
return jMechanismInfo ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -703,11 +724,11 @@ ckMechanismInfoPtrToJMechanismInfo
|
|||||||
|
|
||||||
/* load CK_MECHANISM_INFO class */
|
/* load CK_MECHANISM_INFO class */
|
||||||
jMechanismInfoClass = (*env)->FindClass(env, CLASS_MECHANISM_INFO);
|
jMechanismInfoClass = (*env)->FindClass(env, CLASS_MECHANISM_INFO);
|
||||||
assert(jMechanismInfoClass != 0);
|
if (jMechanismInfoClass == NULL) { return NULL; };
|
||||||
|
|
||||||
/* load CK_MECHANISM_INFO constructor */
|
/* load CK_MECHANISM_INFO constructor */
|
||||||
jCtrId = (*env)->GetMethodID(env, jMechanismInfoClass, "<init>", "(JJJ)V");
|
jCtrId = (*env)->GetMethodID(env, jMechanismInfoClass, "<init>", "(JJJ)V");
|
||||||
assert(jCtrId != 0);
|
if (jCtrId == NULL) { return NULL; };
|
||||||
|
|
||||||
/* prep all fields */
|
/* prep all fields */
|
||||||
jMinKeySize = ckULongToJLong(ckpMechanismInfo->ulMinKeySize);
|
jMinKeySize = ckULongToJLong(ckpMechanismInfo->ulMinKeySize);
|
||||||
@ -717,7 +738,7 @@ ckMechanismInfoPtrToJMechanismInfo
|
|||||||
/* create new CK_MECHANISM_INFO object */
|
/* create new CK_MECHANISM_INFO object */
|
||||||
jMechanismInfoObject = (*env)->NewObject(env, jMechanismInfoClass, jCtrId,
|
jMechanismInfoObject = (*env)->NewObject(env, jMechanismInfoClass, jCtrId,
|
||||||
jMinKeySize, jMaxKeySize, jFlags);
|
jMinKeySize, jMaxKeySize, jFlags);
|
||||||
assert(jMechanismInfoObject != 0);
|
if (jMechanismInfoObject == NULL) { return NULL; };
|
||||||
|
|
||||||
/* free local references */
|
/* free local references */
|
||||||
(*env)->DeleteLocalRef(env, jMechanismInfoClass);
|
(*env)->DeleteLocalRef(env, jMechanismInfoClass);
|
||||||
@ -753,8 +774,13 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1InitToken
|
|||||||
|
|
||||||
ckSlotID = jLongToCKULong(jSlotID);
|
ckSlotID = jLongToCKULong(jSlotID);
|
||||||
jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
|
jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
|
||||||
jCharArrayToCKUTF8CharArray(env, jLabel, &ckpLabel, &ckLabelLength);
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
/* ckLabelLength <= 32 !!! */
|
/* ckLabelLength <= 32 !!! */
|
||||||
|
jCharArrayToCKUTF8CharArray(env, jLabel, &ckpLabel, &ckLabelLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(ckpPin);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_InitToken)(ckSlotID, ckpPin, ckPinLength, ckpLabel);
|
rv = (*ckpFunctions->C_InitToken)(ckSlotID, ckpPin, ckPinLength, ckpLabel);
|
||||||
TRACE1("InitToken return code: %d", rv);
|
TRACE1("InitToken return code: %d", rv);
|
||||||
@ -790,6 +816,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1InitPIN
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
|
jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_InitPIN)(ckSessionHandle, ckpPin, ckPinLength);
|
rv = (*ckpFunctions->C_InitPIN)(ckSessionHandle, ckpPin, ckPinLength);
|
||||||
|
|
||||||
@ -828,7 +855,12 @@ jcharArray jNewPin)
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jCharArrayToCKCharArray(env, jOldPin, &ckpOldPin, &ckOldPinLength);
|
jCharArrayToCKCharArray(env, jOldPin, &ckpOldPin, &ckOldPinLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
jCharArrayToCKCharArray(env, jNewPin, &ckpNewPin, &ckNewPinLength);
|
jCharArrayToCKCharArray(env, jNewPin, &ckpNewPin, &ckNewPinLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(ckpOldPin);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SetPIN)(ckSessionHandle, ckpOldPin, ckOldPinLength,
|
rv = (*ckpFunctions->C_SetPIN)(ckSessionHandle, ckpOldPin, ckOldPinLength,
|
||||||
ckpNewPin, ckNewPinLength);
|
ckpNewPin, ckNewPinLength);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -74,7 +74,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey
|
|||||||
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
|
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
|
||||||
CK_ULONG ckAttributesLength;
|
CK_ULONG ckAttributesLength;
|
||||||
CK_OBJECT_HANDLE ckKeyHandle;
|
CK_OBJECT_HANDLE ckKeyHandle;
|
||||||
jlong jKeyHandle;
|
jlong jKeyHandle = 0L;
|
||||||
CK_ULONG i;
|
CK_ULONG i;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
@ -83,21 +83,23 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
if ((*env)->ExceptionOccurred(env)) { return 0L ; }
|
if ((*env)->ExceptionCheck(env)) { return 0L ; }
|
||||||
|
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GenerateKey)(ckSessionHandle, &ckMechanism, ckpAttributes, ckAttributesLength, &ckKeyHandle);
|
rv = (*ckpFunctions->C_GenerateKey)(ckSessionHandle, &ckMechanism, ckpAttributes, ckAttributesLength, &ckKeyHandle);
|
||||||
|
|
||||||
jKeyHandle = ckULongToJLong(ckKeyHandle);
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
for(i=0; i<ckAttributesLength; i++) {
|
jKeyHandle = ckULongToJLong(ckKeyHandle);
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(ckpAttributes);
|
|
||||||
|
|
||||||
/* cheack, if we must give a initialization vector back to Java */
|
/* cheack, if we must give a initialization vector back to Java */
|
||||||
switch (ckMechanism.mechanism) {
|
switch (ckMechanism.mechanism) {
|
||||||
case CKM_PBE_MD2_DES_CBC:
|
case CKM_PBE_MD2_DES_CBC:
|
||||||
case CKM_PBE_MD5_DES_CBC:
|
case CKM_PBE_MD5_DES_CBC:
|
||||||
case CKM_PBE_MD5_CAST_CBC:
|
case CKM_PBE_MD5_CAST_CBC:
|
||||||
@ -109,13 +111,13 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey
|
|||||||
/* we must copy back the initialization vector to the jMechanism object */
|
/* we must copy back the initialization vector to the jMechanism object */
|
||||||
copyBackPBEInitializationVector(env, &ckMechanism, jMechanism);
|
copyBackPBEInitializationVector(env, &ckMechanism, jMechanism);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
|
||||||
|
|
||||||
return jKeyHandle ;
|
return jKeyHandle ;
|
||||||
}
|
}
|
||||||
@ -158,40 +160,53 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Generate
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
jAttributeArrayToCKAttributeArray(env, jPublicKeyTemplate, &ckpPublicKeyAttributes, &ckPublicKeyAttributesLength);
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength);
|
|
||||||
ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) malloc(2 * sizeof(CK_OBJECT_HANDLE));
|
ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) malloc(2 * sizeof(CK_OBJECT_HANDLE));
|
||||||
|
if (ckpKeyHandles == NULL) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
ckpPublicKeyHandle = ckpKeyHandles; /* first element of array is Public Key */
|
ckpPublicKeyHandle = ckpKeyHandles; /* first element of array is Public Key */
|
||||||
ckpPrivateKeyHandle = (ckpKeyHandles + 1); /* second element of array is Private Key */
|
ckpPrivateKeyHandle = (ckpKeyHandles + 1); /* second element of array is Private Key */
|
||||||
|
|
||||||
|
jAttributeArrayToCKAttributeArray(env, jPublicKeyTemplate, &ckpPublicKeyAttributes, &ckPublicKeyAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
free(ckpKeyHandles);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
free(ckpKeyHandles);
|
||||||
|
freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism,
|
rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism,
|
||||||
ckpPublicKeyAttributes, ckPublicKeyAttributesLength,
|
ckpPublicKeyAttributes, ckPublicKeyAttributesLength,
|
||||||
ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength,
|
ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength,
|
||||||
ckpPublicKeyHandle, ckpPrivateKeyHandle);
|
ckpPublicKeyHandle, ckpPrivateKeyHandle);
|
||||||
|
|
||||||
jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
|
||||||
for(i=0; i<ckPublicKeyAttributesLength; i++) {
|
|
||||||
if(ckpPublicKeyAttributes[i].pValue != NULL_PTR) {
|
|
||||||
free(ckpPublicKeyAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
free(ckpPublicKeyAttributes);
|
|
||||||
|
|
||||||
for(i=0; i<ckPrivateKeyAttributesLength; i++) {
|
|
||||||
if(ckpPrivateKeyAttributes[i].pValue != NULL_PTR) {
|
|
||||||
free(ckpPrivateKeyAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(ckpPrivateKeyAttributes);
|
|
||||||
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
if(ckMechanism.pParameter != NULL_PTR) {
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ckpKeyHandles);
|
free(ckpKeyHandles);
|
||||||
|
freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL; }
|
freeCKAttributeArray(ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength);
|
||||||
|
|
||||||
return jKeyHandles ;
|
return jKeyHandles ;
|
||||||
}
|
}
|
||||||
@ -217,7 +232,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1WrapKey
|
|||||||
CK_MECHANISM ckMechanism;
|
CK_MECHANISM ckMechanism;
|
||||||
CK_OBJECT_HANDLE ckWrappingKeyHandle;
|
CK_OBJECT_HANDLE ckWrappingKeyHandle;
|
||||||
CK_OBJECT_HANDLE ckKeyHandle;
|
CK_OBJECT_HANDLE ckKeyHandle;
|
||||||
jbyteArray jWrappedKey;
|
jbyteArray jWrappedKey = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
CK_BYTE BUF[MAX_STACK_BUFFER_LEN];
|
CK_BYTE BUF[MAX_STACK_BUFFER_LEN];
|
||||||
CK_BYTE_PTR ckpWrappedKey = BUF;
|
CK_BYTE_PTR ckpWrappedKey = BUF;
|
||||||
@ -228,24 +243,32 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1WrapKey
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
|
|
||||||
ckWrappingKeyHandle = jLongToCKULong(jWrappingKeyHandle);
|
ckWrappingKeyHandle = jLongToCKULong(jWrappingKeyHandle);
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
|
rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
|
||||||
if (rv == CKR_BUFFER_TOO_SMALL) {
|
if (rv == CKR_BUFFER_TOO_SMALL) {
|
||||||
ckpWrappedKey = (CK_BYTE_PTR) malloc(ckWrappedKeyLength);
|
ckpWrappedKey = (CK_BYTE_PTR) malloc(ckWrappedKeyLength);
|
||||||
|
if (ckpWrappedKey == NULL) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
|
rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
|
||||||
}
|
}
|
||||||
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jWrappedKey = ckByteArrayToJByteArray(env, ckpWrappedKey, ckWrappedKeyLength);
|
jWrappedKey = ckByteArrayToJByteArray(env, ckpWrappedKey, ckWrappedKeyLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ckpWrappedKey != BUF) {
|
if (ckpWrappedKey != BUF) { free(ckpWrappedKey); }
|
||||||
free(ckpWrappedKey);
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
}
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR)
|
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
return jWrappedKey ;
|
return jWrappedKey ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -277,7 +300,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1UnwrapKey
|
|||||||
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
|
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
|
||||||
CK_ULONG ckAttributesLength;
|
CK_ULONG ckAttributesLength;
|
||||||
CK_OBJECT_HANDLE ckKeyHandle;
|
CK_OBJECT_HANDLE ckKeyHandle;
|
||||||
jlong jKeyHandle;
|
jlong jKeyHandle = 0L;
|
||||||
CK_ULONG i;
|
CK_ULONG i;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
@ -286,37 +309,48 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1UnwrapKey
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return 0L; }
|
||||||
|
|
||||||
ckUnwrappingKeyHandle = jLongToCKULong(jUnwrappingKeyHandle);
|
ckUnwrappingKeyHandle = jLongToCKULong(jUnwrappingKeyHandle);
|
||||||
jByteArrayToCKByteArray(env, jWrappedKey, &ckpWrappedKey, &ckWrappedKeyLength);
|
jByteArrayToCKByteArray(env, jWrappedKey, &ckpWrappedKey, &ckWrappedKeyLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
free(ckpWrappedKey);
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, ckUnwrappingKeyHandle,
|
rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, ckUnwrappingKeyHandle,
|
||||||
ckpWrappedKey, ckWrappedKeyLength,
|
ckpWrappedKey, ckWrappedKeyLength,
|
||||||
ckpAttributes, ckAttributesLength, &ckKeyHandle);
|
ckpAttributes, ckAttributesLength, &ckKeyHandle);
|
||||||
|
|
||||||
jKeyHandle = ckLongToJLong(ckKeyHandle);
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jKeyHandle = ckLongToJLong(ckKeyHandle);
|
||||||
for(i=0; i<ckAttributesLength; i++) {
|
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(ckpAttributes);
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* cheack, if we must give a initialization vector back to Java */
|
/* cheack, if we must give a initialization vector back to Java */
|
||||||
if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) {
|
if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) {
|
||||||
/* we must copy back the unwrapped key info to the jMechanism object */
|
/* we must copy back the unwrapped key info to the jMechanism object */
|
||||||
copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism);
|
copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
free(ckpWrappedKey);
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
free(ckpWrappedKey);
|
||||||
|
|
||||||
return jKeyHandle ;
|
return jKeyHandle ;
|
||||||
}
|
}
|
||||||
@ -360,8 +394,7 @@ void freeEcdh1DeriveParams(CK_MECHANISM_PTR ckMechanism) {
|
|||||||
*/
|
*/
|
||||||
void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
|
void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
|
||||||
{
|
{
|
||||||
jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
|
jclass jMechanismClass, jTLSPrfParamsClass;
|
||||||
jclass jTLSPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
|
|
||||||
CK_TLS_PRF_PARAMS *ckTLSPrfParams;
|
CK_TLS_PRF_PARAMS *ckTLSPrfParams;
|
||||||
jobject jTLSPrfParams;
|
jobject jTLSPrfParams;
|
||||||
jfieldID fieldID;
|
jfieldID fieldID;
|
||||||
@ -374,8 +407,10 @@ void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMecha
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* get mechanism */
|
/* get mechanism */
|
||||||
|
jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
|
||||||
|
if (jMechanismClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
|
fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
|
jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
|
||||||
ckMechanismType = jLongToCKULong(jMechanismType);
|
ckMechanismType = jLongToCKULong(jMechanismType);
|
||||||
if (ckMechanismType != ckMechanism->mechanism) {
|
if (ckMechanismType != ckMechanism->mechanism) {
|
||||||
@ -388,12 +423,14 @@ void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMecha
|
|||||||
if (ckTLSPrfParams != NULL_PTR) {
|
if (ckTLSPrfParams != NULL_PTR) {
|
||||||
/* get the Java CK_TLS_PRF_PARAMS object (pParameter) */
|
/* get the Java CK_TLS_PRF_PARAMS object (pParameter) */
|
||||||
fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
|
fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jTLSPrfParams = (*env)->GetObjectField(env, jMechanism, fieldID);
|
jTLSPrfParams = (*env)->GetObjectField(env, jMechanism, fieldID);
|
||||||
|
|
||||||
/* copy back the client IV */
|
/* copy back the client IV */
|
||||||
|
jTLSPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
|
||||||
|
if (jTLSPrfParamsClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jTLSPrfParamsClass, "pOutput", "[B");
|
fieldID = (*env)->GetFieldID(env, jTLSPrfParamsClass, "pOutput", "[B");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jOutput = (*env)->GetObjectField(env, jTLSPrfParams, fieldID);
|
jOutput = (*env)->GetObjectField(env, jTLSPrfParams, fieldID);
|
||||||
output = ckTLSPrfParams->pOutput;
|
output = ckTLSPrfParams->pOutput;
|
||||||
|
|
||||||
@ -402,26 +439,21 @@ void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMecha
|
|||||||
if (jOutput != NULL) {
|
if (jOutput != NULL) {
|
||||||
jLength = (*env)->GetArrayLength(env, jOutput);
|
jLength = (*env)->GetArrayLength(env, jOutput);
|
||||||
jBytes = (*env)->GetByteArrayElements(env, jOutput, NULL);
|
jBytes = (*env)->GetByteArrayElements(env, jOutput, NULL);
|
||||||
|
if (jBytes == NULL) { return; }
|
||||||
|
|
||||||
/* copy the bytes to the Java buffer */
|
/* copy the bytes to the Java buffer */
|
||||||
for (i=0; i < jLength; i++) {
|
for (i=0; i < jLength; i++) {
|
||||||
jBytes[i] = ckByteToJByte(output[i]);
|
jBytes[i] = ckByteToJByte(output[i]);
|
||||||
}
|
}
|
||||||
/* copy back the Java buffer to the object */
|
/* copy back the Java buffer to the object */
|
||||||
(*env)->ReleaseByteArrayElements(env, jOutput, jBytes, 0);
|
(*env)->ReleaseByteArrayElements(env, jOutput, jBytes, 0);
|
||||||
// free malloc'd data
|
|
||||||
free(output);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// free malloc'd data
|
// free malloc'd data
|
||||||
if (ckTLSPrfParams->pSeed != NULL) {
|
free(ckTLSPrfParams->pSeed);
|
||||||
free(ckTLSPrfParams->pSeed);
|
free(ckTLSPrfParams->pLabel);
|
||||||
}
|
free(ckTLSPrfParams->pulOutputLen);
|
||||||
if (ckTLSPrfParams->pLabel != NULL) {
|
free(ckTLSPrfParams->pOutput);
|
||||||
free(ckTLSPrfParams->pLabel);
|
|
||||||
}
|
|
||||||
if (ckTLSPrfParams->pulOutputLen != NULL) {
|
|
||||||
free(ckTLSPrfParams->pulOutputLen);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,8 +488,16 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return 0L; }
|
||||||
|
|
||||||
ckBaseKeyHandle = jLongToCKULong(jBaseKeyHandle);
|
ckBaseKeyHandle = jLongToCKULong(jBaseKeyHandle);
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
|
free(ckMechanism.pParameter);
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
switch (ckMechanism.mechanism) {
|
switch (ckMechanism.mechanism) {
|
||||||
case CKM_SSL3_KEY_AND_MAC_DERIVE:
|
case CKM_SSL3_KEY_AND_MAC_DERIVE:
|
||||||
@ -476,14 +516,8 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey
|
|||||||
ckpAttributes, ckAttributesLength, phKey);
|
ckpAttributes, ckAttributesLength, phKey);
|
||||||
|
|
||||||
jKeyHandle = ckLongToJLong(ckKeyHandle);
|
jKeyHandle = ckLongToJLong(ckKeyHandle);
|
||||||
for(i=0; i<ckAttributesLength; i++) {
|
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ckpAttributes != NULL) {
|
|
||||||
free(ckpAttributes);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ckMechanism.mechanism) {
|
switch (ckMechanism.mechanism) {
|
||||||
case CKM_SSL3_MASTER_KEY_DERIVE:
|
case CKM_SSL3_MASTER_KEY_DERIVE:
|
||||||
@ -512,11 +546,10 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
|
||||||
|
|
||||||
return jKeyHandle ;
|
return jKeyHandle ;
|
||||||
}
|
}
|
||||||
@ -529,9 +562,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey
|
|||||||
*/
|
*/
|
||||||
void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
|
void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
|
||||||
{
|
{
|
||||||
jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
|
jclass jMechanismClass, jSSL3MasterKeyDeriveParamsClass, jVersionClass;
|
||||||
jclass jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
|
|
||||||
jclass jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
|
|
||||||
CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams;
|
CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams;
|
||||||
CK_VERSION *ckVersion;
|
CK_VERSION *ckVersion;
|
||||||
jfieldID fieldID;
|
jfieldID fieldID;
|
||||||
@ -541,8 +572,10 @@ void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMech
|
|||||||
jobject jVersion;
|
jobject jVersion;
|
||||||
|
|
||||||
/* get mechanism */
|
/* get mechanism */
|
||||||
|
jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
|
||||||
|
if (jMechanismClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
|
fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
|
jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
|
||||||
ckMechanismType = jLongToCKULong(jMechanismType);
|
ckMechanismType = jLongToCKULong(jMechanismType);
|
||||||
if (ckMechanismType != ckMechanism->mechanism) {
|
if (ckMechanismType != ckMechanism->mechanism) {
|
||||||
@ -558,27 +591,31 @@ void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMech
|
|||||||
if (ckVersion != NULL_PTR) {
|
if (ckVersion != NULL_PTR) {
|
||||||
/* get the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS (pParameter) */
|
/* get the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS (pParameter) */
|
||||||
fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
|
fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
|
|
||||||
jSSL3MasterKeyDeriveParams = (*env)->GetObjectField(env, jMechanism, fieldID);
|
jSSL3MasterKeyDeriveParams = (*env)->GetObjectField(env, jMechanism, fieldID);
|
||||||
|
|
||||||
/* get the Java CK_VERSION */
|
/* get the Java CK_VERSION */
|
||||||
|
jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
|
||||||
|
if (jSSL3MasterKeyDeriveParamsClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3MasterKeyDeriveParamsClass, "pVersion", "L"CLASS_VERSION";");
|
fieldID = (*env)->GetFieldID(env, jSSL3MasterKeyDeriveParamsClass, "pVersion", "L"CLASS_VERSION";");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jVersion = (*env)->GetObjectField(env, jSSL3MasterKeyDeriveParams, fieldID);
|
jVersion = (*env)->GetObjectField(env, jSSL3MasterKeyDeriveParams, fieldID);
|
||||||
|
|
||||||
/* now copy back the version from the native structure to the Java structure */
|
/* now copy back the version from the native structure to the Java structure */
|
||||||
|
|
||||||
/* copy back the major version */
|
/* copy back the major version */
|
||||||
|
jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
|
||||||
|
if (jVersionClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
|
fieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
(*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->major));
|
(*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->major));
|
||||||
|
|
||||||
/* copy back the minor version */
|
/* copy back the minor version */
|
||||||
fieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
|
fieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
(*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->minor));
|
(*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->minor));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -591,9 +628,7 @@ void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMech
|
|||||||
*/
|
*/
|
||||||
void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
|
void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
|
||||||
{
|
{
|
||||||
jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
|
jclass jMechanismClass, jSSL3KeyMatParamsClass, jSSL3KeyMatOutClass;
|
||||||
jclass jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
|
|
||||||
jclass jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
|
|
||||||
CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam;
|
CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam;
|
||||||
CK_SSL3_KEY_MAT_OUT *ckSSL3KeyMatOut;
|
CK_SSL3_KEY_MAT_OUT *ckSSL3KeyMatOut;
|
||||||
jfieldID fieldID;
|
jfieldID fieldID;
|
||||||
@ -608,8 +643,10 @@ void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMe
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* get mechanism */
|
/* get mechanism */
|
||||||
|
jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
|
||||||
|
if (jMechanismClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
|
fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
|
jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
|
||||||
ckMechanismType = jLongToCKULong(jMechanismType);
|
ckMechanismType = jLongToCKULong(jMechanismType);
|
||||||
if (ckMechanismType != ckMechanism->mechanism) {
|
if (ckMechanismType != ckMechanism->mechanism) {
|
||||||
@ -633,74 +670,78 @@ void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMe
|
|||||||
if (ckSSL3KeyMatOut != NULL_PTR) {
|
if (ckSSL3KeyMatOut != NULL_PTR) {
|
||||||
/* get the Java CK_SSL3_KEY_MAT_PARAMS (pParameter) */
|
/* get the Java CK_SSL3_KEY_MAT_PARAMS (pParameter) */
|
||||||
fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
|
fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jSSL3KeyMatParam = (*env)->GetObjectField(env, jMechanism, fieldID);
|
jSSL3KeyMatParam = (*env)->GetObjectField(env, jMechanism, fieldID);
|
||||||
|
|
||||||
/* get the Java CK_SSL3_KEY_MAT_OUT */
|
/* get the Java CK_SSL3_KEY_MAT_OUT */
|
||||||
|
jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
|
||||||
|
if (jSSL3KeyMatParamsClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatParamsClass, "pReturnedKeyMaterial", "L"CLASS_SSL3_KEY_MAT_OUT";");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatParamsClass, "pReturnedKeyMaterial", "L"CLASS_SSL3_KEY_MAT_OUT";");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jSSL3KeyMatOut = (*env)->GetObjectField(env, jSSL3KeyMatParam, fieldID);
|
jSSL3KeyMatOut = (*env)->GetObjectField(env, jSSL3KeyMatParam, fieldID);
|
||||||
|
|
||||||
/* now copy back all the key handles and the initialization vectors */
|
/* now copy back all the key handles and the initialization vectors */
|
||||||
/* copy back client MAC secret handle */
|
/* copy back client MAC secret handle */
|
||||||
|
jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
|
||||||
|
if (jSSL3KeyMatOutClass == NULL) { return; }
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientMacSecret", "J");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientMacSecret", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientMacSecret));
|
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientMacSecret));
|
||||||
|
|
||||||
/* copy back server MAC secret handle */
|
/* copy back server MAC secret handle */
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerMacSecret", "J");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerMacSecret", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerMacSecret));
|
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerMacSecret));
|
||||||
|
|
||||||
/* copy back client secret key handle */
|
/* copy back client secret key handle */
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientKey", "J");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientKey", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientKey));
|
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientKey));
|
||||||
|
|
||||||
/* copy back server secret key handle */
|
/* copy back server secret key handle */
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerKey", "J");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerKey", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerKey));
|
(*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerKey));
|
||||||
|
|
||||||
/* copy back the client IV */
|
/* copy back the client IV */
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVClient", "[B");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVClient", "[B");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
|
jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
|
||||||
iv = ckSSL3KeyMatOut->pIVClient;
|
iv = ckSSL3KeyMatOut->pIVClient;
|
||||||
|
|
||||||
if (jIV != NULL) {
|
if (jIV != NULL) {
|
||||||
jLength = (*env)->GetArrayLength(env, jIV);
|
jLength = (*env)->GetArrayLength(env, jIV);
|
||||||
jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
|
jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
|
||||||
|
if (jBytes == NULL) { return; }
|
||||||
/* copy the bytes to the Java buffer */
|
/* copy the bytes to the Java buffer */
|
||||||
for (i=0; i < jLength; i++) {
|
for (i=0; i < jLength; i++) {
|
||||||
jBytes[i] = ckByteToJByte(iv[i]);
|
jBytes[i] = ckByteToJByte(iv[i]);
|
||||||
}
|
}
|
||||||
/* copy back the Java buffer to the object */
|
/* copy back the Java buffer to the object */
|
||||||
(*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
|
(*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
|
||||||
// free malloc'd data
|
|
||||||
free(iv);
|
|
||||||
}
|
}
|
||||||
|
// free malloc'd data
|
||||||
|
free(ckSSL3KeyMatOut->pIVClient);
|
||||||
|
|
||||||
/* copy back the server IV */
|
/* copy back the server IV */
|
||||||
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVServer", "[B");
|
fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVServer", "[B");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return; }
|
||||||
jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
|
jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
|
||||||
iv = ckSSL3KeyMatOut->pIVServer;
|
iv = ckSSL3KeyMatOut->pIVServer;
|
||||||
|
|
||||||
if (jIV != NULL) {
|
if (jIV != NULL) {
|
||||||
jLength = (*env)->GetArrayLength(env, jIV);
|
jLength = (*env)->GetArrayLength(env, jIV);
|
||||||
jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
|
jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
|
||||||
|
if (jBytes == NULL) { return; }
|
||||||
/* copy the bytes to the Java buffer */
|
/* copy the bytes to the Java buffer */
|
||||||
for (i=0; i < jLength; i++) {
|
for (i=0; i < jLength; i++) {
|
||||||
jBytes[i] = ckByteToJByte(iv[i]);
|
jBytes[i] = ckByteToJByte(iv[i]);
|
||||||
}
|
}
|
||||||
/* copy back the Java buffer to the object */
|
/* copy back the Java buffer to the object */
|
||||||
(*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
|
(*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
|
||||||
// free malloc'd data
|
|
||||||
free(iv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// free malloc'd data
|
// free malloc'd data
|
||||||
|
free(ckSSL3KeyMatOut->pIVServer);
|
||||||
free(ckSSL3KeyMatOut);
|
free(ckSSL3KeyMatOut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -76,7 +76,7 @@ CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs;
|
|||||||
CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
|
CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
|
||||||
{
|
{
|
||||||
CK_C_INITIALIZE_ARGS_PTR ckpInitArgs;
|
CK_C_INITIALIZE_ARGS_PTR ckpInitArgs;
|
||||||
jclass jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
jclass jInitArgsClass;
|
||||||
jfieldID fieldID;
|
jfieldID fieldID;
|
||||||
jlong jFlags;
|
jlong jFlags;
|
||||||
jobject jReserved;
|
jobject jReserved;
|
||||||
@ -91,10 +91,20 @@ CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
|
|||||||
|
|
||||||
/* convert the Java InitArgs object to a pointer to a CK_C_INITIALIZE_ARGS structure */
|
/* convert the Java InitArgs object to a pointer to a CK_C_INITIALIZE_ARGS structure */
|
||||||
ckpInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
|
ckpInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
|
||||||
|
if (ckpInitArgs == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL_PTR;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the mutex functions that will call the Java mutex functions, but
|
/* Set the mutex functions that will call the Java mutex functions, but
|
||||||
* only set it, if the field is not null.
|
* only set it, if the field is not null.
|
||||||
*/
|
*/
|
||||||
|
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
||||||
|
if (jInitArgsClass == NULL) {
|
||||||
|
free(ckpInitArgs);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef NO_CALLBACKS
|
#ifdef NO_CALLBACKS
|
||||||
ckpInitArgs->CreateMutex = NULL_PTR;
|
ckpInitArgs->CreateMutex = NULL_PTR;
|
||||||
ckpInitArgs->DestroyMutex = NULL_PTR;
|
ckpInitArgs->DestroyMutex = NULL_PTR;
|
||||||
@ -102,22 +112,22 @@ CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
|
|||||||
ckpInitArgs->UnlockMutex = NULL_PTR;
|
ckpInitArgs->UnlockMutex = NULL_PTR;
|
||||||
#else
|
#else
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return NULL; }
|
||||||
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
||||||
ckpInitArgs->CreateMutex = (jMutexHandler != NULL) ? &callJCreateMutex : NULL_PTR;
|
ckpInitArgs->CreateMutex = (jMutexHandler != NULL) ? &callJCreateMutex : NULL_PTR;
|
||||||
|
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return NULL; }
|
||||||
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
||||||
ckpInitArgs->DestroyMutex = (jMutexHandler != NULL) ? &callJDestroyMutex : NULL_PTR;
|
ckpInitArgs->DestroyMutex = (jMutexHandler != NULL) ? &callJDestroyMutex : NULL_PTR;
|
||||||
|
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return NULL; }
|
||||||
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
||||||
ckpInitArgs->LockMutex = (jMutexHandler != NULL) ? &callJLockMutex : NULL_PTR;
|
ckpInitArgs->LockMutex = (jMutexHandler != NULL) ? &callJLockMutex : NULL_PTR;
|
||||||
|
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return NULL; }
|
||||||
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
||||||
ckpInitArgs->UnlockMutex = (jMutexHandler != NULL) ? &callJUnlockMutex : NULL_PTR;
|
ckpInitArgs->UnlockMutex = (jMutexHandler != NULL) ? &callJUnlockMutex : NULL_PTR;
|
||||||
|
|
||||||
@ -129,19 +139,25 @@ CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
|
|||||||
/* set the global object jInitArgs so that the right Java mutex functions will be called */
|
/* set the global object jInitArgs so that the right Java mutex functions will be called */
|
||||||
jInitArgsObject = (*env)->NewGlobalRef(env, jInitArgs);
|
jInitArgsObject = (*env)->NewGlobalRef(env, jInitArgs);
|
||||||
ckpGlobalInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
|
ckpGlobalInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
|
||||||
|
if (ckpGlobalInitArgs == NULL) {
|
||||||
|
free(ckpInitArgs);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL_PTR;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(ckpGlobalInitArgs, ckpInitArgs, sizeof(CK_C_INITIALIZE_ARGS));
|
memcpy(ckpGlobalInitArgs, ckpInitArgs, sizeof(CK_C_INITIALIZE_ARGS));
|
||||||
}
|
}
|
||||||
#endif /* NO_CALLBACKS */
|
#endif /* NO_CALLBACKS */
|
||||||
|
|
||||||
/* convert and set the flags field */
|
/* convert and set the flags field */
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "flags", "J");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "flags", "J");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return NULL; }
|
||||||
jFlags = (*env)->GetLongField(env, jInitArgs, fieldID);
|
jFlags = (*env)->GetLongField(env, jInitArgs, fieldID);
|
||||||
ckpInitArgs->flags = jLongToCKULong(jFlags);
|
ckpInitArgs->flags = jLongToCKULong(jFlags);
|
||||||
|
|
||||||
/* pReserved should be NULL_PTR in this version */
|
/* pReserved should be NULL_PTR in this version */
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "pReserved", "Ljava/lang/Object;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "pReserved", "Ljava/lang/Object;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return NULL; }
|
||||||
jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID);
|
||||||
|
|
||||||
/* we try to convert the reserved parameter also */
|
/* we try to convert the reserved parameter also */
|
||||||
@ -201,20 +217,21 @@ CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex)
|
|||||||
wasAttached = 1;
|
wasAttached = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
jCreateMutexClass = (*env)->FindClass(env, CLASS_CREATEMUTEX);
|
jCreateMutexClass = (*env)->FindClass(env, CLASS_CREATEMUTEX);
|
||||||
|
if (jCreateMutexClass == NULL) { return rv; }
|
||||||
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
||||||
|
if (jInitArgsClass == NULL) { return rv; }
|
||||||
|
|
||||||
/* get the CreateMutex object out of the jInitArgs object */
|
/* get the CreateMutex object out of the jInitArgs object */
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return rv; }
|
||||||
jCreateMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
jCreateMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
||||||
assert(jCreateMutex != 0);
|
assert(jCreateMutex != 0);
|
||||||
|
|
||||||
/* call the CK_CREATEMUTEX function of the CreateMutex object */
|
/* call the CK_CREATEMUTEX function of the CreateMutex object */
|
||||||
/* and get the new Java mutex object */
|
/* and get the new Java mutex object */
|
||||||
methodID = (*env)->GetMethodID(env, jCreateMutexClass, "CK_CREATEMUTEX", "()Ljava/lang/Object;");
|
methodID = (*env)->GetMethodID(env, jCreateMutexClass, "CK_CREATEMUTEX", "()Ljava/lang/Object;");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
jMutex = (*env)->CallObjectMethod(env, jCreateMutex, methodID);
|
jMutex = (*env)->CallObjectMethod(env, jCreateMutex, methodID);
|
||||||
|
|
||||||
/* set a global reference on the Java mutex */
|
/* set a global reference on the Java mutex */
|
||||||
@ -227,10 +244,13 @@ CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex)
|
|||||||
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
||||||
|
|
||||||
if (pkcs11Exception != NULL) {
|
if (pkcs11Exception != NULL) {
|
||||||
|
/* TBD: clear the pending exception with ExceptionClear? */
|
||||||
/* The was an exception thrown, now we get the error-code from it */
|
/* The was an exception thrown, now we get the error-code from it */
|
||||||
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
||||||
|
if (pkcs11ExceptionClass == NULL) { return rv; }
|
||||||
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
|
|
||||||
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
||||||
rv = jLongToCKULong(errorCode);
|
rv = jLongToCKULong(errorCode);
|
||||||
}
|
}
|
||||||
@ -292,22 +312,23 @@ CK_RV callJDestroyMutex(CK_VOID_PTR pMutex)
|
|||||||
wasAttached = 1;
|
wasAttached = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
jDestroyMutexClass = (*env)->FindClass(env, CLASS_DESTROYMUTEX);
|
jDestroyMutexClass = (*env)->FindClass(env, CLASS_DESTROYMUTEX);
|
||||||
|
if (jDestroyMutexClass == NULL) { return rv; }
|
||||||
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
||||||
|
if (jInitArgsClass == NULL) { return rv; }
|
||||||
|
|
||||||
/* convert the CK mutex to a Java mutex */
|
/* convert the CK mutex to a Java mutex */
|
||||||
jMutex = ckVoidPtrToJObject(pMutex);
|
jMutex = ckVoidPtrToJObject(pMutex);
|
||||||
|
|
||||||
/* get the DestroyMutex object out of the jInitArgs object */
|
/* get the DestroyMutex object out of the jInitArgs object */
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return rv; }
|
||||||
jDestroyMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
jDestroyMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
||||||
assert(jDestroyMutex != 0);
|
assert(jDestroyMutex != 0);
|
||||||
|
|
||||||
/* call the CK_DESTROYMUTEX method of the DestroyMutex object */
|
/* call the CK_DESTROYMUTEX method of the DestroyMutex object */
|
||||||
methodID = (*env)->GetMethodID(env, jDestroyMutexClass, "CK_DESTROYMUTEX", "(Ljava/lang/Object;)V");
|
methodID = (*env)->GetMethodID(env, jDestroyMutexClass, "CK_DESTROYMUTEX", "(Ljava/lang/Object;)V");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
(*env)->CallVoidMethod(env, jDestroyMutex, methodID, jMutex);
|
(*env)->CallVoidMethod(env, jDestroyMutex, methodID, jMutex);
|
||||||
|
|
||||||
/* delete the global reference on the Java mutex */
|
/* delete the global reference on the Java mutex */
|
||||||
@ -318,10 +339,12 @@ CK_RV callJDestroyMutex(CK_VOID_PTR pMutex)
|
|||||||
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
||||||
|
|
||||||
if (pkcs11Exception != NULL) {
|
if (pkcs11Exception != NULL) {
|
||||||
|
/* TBD: clear the pending exception with ExceptionClear? */
|
||||||
/* The was an exception thrown, now we get the error-code from it */
|
/* The was an exception thrown, now we get the error-code from it */
|
||||||
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
||||||
|
if (pkcs11ExceptionClass == NULL) { return rv; }
|
||||||
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
||||||
rv = jLongToCKULong(errorCode);
|
rv = jLongToCKULong(errorCode);
|
||||||
}
|
}
|
||||||
@ -383,33 +406,35 @@ CK_RV callJLockMutex(CK_VOID_PTR pMutex)
|
|||||||
wasAttached = 1;
|
wasAttached = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
jLockMutexClass = (*env)->FindClass(env, CLASS_LOCKMUTEX);
|
jLockMutexClass = (*env)->FindClass(env, CLASS_LOCKMUTEX);
|
||||||
|
if (jLockMutexClass == NULL) { return rv; }
|
||||||
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
||||||
|
if (jInitArgsClass == NULL) { return rv; }
|
||||||
|
|
||||||
/* convert the CK mutex to a Java mutex */
|
/* convert the CK mutex to a Java mutex */
|
||||||
jMutex = ckVoidPtrToJObject(pMutex);
|
jMutex = ckVoidPtrToJObject(pMutex);
|
||||||
|
|
||||||
/* get the LockMutex object out of the jInitArgs object */
|
/* get the LockMutex object out of the jInitArgs object */
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return rv; }
|
||||||
jLockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
jLockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
||||||
assert(jLockMutex != 0);
|
assert(jLockMutex != 0);
|
||||||
|
|
||||||
/* call the CK_LOCKMUTEX method of the LockMutex object */
|
/* call the CK_LOCKMUTEX method of the LockMutex object */
|
||||||
methodID = (*env)->GetMethodID(env, jLockMutexClass, "CK_LOCKMUTEX", "(Ljava/lang/Object;)V");
|
methodID = (*env)->GetMethodID(env, jLockMutexClass, "CK_LOCKMUTEX", "(Ljava/lang/Object;)V");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
(*env)->CallVoidMethod(env, jLockMutex, methodID, jMutex);
|
(*env)->CallVoidMethod(env, jLockMutex, methodID, jMutex);
|
||||||
|
|
||||||
|
|
||||||
/* check, if callback threw an exception */
|
/* check, if callback threw an exception */
|
||||||
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
||||||
|
|
||||||
if (pkcs11Exception != NULL) {
|
if (pkcs11Exception != NULL) {
|
||||||
|
/* TBD: clear the pending exception with ExceptionClear? */
|
||||||
/* The was an exception thrown, now we get the error-code from it */
|
/* The was an exception thrown, now we get the error-code from it */
|
||||||
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
||||||
|
if (pkcs11ExceptionClass == NULL) { return rv; }
|
||||||
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
||||||
rv = jLongToCKULong(errorCode);
|
rv = jLongToCKULong(errorCode);
|
||||||
}
|
}
|
||||||
@ -471,33 +496,35 @@ CK_RV callJUnlockMutex(CK_VOID_PTR pMutex)
|
|||||||
wasAttached = 1;
|
wasAttached = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
jUnlockMutexClass = (*env)->FindClass(env, CLASS_UNLOCKMUTEX);
|
jUnlockMutexClass = (*env)->FindClass(env, CLASS_UNLOCKMUTEX);
|
||||||
|
if (jUnlockMutexClass == NULL) { return rv; }
|
||||||
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
|
||||||
|
if (jInitArgsClass == NULL) { return rv; }
|
||||||
|
|
||||||
/* convert the CK-type mutex to a Java mutex */
|
/* convert the CK-type mutex to a Java mutex */
|
||||||
jMutex = ckVoidPtrToJObject(pMutex);
|
jMutex = ckVoidPtrToJObject(pMutex);
|
||||||
|
|
||||||
/* get the UnlockMutex object out of the jInitArgs object */
|
/* get the UnlockMutex object out of the jInitArgs object */
|
||||||
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
|
fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
|
||||||
assert(fieldID != 0);
|
if (fieldID == NULL) { return rv; }
|
||||||
jUnlockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
jUnlockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
|
||||||
assert(jUnlockMutex != 0);
|
assert(jUnlockMutex != 0);
|
||||||
|
|
||||||
/* call the CK_UNLOCKMUTEX method of the UnLockMutex object */
|
/* call the CK_UNLOCKMUTEX method of the UnLockMutex object */
|
||||||
methodID = (*env)->GetMethodID(env, jUnlockMutexClass, "CK_UNLOCKMUTEX", "(Ljava/lang/Object;)V");
|
methodID = (*env)->GetMethodID(env, jUnlockMutexClass, "CK_UNLOCKMUTEX", "(Ljava/lang/Object;)V");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
(*env)->CallVoidMethod(env, jUnlockMutex, methodID, jMutex);
|
(*env)->CallVoidMethod(env, jUnlockMutex, methodID, jMutex);
|
||||||
|
|
||||||
|
|
||||||
/* check, if callback threw an exception */
|
/* check, if callback threw an exception */
|
||||||
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
||||||
|
|
||||||
if (pkcs11Exception != NULL) {
|
if (pkcs11Exception != NULL) {
|
||||||
|
/* TBD: clear the pending exception with ExceptionClear? */
|
||||||
/* The was an exception thrown, now we get the error-code from it */
|
/* The was an exception thrown, now we get the error-code from it */
|
||||||
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
||||||
|
if (pkcs11ExceptionClass == NULL) { return rv; }
|
||||||
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
||||||
assert(methodID != 0);
|
if (methodID == NULL) { return rv; }
|
||||||
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
|
||||||
rv = jLongToCKULong(errorCode);
|
rv = jLongToCKULong(errorCode);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -81,16 +81,14 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CreateObject
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return 0L; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_CreateObject)(ckSessionHandle, ckpAttributes, ckAttributesLength, &ckObjectHandle);
|
rv = (*ckpFunctions->C_CreateObject)(ckSessionHandle, ckpAttributes, ckAttributesLength, &ckObjectHandle);
|
||||||
|
|
||||||
jObjectHandle = ckULongToJLong(ckObjectHandle);
|
jObjectHandle = ckULongToJLong(ckObjectHandle);
|
||||||
for(i=0; i<ckAttributesLength; i++)
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR)
|
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
free(ckpAttributes);
|
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
||||||
|
|
||||||
return jObjectHandle ;
|
return jObjectHandle ;
|
||||||
}
|
}
|
||||||
@ -126,14 +124,12 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CopyObject
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return 0L; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_CopyObject)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength, &ckNewObjectHandle);
|
rv = (*ckpFunctions->C_CopyObject)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength, &ckNewObjectHandle);
|
||||||
|
|
||||||
jNewObjectHandle = ckULongToJLong(ckNewObjectHandle);
|
jNewObjectHandle = ckULongToJLong(ckNewObjectHandle);
|
||||||
for(i=0; i<ckAttributesLength; i++)
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR)
|
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
free(ckpAttributes);
|
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
||||||
|
|
||||||
@ -164,7 +160,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DestroyObject
|
|||||||
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_DestroyObject)(ckSessionHandle, ckObjectHandle);
|
rv = (*ckpFunctions->C_DestroyObject)(ckSessionHandle, ckObjectHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -194,7 +190,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetObjectSize
|
|||||||
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetObjectSize)(ckSessionHandle, ckObjectHandle, &ckObjectSize);
|
rv = (*ckpFunctions->C_GetObjectSize)(ckSessionHandle, ckObjectHandle, &ckObjectSize);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
||||||
|
|
||||||
jObjectSize = ckULongToJLong(ckObjectSize);
|
jObjectSize = ckULongToJLong(ckObjectSize);
|
||||||
|
|
||||||
@ -221,7 +217,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetAttributeVa
|
|||||||
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
|
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
|
||||||
CK_ULONG ckAttributesLength;
|
CK_ULONG ckAttributesLength;
|
||||||
CK_ULONG ckBufferLength;
|
CK_ULONG ckBufferLength;
|
||||||
CK_ULONG i;
|
CK_ULONG i, j;
|
||||||
jobject jAttribute;
|
jobject jAttribute;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
@ -238,19 +234,20 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetAttributeVa
|
|||||||
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
||||||
TRACE1("jAttributeArrayToCKAttributeArray now with jTemplate = %d", jTemplate);
|
TRACE1("jAttributeArrayToCKAttributeArray now with jTemplate = %d", jTemplate);
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
TRACE2("DEBUG: jAttributeArrayToCKAttributeArray finished with ckpAttribute = %d, Length = %d\n", ckpAttributes, ckAttributesLength);
|
TRACE2("DEBUG: jAttributeArrayToCKAttributeArray finished with ckpAttribute = %d, Length = %d\n", ckpAttributes, ckAttributesLength);
|
||||||
|
|
||||||
/* first set all pValue to NULL, to get the needed buffer length */
|
/* first set all pValue to NULL, to get the needed buffer length */
|
||||||
for(i = 0; i < ckAttributesLength; i++) {
|
for(i = 0; i < ckAttributesLength; i++) {
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
if (ckpAttributes[i].pValue != NULL_PTR) {
|
||||||
free(ckpAttributes[i].pValue);
|
free(ckpAttributes[i].pValue);
|
||||||
|
ckpAttributes[i].pValue = NULL_PTR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = 0; i < ckAttributesLength; i++) {
|
|
||||||
ckpAttributes[i].pValue = NULL_PTR;
|
|
||||||
}
|
|
||||||
rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
|
rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
free(ckpAttributes);
|
free(ckpAttributes);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
@ -261,27 +258,34 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetAttributeVa
|
|||||||
for (i = 0; i < ckAttributesLength; i++) {
|
for (i = 0; i < ckAttributesLength; i++) {
|
||||||
ckBufferLength = sizeof(CK_BYTE) * ckpAttributes[i].ulValueLen;
|
ckBufferLength = sizeof(CK_BYTE) * ckpAttributes[i].ulValueLen;
|
||||||
ckpAttributes[i].pValue = (void *) malloc(ckBufferLength);
|
ckpAttributes[i].pValue = (void *) malloc(ckBufferLength);
|
||||||
|
if (ckpAttributes[i].pValue == NULL) {
|
||||||
|
freeCKAttributeArray(ckpAttributes, i);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ckpAttributes[i].ulValueLen = ckBufferLength;
|
ckpAttributes[i].ulValueLen = ckBufferLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now get the attributes with all values */
|
/* now get the attributes with all values */
|
||||||
rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
|
rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
|
||||||
|
|
||||||
/* copy back the values to the Java attributes */
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
for (i = 0; i < ckAttributesLength; i++) {
|
/* copy back the values to the Java attributes */
|
||||||
jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
|
for (i = 0; i < ckAttributesLength; i++) {
|
||||||
(*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
|
jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
|
||||||
}
|
if (jAttribute == NULL) {
|
||||||
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
for(i=0; i<ckAttributesLength; i++) {
|
return;
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
}
|
||||||
free(ckpAttributes[i].pValue);
|
(*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(ckpAttributes);
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
TRACE0("FINISHED\n");
|
TRACE0("FINISHED\n");
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return ; }
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -312,15 +316,11 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SetAttributeVa
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
ckObjectHandle = jLongToCKULong(jObjectHandle);
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
|
rv = (*ckpFunctions->C_SetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
|
||||||
|
|
||||||
for(i=0; i<ckAttributesLength; i++) {
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(ckpAttributes);
|
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
@ -355,15 +355,11 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1FindObjectsIni
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_FindObjectsInit)(ckSessionHandle, ckpAttributes, ckAttributesLength);
|
rv = (*ckpFunctions->C_FindObjectsInit)(ckSessionHandle, ckpAttributes, ckAttributesLength);
|
||||||
|
|
||||||
for(i=0; i<ckAttributesLength; i++) {
|
freeCKAttributeArray(ckpAttributes, ckAttributesLength);
|
||||||
if(ckpAttributes[i].pValue != NULL_PTR) {
|
|
||||||
free(ckpAttributes[i].pValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(ckpAttributes);
|
|
||||||
TRACE0("FINISHED\n");
|
TRACE0("FINISHED\n");
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
@ -397,14 +393,18 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1FindObje
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
ckMaxObjectLength = jLongToCKULong(jMaxObjectCount);
|
ckMaxObjectLength = jLongToCKULong(jMaxObjectCount);
|
||||||
ckpObjectHandleArray = (CK_OBJECT_HANDLE_PTR) malloc(sizeof(CK_OBJECT_HANDLE) * ckMaxObjectLength);
|
ckpObjectHandleArray = (CK_OBJECT_HANDLE_PTR) malloc(sizeof(CK_OBJECT_HANDLE) * ckMaxObjectLength);
|
||||||
|
if (ckpObjectHandleArray == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_FindObjects)(ckSessionHandle, ckpObjectHandleArray, ckMaxObjectLength, &ckActualObjectCount);
|
rv = (*ckpFunctions->C_FindObjects)(ckSessionHandle, ckpObjectHandleArray, ckMaxObjectLength, &ckActualObjectCount);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
|
||||||
|
}
|
||||||
|
|
||||||
jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
|
|
||||||
free(ckpObjectHandleArray);
|
free(ckpObjectHandleArray);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jObjectHandleArray ;
|
return jObjectHandleArray ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -97,6 +97,10 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1OpenSession
|
|||||||
#ifndef NO_CALLBACKS
|
#ifndef NO_CALLBACKS
|
||||||
if (jNotify != NULL) {
|
if (jNotify != NULL) {
|
||||||
notifyEncapsulation = (NotifyEncapsulation *) malloc(sizeof(NotifyEncapsulation));
|
notifyEncapsulation = (NotifyEncapsulation *) malloc(sizeof(NotifyEncapsulation));
|
||||||
|
if (notifyEncapsulation == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
notifyEncapsulation->jApplicationData = (jApplication != NULL)
|
notifyEncapsulation->jApplicationData = (jApplication != NULL)
|
||||||
? (*env)->NewGlobalRef(env, jApplication)
|
? (*env)->NewGlobalRef(env, jApplication)
|
||||||
: NULL;
|
: NULL;
|
||||||
@ -118,7 +122,18 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1OpenSession
|
|||||||
TRACE0(" ... ");
|
TRACE0(" ... ");
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_OpenSession)(ckSlotID, ckFlags, ckpApplication, ckNotify, &ckSessionHandle);
|
rv = (*ckpFunctions->C_OpenSession)(ckSlotID, ckFlags, ckpApplication, ckNotify, &ckSessionHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
|
#ifndef NO_CALLBACKS
|
||||||
|
if (notifyEncapsulation != NULL) {
|
||||||
|
if (notifyEncapsulation->jApplicationData != NULL) {
|
||||||
|
(*env)->DeleteGlobalRef(env, jApplication);
|
||||||
|
}
|
||||||
|
(*env)->DeleteGlobalRef(env, jNotify);
|
||||||
|
free(notifyEncapsulation);
|
||||||
|
}
|
||||||
|
#endif /* NO_CALLBACKS */
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
TRACE0("got session");
|
TRACE0("got session");
|
||||||
TRACE1(", SessionHandle=%u", ckSessionHandle);
|
TRACE1(", SessionHandle=%u", ckSessionHandle);
|
||||||
@ -163,7 +178,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CloseSession
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_CloseSession)(ckSessionHandle);
|
rv = (*ckpFunctions->C_CloseSession)(ckSessionHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
|
|
||||||
#ifndef NO_CALLBACKS
|
#ifndef NO_CALLBACKS
|
||||||
notifyEncapsulation = removeNotifyEntry(env, ckSessionHandle);
|
notifyEncapsulation = removeNotifyEntry(env, ckSessionHandle);
|
||||||
@ -208,7 +223,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CloseAllSessio
|
|||||||
ckSlotID = jLongToCKULong(jSlotID);
|
ckSlotID = jLongToCKULong(jSlotID);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_CloseAllSessions)(ckSlotID);
|
rv = (*ckpFunctions->C_CloseAllSessions)(ckSlotID);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
|
|
||||||
#ifndef NO_CALLBACKS
|
#ifndef NO_CALLBACKS
|
||||||
/* Remove all notify callback helper objects. */
|
/* Remove all notify callback helper objects. */
|
||||||
@ -250,10 +265,9 @@ JNIEXPORT jobject JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSessionI
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetSessionInfo)(ckSessionHandle, &ckSessionInfo);
|
rv = (*ckpFunctions->C_GetSessionInfo)(ckSessionHandle, &ckSessionInfo);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
|
jSessionInfo = ckSessionInfoPtrToJSessionInfo(env, &ckSessionInfo);
|
||||||
jSessionInfo = ckSessionInfoPtrToJSessionInfo(env, &ckSessionInfo);
|
}
|
||||||
|
|
||||||
return jSessionInfo ;
|
return jSessionInfo ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -274,7 +288,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetOpera
|
|||||||
CK_SESSION_HANDLE ckSessionHandle;
|
CK_SESSION_HANDLE ckSessionHandle;
|
||||||
CK_BYTE_PTR ckpState;
|
CK_BYTE_PTR ckpState;
|
||||||
CK_ULONG ckStateLength;
|
CK_ULONG ckStateLength;
|
||||||
jbyteArray jState;
|
jbyteArray jState = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
|
||||||
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
|
||||||
@ -283,17 +297,20 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetOpera
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, NULL_PTR, &ckStateLength);
|
rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, NULL_PTR, &ckStateLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
||||||
|
|
||||||
ckpState = (CK_BYTE_PTR) malloc(ckStateLength);
|
ckpState = (CK_BYTE_PTR) malloc(ckStateLength);
|
||||||
|
if (ckpState == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, ckpState, &ckStateLength);
|
rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, ckpState, &ckStateLength);
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jState = ckByteArrayToJByteArray(env, ckpState, ckStateLength);
|
jState = ckByteArrayToJByteArray(env, ckpState, ckStateLength);
|
||||||
|
}
|
||||||
free(ckpState);
|
free(ckpState);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jState ;
|
return jState ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -325,6 +342,8 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SetOperationSt
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jOperationState, &ckpState, &ckStateLength);
|
jByteArrayToCKByteArray(env, jOperationState, &ckpState, &ckStateLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
ckEncryptionKeyHandle = jLongToCKULong(jEncryptionKeyHandle);
|
ckEncryptionKeyHandle = jLongToCKULong(jEncryptionKeyHandle);
|
||||||
ckAuthenticationKeyHandle = jLongToCKULong(jAuthenticationKeyHandle);
|
ckAuthenticationKeyHandle = jLongToCKULong(jAuthenticationKeyHandle);
|
||||||
|
|
||||||
@ -332,7 +351,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SetOperationSt
|
|||||||
|
|
||||||
free(ckpState);
|
free(ckpState);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -362,12 +381,13 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Login
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
ckUserType = jLongToCKULong(jUserType);
|
ckUserType = jLongToCKULong(jUserType);
|
||||||
jCharArrayToCKCharArray(env, jPin, &ckpPinArray, &ckPinLength);
|
jCharArrayToCKCharArray(env, jPin, &ckpPinArray, &ckPinLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_Login)(ckSessionHandle, ckUserType, ckpPinArray, ckPinLength);
|
rv = (*ckpFunctions->C_Login)(ckSessionHandle, ckUserType, ckpPinArray, ckPinLength);
|
||||||
|
|
||||||
free(ckpPinArray);
|
free(ckpPinArray);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -391,7 +411,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Logout
|
|||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_Logout)(ckSessionHandle);
|
rv = (*ckpFunctions->C_Logout)(ckSessionHandle);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -410,10 +430,14 @@ void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation
|
|||||||
NotifyListNode *currentNode, *newNode;
|
NotifyListNode *currentNode, *newNode;
|
||||||
|
|
||||||
if (notifyEncapsulation == NULL) {
|
if (notifyEncapsulation == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
newNode = (NotifyListNode *) malloc(sizeof(NotifyListNode));
|
newNode = (NotifyListNode *) malloc(sizeof(NotifyListNode));
|
||||||
|
if (newNode == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
newNode->hSession = hSession;
|
newNode->hSession = hSession;
|
||||||
newNode->notifyEncapsulation = notifyEncapsulation;
|
newNode->notifyEncapsulation = notifyEncapsulation;
|
||||||
newNode->next = NULL;
|
newNode->next = NULL;
|
||||||
@ -578,9 +602,10 @@ CK_RV notifyCallback(
|
|||||||
jEvent = ckULongToJLong(event);
|
jEvent = ckULongToJLong(event);
|
||||||
|
|
||||||
ckNotifyClass = (*env)->FindClass(env, CLASS_NOTIFY);
|
ckNotifyClass = (*env)->FindClass(env, CLASS_NOTIFY);
|
||||||
assert(ckNotifyClass != 0);
|
if (ckNotifyClass == NULL) { return rv; }
|
||||||
jmethod = (*env)->GetMethodID(env, ckNotifyClass, "CK_NOTIFY", "(JJLjava/lang/Object;)V");
|
jmethod = (*env)->GetMethodID(env, ckNotifyClass, "CK_NOTIFY", "(JJLjava/lang/Object;)V");
|
||||||
assert(jmethod != 0);
|
if (jmethod == NULL) { return rv; }
|
||||||
|
|
||||||
(*env)->CallVoidMethod(env, notifyEncapsulation->jNotifyObject, jmethod,
|
(*env)->CallVoidMethod(env, notifyEncapsulation->jNotifyObject, jmethod,
|
||||||
jSessionHandle, jEvent, notifyEncapsulation->jApplicationData);
|
jSessionHandle, jEvent, notifyEncapsulation->jApplicationData);
|
||||||
|
|
||||||
@ -588,10 +613,14 @@ CK_RV notifyCallback(
|
|||||||
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
pkcs11Exception = (*env)->ExceptionOccurred(env);
|
||||||
|
|
||||||
if (pkcs11Exception != NULL) {
|
if (pkcs11Exception != NULL) {
|
||||||
|
/* TBD: clear the pending exception with ExceptionClear? */
|
||||||
/* The was an exception thrown, now we get the error-code from it */
|
/* The was an exception thrown, now we get the error-code from it */
|
||||||
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
||||||
|
if (pkcs11ExceptionClass == NULL) { return rv; }
|
||||||
|
|
||||||
jmethod = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
jmethod = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
|
||||||
assert(jmethod != 0);
|
if (jmethod == NULL) { return rv; }
|
||||||
|
|
||||||
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, jmethod);
|
errorCode = (*env)->CallLongMethod(env, pkcs11Exception, jmethod);
|
||||||
rv = jLongToCKULong(errorCode);
|
rv = jLongToCKULong(errorCode);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -77,15 +77,16 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
||||||
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -117,14 +118,23 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
|
jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return NULL; }
|
||||||
|
|
||||||
/* START standard code */
|
/* START standard code */
|
||||||
|
|
||||||
/* first determine the length of the signature */
|
/* first determine the length of the signature */
|
||||||
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength);
|
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
|
free(ckpData);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
|
ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
|
||||||
|
if (ckpSignature == NULL) {
|
||||||
|
free(ckpData);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* now get the signature */
|
/* now get the signature */
|
||||||
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
|
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
|
||||||
@ -134,22 +144,31 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign
|
|||||||
/* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */
|
/* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */
|
||||||
/*
|
/*
|
||||||
ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE));
|
ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE));
|
||||||
|
if (ckpSignature == NULL) {
|
||||||
|
free(ckpData);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
|
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
|
||||||
|
|
||||||
if (rv == CKR_BUFFER_TOO_SMALL) {
|
if (rv == CKR_BUFFER_TOO_SMALL) {
|
||||||
free(ckpSignature);
|
free(ckpSignature);
|
||||||
ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
|
ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
|
||||||
|
if (ckpSignature == NULL) {
|
||||||
|
free(ckpData);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
|
rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
/* END workaround code */
|
/* END workaround code */
|
||||||
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
|
jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
|
||||||
|
}
|
||||||
free(ckpData);
|
free(ckpData);
|
||||||
free(ckpSignature);
|
free(ckpSignature);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
|
|
||||||
|
|
||||||
return jSignature ;
|
return jSignature ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -189,14 +208,22 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignUpdate
|
|||||||
bufP = BUF;
|
bufP = BUF;
|
||||||
} else {
|
} else {
|
||||||
bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
|
bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
|
||||||
bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
|
bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
|
||||||
|
if (bufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (jInLen > 0) {
|
while (jInLen > 0) {
|
||||||
jsize chunkLen = min(bufLen, jInLen);
|
jsize chunkLen = min(bufLen, jInLen);
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (bufP != BUF) { free(bufP); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);
|
rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
if (bufP != BUF) {
|
if (bufP != BUF) {
|
||||||
free(bufP);
|
free(bufP);
|
||||||
}
|
}
|
||||||
@ -206,9 +233,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignUpdate
|
|||||||
jInLen -= chunkLen;
|
jInLen -= chunkLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bufP != BUF) {
|
if (bufP != BUF) { free(bufP); }
|
||||||
free(bufP);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -244,15 +269,18 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignFina
|
|||||||
rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
|
rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
|
||||||
if (rv == CKR_BUFFER_TOO_SMALL) {
|
if (rv == CKR_BUFFER_TOO_SMALL) {
|
||||||
bufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
|
bufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
|
||||||
|
if (bufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
|
rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
|
||||||
}
|
}
|
||||||
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);
|
jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bufP != BUF) {
|
if (bufP != BUF) { free(bufP); }
|
||||||
free(bufP);
|
|
||||||
}
|
|
||||||
return jSignature;
|
return jSignature;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -280,11 +308,13 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverIni
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
||||||
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -323,26 +353,38 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecover
|
|||||||
if (jInLen <= MAX_STACK_BUFFER_LEN) {
|
if (jInLen <= MAX_STACK_BUFFER_LEN) {
|
||||||
inBufP = INBUF;
|
inBufP = INBUF;
|
||||||
} else {
|
} else {
|
||||||
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
|
||||||
|
if (inBufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (inBufP != INBUF) { free(inBufP); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
|
rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
|
||||||
/* re-alloc larger buffer if it fits into our Java buffer */
|
/* re-alloc larger buffer if it fits into our Java buffer */
|
||||||
if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {
|
if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {
|
||||||
outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
|
outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
|
||||||
|
if (outBufP == NULL) {
|
||||||
|
if (inBufP != INBUF) {
|
||||||
|
free(inBufP);
|
||||||
|
}
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
|
rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
|
||||||
}
|
}
|
||||||
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
(*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);
|
(*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inBufP != INBUF) {
|
if (inBufP != INBUF) { free(inBufP); }
|
||||||
free(inBufP);
|
if (outBufP != OUTBUF) { free(outBufP); }
|
||||||
}
|
|
||||||
if (outBufP != OUTBUF) {
|
|
||||||
free(outBufP);
|
|
||||||
}
|
|
||||||
return ckSignatureLength;
|
return ckSignatureLength;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -370,6 +412,8 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
||||||
@ -378,7 +422,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit
|
|||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -409,7 +453,13 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Verify
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
|
jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
|
jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(ckpData);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* verify the signature */
|
/* verify the signature */
|
||||||
rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);
|
rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);
|
||||||
@ -417,7 +467,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Verify
|
|||||||
free(ckpData);
|
free(ckpData);
|
||||||
free(ckpSignature);
|
free(ckpSignature);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -456,26 +506,31 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyUpdate
|
|||||||
bufP = BUF;
|
bufP = BUF;
|
||||||
} else {
|
} else {
|
||||||
bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
|
bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
|
||||||
bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
|
bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
|
||||||
|
if (bufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (jInLen > 0) {
|
while (jInLen > 0) {
|
||||||
jsize chunkLen = min(bufLen, jInLen);
|
jsize chunkLen = min(bufLen, jInLen);
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (bufP != BUF) { free(bufP); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);
|
rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
|
||||||
if (bufP != BUF) {
|
if (bufP != BUF) { free(bufP); }
|
||||||
free(bufP);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
jInOfs += chunkLen;
|
jInOfs += chunkLen;
|
||||||
jInLen -= chunkLen;
|
jInLen -= chunkLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bufP != BUF) {
|
if (bufP != BUF) { free(bufP); }
|
||||||
free(bufP);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -502,13 +557,14 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyFinal
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
|
jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
/* verify the signature */
|
/* verify the signature */
|
||||||
rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);
|
rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);
|
||||||
|
|
||||||
free(ckpSignature);
|
free(ckpSignature);
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -535,15 +591,17 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverI
|
|||||||
|
|
||||||
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
ckSessionHandle = jLongToCKULong(jSessionHandle);
|
||||||
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
|
||||||
|
if ((*env)->ExceptionCheck(env)) { return; }
|
||||||
|
|
||||||
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
ckKeyHandle = jLongToCKULong(jKeyHandle);
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
|
||||||
|
|
||||||
if(ckMechanism.pParameter != NULL_PTR) {
|
if (ckMechanism.pParameter != NULL_PTR) {
|
||||||
free(ckMechanism.pParameter);
|
free(ckMechanism.pParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -578,26 +636,38 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecover
|
|||||||
if (jInLen <= MAX_STACK_BUFFER_LEN) {
|
if (jInLen <= MAX_STACK_BUFFER_LEN) {
|
||||||
inBufP = INBUF;
|
inBufP = INBUF;
|
||||||
} else {
|
} else {
|
||||||
inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
|
inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
|
||||||
|
if (inBufP == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
(*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
if (inBufP != INBUF) { free(inBufP); }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
|
rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
|
||||||
|
|
||||||
/* re-alloc larger buffer if it fits into our Java buffer */
|
/* re-alloc larger buffer if it fits into our Java buffer */
|
||||||
if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {
|
if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {
|
||||||
outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
|
outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
|
||||||
|
if (outBufP == NULL) {
|
||||||
|
if (inBufP != INBUF) { free(inBufP); }
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
|
rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
|
||||||
}
|
}
|
||||||
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
|
||||||
(*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);
|
(*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inBufP != INBUF) {
|
if (inBufP != INBUF) { free(inBufP); }
|
||||||
free(inBufP);
|
if (outBufP != OUTBUF) { free(outBufP); }
|
||||||
}
|
|
||||||
if (outBufP != OUTBUF) {
|
|
||||||
free(outBufP);
|
|
||||||
}
|
|
||||||
return ckDataLength;
|
return ckDataLength;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -73,11 +73,11 @@ jobject createLockObject(JNIEnv *env) {
|
|||||||
jmethodID jConstructor;
|
jmethodID jConstructor;
|
||||||
|
|
||||||
jObjectClass = (*env)->FindClass(env, "java/lang/Object");
|
jObjectClass = (*env)->FindClass(env, "java/lang/Object");
|
||||||
assert(jObjectClass != 0);
|
if (jObjectClass == NULL) { return NULL; }
|
||||||
jConstructor = (*env)->GetMethodID(env, jObjectClass, "<init>", "()V");
|
jConstructor = (*env)->GetMethodID(env, jObjectClass, "<init>", "()V");
|
||||||
assert(jConstructor != 0);
|
if (jConstructor == NULL) { return NULL; }
|
||||||
jLockObject = (*env)->NewObject(env, jObjectClass, jConstructor);
|
jLockObject = (*env)->NewObject(env, jObjectClass, jConstructor);
|
||||||
assert(jLockObject != 0);
|
if (jLockObject == NULL) { return NULL; }
|
||||||
jLockObject = (*env)->NewGlobalRef(env, jLockObject);
|
jLockObject = (*env)->NewGlobalRef(env, jLockObject);
|
||||||
|
|
||||||
return jLockObject ;
|
return jLockObject ;
|
||||||
@ -200,84 +200,30 @@ jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue)
|
|||||||
return 0L ;
|
return 0L ;
|
||||||
} else {
|
} else {
|
||||||
jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
|
||||||
assert(jPKCS11ExceptionClass != 0);
|
if (jPKCS11ExceptionClass != NULL) {
|
||||||
jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
|
jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
|
||||||
assert(jConstructor != 0);
|
if (jConstructor != NULL) {
|
||||||
jErrorCode = ckULongToJLong(returnValue);
|
jErrorCode = ckULongToJLong(returnValue);
|
||||||
jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
|
jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
|
||||||
(*env)->Throw(env, jPKCS11Exception);
|
if (jPKCS11Exception != NULL) {
|
||||||
|
(*env)->Throw(env, jPKCS11Exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(*env)->DeleteLocalRef(env, jPKCS11ExceptionClass);
|
||||||
return jErrorCode ;
|
return jErrorCode ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this function simply throws a FileNotFoundException
|
* This function simply throws an IOException
|
||||||
*
|
|
||||||
* @param env Used to call JNI funktions and to get the Exception class.
|
|
||||||
* @param jmessage The message string of the Exception object.
|
|
||||||
*/
|
|
||||||
void throwFileNotFoundException(JNIEnv *env, jstring jmessage)
|
|
||||||
{
|
|
||||||
jclass jFileNotFoundExceptionClass;
|
|
||||||
jmethodID jConstructor;
|
|
||||||
jthrowable jFileNotFoundException;
|
|
||||||
|
|
||||||
jFileNotFoundExceptionClass = (*env)->FindClass(env, CLASS_FILE_NOT_FOUND_EXCEPTION);
|
|
||||||
assert(jFileNotFoundExceptionClass != 0);
|
|
||||||
|
|
||||||
jConstructor = (*env)->GetMethodID(env, jFileNotFoundExceptionClass, "<init>", "(Ljava/lang/String;)V");
|
|
||||||
assert(jConstructor != 0);
|
|
||||||
jFileNotFoundException = (jthrowable) (*env)->NewObject(env, jFileNotFoundExceptionClass, jConstructor, jmessage);
|
|
||||||
(*env)->Throw(env, jFileNotFoundException);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this function simply throws an IOException
|
|
||||||
*
|
*
|
||||||
* @param env Used to call JNI funktions and to get the Exception class.
|
* @param env Used to call JNI funktions and to get the Exception class.
|
||||||
* @param message The message string of the Exception object.
|
* @param message The message string of the Exception object.
|
||||||
*/
|
*/
|
||||||
void throwIOException(JNIEnv *env, const char * message)
|
void throwIOException(JNIEnv *env, const char *message)
|
||||||
{
|
{
|
||||||
jclass jIOExceptionClass;
|
JNU_ThrowByName(env, CLASS_IO_EXCEPTION, message);
|
||||||
|
|
||||||
jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
|
|
||||||
assert(jIOExceptionClass != 0);
|
|
||||||
|
|
||||||
(*env)->ThrowNew(env, jIOExceptionClass, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this function simply throws an IOException and takes a unicode
|
|
||||||
* messge.
|
|
||||||
*
|
|
||||||
* @param env Used to call JNI funktions and to get the Exception class.
|
|
||||||
* @param message The unicode message string of the Exception object.
|
|
||||||
*/
|
|
||||||
void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message)
|
|
||||||
{
|
|
||||||
jclass jIOExceptionClass;
|
|
||||||
jmethodID jConstructor;
|
|
||||||
jthrowable jIOException;
|
|
||||||
jstring jmessage;
|
|
||||||
jsize length;
|
|
||||||
short *currentCharacter;
|
|
||||||
|
|
||||||
jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
|
|
||||||
assert(jIOExceptionClass != 0);
|
|
||||||
|
|
||||||
length = 0;
|
|
||||||
if (message != NULL) {
|
|
||||||
currentCharacter = (short *) message;
|
|
||||||
while (*(currentCharacter++) != 0) length++;
|
|
||||||
}
|
|
||||||
|
|
||||||
jmessage = (*env)->NewString(env, (const jchar *)message, length);
|
|
||||||
|
|
||||||
jConstructor = (*env)->GetMethodID(env, jIOExceptionClass, "<init>", "(Ljava/lang/String;)V");
|
|
||||||
assert(jConstructor != 0);
|
|
||||||
jIOException = (jthrowable) (*env)->NewObject(env, jIOExceptionClass, jConstructor, jmessage);
|
|
||||||
(*env)->Throw(env, jIOException);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -288,26 +234,9 @@ void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message)
|
|||||||
* @param env Used to call JNI funktions and to get the Exception class.
|
* @param env Used to call JNI funktions and to get the Exception class.
|
||||||
* @param jmessage The message string of the Exception object.
|
* @param jmessage The message string of the Exception object.
|
||||||
*/
|
*/
|
||||||
void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage)
|
void throwPKCS11RuntimeException(JNIEnv *env, const char *message)
|
||||||
{
|
{
|
||||||
jclass jPKCS11RuntimeExceptionClass;
|
JNU_ThrowByName(env, CLASS_PKCS11RUNTIMEEXCEPTION, message);
|
||||||
jmethodID jConstructor;
|
|
||||||
jthrowable jPKCS11RuntimeException;
|
|
||||||
|
|
||||||
jPKCS11RuntimeExceptionClass = (*env)->FindClass(env, CLASS_PKCS11RUNTIMEEXCEPTION);
|
|
||||||
assert(jPKCS11RuntimeExceptionClass != 0);
|
|
||||||
|
|
||||||
if (jmessage == NULL) {
|
|
||||||
jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "()V");
|
|
||||||
assert(jConstructor != 0);
|
|
||||||
jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor);
|
|
||||||
(*env)->Throw(env, jPKCS11RuntimeException);
|
|
||||||
} else {
|
|
||||||
jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "(Ljava/lang/String;)V");
|
|
||||||
assert(jConstructor != 0);
|
|
||||||
jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor, jmessage);
|
|
||||||
(*env)->Throw(env, jPKCS11RuntimeException);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -318,9 +247,24 @@ void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage)
|
|||||||
*/
|
*/
|
||||||
void throwDisconnectedRuntimeException(JNIEnv *env)
|
void throwDisconnectedRuntimeException(JNIEnv *env)
|
||||||
{
|
{
|
||||||
jstring jExceptionMessage = (*env)->NewStringUTF(env, "This object is not connected to a module.");
|
throwPKCS11RuntimeException(env, "This object is not connected to a module.");
|
||||||
|
}
|
||||||
|
|
||||||
throwPKCS11RuntimeException(env, jExceptionMessage);
|
/* This function frees the specified CK_ATTRIBUTE array.
|
||||||
|
*
|
||||||
|
* @param attrPtr pointer to the to-be-freed CK_ATTRIBUTE array.
|
||||||
|
* @param len the length of the array
|
||||||
|
*/
|
||||||
|
void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i<len; i++) {
|
||||||
|
if (attrPtr[i].pValue != NULL_PTR) {
|
||||||
|
free(attrPtr[i].pValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(attrPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -375,8 +319,22 @@ void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBO
|
|||||||
}
|
}
|
||||||
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
||||||
jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean));
|
jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
(*env)->GetBooleanArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
|
(*env)->GetBooleanArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(jpTemp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
*ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL));
|
*ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
free(jpTemp);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
for (i=0; i<(*ckpLength); i++) {
|
||||||
(*ckpArray)[i] = jBooleanToCKBBool(jpTemp[i]);
|
(*ckpArray)[i] = jBooleanToCKBBool(jpTemp[i]);
|
||||||
}
|
}
|
||||||
@ -403,13 +361,26 @@ void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *
|
|||||||
}
|
}
|
||||||
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
||||||
jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte));
|
jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
(*env)->GetByteArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
|
(*env)->GetByteArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(jpTemp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* if CK_BYTE is the same size as jbyte, we save an additional copy */
|
/* if CK_BYTE is the same size as jbyte, we save an additional copy */
|
||||||
if (sizeof(CK_BYTE) == sizeof(jbyte)) {
|
if (sizeof(CK_BYTE) == sizeof(jbyte)) {
|
||||||
*ckpArray = (CK_BYTE_PTR) jpTemp;
|
*ckpArray = (CK_BYTE_PTR) jpTemp;
|
||||||
} else {
|
} else {
|
||||||
*ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE));
|
*ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
free(jpTemp);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
for (i=0; i<(*ckpLength); i++) {
|
||||||
(*ckpArray)[i] = jByteToCKByte(jpTemp[i]);
|
(*ckpArray)[i] = jByteToCKByte(jpTemp[i]);
|
||||||
}
|
}
|
||||||
@ -437,8 +408,22 @@ void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR
|
|||||||
}
|
}
|
||||||
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
||||||
jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong));
|
jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong));
|
||||||
|
if (jTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
(*env)->GetLongArrayRegion(env, jArray, 0, *ckpLength, jTemp);
|
(*env)->GetLongArrayRegion(env, jArray, 0, *ckpLength, jTemp);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(jTemp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
*ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG));
|
*ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
free(jTemp);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
for (i=0; i<(*ckpLength); i++) {
|
||||||
(*ckpArray)[i] = jLongToCKULong(jTemp[i]);
|
(*ckpArray)[i] = jLongToCKULong(jTemp[i]);
|
||||||
}
|
}
|
||||||
@ -465,8 +450,22 @@ void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *
|
|||||||
}
|
}
|
||||||
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
||||||
jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
|
jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
(*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
|
(*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(jpTemp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
*ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR));
|
*ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
free(jpTemp);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
for (i=0; i<(*ckpLength); i++) {
|
||||||
(*ckpArray)[i] = jCharToCKChar(jpTemp[i]);
|
(*ckpArray)[i] = jCharToCKChar(jpTemp[i]);
|
||||||
}
|
}
|
||||||
@ -493,8 +492,22 @@ void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CH
|
|||||||
}
|
}
|
||||||
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
||||||
jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
|
jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
|
||||||
|
if (jTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
(*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jTemp);
|
(*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jTemp);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
free(jTemp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
*ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR));
|
*ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
free(jTemp);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
for (i=0; i<(*ckpLength); i++) {
|
||||||
(*ckpArray)[i] = jCharToCKUTF8Char(jTemp[i]);
|
(*ckpArray)[i] = jCharToCKUTF8Char(jTemp[i]);
|
||||||
}
|
}
|
||||||
@ -521,8 +534,15 @@ void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR
|
|||||||
}
|
}
|
||||||
|
|
||||||
pCharArray = (*env)->GetStringUTFChars(env, jArray, &isCopy);
|
pCharArray = (*env)->GetStringUTFChars(env, jArray, &isCopy);
|
||||||
|
if (pCharArray == NULL) { return; }
|
||||||
|
|
||||||
*ckpLength = strlen(pCharArray);
|
*ckpLength = strlen(pCharArray);
|
||||||
*ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR));
|
*ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
(*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
strcpy((char*)*ckpArray, pCharArray);
|
strcpy((char*)*ckpArray, pCharArray);
|
||||||
(*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
|
(*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
|
||||||
}
|
}
|
||||||
@ -552,55 +572,36 @@ void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jArray, CK_ATTR
|
|||||||
jLength = (*env)->GetArrayLength(env, jArray);
|
jLength = (*env)->GetArrayLength(env, jArray);
|
||||||
*ckpLength = jLongToCKULong(jLength);
|
*ckpLength = jLongToCKULong(jLength);
|
||||||
*ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE));
|
*ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE));
|
||||||
|
if (*ckpArray == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
TRACE1(", converting %d attibutes", jLength);
|
TRACE1(", converting %d attibutes", jLength);
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
for (i=0; i<(*ckpLength); i++) {
|
||||||
TRACE1(", getting %d. attibute", i);
|
TRACE1(", getting %d. attibute", i);
|
||||||
jAttribute = (*env)->GetObjectArrayElement(env, jArray, i);
|
jAttribute = (*env)->GetObjectArrayElement(env, jArray, i);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
freeCKAttributeArray(*ckpArray, i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
TRACE1(", jAttribute = %d", jAttribute);
|
TRACE1(", jAttribute = %d", jAttribute);
|
||||||
TRACE1(", converting %d. attibute", i);
|
TRACE1(", converting %d. attibute", i);
|
||||||
(*ckpArray)[i] = jAttributeToCKAttribute(env, jAttribute);
|
(*ckpArray)[i] = jAttributeToCKAttribute(env, jAttribute);
|
||||||
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
|
freeCKAttributeArray(*ckpArray, i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
TRACE0("FINISHED\n");
|
TRACE0("FINISHED\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* converts a jobjectArray to a CK_VOID_PTR array. The allocated memory has to be freed after
|
|
||||||
* use!
|
|
||||||
* NOTE: this function does not work and is not used yet
|
|
||||||
*
|
|
||||||
* @param env - used to call JNI funktions to get the array informtaion
|
|
||||||
* @param jArray - the Java object array to convert
|
|
||||||
* @param ckpArray - the reference, where the pointer to the new CK_VOID_PTR array will be stored
|
|
||||||
* @param ckpLength - the reference, where the array length will be stored
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
|
|
||||||
{
|
|
||||||
jobject jTemp;
|
|
||||||
CK_ULONG i;
|
|
||||||
|
|
||||||
if(jArray == NULL) {
|
|
||||||
*ckpArray = NULL_PTR;
|
|
||||||
*ckpLength = 0L;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*ckpLength = (*env)->GetArrayLength(env, jArray);
|
|
||||||
*ckpArray = (CK_VOID_PTR_PTR) malloc (*ckpLength * sizeof(CK_VOID_PTR));
|
|
||||||
for (i=0; i<(*ckpLength); i++) {
|
|
||||||
jTemp = (*env)->GetObjectArrayElement(env, jArray, i);
|
|
||||||
(*ckpArray)[i] = jObjectToCKVoidPtr(jTemp);
|
|
||||||
}
|
|
||||||
free(jTemp);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* converts a CK_BYTE array and its length to a jbyteArray.
|
* converts a CK_BYTE array and its length to a jbyteArray.
|
||||||
*
|
*
|
||||||
* @param env - used to call JNI funktions to create the new Java array
|
* @param env - used to call JNI funktions to create the new Java array
|
||||||
* @param ckpArray - the pointer to the CK_BYTE array to convert
|
* @param ckpArray - the pointer to the CK_BYTE array to convert
|
||||||
* @param ckpLength - the length of the array to convert
|
* @param ckpLength - the length of the array to convert
|
||||||
* @return - the new Java byte array
|
* @return - the new Java byte array or NULL if error occurred
|
||||||
*/
|
*/
|
||||||
jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength)
|
jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength)
|
||||||
{
|
{
|
||||||
@ -613,18 +614,22 @@ jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_U
|
|||||||
jpTemp = (jbyte*) ckpArray;
|
jpTemp = (jbyte*) ckpArray;
|
||||||
} else {
|
} else {
|
||||||
jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte));
|
jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
for (i=0; i<ckLength; i++) {
|
for (i=0; i<ckLength; i++) {
|
||||||
jpTemp[i] = ckByteToJByte(ckpArray[i]);
|
jpTemp[i] = ckByteToJByte(ckpArray[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
jArray = (*env)->NewByteArray(env, ckULongToJSize(ckLength));
|
jArray = (*env)->NewByteArray(env, ckULongToJSize(ckLength));
|
||||||
(*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
if (jArray != NULL) {
|
||||||
|
(*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
||||||
if (sizeof(CK_BYTE) != sizeof(jbyte)) {
|
|
||||||
free(jpTemp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sizeof(CK_BYTE) != sizeof(jbyte)) { free(jpTemp); }
|
||||||
|
|
||||||
return jArray ;
|
return jArray ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -643,11 +648,17 @@ jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK
|
|||||||
jlongArray jArray;
|
jlongArray jArray;
|
||||||
|
|
||||||
jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong));
|
jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
for (i=0; i<ckLength; i++) {
|
for (i=0; i<ckLength; i++) {
|
||||||
jpTemp[i] = ckLongToJLong(ckpArray[i]);
|
jpTemp[i] = ckLongToJLong(ckpArray[i]);
|
||||||
}
|
}
|
||||||
jArray = (*env)->NewLongArray(env, ckULongToJSize(ckLength));
|
jArray = (*env)->NewLongArray(env, ckULongToJSize(ckLength));
|
||||||
(*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
if (jArray != NULL) {
|
||||||
|
(*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
||||||
|
}
|
||||||
free(jpTemp);
|
free(jpTemp);
|
||||||
|
|
||||||
return jArray ;
|
return jArray ;
|
||||||
@ -668,11 +679,17 @@ jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_U
|
|||||||
jcharArray jArray;
|
jcharArray jArray;
|
||||||
|
|
||||||
jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
|
jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
for (i=0; i<ckLength; i++) {
|
for (i=0; i<ckLength; i++) {
|
||||||
jpTemp[i] = ckCharToJChar(ckpArray[i]);
|
jpTemp[i] = ckCharToJChar(ckpArray[i]);
|
||||||
}
|
}
|
||||||
jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
|
jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
|
||||||
(*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
if (jArray != NULL) {
|
||||||
|
(*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
||||||
|
}
|
||||||
free(jpTemp);
|
free(jpTemp);
|
||||||
|
|
||||||
return jArray ;
|
return jArray ;
|
||||||
@ -693,11 +710,17 @@ jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArr
|
|||||||
jcharArray jArray;
|
jcharArray jArray;
|
||||||
|
|
||||||
jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
|
jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
|
||||||
|
if (jpTemp == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
for (i=0; i<ckLength; i++) {
|
for (i=0; i<ckLength; i++) {
|
||||||
jpTemp[i] = ckUTF8CharToJChar(ckpArray[i]);
|
jpTemp[i] = ckUTF8CharToJChar(ckpArray[i]);
|
||||||
}
|
}
|
||||||
jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
|
jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
|
||||||
(*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
if (jArray != NULL) {
|
||||||
|
(*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
|
||||||
|
}
|
||||||
free(jpTemp);
|
free(jpTemp);
|
||||||
|
|
||||||
return jArray ;
|
return jArray ;
|
||||||
@ -736,12 +759,11 @@ jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL *ckpValue)
|
|||||||
jboolean jValue;
|
jboolean jValue;
|
||||||
|
|
||||||
jValueObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
|
jValueObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
|
||||||
assert(jValueObjectClass != 0);
|
if (jValueObjectClass == NULL) { return NULL; }
|
||||||
jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(Z)V");
|
jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(Z)V");
|
||||||
assert(jConstructor != 0);
|
if (jConstructor == NULL) { return NULL; }
|
||||||
jValue = ckBBoolToJBoolean(*ckpValue);
|
jValue = ckBBoolToJBoolean(*ckpValue);
|
||||||
jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
|
jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
|
||||||
assert(jValueObject != 0);
|
|
||||||
|
|
||||||
return jValueObject ;
|
return jValueObject ;
|
||||||
}
|
}
|
||||||
@ -761,12 +783,11 @@ jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue)
|
|||||||
jlong jValue;
|
jlong jValue;
|
||||||
|
|
||||||
jValueObjectClass = (*env)->FindClass(env, "java/lang/Long");
|
jValueObjectClass = (*env)->FindClass(env, "java/lang/Long");
|
||||||
assert(jValueObjectClass != 0);
|
if (jValueObjectClass == NULL) { return NULL; }
|
||||||
jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(J)V");
|
jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(J)V");
|
||||||
assert(jConstructor != 0);
|
if (jConstructor == NULL) { return NULL; }
|
||||||
jValue = ckULongToJLong(*ckpValue);
|
jValue = ckULongToJLong(*ckpValue);
|
||||||
jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
|
jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
|
||||||
assert(jValueObject != 0);
|
|
||||||
|
|
||||||
return jValueObject ;
|
return jValueObject ;
|
||||||
}
|
}
|
||||||
@ -787,11 +808,15 @@ CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject)
|
|||||||
CK_BBOOL *ckpValue;
|
CK_BBOOL *ckpValue;
|
||||||
|
|
||||||
jObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
|
jObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
|
||||||
assert(jObjectClass != 0);
|
if (jObjectClass == NULL) { return NULL; }
|
||||||
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "booleanValue", "()Z");
|
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "booleanValue", "()Z");
|
||||||
assert(jValueMethod != 0);
|
if (jValueMethod == NULL) { return NULL; }
|
||||||
jValue = (*env)->CallBooleanMethod(env, jObject, jValueMethod);
|
jValue = (*env)->CallBooleanMethod(env, jObject, jValueMethod);
|
||||||
ckpValue = (CK_BBOOL *) malloc(sizeof(CK_BBOOL));
|
ckpValue = (CK_BBOOL *) malloc(sizeof(CK_BBOOL));
|
||||||
|
if (ckpValue == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
*ckpValue = jBooleanToCKBBool(jValue);
|
*ckpValue = jBooleanToCKBBool(jValue);
|
||||||
|
|
||||||
return ckpValue ;
|
return ckpValue ;
|
||||||
@ -813,13 +838,16 @@ CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject)
|
|||||||
CK_BYTE_PTR ckpValue;
|
CK_BYTE_PTR ckpValue;
|
||||||
|
|
||||||
jObjectClass = (*env)->FindClass(env, "java/lang/Byte");
|
jObjectClass = (*env)->FindClass(env, "java/lang/Byte");
|
||||||
assert(jObjectClass != 0);
|
if (jObjectClass == NULL) { return NULL; }
|
||||||
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "byteValue", "()B");
|
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "byteValue", "()B");
|
||||||
assert(jValueMethod != 0);
|
if (jValueMethod == NULL) { return NULL; }
|
||||||
jValue = (*env)->CallByteMethod(env, jObject, jValueMethod);
|
jValue = (*env)->CallByteMethod(env, jObject, jValueMethod);
|
||||||
ckpValue = (CK_BYTE_PTR) malloc(sizeof(CK_BYTE));
|
ckpValue = (CK_BYTE_PTR) malloc(sizeof(CK_BYTE));
|
||||||
|
if (ckpValue == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
*ckpValue = jByteToCKByte(jValue);
|
*ckpValue = jByteToCKByte(jValue);
|
||||||
|
|
||||||
return ckpValue ;
|
return ckpValue ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -839,13 +867,16 @@ CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject)
|
|||||||
CK_ULONG *ckpValue;
|
CK_ULONG *ckpValue;
|
||||||
|
|
||||||
jObjectClass = (*env)->FindClass(env, "java/lang/Integer");
|
jObjectClass = (*env)->FindClass(env, "java/lang/Integer");
|
||||||
assert(jObjectClass != 0);
|
if (jObjectClass == NULL) { return NULL; }
|
||||||
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "intValue", "()I");
|
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "intValue", "()I");
|
||||||
assert(jValueMethod != 0);
|
if (jValueMethod == NULL) { return NULL; }
|
||||||
jValue = (*env)->CallIntMethod(env, jObject, jValueMethod);
|
jValue = (*env)->CallIntMethod(env, jObject, jValueMethod);
|
||||||
ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
|
ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
|
||||||
|
if (ckpValue == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
*ckpValue = jLongToCKLong(jValue);
|
*ckpValue = jLongToCKLong(jValue);
|
||||||
|
|
||||||
return ckpValue ;
|
return ckpValue ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -865,11 +896,15 @@ CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject)
|
|||||||
CK_ULONG *ckpValue;
|
CK_ULONG *ckpValue;
|
||||||
|
|
||||||
jObjectClass = (*env)->FindClass(env, "java/lang/Long");
|
jObjectClass = (*env)->FindClass(env, "java/lang/Long");
|
||||||
assert(jObjectClass != 0);
|
if (jObjectClass == NULL) { return NULL; }
|
||||||
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "longValue", "()J");
|
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "longValue", "()J");
|
||||||
assert(jValueMethod != 0);
|
if (jValueMethod == NULL) { return NULL; }
|
||||||
jValue = (*env)->CallLongMethod(env, jObject, jValueMethod);
|
jValue = (*env)->CallLongMethod(env, jObject, jValueMethod);
|
||||||
ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
|
ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
|
||||||
|
if (ckpValue == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
*ckpValue = jLongToCKULong(jValue);
|
*ckpValue = jLongToCKULong(jValue);
|
||||||
|
|
||||||
return ckpValue ;
|
return ckpValue ;
|
||||||
@ -891,11 +926,15 @@ CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject)
|
|||||||
CK_CHAR_PTR ckpValue;
|
CK_CHAR_PTR ckpValue;
|
||||||
|
|
||||||
jObjectClass = (*env)->FindClass(env, "java/lang/Char");
|
jObjectClass = (*env)->FindClass(env, "java/lang/Char");
|
||||||
assert(jObjectClass != 0);
|
if (jObjectClass == NULL) { return NULL; }
|
||||||
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "charValue", "()C");
|
jValueMethod = (*env)->GetMethodID(env, jObjectClass, "charValue", "()C");
|
||||||
assert(jValueMethod != 0);
|
if (jValueMethod == NULL) { return NULL; }
|
||||||
jValue = (*env)->CallCharMethod(env, jObject, jValueMethod);
|
jValue = (*env)->CallCharMethod(env, jObject, jValueMethod);
|
||||||
ckpValue = (CK_CHAR_PTR) malloc(sizeof(CK_CHAR));
|
ckpValue = (CK_CHAR_PTR) malloc(sizeof(CK_CHAR));
|
||||||
|
if (ckpValue == NULL) {
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
*ckpValue = jCharToCKChar(jValue);
|
*ckpValue = jCharToCKChar(jValue);
|
||||||
|
|
||||||
return ckpValue ;
|
return ckpValue ;
|
||||||
@ -913,124 +952,172 @@ CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject)
|
|||||||
*/
|
*/
|
||||||
void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *ckpLength)
|
void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *ckpLength)
|
||||||
{
|
{
|
||||||
jclass jBooleanClass = (*env)->FindClass(env, "java/lang/Boolean");
|
jclass jLongClass, jBooleanClass, jByteArrayClass, jCharArrayClass;
|
||||||
jclass jByteClass = (*env)->FindClass(env, "java/lang/Byte");
|
jclass jByteClass, jDateClass, jCharacterClass, jIntegerClass;
|
||||||
jclass jCharacterClass = (*env)->FindClass(env, "java/lang/Character");
|
jclass jBooleanArrayClass, jIntArrayClass, jLongArrayClass;
|
||||||
jclass jClassClass = (*env)->FindClass(env, "java/lang/Class");
|
jclass jStringClass;
|
||||||
/* jclass jShortClass = (*env)->FindClass(env, "java/lang/Short"); */
|
jclass jObjectClass, jClassClass;
|
||||||
jclass jIntegerClass = (*env)->FindClass(env, "java/lang/Integer");
|
|
||||||
jclass jLongClass = (*env)->FindClass(env, "java/lang/Long");
|
|
||||||
/* jclass jFloatClass = (*env)->FindClass(env, "java/lang/Float"); */
|
|
||||||
/* jclass jDoubleClass = (*env)->FindClass(env, "java/lang/Double"); */
|
|
||||||
jclass jDateClass = (*env)->FindClass(env, CLASS_DATE);
|
|
||||||
jclass jStringClass = (*env)->FindClass(env, "java/lang/String");
|
|
||||||
jclass jStringBufferClass = (*env)->FindClass(env, "java/lang/StringBuffer");
|
|
||||||
jclass jBooleanArrayClass = (*env)->FindClass(env, "[Z");
|
|
||||||
jclass jByteArrayClass = (*env)->FindClass(env, "[B");
|
|
||||||
jclass jCharArrayClass = (*env)->FindClass(env, "[C");
|
|
||||||
/* jclass jShortArrayClass = (*env)->FindClass(env, "[S"); */
|
|
||||||
jclass jIntArrayClass = (*env)->FindClass(env, "[I");
|
|
||||||
jclass jLongArrayClass = (*env)->FindClass(env, "[J");
|
|
||||||
/* jclass jFloatArrayClass = (*env)->FindClass(env, "[F"); */
|
|
||||||
/* jclass jDoubleArrayClass = (*env)->FindClass(env, "[D"); */
|
|
||||||
jclass jObjectClass = (*env)->FindClass(env, "java/lang/Object");
|
|
||||||
/* jclass jObjectArrayClass = (*env)->FindClass(env, "[java/lang/Object"); */
|
|
||||||
/* ATTENTION: jObjectArrayClass is always NULL !! */
|
|
||||||
/* CK_ULONG ckArrayLength; */
|
|
||||||
/* CK_VOID_PTR *ckpElementObject; */
|
|
||||||
/* CK_ULONG ckElementLength; */
|
|
||||||
/* CK_ULONG i; */
|
|
||||||
CK_VOID_PTR ckpVoid = *ckpObjectPtr;
|
CK_VOID_PTR ckpVoid = *ckpObjectPtr;
|
||||||
jmethodID jMethod;
|
jmethodID jMethod;
|
||||||
jobject jClassObject;
|
jobject jClassObject;
|
||||||
jstring jClassNameString;
|
jstring jClassNameString;
|
||||||
jstring jExceptionMessagePrefix;
|
char *classNameString, *exceptionMsgPrefix, *exceptionMsg;
|
||||||
jobject jExceptionMessageStringBuffer;
|
|
||||||
jstring jExceptionMessage;
|
|
||||||
|
|
||||||
TRACE0("\nDEBUG: jObjectToPrimitiveCKObjectPtrPtr");
|
TRACE0("\nDEBUG: jObjectToPrimitiveCKObjectPtrPtr");
|
||||||
if (jObject == NULL) {
|
if (jObject == NULL) {
|
||||||
*ckpObjectPtr = NULL;
|
*ckpObjectPtr = NULL;
|
||||||
*ckpLength = 0;
|
*ckpLength = 0;
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jLongClass = (*env)->FindClass(env, "java/lang/Long");
|
||||||
|
if (jLongClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
|
||||||
*ckpObjectPtr = jLongObjectToCKULongPtr(env, jObject);
|
*ckpObjectPtr = jLongObjectToCKULongPtr(env, jObject);
|
||||||
*ckpLength = sizeof(CK_ULONG);
|
*ckpLength = sizeof(CK_ULONG);
|
||||||
TRACE1("<converted long value %X>", *((CK_ULONG *) *ckpObjectPtr));
|
TRACE1("<converted long value %X>", *((CK_ULONG *) *ckpObjectPtr));
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jBooleanClass = (*env)->FindClass(env, "java/lang/Boolean");
|
||||||
|
if (jBooleanClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
|
||||||
*ckpObjectPtr = jBooleanObjectToCKBBoolPtr(env, jObject);
|
*ckpObjectPtr = jBooleanObjectToCKBBoolPtr(env, jObject);
|
||||||
*ckpLength = sizeof(CK_BBOOL);
|
*ckpLength = sizeof(CK_BBOOL);
|
||||||
TRACE0(" <converted boolean value ");
|
TRACE0(" <converted boolean value ");
|
||||||
TRACE0((*((CK_BBOOL *) *ckpObjectPtr) == TRUE) ? "TRUE>" : "FALSE>");
|
TRACE0((*((CK_BBOOL *) *ckpObjectPtr) == TRUE) ? "TRUE>" : "FALSE>");
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jByteArrayClass = (*env)->FindClass(env, "[B");
|
||||||
|
if (jByteArrayClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
|
||||||
jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR*)ckpObjectPtr, ckpLength);
|
jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR*)ckpObjectPtr, ckpLength);
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jCharArrayClass = (*env)->FindClass(env, "[C");
|
||||||
|
if (jCharArrayClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
|
||||||
jCharArrayToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
|
jCharArrayToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jByteClass = (*env)->FindClass(env, "java/lang/Byte");
|
||||||
|
if (jByteClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
|
||||||
*ckpObjectPtr = jByteObjectToCKBytePtr(env, jObject);
|
*ckpObjectPtr = jByteObjectToCKBytePtr(env, jObject);
|
||||||
*ckpLength = sizeof(CK_BYTE);
|
*ckpLength = sizeof(CK_BYTE);
|
||||||
TRACE1("<converted byte value %X>", *((CK_BYTE *) *ckpObjectPtr));
|
TRACE1("<converted byte value %X>", *((CK_BYTE *) *ckpObjectPtr));
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jDateClass = (*env)->FindClass(env, CLASS_DATE);
|
||||||
|
if (jDateClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
|
||||||
*ckpObjectPtr = jDateObjectPtrToCKDatePtr(env, jObject);
|
*ckpObjectPtr = jDateObjectPtrToCKDatePtr(env, jObject);
|
||||||
*ckpLength = sizeof(CK_DATE);
|
*ckpLength = sizeof(CK_DATE);
|
||||||
TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year,
|
TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year, (*((CK_DATE *) *ckpObjectPtr)).month, (*((CK_DATE *) *ckpObjectPtr)).day);
|
||||||
(*((CK_DATE *) *ckpObjectPtr)).month,
|
return;
|
||||||
(*((CK_DATE *) *ckpObjectPtr)).day);
|
}
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
|
|
||||||
|
jCharacterClass = (*env)->FindClass(env, "java/lang/Character");
|
||||||
|
if (jCharacterClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
|
||||||
*ckpObjectPtr = jCharObjectToCKCharPtr(env, jObject);
|
*ckpObjectPtr = jCharObjectToCKCharPtr(env, jObject);
|
||||||
*ckpLength = sizeof(CK_UTF8CHAR);
|
*ckpLength = sizeof(CK_UTF8CHAR);
|
||||||
TRACE1("<converted char value %c>", *((CK_CHAR *) *ckpObjectPtr));
|
TRACE1("<converted char value %c>", *((CK_CHAR *) *ckpObjectPtr));
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jIntegerClass = (*env)->FindClass(env, "java/lang/Integer");
|
||||||
|
if (jIntegerClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
|
||||||
*ckpObjectPtr = jIntegerObjectToCKULongPtr(env, jObject);
|
*ckpObjectPtr = jIntegerObjectToCKULongPtr(env, jObject);
|
||||||
*ckpLength = sizeof(CK_ULONG);
|
*ckpLength = sizeof(CK_ULONG);
|
||||||
TRACE1("<converted integer value %X>", *((CK_ULONG *) *ckpObjectPtr));
|
TRACE1("<converted integer value %X>", *((CK_ULONG *) *ckpObjectPtr));
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
|
return;
|
||||||
jBooleanArrayToCKBBoolArray(env, jObject, (CK_BBOOL**)ckpObjectPtr, ckpLength);
|
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
|
|
||||||
jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
|
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
|
|
||||||
jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
|
|
||||||
} else if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
|
|
||||||
jStringToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
|
|
||||||
|
|
||||||
/* a Java object array is not used by CK_ATTRIBUTE by now... */
|
|
||||||
/* } else if ((*env)->IsInstanceOf(env, jObject, jObjectArrayClass)) {
|
|
||||||
ckArrayLength = (*env)->GetArrayLength(env, (jarray) jObject);
|
|
||||||
ckpObjectPtr = (CK_VOID_PTR_PTR) malloc(sizeof(CK_VOID_PTR) * ckArrayLength);
|
|
||||||
*ckpLength = 0;
|
|
||||||
for (i = 0; i < ckArrayLength; i++) {
|
|
||||||
jObjectToPrimitiveCKObjectPtrPtr(env, (*env)->GetObjectArrayElement(env, (jarray) jObject, i),
|
|
||||||
ckpElementObject, &ckElementLength);
|
|
||||||
(*ckpObjectPtr)[i] = *ckpElementObject;
|
|
||||||
*ckpLength += ckElementLength;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
} else {
|
|
||||||
/* type of jObject unknown, throw PKCS11RuntimeException */
|
|
||||||
jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
|
|
||||||
assert(jMethod != 0);
|
|
||||||
jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
|
|
||||||
assert(jClassObject != 0);
|
|
||||||
jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
|
|
||||||
assert(jMethod != 0);
|
|
||||||
jClassNameString = (jstring)
|
|
||||||
(*env)->CallObjectMethod(env, jClassObject, jMethod);
|
|
||||||
assert(jClassNameString != 0);
|
|
||||||
jExceptionMessagePrefix = (*env)->NewStringUTF(env, "Java object of this class cannot be converted to native PKCS#11 type: ");
|
|
||||||
jMethod = (*env)->GetMethodID(env, jStringBufferClass, "<init>", "(Ljava/lang/String;)V");
|
|
||||||
assert(jMethod != 0);
|
|
||||||
jExceptionMessageStringBuffer = (*env)->NewObject(env, jStringBufferClass, jMethod, jExceptionMessagePrefix);
|
|
||||||
assert(jClassNameString != 0);
|
|
||||||
jMethod = (*env)->GetMethodID(env, jStringBufferClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
|
|
||||||
assert(jMethod != 0);
|
|
||||||
jExceptionMessage = (jstring)
|
|
||||||
(*env)->CallObjectMethod(env, jExceptionMessageStringBuffer, jMethod, jClassNameString);
|
|
||||||
assert(jExceptionMessage != 0);
|
|
||||||
|
|
||||||
throwPKCS11RuntimeException(env, jExceptionMessage);
|
|
||||||
|
|
||||||
*ckpObjectPtr = NULL;
|
|
||||||
*ckpLength = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jBooleanArrayClass = (*env)->FindClass(env, "[Z");
|
||||||
|
if (jBooleanArrayClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
|
||||||
|
jBooleanArrayToCKBBoolArray(env, jObject, (CK_BBOOL**)ckpObjectPtr, ckpLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jIntArrayClass = (*env)->FindClass(env, "[I");
|
||||||
|
if (jIntArrayClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
|
||||||
|
jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jLongArrayClass = (*env)->FindClass(env, "[J");
|
||||||
|
if (jLongArrayClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
|
||||||
|
jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
jStringClass = (*env)->FindClass(env, "java/lang/String");
|
||||||
|
if (jStringClass == NULL) { return; }
|
||||||
|
if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
|
||||||
|
jStringToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* type of jObject unknown, throw PKCS11RuntimeException */
|
||||||
|
jObjectClass = (*env)->FindClass(env, "java/lang/Object");
|
||||||
|
if (jObjectClass == NULL) { return; }
|
||||||
|
jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
|
||||||
|
if (jMethod == NULL) { return; }
|
||||||
|
jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
|
||||||
|
assert(jClassObject != 0);
|
||||||
|
jClassClass = (*env)->FindClass(env, "java/lang/Class");
|
||||||
|
if (jClassClass == NULL) { return; }
|
||||||
|
jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
|
||||||
|
if (jMethod == NULL) { return; }
|
||||||
|
jClassNameString = (jstring)
|
||||||
|
(*env)->CallObjectMethod(env, jClassObject, jMethod);
|
||||||
|
assert(jClassNameString != 0);
|
||||||
|
classNameString = (char*)
|
||||||
|
(*env)->GetStringUTFChars(env, jClassNameString, NULL);
|
||||||
|
if (classNameString == NULL) { return; }
|
||||||
|
exceptionMsgPrefix = "Java object of this class cannot be converted to native PKCS#11 type: ";
|
||||||
|
exceptionMsg = (char *)
|
||||||
|
malloc((strlen(exceptionMsgPrefix) + strlen(classNameString) + 1));
|
||||||
|
if (exceptionMsg == NULL) {
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
|
||||||
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(exceptionMsg, exceptionMsgPrefix);
|
||||||
|
strcat(exceptionMsg, classNameString);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
|
||||||
|
throwPKCS11RuntimeException(env, exceptionMsg);
|
||||||
|
free(exceptionMsg);
|
||||||
|
*ckpObjectPtr = NULL;
|
||||||
|
*ckpLength = 0;
|
||||||
|
|
||||||
TRACE0("FINISHED\n");
|
TRACE0("FINISHED\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef P11_MEMORYDEBUG
|
||||||
|
|
||||||
|
#undef malloc
|
||||||
|
#undef free
|
||||||
|
|
||||||
|
void *p11malloc(size_t c, char *file, int line) {
|
||||||
|
void *p = malloc(c);
|
||||||
|
printf("malloc\t%08x\t%d\t%s:%d\n", p, c, file, line); fflush(stdout);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void p11free(void *p, char *file, int line) {
|
||||||
|
printf("free\t%08x\t\t%s:%d\n", p, file, line); fflush(stdout);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Portions Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
* Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
|
||||||
@ -154,6 +154,7 @@
|
|||||||
|
|
||||||
#include "pkcs11.h"
|
#include "pkcs11.h"
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
#include <jni_util.h>
|
||||||
|
|
||||||
#define MAX_STACK_BUFFER_LEN (4 * 1024)
|
#define MAX_STACK_BUFFER_LEN (4 * 1024)
|
||||||
#define MAX_HEAP_BUFFER_LEN (64 * 1024)
|
#define MAX_HEAP_BUFFER_LEN (64 * 1024)
|
||||||
@ -277,12 +278,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
|
jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
|
||||||
void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage);
|
|
||||||
void throwFileNotFoundException(JNIEnv *env, jstring jmessage);
|
|
||||||
void throwIOException(JNIEnv *env, const char *message);
|
void throwIOException(JNIEnv *env, const char *message);
|
||||||
void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message);
|
void throwPKCS11RuntimeException(JNIEnv *env, const char *message);
|
||||||
void throwDisconnectedRuntimeException(JNIEnv *env);
|
void throwDisconnectedRuntimeException(JNIEnv *env);
|
||||||
|
|
||||||
|
/* function to free CK_ATTRIBUTE array
|
||||||
|
*/
|
||||||
|
void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len);
|
||||||
|
|
||||||
/* funktions to convert Java arrays to a CK-type array and the array length */
|
/* funktions to convert Java arrays to a CK-type array and the array length */
|
||||||
|
|
||||||
void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength);
|
void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength);
|
||||||
@ -438,3 +441,15 @@ extern jobject notifyListLock;
|
|||||||
extern jobject jInitArgsObject;
|
extern jobject jInitArgsObject;
|
||||||
extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs;
|
extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs;
|
||||||
#endif /* NO_CALLBACKS */
|
#endif /* NO_CALLBACKS */
|
||||||
|
|
||||||
|
#ifdef P11_MEMORYDEBUG
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Simple malloc/free dumper */
|
||||||
|
void *p11malloc(size_t c, char *file, int line);
|
||||||
|
void p11free(void *p, char *file, int line);
|
||||||
|
|
||||||
|
#define malloc(c) (p11malloc((c), __FILE__, __LINE__))
|
||||||
|
#define free(c) (p11free((c), __FILE__, __LINE__))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
101
jdk/test/java/security/Permission/ToString.java
Normal file
101
jdk/test/java/security/Permission/ToString.java
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Sun Microsystems, Inc. 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.
|
||||||
|
*
|
||||||
|
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 6549506
|
||||||
|
* @summary Specification of Permission.toString() method contradicts with
|
||||||
|
* JDK implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.security.*;
|
||||||
|
|
||||||
|
public class ToString {
|
||||||
|
|
||||||
|
public static void main(String[]args) throws Exception {
|
||||||
|
DummyWritePermission dummyPerm = new DummyWritePermission();
|
||||||
|
NullActionPermission nullActionPerm = new NullActionPermission();
|
||||||
|
System.out.println(dummyPerm.toString());
|
||||||
|
System.out.println(dummyPerm.getDescription());
|
||||||
|
System.out.println(nullActionPerm.toString());
|
||||||
|
System.out.println(nullActionPerm.getDescription());
|
||||||
|
if (!dummyPerm.toString().equals(dummyPerm.getDescription())) {
|
||||||
|
throw new Exception("The expected permission.toString() is " +
|
||||||
|
dummyPerm.getDescription() + ", but " +
|
||||||
|
dummyPerm.toString() + " returned!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nullActionPerm.toString().equals(nullActionPerm.getDescription())) {
|
||||||
|
throw new Exception("The expected permission.toString() is " +
|
||||||
|
nullActionPerm.getDescription() + ", but " +
|
||||||
|
nullActionPerm.toString() + " returned!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static abstract class SimplePermission extends Permission {
|
||||||
|
public SimplePermission(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean implies(Permission permission) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
return 13;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class DummyWritePermission extends SimplePermission {
|
||||||
|
public DummyWritePermission() {
|
||||||
|
super("permit to");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getActions() {
|
||||||
|
return "write";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return "(\"ToString$DummyWritePermission\" \"permit to\" \"write\")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NullActionPermission extends SimplePermission {
|
||||||
|
public NullActionPermission() {
|
||||||
|
super("permit to");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getActions() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return "(\"ToString$NullActionPermission\" \"permit to\")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,3 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Sun Microsystems, Inc. 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.
|
||||||
|
*
|
||||||
|
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.*;
|
import java.nio.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
65
jdk/test/sun/security/tools/keytool/NoExtNPE.sh
Normal file
65
jdk/test/sun/security/tools/keytool/NoExtNPE.sh
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2009 Sun Microsystems, Inc. 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.
|
||||||
|
#
|
||||||
|
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
# have any questions.
|
||||||
|
#
|
||||||
|
|
||||||
|
# @test
|
||||||
|
# @bug 6813402
|
||||||
|
# @summary keytool cannot -printcert entries without extensions
|
||||||
|
#
|
||||||
|
# @run shell NoExtNPE.sh
|
||||||
|
|
||||||
|
# set a few environment variables so that the shell-script can run stand-alone
|
||||||
|
# in the source directory
|
||||||
|
if [ "${TESTSRC}" = "" ] ; then
|
||||||
|
TESTSRC="."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${TESTJAVA}" = "" ] ; then
|
||||||
|
echo "TESTJAVA not set. Test cannot execute."
|
||||||
|
echo "FAILED!!!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set platform-dependent variables
|
||||||
|
OS=`uname -s`
|
||||||
|
case "$OS" in
|
||||||
|
SunOS )
|
||||||
|
FILESEP="/"
|
||||||
|
;;
|
||||||
|
Linux )
|
||||||
|
FILESEP="/"
|
||||||
|
;;
|
||||||
|
Windows* )
|
||||||
|
FILESEP="\\"
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
echo "Unrecognized system!"
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
${TESTJAVA}${FILESEP}bin${FILESEP}keytool \
|
||||||
|
-list -v \
|
||||||
|
-keystore ${TESTSRC}${FILESEP}CloneKeyAskPassword.jks \
|
||||||
|
-storepass test123
|
||||||
|
|
||||||
|
exit $?
|
Loading…
Reference in New Issue
Block a user