diff --git a/src/java.base/share/classes/sun/security/util/GCMParameters.java b/src/java.base/share/classes/sun/security/util/GCMParameters.java new file mode 100644 index 00000000000..02390777a03 --- /dev/null +++ b/src/java.base/share/classes/sun/security/util/GCMParameters.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.util; + +import java.io.IOException; +import java.security.AlgorithmParametersSpi; +import java.security.spec.AlgorithmParameterSpec; +import java.security.spec.InvalidParameterSpecException; +import javax.crypto.spec.GCMParameterSpec; +import sun.security.util.HexDumpEncoder; +import sun.security.util.*; + +/** + * This class implements the parameter set used with + * GCM encryption, which is defined in RFC 5084 as follows: + * + *
+ * GCMParameters ::= SEQUENCE {
+ * aes-iv OCTET STRING, -- recommended size is 12 octets
+ * aes-tLen AES-GCM-ICVlen DEFAULT 12 }
+ *
+ * AES-GCM-ICVlen ::= INTEGER (12 | 13 | 14 | 15 | 16)
+ *
+ *
+ *
+ * @since 13
+ */
+public final class GCMParameters extends AlgorithmParametersSpi {
+
+ // the iv
+ private byte[] iv;
+ // the tag length in bytes
+ private int tLen;
+
+ public GCMParameters() {}
+
+ protected void engineInit(AlgorithmParameterSpec paramSpec)
+ throws InvalidParameterSpecException {
+
+ if (!(paramSpec instanceof GCMParameterSpec)) {
+ throw new InvalidParameterSpecException
+ ("Inappropriate parameter specification");
+ }
+ GCMParameterSpec gps = (GCMParameterSpec) paramSpec;
+ // need to convert from bits to bytes for ASN.1 encoding
+ this.tLen = gps.getTLen()/8;
+ if (this.tLen < 12 || this.tLen > 16 ) {
+ throw new InvalidParameterSpecException
+ ("GCM parameter parsing error: unsupported tag len: " +
+ this.tLen);
+ }
+ this.iv = gps.getIV();
+ }
+
+ protected void engineInit(byte[] encoded) throws IOException {
+ DerValue val = new DerValue(encoded);
+ // check if IV or params
+ if (val.tag == DerValue.tag_Sequence) {
+ byte[] iv = val.data.getOctetString();
+ int tLen;
+ if (val.data.available() != 0) {
+ tLen = val.data.getInteger();
+ if (tLen < 12 || tLen > 16 ) {
+ throw new IOException
+ ("GCM parameter parsing error: unsupported tag len: " +
+ tLen);
+ }
+ if (val.data.available() != 0) {
+ throw new IOException
+ ("GCM parameter parsing error: extra data");
+ }
+ } else {
+ tLen = 12;
+ }
+ this.iv = iv.clone();
+ this.tLen = tLen;
+ } else {
+ throw new IOException("GCM parameter parsing error: no SEQ tag");
+ }
+ }
+
+ protected void engineInit(byte[] encoded, String decodingMethod)
+ throws IOException {
+ engineInit(encoded);
+ }
+
+ protected + * PKCS#11 structure: + *
+ * typedef struct CK_CCM_PARAMS {
+ * CK_ULONG ulDataLen;
+ * CK_BYTE_PTR pNonce;
+ * CK_ULONG ulNonceLen;
+ * CK_BYTE_PTR pAAD;
+ * CK_ULONG ulAADLen;
+ * CK_ULONG ulMACLen;
+ * } CK_CCM_PARAMS;
+ *
+ *
+ * @since 13
+ */
+public class CK_CCM_PARAMS {
+
+ private final long dataLen;
+ private final byte[] nonce;
+ private final byte[] aad;
+ private final long macLen;
+
+ public CK_CCM_PARAMS(int tagLen, byte[] iv, byte[] aad, int dataLen) {
+ this.dataLen = dataLen;
+ this.nonce = iv;
+ this.aad = aad;
+ this.macLen = tagLen;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append(Constants.INDENT);
+ sb.append("ulDataLen: ");
+ sb.append(dataLen);
+ sb.append(Constants.NEWLINE);
+
+ sb.append(Constants.INDENT);
+ sb.append("iv: ");
+ sb.append(Functions.toHexString(nonce));
+ sb.append(Constants.NEWLINE);
+
+ sb.append(Constants.INDENT);
+ sb.append("aad: ");
+ sb.append(Functions.toHexString(aad));
+ sb.append(Constants.NEWLINE);
+
+ sb.append(Constants.INDENT);
+ sb.append("tagLen: ");
+ sb.append(macLen);
+
+ return sb.toString();
+ }
+}
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_GCM_PARAMS.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_GCM_PARAMS.java
new file mode 100644
index 00000000000..0389dda2818
--- /dev/null
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_GCM_PARAMS.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.pkcs11.wrapper;
+
+/**
+ * This class represents the necessary parameters required by
+ * the CKM_AES_GCM mechanism as defined in CK_GCM_PARAMS structure.+ * PKCS#11 structure: + *
+ * typedef struct CK_GCM_PARAMS {
+ * CK_BYTE_PTR pIv;
+ * CK_ULONG ulIvLen;
+ * CK_BYTE_PTR pAAD;
+ * CK_ULONG ulAADLen;
+ * CK_ULONG ulTagBits;
+ * } CK_GCM_PARAMS;
+ *
+ *
+ * @since 10
+ */
+public class CK_GCM_PARAMS {
+
+ private final byte[] iv;
+ private final byte[] aad;
+ private final long tagBits;
+
+ public CK_GCM_PARAMS(int tagLenInBits, byte[] iv, byte[] aad) {
+ this.iv = iv;
+ this.aad = aad;
+ this.tagBits = tagLenInBits;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append(Constants.INDENT);
+ sb.append("iv: ");
+ sb.append(Functions.toHexString(iv));
+ sb.append(Constants.NEWLINE);
+
+ sb.append(Constants.INDENT);
+ sb.append("aad: ");
+ sb.append(Functions.toHexString(aad));
+ sb.append(Constants.NEWLINE);
+
+ sb.append(Constants.INDENT);
+ sb.append("tagLen(in bits): ");
+ sb.append(tagBits);
+
+ return sb.toString();
+ }
+}
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java
index 84f8508a3fd..1e546462163 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
@@ -82,11 +82,15 @@ public class CK_MECHANISM {
* CK_ULONG ulParameterLen;
*
*/
- public Object pParameter;
+ public Object pParameter = null;
- public CK_MECHANISM() {
- // empty
- }
+ // pointer to native CK_MECHANISM structure
+ // For mechanisms which have only mechanism id, the native structure
+ // can be freed right after init and this field will not be used. However,
+ // for mechanisms which have both mechanism id and parameters, it can
+ // only be freed after operation is finished. Thus, the native pointer
+ // will be stored here and then be explicitly freed by caller.
+ private long pHandle = 0L;
public CK_MECHANISM(long mechanism) {
this.mechanism = mechanism;
@@ -95,7 +99,6 @@ public class CK_MECHANISM {
// We don't have a (long,Object) constructor to force type checking.
// This makes sure we don't accidentally pass a class that the native
// code cannot handle.
-
public CK_MECHANISM(long mechanism, byte[] pParameter) {
init(mechanism, pParameter);
}
@@ -144,6 +147,33 @@ public class CK_MECHANISM {
init(mechanism, params);
}
+ public CK_MECHANISM(long mechanism, CK_GCM_PARAMS params) {
+ init(mechanism, params);
+ }
+
+ public CK_MECHANISM(long mechanism, CK_CCM_PARAMS params) {
+ init(mechanism, params);
+ }
+
+ // For PSS. the parameter may be set multiple times, use the
+ // CK_MECHANISM(long) constructor and setParameter(CK_RSA_PKCS_PSS_PARAMS)
+ // methods instead of creating yet another constructor
+ public void setParameter(CK_RSA_PKCS_PSS_PARAMS params) {
+ assert(this.mechanism == CKM_RSA_PKCS_PSS);
+ assert(params != null);
+ if (this.pParameter != null && this.pParameter.equals(params)) {
+ return;
+ }
+ freeHandle();
+ this.pParameter = params;
+ }
+
+ public void freeHandle() {
+ if (this.pHandle != 0L) {
+ this.pHandle = PKCS11.freeMechanism(pHandle);
+ }
+ }
+
private void init(long mechanism, Object pParameter) {
this.mechanism = mechanism;
this.pParameter = pParameter;
@@ -167,12 +197,17 @@ public class CK_MECHANISM {
sb.append(pParameter.toString());
sb.append(Constants.NEWLINE);
+ /*
sb.append(Constants.INDENT);
sb.append("ulParameterLen: ??");
- //buffer.append(pParameter.length);
- //buffer.append(Constants.NEWLINE);
-
+ sb.append(Constants.NEWLINE);
+ */
+ if (pHandle != 0L) {
+ sb.append(Constants.INDENT);
+ sb.append("pHandle: ");
+ sb.append(pHandle);
+ sb.append(Constants.NEWLINE);
+ }
return sb.toString() ;
}
-
}
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java
index fd11493c827..7309f0d2e72 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java
@@ -1,118 +1,105 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
*
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
+ * 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).
*
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
+ * 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.
*
- * 3. The end-user documentation included with the redistribution, if any, must
- * include the following acknowledgment:
- *
- * "This product includes software developed by IAIK of Graz University of
- * Technology."
- *
- * Alternately, this acknowledgment may appear in the software itself, if
- * and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Graz University of Technology" and "IAIK of Graz University of
- * Technology" must not be used to endorse or promote products derived from
- * this software without prior written permission.
- *
- * 5. Products derived from this software may not be called
- * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior
- * written permission of Graz University of Technology.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
*/
package sun.security.pkcs11.wrapper;
+import java.security.ProviderException;
+import java.security.spec.PSSParameterSpec;
+import java.security.spec.MGF1ParameterSpec;
/**
- * class CK_RSA_PKCS_PSS_PARAMS provides the parameters to the CKM_RSA_PKCS_OAEP
- * mechanism.+ * This class represents the necessary parameters required by the + * CKM_RSA_PKCS_PSS mechanism as defined in CK_RSA_PKCS_PSS_PARAMS structure.
* PKCS#11 structure: *
* typedef struct CK_RSA_PKCS_PSS_PARAMS {
- * CK_MECHANISM_TYPE hashAlg;
- * CK_RSA_PKCS_MGF_TYPE mgf;
- * CK_ULONG sLen;
+ * CK_MECHANISM_TYPE hashAlg;
+ * CK_RSA_PKCS_MGF_TYPE mgf;
+ * CK_ULONG sLen;
* } CK_RSA_PKCS_PSS_PARAMS;
*
*
- * @author Karl Scheibelhofer - * CK_MECHANISM_TYPE hashAlg; - *- */ - public long hashAlg; + private final long hashAlg; + private final long mgf; + private final long sLen; - /** - * PKCS#11: - *
- * CK_RSA_PKCS_MGF_TYPE mgf; - *- */ - public long mgf; + public CK_RSA_PKCS_PSS_PARAMS(String hashAlg, String mgfAlg, + String mgfHash, int sLen) { + this.hashAlg = Functions.getHashMechId(hashAlg); + if (!mgfAlg.equals("MGF1")) { + throw new ProviderException("Only MGF1 is supported"); + } + // no dash in PKCS#11 mechanism names + this.mgf = Functions.getMGFId("CKG_MGF1_" + hashAlg.replaceFirst("-", "")); + this.sLen = sLen; + } - /** - * PKCS#11: - *
- * CK_ULONG sLen; - *- */ - public long sLen; + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } - /** - * Returns the string representation of CK_PKCS5_PBKD2_PARAMS. - * - * @return the string representation of CK_PKCS5_PBKD2_PARAMS - */ + if (!(o instanceof CK_RSA_PKCS_PSS_PARAMS)) { + return false; + } + + CK_RSA_PKCS_PSS_PARAMS other = (CK_RSA_PKCS_PSS_PARAMS) o; + return ((other.hashAlg == hashAlg) && + (other.mgf == mgf) && + (other.sLen == sLen)); + } + + @Override + public int hashCode() { + return (int)(hashAlg << 2 + mgf << 1 + sLen); + } + + @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(Constants.INDENT); - sb.append("hashAlg: 0x"); + sb.append("hashAlg: "); sb.append(Functions.toFullHexString(hashAlg)); sb.append(Constants.NEWLINE); sb.append(Constants.INDENT); - sb.append("mgf: 0x"); + sb.append("mgf: "); sb.append(Functions.toFullHexString(mgf)); sb.append(Constants.NEWLINE); sb.append(Constants.INDENT); - sb.append("sLen: "); + sb.append("sLen(in bytes): "); sb.append(sLen); - //buffer.append(Constants.NEWLINE); return sb.toString(); } - } diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/Functions.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/Functions.java index b150a126d51..7e5593f8703 100644 --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/Functions.java +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/Functions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -97,6 +97,13 @@ public class Functions { private static final Map
null or both have the same length and
@@ -595,8 +614,14 @@ public class Functions {
addMapping(objectClassNames, objectClassIds, id, name);
}
- private static void addHashMech(long id, String name) {
- hashMechIds.put(name, id);
+ private static void addHashMech(long id, String... names) {
+ for (String n : names) {
+ hashMechIds.put(n, id);
+ }
+ }
+
+ private static void addMGF(long id, String name) {
+ addMapping(mgfNames, mgfIds, id, name);
}
static {
@@ -618,16 +643,27 @@ public class Functions {
addMech(CKM_DSA_KEY_PAIR_GEN, "CKM_DSA_KEY_PAIR_GEN");
addMech(CKM_DSA, "CKM_DSA");
addMech(CKM_DSA_SHA1, "CKM_DSA_SHA1");
+ addMech(CKM_DSA_SHA224, "CKM_DSA_SHA224");
+ addMech(CKM_DSA_SHA256, "CKM_DSA_SHA256");
+ addMech(CKM_DSA_SHA384, "CKM_DSA_SHA384");
+ addMech(CKM_DSA_SHA512, "CKM_DSA_SHA512");
+
addMech(CKM_DH_PKCS_KEY_PAIR_GEN, "CKM_DH_PKCS_KEY_PAIR_GEN");
addMech(CKM_DH_PKCS_DERIVE, "CKM_DH_PKCS_DERIVE");
addMech(CKM_X9_42_DH_KEY_PAIR_GEN, "CKM_X9_42_DH_KEY_PAIR_GEN");
addMech(CKM_X9_42_DH_DERIVE, "CKM_X9_42_DH_DERIVE");
addMech(CKM_X9_42_DH_HYBRID_DERIVE, "CKM_X9_42_DH_HYBRID_DERIVE");
addMech(CKM_X9_42_MQV_DERIVE, "CKM_X9_42_MQV_DERIVE");
- addMech(CKM_SHA224_RSA_PKCS, "CKM_SHA224_RSA_PKCS");
+
addMech(CKM_SHA256_RSA_PKCS, "CKM_SHA256_RSA_PKCS");
addMech(CKM_SHA384_RSA_PKCS, "CKM_SHA384_RSA_PKCS");
addMech(CKM_SHA512_RSA_PKCS, "CKM_SHA512_RSA_PKCS");
+ addMech(CKM_SHA256_RSA_PKCS_PSS, "CKM_SHA256_RSA_PKCS_PSS");
+ addMech(CKM_SHA384_RSA_PKCS_PSS, "CKM_SHA384_RSA_PKCS_PSS");
+ addMech(CKM_SHA512_RSA_PKCS_PSS, "CKM_SHA512_RSA_PKCS_PSS");
+ addMech(CKM_SHA224_RSA_PKCS, "CKM_SHA224_RSA_PKCS");
+ addMech(CKM_SHA224_RSA_PKCS_PSS, "CKM_SHA224_RSA_PKCS_PSS");
+
addMech(CKM_RC2_KEY_GEN, "CKM_RC2_KEY_GEN");
addMech(CKM_RC2_ECB, "CKM_RC2_ECB");
addMech(CKM_RC2_CBC, "CKM_RC2_CBC");
@@ -649,12 +685,21 @@ public class Functions {
addMech(CKM_DES3_MAC, "CKM_DES3_MAC");
addMech(CKM_DES3_MAC_GENERAL, "CKM_DES3_MAC_GENERAL");
addMech(CKM_DES3_CBC_PAD, "CKM_DES3_CBC_PAD");
+ addMech(CKM_DES3_CMAC_GENERAL, "CKM_DES3_CMAC_GENERAL");
+ addMech(CKM_DES3_CMAC, "CKM_DES3_CMAC");
+
addMech(CKM_CDMF_KEY_GEN, "CKM_CDMF_KEY_GEN");
addMech(CKM_CDMF_ECB, "CKM_CDMF_ECB");
addMech(CKM_CDMF_CBC, "CKM_CDMF_CBC");
addMech(CKM_CDMF_MAC, "CKM_CDMF_MAC");
addMech(CKM_CDMF_MAC_GENERAL, "CKM_CDMF_MAC_GENERAL");
addMech(CKM_CDMF_CBC_PAD, "CKM_CDMF_CBC_PAD");
+
+ addMech(CKM_DES_OFB64, "CKM_DES_OFB64");
+ addMech(CKM_DES_OFB8, "CKM_DES_OFB8");
+ addMech(CKM_DES_CFB64, "CKM_DES_CFB64");
+ addMech(CKM_DES_CFB8, "CKM_DES_CFB8");
+
addMech(CKM_MD2, "CKM_MD2");
addMech(CKM_MD2_HMAC, "CKM_MD2_HMAC");
addMech(CKM_MD2_HMAC_GENERAL, "CKM_MD2_HMAC_GENERAL");
@@ -682,6 +727,26 @@ public class Functions {
addMech(CKM_SHA512, "CKM_SHA512");
addMech(CKM_SHA512_HMAC, "CKM_SHA512_HMAC");
addMech(CKM_SHA512_HMAC_GENERAL, "CKM_SHA512_HMAC_GENERAL");
+ addMech(CKM_SHA512_224, "CKM_SHA512_224");
+ addMech(CKM_SHA512_224_HMAC, "CKM_SHA512_224_HMAC");
+ addMech(CKM_SHA512_224_HMAC_GENERAL, "CKM_SHA512_224_HMAC_GENERAL");
+ addMech(CKM_SHA512_224_KEY_DERIVATION, "CKM_SHA512_224_KEY_DERIVATION");
+ addMech(CKM_SHA512_256, "CKM_SHA512_256");
+ addMech(CKM_SHA512_256_HMAC, "CKM_SHA512_256_HMAC");
+ addMech(CKM_SHA512_256_HMAC_GENERAL, "CKM_SHA512_256_HMAC_GENERAL");
+ addMech(CKM_SHA512_256_KEY_DERIVATION, "CKM_SHA512_256_KEY_DERIVATION");
+ addMech(CKM_SHA512_T, "CKM_SHA512_T");
+ addMech(CKM_SHA512_T_HMAC, "CKM_SHA512_T_HMAC");
+ addMech(CKM_SHA512_T_HMAC_GENERAL, "CKM_SHA512_T_HMAC_GENERAL");
+ addMech(CKM_SHA512_T_KEY_DERIVATION, "CKM_SHA512_T_KEY_DERIVATION");
+
+ addMech(CKM_SECURID_KEY_GEN, "CKM_SECURID_KEY_GEN");
+ addMech(CKM_SECURID, "CKM_SECURID");
+ addMech(CKM_HOTP_KEY_GEN, "CKM_HOTP_KEY_GEN");
+ addMech(CKM_HOTP, "CKM_HOTP");
+ addMech(CKM_ACTI, "CKM_ACTI");
+ addMech(CKM_ACTI_KEY_GEN, "CKM_ACTI_KEY_GEN");
+
addMech(CKM_CAST_KEY_GEN, "CKM_CAST_KEY_GEN");
addMech(CKM_CAST_ECB, "CKM_CAST_ECB");
addMech(CKM_CAST_CBC, "CKM_CAST_CBC");
@@ -729,10 +794,7 @@ public class Functions {
addMech(CKM_TLS_PRF, "CKM_TLS_PRF");
addMech(CKM_SSL3_MD5_MAC, "CKM_SSL3_MD5_MAC");
addMech(CKM_SSL3_SHA1_MAC, "CKM_SSL3_SHA1_MAC");
- addMech(CKM_TLS12_MASTER_KEY_DERIVE, "CKM_TLS12_MASTER_KEY_DERIVE");
- addMech(CKM_TLS12_KEY_AND_MAC_DERIVE, "CKM_TLS12_KEY_AND_MAC_DERIVE");
- addMech(CKM_TLS12_MASTER_KEY_DERIVE_DH, "CKM_TLS12_MASTER_KEY_DERIVE_DH");
- addMech(CKM_TLS_MAC, "CKM_TLS_MAC");
+
addMech(CKM_MD5_KEY_DERIVATION, "CKM_MD5_KEY_DERIVATION");
addMech(CKM_MD2_KEY_DERIVATION, "CKM_MD2_KEY_DERIVATION");
addMech(CKM_SHA1_KEY_DERIVATION, "CKM_SHA1_KEY_DERIVATION");
@@ -754,8 +816,62 @@ public class Functions {
addMech(CKM_PBE_SHA1_RC2_40_CBC, "CKM_PBE_SHA1_RC2_40_CBC");
addMech(CKM_PKCS5_PBKD2, "CKM_PKCS5_PBKD2");
addMech(CKM_PBA_SHA1_WITH_SHA1_HMAC, "CKM_PBA_SHA1_WITH_SHA1_HMAC");
+
+ addMech(CKM_WTLS_PRE_MASTER_KEY_GEN, "CKM_WTLS_PRE_MASTER_KEY_GEN");
+ addMech(CKM_WTLS_MASTER_KEY_DERIVE, "CKM_WTLS_MASTER_KEY_DERIVE");
+ addMech(CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC,
+ "CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC");
+ addMech(CKM_WTLS_PRF, "CKM_WTLS_PRF");
+ addMech(CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE,
+ "CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE");
+ addMech(CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE,
+ "CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE");
+ addMech(CKM_TLS10_MAC_SERVER, "CKM_TLS10_MAC_SERVER");
+ addMech(CKM_TLS10_MAC_CLIENT, "CKM_TLS10_MAC_CLIENT");
+ addMech(CKM_TLS12_MAC, "CKM_TLS12_MAC");
+ addMech(CKM_TLS12_KDF, "CKM_TLS12_KDF");
+ addMech(CKM_TLS12_MASTER_KEY_DERIVE, "CKM_TLS12_MASTER_KEY_DERIVE");
+ addMech(CKM_TLS12_KEY_AND_MAC_DERIVE, "CKM_TLS12_KEY_AND_MAC_DERIVE");
+ addMech(CKM_TLS12_MASTER_KEY_DERIVE_DH, "CKM_TLS12_MASTER_KEY_DERIVE_DH");
+ addMech(CKM_TLS12_KEY_SAFE_DERIVE, "CKM_TLS12_KEY_SAFE_DERIVE");
+ addMech(CKM_TLS_MAC, "CKM_TLS_MAC");
+ addMech(CKM_TLS_KDF, "CKM_TLS_KDF");
+
addMech(CKM_KEY_WRAP_LYNKS, "CKM_KEY_WRAP_LYNKS");
addMech(CKM_KEY_WRAP_SET_OAEP, "CKM_KEY_WRAP_SET_OAEP");
+
+ addMech(CKM_CMS_SIG, "CKM_CMS_SIG");
+ addMech(CKM_KIP_DERIVE, "CKM_KIP_DERIVE");
+ addMech(CKM_KIP_WRAP, "CKM_KIP_WRAP");
+ addMech(CKM_KIP_MAC, "CKM_KIP_MAC");
+ addMech(CKM_CAMELLIA_KEY_GEN, "CKM_CAMELLIA_KEY_GEN");
+ addMech(CKM_CAMELLIA_ECB, "CKM_CAMELLIA_ECB");
+ addMech(CKM_CAMELLIA_CBC, "CKM_CAMELLIA_CBC");
+ addMech(CKM_CAMELLIA_MAC, "CKM_CAMELLIA_MAC");
+ addMech(CKM_CAMELLIA_MAC_GENERAL, "CKM_CAMELLIA_MAC_GENERAL");
+ addMech(CKM_CAMELLIA_CBC_PAD, "CKM_CAMELLIA_CBC_PAD");
+ addMech(CKM_CAMELLIA_ECB_ENCRYPT_DATA, "CKM_CAMELLIA_ECB_ENCRYPT_DATA");
+ addMech(CKM_CAMELLIA_CBC_ENCRYPT_DATA, "CKM_CAMELLIA_CBC_ENCRYPT_DATA");
+ addMech(CKM_CAMELLIA_CTR, "CKM_CAMELLIA_CTR");
+
+ addMech(CKM_ARIA_KEY_GEN, "CKM_ARIA_KEY_GEN");
+ addMech(CKM_ARIA_ECB, "CKM_ARIA_ECB");
+ addMech(CKM_ARIA_CBC, "CKM_ARIA_CBC");
+ addMech(CKM_ARIA_MAC, "CKM_ARIA_MAC");
+ addMech(CKM_ARIA_MAC_GENERAL, "CKM_ARIA_MAC_GENERAL");
+ addMech(CKM_ARIA_CBC_PAD, "CKM_ARIA_CBC_PAD");
+ addMech(CKM_ARIA_ECB_ENCRYPT_DATA, "CKM_ARIA_ECB_ENCRYPT_DATA");
+ addMech(CKM_ARIA_CBC_ENCRYPT_DATA, "CKM_ARIA_CBC_ENCRYPT_DATA");
+
+ addMech(CKM_SEED_KEY_GEN, "CKM_SEED_KEY_GEN");
+ addMech(CKM_SEED_ECB, "CKM_SEED_ECB");
+ addMech(CKM_SEED_CBC, "CKM_SEED_CBC");
+ addMech(CKM_SEED_MAC, "CKM_SEED_MAC");
+ addMech(CKM_SEED_MAC_GENERAL, "CKM_SEED_MAC_GENERAL");
+ addMech(CKM_SEED_CBC_PAD, "CKM_SEED_CBC_PAD");
+ addMech(CKM_SEED_ECB_ENCRYPT_DATA, "CKM_SEED_ECB_ENCRYPT_DATA");
+ addMech(CKM_SEED_CBC_ENCRYPT_DATA, "CKM_SEED_CBC_ENCRYPT_DATA");
+
addMech(CKM_SKIPJACK_KEY_GEN, "CKM_SKIPJACK_KEY_GEN");
addMech(CKM_SKIPJACK_ECB64, "CKM_SKIPJACK_ECB64");
addMech(CKM_SKIPJACK_CBC64, "CKM_SKIPJACK_CBC64");
@@ -780,9 +896,17 @@ public class Functions {
addMech(CKM_EC_KEY_PAIR_GEN, "CKM_EC_KEY_PAIR_GEN");
addMech(CKM_ECDSA, "CKM_ECDSA");
addMech(CKM_ECDSA_SHA1, "CKM_ECDSA_SHA1");
+ addMech(CKM_ECDSA_SHA224, "CKM_ECDSA_SHA224");
+ addMech(CKM_ECDSA_SHA256, "CKM_ECDSA_SHA256");
+ addMech(CKM_ECDSA_SHA384, "CKM_ECDSA_SHA384");
+ addMech(CKM_ECDSA_SHA512, "CKM_ECDSA_SHA512");
+
addMech(CKM_ECDH1_DERIVE, "CKM_ECDH1_DERIVE");
addMech(CKM_ECDH1_COFACTOR_DERIVE, "CKM_ECDH1_COFACTOR_DERIVE");
addMech(CKM_ECMQV_DERIVE, "CKM_ECMQV_DERIVE");
+ addMech(CKM_ECDH_AES_KEY_WRAP, "CKM_ECDH_AES_KEY_WRAP");
+ addMech(CKM_RSA_AES_KEY_WRAP, "CKM_RSA_AES_KEY_WRAP");
+
addMech(CKM_JUNIPER_KEY_GEN, "CKM_JUNIPER_KEY_GEN");
addMech(CKM_JUNIPER_ECB128, "CKM_JUNIPER_ECB128");
addMech(CKM_JUNIPER_CBC128, "CKM_JUNIPER_CBC128");
@@ -796,11 +920,61 @@ public class Functions {
addMech(CKM_AES_MAC, "CKM_AES_MAC");
addMech(CKM_AES_MAC_GENERAL, "CKM_AES_MAC_GENERAL");
addMech(CKM_AES_CBC_PAD, "CKM_AES_CBC_PAD");
+ addMech(CKM_AES_CTR, "CKM_AES_CTR");
+ addMech(CKM_AES_GCM, "CKM_AES_GCM");
+ addMech(CKM_AES_CCM, "CKM_AES_CCM");
+ addMech(CKM_AES_CTS, "CKM_AES_CTS");
+ addMech(CKM_AES_CMAC, "CKM_AES_CMAC");
+ addMech(CKM_AES_CMAC_GENERAL, "CKM_AES_CMAC_GENERAL");
+ addMech(CKM_AES_XCBC_MAC, "CKM_AES_XCBC_MAC");
+ addMech(CKM_AES_XCBC_MAC_96, "CKM_AES_XCBC_MAC_96");
+ addMech(CKM_AES_GMAC, "CKM_AES_GMAC");
+
addMech(CKM_BLOWFISH_KEY_GEN, "CKM_BLOWFISH_KEY_GEN");
addMech(CKM_BLOWFISH_CBC, "CKM_BLOWFISH_CBC");
+ addMech(CKM_TWOFISH_KEY_GEN, "CKM_TWOFISH_KEY_GEN");
+ addMech(CKM_TWOFISH_CBC, "CKM_TWOFISH_CBC");
+ addMech(CKM_BLOWFISH_CBC_PAD, "CKM_BLOWFISH_CBC_PAD");
+ addMech(CKM_TWOFISH_CBC_PAD, "CKM_TWOFISH_CBC_PAD");
+
+ addMech(CKM_DES_ECB_ENCRYPT_DATA, "CKM_DES_ECB_ENCRYPT_DATA");
+ addMech(CKM_DES_CBC_ENCRYPT_DATA, "CKM_DES_CBC_ENCRYPT_DATA");
+ addMech(CKM_DES3_ECB_ENCRYPT_DATA, "CKM_DES3_ECB_ENCRYPT_DATA");
+ addMech(CKM_DES3_CBC_ENCRYPT_DATA, "CKM_DES3_CBC_ENCRYPT_DATA");
+ addMech(CKM_AES_ECB_ENCRYPT_DATA, "CKM_AES_ECB_ENCRYPT_DATA");
+ addMech(CKM_AES_CBC_ENCRYPT_DATA, "CKM_AES_CBC_ENCRYPT_DATA");
+
+ addMech(CKM_GOSTR3410_KEY_PAIR_GEN, "CKM_GOSTR3410_KEY_PAIR_GEN");
+ addMech(CKM_GOSTR3410, "CKM_GOSTR3410");
+ addMech(CKM_GOSTR3410_WITH_GOSTR3411, "CKM_GOSTR3410_WITH_GOSTR3411");
+ addMech(CKM_GOSTR3410_KEY_WRAP, "CKM_GOSTR3410_KEY_WRAP");
+ addMech(CKM_GOSTR3410_DERIVE, "CKM_GOSTR3410_DERIVE");
+ addMech(CKM_GOSTR3411, "CKM_GOSTR3411");
+ addMech(CKM_GOSTR3411_HMAC, "CKM_GOSTR3411_HMAC");
+ addMech(CKM_GOST28147_KEY_GEN, "CKM_GOST28147_KEY_GEN");
+ addMech(CKM_GOST28147_ECB, "CKM_GOST28147_ECB");
+ addMech(CKM_GOST28147, "CKM_GOST28147");
+ addMech(CKM_GOST28147_MAC, "CKM_GOST28147_MAC");
+ addMech(CKM_GOST28147_KEY_WRAP, "CKM_GOST28147_KEY_WRAP");
+
addMech(CKM_DSA_PARAMETER_GEN, "CKM_DSA_PARAMETER_GEN");
addMech(CKM_DH_PKCS_PARAMETER_GEN, "CKM_DH_PKCS_PARAMETER_GEN");
addMech(CKM_X9_42_DH_PARAMETER_GEN, "CKM_X9_42_DH_PARAMETER_GEN");
+ addMech(CKM_DSA_PROBABLISTIC_PARAMETER_GEN,
+ "CKM_DSA_PROBABLISTIC_PARAMETER_GEN");
+ addMech(CKM_DSA_SHAWE_TAYLOR_PARAMETER_GEN,
+ "CKM_DSA_SHAWE_TAYLOR_PARAMETER_GEN");
+ addMech(CKM_AES_OFB, "CKM_AES_OFB");
+ addMech(CKM_AES_CFB64, "CKM_AES_CFB64");
+ addMech(CKM_AES_CFB8, "CKM_AES_CFB8");
+ addMech(CKM_AES_CFB128, "CKM_AES_CFB128");
+ addMech(CKM_AES_CFB1, "CKM_AES_CFB1");
+ addMech(CKM_AES_KEY_WRAP, "CKM_AES_KEY_WRAP");
+ addMech(CKM_AES_KEY_WRAP_PAD, "CKM_AES_KEY_WRAP_PAD");
+
+ addMech(CKM_RSA_PKCS_TPM_1_1, "CKM_RSA_PKCS_TPM_1_1");
+ addMech(CKM_RSA_PKCS_OAEP_TPM_1_1, "CKM_RSA_PKCS_OAEP_TPM_1_1");
+
addMech(CKM_VENDOR_DEFINED, "CKM_VENDOR_DEFINED");
addMech(CKM_NSS_TLS_PRF_GENERAL, "CKM_NSS_TLS_PRF_GENERAL");
@@ -808,11 +982,13 @@ public class Functions {
addMech(PCKM_SECURERANDOM, "SecureRandom");
addMech(PCKM_KEYSTORE, "KeyStore");
- addHashMech(CKM_SHA_1, "SHA-1");
- addHashMech(CKM_SHA224, "SHA-224");
- addHashMech(CKM_SHA256, "SHA-256");
- addHashMech(CKM_SHA384, "SHA-384");
- addHashMech(CKM_SHA512, "SHA-512");
+ addHashMech(CKM_SHA_1, "SHA-1", "SHA", "SHA1");
+ addHashMech(CKM_SHA224, "SHA-224", "SHA224");
+ addHashMech(CKM_SHA256, "SHA-256", "SHA256");
+ addHashMech(CKM_SHA384, "SHA-384", "SHA384");
+ addHashMech(CKM_SHA512, "SHA-512", "SHA512");
+ addHashMech(CKM_SHA512_224, "SHA-512/224", "SHA512/224");
+ addHashMech(CKM_SHA512_256, "SHA-512/256", "SHA512/256");
addKeyType(CKK_RSA, "CKK_RSA");
addKeyType(CKK_DSA, "CKK_DSA");
@@ -837,6 +1013,25 @@ public class Functions {
addKeyType(CKK_CDMF, "CKK_CDMF");
addKeyType(CKK_AES, "CKK_AES");
addKeyType(CKK_BLOWFISH, "CKK_BLOWFISH");
+ addKeyType(CKK_TWOFISH, "CKK_TWOFISH");
+ addKeyType(CKK_SECURID, "CKK_SECURID");
+ addKeyType(CKK_HOTP, "CKK_HOTP");
+ addKeyType(CKK_ACTI, "CKK_ACTI");
+ addKeyType(CKK_CAMELLIA, "CKK_CAMELLIA");
+ addKeyType(CKK_ARIA, "CKK_ARIA");
+ addKeyType(CKK_MD5_HMAC, "CKK_MD5_HMAC");
+ addKeyType(CKK_SHA_1_HMAC, "CKK_SHA_1_HMAC");
+ addKeyType(CKK_RIPEMD128_HMAC, "CKK_RIPEMD128_HMAC");
+ addKeyType(CKK_RIPEMD160_HMAC, "CKK_RIPEMD160_HMAC");
+ addKeyType(CKK_SHA256_HMAC, "CKK_SHA256_HMAC");
+ addKeyType(CKK_SHA384_HMAC, "CKK_SHA384_HMAC");
+ addKeyType(CKK_SHA512_HMAC, "CKK_SHA512_HMAC");
+ addKeyType(CKK_SHA224_HMAC, "CKK_SHA224_HMAC");
+ addKeyType(CKK_SEED, "CKK_SEED");
+ addKeyType(CKK_GOSTR3410, "CKK_GOSTR3410");
+ addKeyType(CKK_GOSTR3411, "CKK_GOSTR3411");
+ addKeyType(CKK_GOST28147, "CKK_GOST28147");
+
addKeyType(CKK_VENDOR_DEFINED, "CKK_VENDOR_DEFINED");
addKeyType(PCKK_ANY, "*");
@@ -855,6 +1050,16 @@ public class Functions {
addAttribute(CKA_OWNER, "CKA_OWNER");
addAttribute(CKA_ATTR_TYPES, "CKA_ATTR_TYPES");
addAttribute(CKA_TRUSTED, "CKA_TRUSTED");
+ addAttribute(CKA_CERTIFICATE_CATEGORY, "CKA_CERTIFICATE_CATEGORY");
+ addAttribute(CKA_JAVA_MIDP_SECURITY_DOMAIN,
+ "CKA_JAVA_MIDP_SECURITY_DOMAIN");
+ addAttribute(CKA_URL, "CKA_URL");
+ addAttribute(CKA_HASH_OF_SUBJECT_PUBLIC_KEY,
+ "CKA_HASH_OF_SUBJECT_PUBLIC_KEY");
+ addAttribute(CKA_HASH_OF_ISSUER_PUBLIC_KEY,
+ "CKA_HASH_OF_ISSUER_PUBLIC_KEY");
+ addAttribute(CKA_NAME_HASH_ALGORITHM, "CKA_NAME_HASH_ALGORITHM");
+ addAttribute(CKA_CHECK_VALUE, "CKA_CHECK_VALUE");
addAttribute(CKA_KEY_TYPE, "CKA_KEY_TYPE");
addAttribute(CKA_SUBJECT, "CKA_SUBJECT");
addAttribute(CKA_ID, "CKA_ID");
@@ -879,6 +1084,7 @@ public class Functions {
addAttribute(CKA_EXPONENT_1, "CKA_EXPONENT_1");
addAttribute(CKA_EXPONENT_2, "CKA_EXPONENT_2");
addAttribute(CKA_COEFFICIENT, "CKA_COEFFICIENT");
+ addAttribute(CKA_PUBLIC_KEY_INFO, "CKA_PUBLIC_KEY_INFO");
addAttribute(CKA_PRIME, "CKA_PRIME");
addAttribute(CKA_SUBPRIME, "CKA_SUBPRIME");
addAttribute(CKA_BASE, "CKA_BASE");
@@ -886,19 +1092,69 @@ public class Functions {
addAttribute(CKA_SUB_PRIME_BITS, "CKA_SUB_PRIME_BITS");
addAttribute(CKA_VALUE_BITS, "CKA_VALUE_BITS");
addAttribute(CKA_VALUE_LEN, "CKA_VALUE_LEN");
+
addAttribute(CKA_EXTRACTABLE, "CKA_EXTRACTABLE");
addAttribute(CKA_LOCAL, "CKA_LOCAL");
addAttribute(CKA_NEVER_EXTRACTABLE, "CKA_NEVER_EXTRACTABLE");
addAttribute(CKA_ALWAYS_SENSITIVE, "CKA_ALWAYS_SENSITIVE");
+
addAttribute(CKA_KEY_GEN_MECHANISM, "CKA_KEY_GEN_MECHANISM");
addAttribute(CKA_MODIFIABLE, "CKA_MODIFIABLE");
+ addAttribute(CKA_COPYABLE, "CKA_COPYABLE");
+ addAttribute(CKA_DESTROYABLE, "CKA_DESTROYABLE");
+
addAttribute(CKA_EC_PARAMS, "CKA_EC_PARAMS");
addAttribute(CKA_EC_POINT, "CKA_EC_POINT");
+
addAttribute(CKA_SECONDARY_AUTH, "CKA_SECONDARY_AUTH");
addAttribute(CKA_AUTH_PIN_FLAGS, "CKA_AUTH_PIN_FLAGS");
+ addAttribute(CKA_ALWAYS_AUTHENTICATE, "CKA_ALWAYS_AUTHENTICATE");
+ addAttribute(CKA_WRAP_WITH_TRUSTED, "CKA_WRAP_WITH_TRUSTED");
+ addAttribute(CKA_WRAP_TEMPLATE, "CKA_WRAP_TEMPLATE");
+ addAttribute(CKA_UNWRAP_TEMPLATE, "CKA_UNWRAP_TEMPLATE");
+ addAttribute(CKA_DERIVE_TEMPLATE, "CKA_DERIVE_TEMPLATE");
+ addAttribute(CKA_OTP_FORMAT, "CKA_OTP_FORMAT");
+ addAttribute(CKA_OTP_LENGTH, "CKA_OTP_LENGTH");
+ addAttribute(CKA_OTP_TIME_INTERVAL, "CKA_OTP_TIME_INTERVAL");
+ addAttribute(CKA_OTP_USER_FRIENDLY_MODE,"CKA_OTP_USER_FRIENDLY_MODE");
+ addAttribute(CKA_OTP_CHALLENGE_REQUIREMENT,
+ "CKA_OTP_CHALLENGE_REQUIREMENT");
+ addAttribute(CKA_OTP_TIME_REQUIREMENT, "CKA_OTP_TIME_REQUIREMENT");
+ addAttribute(CKA_OTP_COUNTER_REQUIREMENT,
+ "CKA_OTP_COUNTER_REQUIREMENT");
+ addAttribute(CKA_OTP_PIN_REQUIREMENT, "CKA_OTP_PIN_REQUIREMENT");
+ addAttribute(CKA_OTP_COUNTER, "CKA_OTP_COUNTER");
+ addAttribute(CKA_OTP_TIME, "CKA_OTP_TIME");
+ addAttribute(CKA_OTP_USER_IDENTIFIER, "CKA_OTP_USER_IDENTIFIER");
+ addAttribute(CKA_OTP_SERVICE_IDENTIFIER,"CKA_OTP_SERVICE_IDENTIFIER");
+ addAttribute(CKA_OTP_SERVICE_LOGO, "CKA_OTP_SERVICE_LOGO");
+ addAttribute(CKA_OTP_SERVICE_LOGO_TYPE, "CKA_OTP_SERVICE_LOGO_TYPE");
+ addAttribute(CKA_GOSTR3410_PARAMS, "CKA_GOSTR3410_PARAMS");
+ addAttribute(CKA_GOSTR3411_PARAMS, "CKA_GOSTR3411_PARAMS");
+ addAttribute(CKA_GOST28147_PARAMS, "CKA_GOST28147_PARAMS");
+
addAttribute(CKA_HW_FEATURE_TYPE, "CKA_HW_FEATURE_TYPE");
addAttribute(CKA_RESET_ON_INIT, "CKA_RESET_ON_INIT");
addAttribute(CKA_HAS_RESET, "CKA_HAS_RESET");
+
+ addAttribute(CKA_PIXEL_X, "CKA_PIXEL_X");
+ addAttribute(CKA_PIXEL_Y, "CKA_PIXEL_Y");
+ addAttribute(CKA_RESOLUTION, "CKA_RESOLUTION");
+ addAttribute(CKA_CHAR_ROWS, "CKA_CHAR_ROWS");
+ addAttribute(CKA_CHAR_COLUMNS, "CKA_CHAR_COLUMNS");
+ addAttribute(CKA_COLOR, "CKA_COLOR");
+ addAttribute(CKA_BITS_PER_PIXEL, "CKA_BITS_PER_PIXEL");
+ addAttribute(CKA_CHAR_SETS, "CKA_CHAR_SETS");
+ addAttribute(CKA_ENCODING_METHODS, "CKA_ENCODING_METHODS");
+ addAttribute(CKA_MIME_TYPES, "CKA_MIME_TYPES");
+ addAttribute(CKA_MECHANISM_TYPE, "CKA_MECHANISM_TYPE");
+ addAttribute(CKA_REQUIRED_CMS_ATTRIBUTES,
+ "CKA_REQUIRED_CMS_ATTRIBUTES");
+ addAttribute(CKA_DEFAULT_CMS_ATTRIBUTES,"CKA_DEFAULT_CMS_ATTRIBUTES");
+ addAttribute(CKA_SUPPORTED_CMS_ATTRIBUTES,
+ "CKA_SUPPORTED_CMS_ATTRIBUTES");
+ addAttribute(CKA_ALLOWED_MECHANISMS, "CKA_ALLOWED_MECHANISMS");
+
addAttribute(CKA_VENDOR_DEFINED, "CKA_VENDOR_DEFINED");
addAttribute(CKA_NETSCAPE_DB, "CKA_NETSCAPE_DB");
@@ -920,6 +1176,11 @@ public class Functions {
addObjectClass(PCKO_ANY, "*");
+ addMGF(CKG_MGF1_SHA1, "CKG_MGF1_SHA1");
+ addMGF(CKG_MGF1_SHA256, "CKG_MGF1_SHA256");
+ addMGF(CKG_MGF1_SHA384, "CKG_MGF1_SHA384");
+ addMGF(CKG_MGF1_SHA512, "CKG_MGF1_SHA512");
+ addMGF(CKG_MGF1_SHA224, "CKG_MGF1_SHA224");
}
}
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java
index d93fa3cbb27..04a369f453c 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
@@ -97,6 +97,12 @@ public class PKCS11 {
// static initializer, hence this method is empty.
}
+ /* *****************************************************************************
+ * Utility, Resource Clean up
+ ******************************************************************************/
+ // always return 0L
+ public static native long freeMechanism(long hMechanism);
+
/**
* The PKCS#11 module to connect to. This is the PKCS#11 driver of the token;
* e.g. pk2priv.dll.
@@ -729,17 +735,25 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
- * @param pData the data to get encrypted and the data's length
+ * @param directIn the address of the to-be-encrypted data
+ * @param in buffer containing the to-be-encrypted data
+ * @param inOfs buffer offset of the to-be-encrypted data
+ * @param inLen length of the to-be-encrypted data
* (PKCS#11 param: CK_BYTE_PTR pData, CK_ULONG ulDataLen)
- * @return the encrypted data and the encrypted data's length
+ * @param directOut the address for the encrypted data
+ * @param out buffer for the encrypted data
+ * @param outOfs buffer offset for the encrypted data
+ * @param outLen buffer size for the encrypted data
+ * @return the length of encrypted data
* (PKCS#11 param: CK_BYTE_PTR pEncryptedData,
* CK_ULONG_PTR pulEncryptedDataLen)
* @exception PKCS11Exception If function returns other value than CKR_OK.
- * @preconditions (pData <> null)
- * @postconditions (result <> null)
+ * @preconditions
+ * @postconditions
*/
- public native int C_Encrypt(long hSession, byte[] in, int inOfs, int inLen,
- byte[] out, int outOfs, int outLen) throws PKCS11Exception;
+ public native int C_Encrypt(long hSession, long directIn, byte[] in,
+ int inOfs, int inLen, long directOut, byte[] out, int outOfs,
+ int outLen) throws PKCS11Exception;
/**
@@ -749,13 +763,20 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
- * @param pPart the data part to get encrypted and the data part's length
+ * @param directIn the address of the to-be-encrypted data
+ * @param in buffer containing the to-be-encrypted data
+ * @param inOfs buffer offset of the to-be-encrypted data
+ * @param inLen length of the to-be-encrypted data
* (PKCS#11 param: CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
- * @return the encrypted data part and the encrypted data part's length
+ * @param directOut the address for the encrypted data
+ * @param out buffer for the encrypted data
+ * @param outOfs buffer offset for the encrypted data
+ * @param outLen buffer size for the encrypted data
+ * @return the length of encrypted data for this update
* (PKCS#11 param: CK_BYTE_PTR pEncryptedPart,
CK_ULONG_PTR pulEncryptedPartLen)
* @exception PKCS11Exception If function returns other value than CKR_OK.
- * @preconditions (pPart <> null)
+ * @preconditions
* @postconditions
*/
public native int C_EncryptUpdate(long hSession, long directIn, byte[] in,
@@ -770,12 +791,16 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
- * @return the last encrypted data part and the last data part's length
+ * @param directOut the address for the encrypted data
+ * @param out buffer for the encrypted data
+ * @param outOfs buffer offset for the encrypted data
+ * @param outLen buffer size for the encrypted data
+ * @return the length of the last part of the encrypted data
* (PKCS#11 param: CK_BYTE_PTR pLastEncryptedPart,
CK_ULONG_PTR pulLastEncryptedPartLen)
* @exception PKCS11Exception If function returns other value than CKR_OK.
* @preconditions
- * @postconditions (result <> null)
+ * @postconditions
*/
public native int C_EncryptFinal(long hSession, long directOut, byte[] out,
int outOfs, int outLen) throws PKCS11Exception;
@@ -805,18 +830,25 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
- * @param pEncryptedData the encrypted data to get decrypted and the
- * encrypted data's length
- * (PKCS#11 param: CK_BYTE_PTR pEncryptedData,
- * CK_ULONG ulEncryptedDataLen)
- * @return the decrypted data and the data's length
+ * @param directIn the address of the to-be-decrypted data
+ * @param in buffer containing the to-be-decrypted data
+ * @param inOfs buffer offset of the to-be-decrypted data
+ * @param inLen length of the to-be-decrypted data
+ * (PKCS#11 param: CK_BYTE_PTR pDecryptedData,
+ * CK_ULONG ulDecryptedDataLen)
+ * @param directOut the address for the decrypted data
+ * @param out buffer for the decrypted data
+ * @param outOfs buffer offset for the decrypted data
+ * @param outLen buffer size for the decrypted data
+ * @return the length of decrypted data
* (PKCS#11 param: CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
* @exception PKCS11Exception If function returns other value than CKR_OK.
- * @preconditions (pEncryptedPart <> null)
- * @postconditions (result <> null)
+ * @preconditions
+ * @postconditions
*/
- public native int C_Decrypt(long hSession, byte[] in, int inOfs, int inLen,
- byte[] out, int outOfs, int outLen) throws PKCS11Exception;
+ public native int C_Decrypt(long hSession, long directIn, byte[] in,
+ int inOfs, int inLen, long directOut, byte[] out, int outOfs,
+ int outLen) throws PKCS11Exception;
/**
@@ -826,14 +858,20 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
- * @param pEncryptedPart the encrypted data part to get decrypted and the
- * encrypted data part's length
- * (PKCS#11 param: CK_BYTE_PTR pEncryptedPart,
- * CK_ULONG ulEncryptedPartLen)
- * @return the decrypted data part and the data part's length
+ * @param directIn the address of the to-be-decrypted data
+ * @param in buffer containing the to-be-decrypted data
+ * @param inOfs buffer offset of the to-be-decrypted data
+ * @param inLen length of the to-be-decrypted data
+ * (PKCS#11 param: CK_BYTE_PTR pDecryptedPart,
+ * CK_ULONG ulDecryptedPartLen)
+ * @param directOut the address for the decrypted data
+ * @param out buffer for the decrypted data
+ * @param outOfs buffer offset for the decrypted data
+ * @param outLen buffer size for the decrypted data
+ * @return the length of decrypted data for this update
* (PKCS#11 param: CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen)
* @exception PKCS11Exception If function returns other value than CKR_OK.
- * @preconditions (pEncryptedPart <> null)
+ * @preconditions
* @postconditions
*/
public native int C_DecryptUpdate(long hSession, long directIn, byte[] in,
@@ -848,12 +886,16 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
- * @return the last decrypted data part and the last data part's length
+ * @param directOut the address for the decrypted data
+ * @param out buffer for the decrypted data
+ * @param outOfs buffer offset for the decrypted data
+ * @param outLen buffer size for the decrypted data
+ * @return the length of this last part of decrypted data
* (PKCS#11 param: CK_BYTE_PTR pLastPart,
* CK_ULONG_PTR pulLastPartLen)
* @exception PKCS11Exception If function returns other value than CKR_OK.
* @preconditions
- * @postconditions (result <> null)
+ * @postconditions
*/
public native int C_DecryptFinal(long hSession, long directOut, byte[] out,
int outOfs, int outLen) throws PKCS11Exception;
@@ -1027,6 +1069,7 @@ public class PKCS11 {
*
* @param hSession the session's handle
* (PKCS#11 param: CK_SESSION_HANDLE hSession)
+ * @param expectedLen expected signature length, can be 0 if unknown
* @return the signature and the signature's length
* (PKCS#11 param: CK_BYTE_PTR pSignature,
* CK_ULONG_PTR pulSignatureLen)
@@ -1285,7 +1328,6 @@ public class PKCS11 {
// byte[] pEncryptedPart) throws PKCS11Exception;
-
/* *****************************************************************************
* Key management
******************************************************************************/
@@ -1692,10 +1734,11 @@ static class SynchronizedPKCS11 extends PKCS11 {
super.C_EncryptInit(hSession, pMechanism, hKey);
}
- public synchronized int C_Encrypt(long hSession, byte[] in, int inOfs,
- int inLen, byte[] out, int outOfs, int outLen)
+ public synchronized int C_Encrypt(long hSession, long directIn, byte[] in,
+ int inOfs, int inLen, long directOut, byte[] out, int outOfs, int outLen)
throws PKCS11Exception {
- return super.C_Encrypt(hSession, in, inOfs, inLen, out, outOfs, outLen);
+ return super.C_Encrypt(hSession, directIn, in, inOfs, inLen,
+ directOut, out, outOfs, outLen);
}
public synchronized int C_EncryptUpdate(long hSession, long directIn,
@@ -1715,10 +1758,11 @@ static class SynchronizedPKCS11 extends PKCS11 {
super.C_DecryptInit(hSession, pMechanism, hKey);
}
- public synchronized int C_Decrypt(long hSession, byte[] in, int inOfs,
- int inLen, byte[] out, int outOfs, int outLen)
- throws PKCS11Exception {
- return super.C_Decrypt(hSession, in, inOfs, inLen, out, outOfs, outLen);
+ public synchronized int C_Decrypt(long hSession, long directIn,
+ byte[] in, int inOfs, int inLen, long directOut, byte[] out,
+ int outOfs, int outLen) throws PKCS11Exception {
+ return super.C_Decrypt(hSession, directIn, in, inOfs, inLen,
+ directOut, out, outOfs, outLen);
}
public synchronized int C_DecryptUpdate(long hSession, long directIn,
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java
index 4d44317a454..f36b0534083 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Constants.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
@@ -144,98 +144,46 @@ public interface PKCS11Constants {
/* normal user's PIN is set */
public static final long CKF_USER_PIN_INITIALIZED = 0x00000008L;
- /* CKF_RESTORE_KEY_NOT_NEEDED is new for v2.0. If it is set,
- * that means that *every* time the state of cryptographic
- * operations of a session is successfully saved, all keys
- * needed to continue those operations are stored in the state */
public static final long CKF_RESTORE_KEY_NOT_NEEDED = 0x00000020L;
- /* CKF_CLOCK_ON_TOKEN is new for v2.0. If it is set, that means
- * that the token has some sort of clock. The time on that
- * clock is returned in the token info structure */
public static final long CKF_CLOCK_ON_TOKEN = 0x00000040L;
- /* CKF_PROTECTED_AUTHENTICATION_PATH is new for v2.0. If it is
- * set, that means that there is some way for the user to login
- * without sending a PIN through the Cryptoki library itself */
public static final long CKF_PROTECTED_AUTHENTICATION_PATH = 0x00000100L;
- /* CKF_DUAL_CRYPTO_OPERATIONS is new for v2.0. If it is true,
- * that means that a single session with the token can perform
- * dual simultaneous cryptographic operations (digest and
- * encrypt; decrypt and digest; sign and encrypt; and decrypt
- * and sign) */
public static final long CKF_DUAL_CRYPTO_OPERATIONS = 0x00000200L;
- /* CKF_TOKEN_INITIALIZED if new for v2.10. If it is true, the
- * token has been initialized using C_InitializeToken or an
- * equivalent mechanism outside the scope of PKCS #11.
- * Calling C_InitializeToken when this flag is set will cause
- * the token to be reinitialized. */
public static final long CKF_TOKEN_INITIALIZED = 0x00000400L;
- /* CKF_SECONDARY_AUTHENTICATION if new for v2.10. If it is
- * true, the token supports secondary authentication for
- * private key objects. */
public static final long CKF_SECONDARY_AUTHENTICATION = 0x00000800L;
- /* CKF_USER_PIN_COUNT_LOW if new for v2.10. If it is true, an
- * incorrect user login PIN has been entered at least once
- * since the last successful authentication. */
public static final long CKF_USER_PIN_COUNT_LOW = 0x00010000L;
- /* CKF_USER_PIN_FINAL_TRY if new for v2.10. If it is true,
- * supplying an incorrect user PIN will it to become locked. */
public static final long CKF_USER_PIN_FINAL_TRY = 0x00020000L;
- /* CKF_USER_PIN_LOCKED if new for v2.10. If it is true, the
- * user PIN has been locked. User login to the token is not
- * possible. */
public static final long CKF_USER_PIN_LOCKED = 0x00040000L;
- /* CKF_USER_PIN_TO_BE_CHANGED if new for v2.10. If it is true,
- * the user PIN value is the default value set by token
- * initialization or manufacturing. */
public static final long CKF_USER_PIN_TO_BE_CHANGED = 0x00080000L;
- /* CKF_SO_PIN_COUNT_LOW if new for v2.10. If it is true, an
- * incorrect SO login PIN has been entered at least once since
- * the last successful authentication. */
public static final long CKF_SO_PIN_COUNT_LOW = 0x00100000L;
- /* CKF_SO_PIN_FINAL_TRY if new for v2.10. If it is true,
- * supplying an incorrect SO PIN will it to become locked. */
public static final long CKF_SO_PIN_FINAL_TRY = 0x00200000L;
- /* CKF_SO_PIN_LOCKED if new for v2.10. If it is true, the SO
- * PIN has been locked. SO login to the token is not possible.
- */
public static final long CKF_SO_PIN_LOCKED = 0x00400000L;
- /* CKF_SO_PIN_TO_BE_CHANGED if new for v2.10. If it is true,
- * the SO PIN value is the default value set by token
- * initialization or manufacturing. */
public static final long CKF_SO_PIN_TO_BE_CHANGED = 0x00800000L;
-
- /* CK_USER_TYPE enumerates the types of Cryptoki users */
- /* CK_USER_TYPE has been changed from an enum to a CK_ULONG for
- * v2.0 */
/* Security Officer */
public static final long CKU_SO = 0L;
/* Normal user */
public static final long CKU_USER = 1L;
/* CK_STATE enumerates the session states */
- /* CK_STATE has been changed from an enum to a CK_ULONG for
- * v2.0 */
public static final long CKS_RO_PUBLIC_SESSION = 0L;
public static final long CKS_RO_USER_FUNCTIONS = 1L;
public static final long CKS_RW_PUBLIC_SESSION = 2L;
public static final long CKS_RW_USER_FUNCTIONS = 3L;
public static final long CKS_RW_SO_FUNCTIONS = 4L;
-
/* The flags are defined in the following table:
* Bit Flag Mask Meaning
*/
@@ -246,8 +194,6 @@ public interface PKCS11Constants {
/* The following classes of objects are defined: */
- /* CKO_HW_FEATURE is new for v2.10 */
- /* CKO_DOMAIN_PARAMETERS is new for v2.11 */
public static final long CKO_DATA = 0x00000000L;
public static final long CKO_CERTIFICATE = 0x00000001L;
public static final long CKO_PUBLIC_KEY = 0x00000002L;
@@ -267,62 +213,73 @@ public interface PKCS11Constants {
public static final long CKH_VENDOR_DEFINED = 0x80000000L;
/* the following key types are defined: */
- public static final long CKK_RSA = 0x00000000L;
- public static final long CKK_DSA = 0x00000001L;
- public static final long CKK_DH = 0x00000002L;
+ public static final long CKK_RSA = 0x00000000L;
+ public static final long CKK_DSA = 0x00000001L;
+ public static final long CKK_DH = 0x00000002L;
+ public static final long CKK_ECDSA /*deprecated*/ = 0x00000003L;
+ public static final long CKK_EC = 0x00000003L;
+ public static final long CKK_X9_42_DH = 0x00000004L;
+ public static final long CKK_KEA = 0x00000005L;
+ public static final long CKK_GENERIC_SECRET = 0x00000010L;
+ public static final long CKK_RC2 = 0x00000011L;
+ public static final long CKK_RC4 = 0x00000012L;
+ public static final long CKK_DES = 0x00000013L;
+ public static final long CKK_DES2 = 0x00000014L;
+ public static final long CKK_DES3 = 0x00000015L;
- /* CKK_ECDSA and CKK_KEA are new for v2.0 */
- /* CKK_ECDSA is deprecated in v2.11, CKK_EC is preferred. */
- public static final long CKK_ECDSA = 0x00000003L;
- public static final long CKK_EC = 0x00000003L;
- public static final long CKK_X9_42_DH = 0x00000004L;
- public static final long CKK_KEA = 0x00000005L;
+ public static final long CKK_CAST = 0x00000016L;
+ public static final long CKK_CAST3 = 0x00000017L;
+ public static final long CKK_CAST5 /*deprecated*/ = 0x00000018L;
+ public static final long CKK_CAST128 = 0x00000018L;
+ public static final long CKK_RC5 = 0x00000019L;
+ public static final long CKK_IDEA = 0x0000001AL;
+ public static final long CKK_SKIPJACK = 0x0000001BL;
+ public static final long CKK_BATON = 0x0000001CL;
+ public static final long CKK_JUNIPER = 0x0000001DL;
+ public static final long CKK_CDMF = 0x0000001EL;
+ public static final long CKK_AES = 0x0000001FL;
+ public static final long CKK_BLOWFISH = 0x00000020L;
+ public static final long CKK_TWOFISH = 0x00000021L;
+ public static final long CKK_SECURID = 0x00000022L;
+ public static final long CKK_HOTP = 0x00000023L;
+ public static final long CKK_ACTI = 0x00000024L;
+ public static final long CKK_CAMELLIA = 0x00000025L;
+ public static final long CKK_ARIA = 0x00000026L;
- public static final long CKK_GENERIC_SECRET = 0x00000010L;
- public static final long CKK_RC2 = 0x00000011L;
- public static final long CKK_RC4 = 0x00000012L;
- public static final long CKK_DES = 0x00000013L;
- public static final long CKK_DES2 = 0x00000014L;
- public static final long CKK_DES3 = 0x00000015L;
+ public static final long CKK_MD5_HMAC = 0x00000027L;
+ public static final long CKK_SHA_1_HMAC = 0x00000028L;
+ public static final long CKK_RIPEMD128_HMAC = 0x00000029L;
+ public static final long CKK_RIPEMD160_HMAC = 0x0000002AL;
+ public static final long CKK_SHA256_HMAC = 0x0000002BL;
+ public static final long CKK_SHA384_HMAC = 0x0000002CL;
+ public static final long CKK_SHA512_HMAC = 0x0000002DL;
+ public static final long CKK_SHA224_HMAC = 0x0000002EL;
- /* all these key types are new for v2.0 */
- public static final long CKK_CAST = 0x00000016L;
- public static final long CKK_CAST3 = 0x00000017L;
- /* CKK_CAST5 is deprecated in v2.11, CKK_CAST128 is preferred. */
- public static final long CKK_CAST5 = 0x00000018L;
- /* CAST128=CAST5 */
- public static final long CKK_CAST128 = 0x00000018L;
- public static final long CKK_RC5 = 0x00000019L;
- public static final long CKK_IDEA = 0x0000001AL;
- public static final long CKK_SKIPJACK = 0x0000001BL;
- public static final long CKK_BATON = 0x0000001CL;
- public static final long CKK_JUNIPER = 0x0000001DL;
- public static final long CKK_CDMF = 0x0000001EL;
- public static final long CKK_AES = 0x0000001FL;
- // v2.20
- public static final long CKK_BLOWFISH = 0x00000020L;
-
- public static final long CKK_VENDOR_DEFINED = 0x80000000L;
-
- // new for v2.20 amendment 3
- //public static final long CKK_CAMELLIA = 0x00000025L;
- //public static final long CKK_ARIA = 0x00000026L;
+ public static final long CKK_SEED = 0x0000002FL;
+ public static final long CKK_GOSTR3410 = 0x00000030L;
+ public static final long CKK_GOSTR3411 = 0x00000031L;
+ public static final long CKK_GOST28147 = 0x00000032L;
+;
+ public static final long CKK_VENDOR_DEFINED = 0x80000000L;
// pseudo key type ANY (for template manager)
- public static final long PCKK_ANY = 0x7FFFFF22L;
+ public static final long PCKK_ANY = 0x7FFFFF22L;
- public static final long PCKK_HMAC = 0x7FFFFF23L;
- public static final long PCKK_SSLMAC = 0x7FFFFF24L;
- public static final long PCKK_TLSPREMASTER = 0x7FFFFF25L;
- public static final long PCKK_TLSRSAPREMASTER = 0x7FFFFF26L;
- public static final long PCKK_TLSMASTER = 0x7FFFFF27L;
+ public static final long PCKK_HMAC = 0x7FFFFF23L;
+ public static final long PCKK_SSLMAC = 0x7FFFFF24L;
+ public static final long PCKK_TLSPREMASTER = 0x7FFFFF25L;
+ public static final long PCKK_TLSRSAPREMASTER = 0x7FFFFF26L;
+ public static final long PCKK_TLSMASTER = 0x7FFFFF27L;
/* The following certificate types are defined: */
- /* CKC_X_509_ATTR_CERT is new for v2.10 */
- public static final long CKC_X_509 = 0x00000000L;
- public static final long CKC_X_509_ATTR_CERT = 0x00000001L;
- public static final long CKC_VENDOR_DEFINED = 0x80000000L;
+ public static final long CKC_X_509 = 0x00000000L;
+ public static final long CKC_X_509_ATTR_CERT = 0x00000001L;
+ public static final long CKC_VENDOR_DEFINED = 0x80000000L;
+ /* The CKF_ARRAY_ATTRIBUTE flag identifies an attribute which
+ * consists of an array of values.
+ */
+ public static final long CKF_ARRAY_ATTRIBUTE = 0x40000000L;
/* The following attribute types are defined: */
public static final long CKA_CLASS = 0x00000000L;
@@ -331,22 +288,26 @@ public interface PKCS11Constants {
public static final long CKA_LABEL = 0x00000003L;
public static final long CKA_APPLICATION = 0x00000010L;
public static final long CKA_VALUE = 0x00000011L;
-
- /* CKA_OBJECT_ID is new for v2.10 */
public static final long CKA_OBJECT_ID = 0x00000012L;
-
public static final long CKA_CERTIFICATE_TYPE = 0x00000080L;
public static final long CKA_ISSUER = 0x00000081L;
public static final long CKA_SERIAL_NUMBER = 0x00000082L;
-
- /* CKA_AC_ISSUER, CKA_OWNER, and CKA_ATTR_TYPES are new L;
- * for v2.10 */
public static final long CKA_AC_ISSUER = 0x00000083L;
public static final long CKA_OWNER = 0x00000084L;
public static final long CKA_ATTR_TYPES = 0x00000085L;
-
- /* CKA_TRUSTED is new for v2.11 */
public static final long CKA_TRUSTED = 0x00000086L;
+ public static final long CKA_CERTIFICATE_CATEGORY
+ = 0x00000087L;
+ public static final long CKA_JAVA_MIDP_SECURITY_DOMAIN
+ = 0x00000088L;
+ public static final long CKA_URL = 0x00000089L;
+ public static final long CKA_HASH_OF_SUBJECT_PUBLIC_KEY
+ = 0x0000008AL;
+ public static final long CKA_HASH_OF_ISSUER_PUBLIC_KEY
+ = 0x0000008BL;
+ public static final long CKA_NAME_HASH_ALGORITHM
+ = 0x0000008CL;
+ public static final long CKA_CHECK_VALUE = 0x00000090L;
public static final long CKA_KEY_TYPE = 0x00000100L;
public static final long CKA_SUBJECT = 0x00000101L;
@@ -372,45 +333,79 @@ public interface PKCS11Constants {
public static final long CKA_EXPONENT_1 = 0x00000126L;
public static final long CKA_EXPONENT_2 = 0x00000127L;
public static final long CKA_COEFFICIENT = 0x00000128L;
+ public static final long CKA_PUBLIC_KEY_INFO = 0x00000129L;
public static final long CKA_PRIME = 0x00000130L;
public static final long CKA_SUBPRIME = 0x00000131L;
public static final long CKA_BASE = 0x00000132L;
- /* CKA_PRIME_BITS and CKA_SUB_PRIME_BITS are new for v2.11 */
public static final long CKA_PRIME_BITS = 0x00000133L;
public static final long CKA_SUB_PRIME_BITS = 0x00000134L;
public static final long CKA_VALUE_BITS = 0x00000160L;
public static final long CKA_VALUE_LEN = 0x00000161L;
- /* CKA_EXTRACTABLE, CKA_LOCAL, CKA_NEVER_EXTRACTABLE,
- * CKA_ALWAYS_SENSITIVE, CKA_MODIFIABLE, CKA_ECDSA_PARAMS,
- * and CKA_EC_POINT are new for v2.0 */
public static final long CKA_EXTRACTABLE = 0x00000162L;
public static final long CKA_LOCAL = 0x00000163L;
public static final long CKA_NEVER_EXTRACTABLE = 0x00000164L;
public static final long CKA_ALWAYS_SENSITIVE = 0x00000165L;
- /* CKA_KEY_GEN_MECHANISM is new for v2.11 */
public static final long CKA_KEY_GEN_MECHANISM = 0x00000166L;
public static final long CKA_MODIFIABLE = 0x00000170L;
+ public static final long CKA_COPYABLE = 0x00000171L;
+ public static final long CKA_DESTROYABLE = 0x00000172L;
- /* CKA_ECDSA_PARAMS is deprecated in v2.11,
- * CKA_EC_PARAMS is preferred. */
- public static final long CKA_ECDSA_PARAMS = 0x00000180L;
- public static final long CKA_EC_PARAMS = 0x00000180L;
- public static final long CKA_EC_POINT = 0x00000181L;
+ public static final long CKA_ECDSA_PARAMS /*deprecated*/ = 0x00000180L;
+ public static final long CKA_EC_PARAMS = 0x00000180L;
+ public static final long CKA_EC_POINT = 0x00000181L;
+
+ public static final long CKA_SECONDARY_AUTH /*deprecated*/= 0x00000200L;
+ public static final long CKA_AUTH_PIN_FLAGS /*deprecated*/= 0x00000201L;
+ public static final long CKA_ALWAYS_AUTHENTICATE = 0x00000202L;
+ public static final long CKA_WRAP_WITH_TRUSTED = 0x00000210L;
+ public static final long CKA_WRAP_TEMPLATE = (CKF_ARRAY_ATTRIBUTE|0x00000211L);
+ public static final long CKA_UNWRAP_TEMPLATE = (CKF_ARRAY_ATTRIBUTE|0x00000212L);
+ public static final long CKA_DERIVE_TEMPLATE = (CKF_ARRAY_ATTRIBUTE|0x00000213L);
+
+ public static final long CKA_OTP_FORMAT = 0x00000220L;
+ public static final long CKA_OTP_LENGTH = 0x00000221L;
+ public static final long CKA_OTP_TIME_INTERVAL = 0x00000222L;
+ public static final long CKA_OTP_USER_FRIENDLY_MODE = 0x00000223L;
+ public static final long CKA_OTP_CHALLENGE_REQUIREMENT = 0x00000224L;
+ public static final long CKA_OTP_TIME_REQUIREMENT = 0x00000225L;
+ public static final long CKA_OTP_COUNTER_REQUIREMENT = 0x00000226L;
+ public static final long CKA_OTP_PIN_REQUIREMENT = 0x00000227L;
+ public static final long CKA_OTP_COUNTER = 0x0000022EL;
+ public static final long CKA_OTP_TIME = 0x0000022FL;
+ public static final long CKA_OTP_USER_IDENTIFIER = 0x0000022AL;
+ public static final long CKA_OTP_SERVICE_IDENTIFIER = 0x0000022BL;
+ public static final long CKA_OTP_SERVICE_LOGO = 0x0000022CL;
+ public static final long CKA_OTP_SERVICE_LOGO_TYPE = 0x0000022DL;
+
+ public static final long CKA_GOSTR3410_PARAMS = 0x00000250L;
+ public static final long CKA_GOSTR3411_PARAMS = 0x00000251L;
+ public static final long CKA_GOST28147_PARAMS = 0x00000252L;
- /* CKA_SECONDARY_AUTH, CKA_AUTH_PIN_FLAGS,
- * CKA_HW_FEATURE_TYPE, CKA_RESET_ON_INIT, and CKA_HAS_RESET
- * are new for v2.10 */
- public static final long CKA_SECONDARY_AUTH = 0x00000200L;
- public static final long CKA_AUTH_PIN_FLAGS = 0x00000201L;
public static final long CKA_HW_FEATURE_TYPE = 0x00000300L;
public static final long CKA_RESET_ON_INIT = 0x00000301L;
public static final long CKA_HAS_RESET = 0x00000302L;
+ public static final long CKA_PIXEL_X = 0x00000400L;
+ public static final long CKA_PIXEL_Y = 0x00000401L;
+ public static final long CKA_RESOLUTION = 0x00000402L;
+ public static final long CKA_CHAR_ROWS = 0x00000403L;
+ public static final long CKA_CHAR_COLUMNS = 0x00000404L;
+ public static final long CKA_COLOR = 0x00000405L;
+ public static final long CKA_BITS_PER_PIXEL = 0x00000406L;
+ public static final long CKA_CHAR_SETS = 0x00000480L;
+ public static final long CKA_ENCODING_METHODS = 0x00000481L;
+ public static final long CKA_MIME_TYPES = 0x00000482L;
+ public static final long CKA_MECHANISM_TYPE = 0x00000500L;
+ public static final long CKA_REQUIRED_CMS_ATTRIBUTES = 0x00000501L;
+ public static final long CKA_DEFAULT_CMS_ATTRIBUTES = 0x00000502L;
+ public static final long CKA_SUPPORTED_CMS_ATTRIBUTES = 0x00000503L;
+ public static final long CKA_ALLOWED_MECHANISMS = (CKF_ARRAY_ATTRIBUTE|0x00000600L);
+
public static final long CKA_VENDOR_DEFINED = 0x80000000L;
/* the following mechanism types are defined: */
@@ -419,20 +414,14 @@ public interface PKCS11Constants {
public static final long CKM_RSA_9796 = 0x00000002L;
public static final long CKM_RSA_X_509 = 0x00000003L;
- /* CKM_MD2_RSA_PKCS, CKM_MD5_RSA_PKCS, and CKM_SHA1_RSA_PKCS
- * are new for v2.0. They are mechanisms which hash and sign */
public static final long CKM_MD2_RSA_PKCS = 0x00000004L;
public static final long CKM_MD5_RSA_PKCS = 0x00000005L;
public static final long CKM_SHA1_RSA_PKCS = 0x00000006L;
- /* CKM_RIPEMD128_RSA_PKCS, CKM_RIPEMD160_RSA_PKCS, and
- * CKM_RSA_PKCS_OAEP are new for v2.10 */
public static final long CKM_RIPEMD128_RSA_PKCS = 0x00000007L;
public static final long CKM_RIPEMD160_RSA_PKCS = 0x00000008L;
public static final long CKM_RSA_PKCS_OAEP = 0x00000009L;
- /* CKM_RSA_X9_31_KEY_PAIR_GEN, CKM_RSA_X9_31, CKM_SHA1_RSA_X9_31,
- * CKM_RSA_PKCS_PSS, and CKM_SHA1_RSA_PKCS_PSS are new for v2.11 */
public static final long CKM_RSA_X9_31_KEY_PAIR_GEN = 0x0000000AL;
public static final long CKM_RSA_X9_31 = 0x0000000BL;
public static final long CKM_SHA1_RSA_X9_31 = 0x0000000CL;
@@ -442,28 +431,48 @@ public interface PKCS11Constants {
public static final long CKM_DSA_KEY_PAIR_GEN = 0x00000010L;
public static final long CKM_DSA = 0x00000011L;
public static final long CKM_DSA_SHA1 = 0x00000012L;
+ public static final long CKM_DSA_SHA224 = 0x00000013L;
+ public static final long CKM_DSA_SHA256 = 0x00000014L;
+ public static final long CKM_DSA_SHA384 = 0x00000015L;
+ public static final long CKM_DSA_SHA512 = 0x00000016L;
+
public static final long CKM_DH_PKCS_KEY_PAIR_GEN = 0x00000020L;
public static final long CKM_DH_PKCS_DERIVE = 0x00000021L;
- /* CKM_X9_42_DH_KEY_PAIR_GEN, CKM_X9_42_DH_DERIVE,
- * CKM_X9_42_DH_HYBRID_DERIVE, and CKM_X9_42_MQV_DERIVE are new for
- * v2.11 */
public static final long CKM_X9_42_DH_KEY_PAIR_GEN = 0x00000030L;
public static final long CKM_X9_42_DH_DERIVE = 0x00000031L;
public static final long CKM_X9_42_DH_HYBRID_DERIVE = 0x00000032L;
public static final long CKM_X9_42_MQV_DERIVE = 0x00000033L;
- // v2.20
public static final long CKM_SHA256_RSA_PKCS = 0x00000040L;
public static final long CKM_SHA384_RSA_PKCS = 0x00000041L;
public static final long CKM_SHA512_RSA_PKCS = 0x00000042L;
+ public static final long CKM_SHA256_RSA_PKCS_PSS = 0x00000043L;
+ public static final long CKM_SHA384_RSA_PKCS_PSS = 0x00000044L;
+ public static final long CKM_SHA512_RSA_PKCS_PSS = 0x00000045L;
+
+ public static final long CKM_SHA224_RSA_PKCS = 0x00000046L;
+ public static final long CKM_SHA224_RSA_PKCS_PSS = 0x00000047L;
+
+ public static final long CKM_SHA512_224 = 0x00000048L;
+ public static final long CKM_SHA512_224_HMAC = 0x00000049L;
+ public static final long CKM_SHA512_224_HMAC_GENERAL = 0x0000004AL;
+ public static final long CKM_SHA512_224_KEY_DERIVATION = 0x0000004BL;
+ public static final long CKM_SHA512_256 = 0x0000004CL;
+ public static final long CKM_SHA512_256_HMAC = 0x0000004DL;
+ public static final long CKM_SHA512_256_HMAC_GENERAL = 0x0000004EL;
+ public static final long CKM_SHA512_256_KEY_DERIVATION = 0x0000004FL;
+
+ public static final long CKM_SHA512_T = 0x00000050L;
+ public static final long CKM_SHA512_T_HMAC = 0x00000051L;
+ public static final long CKM_SHA512_T_HMAC_GENERAL = 0x00000052L;
+ public static final long CKM_SHA512_T_KEY_DERIVATION = 0x00000053L;
public static final long CKM_RC2_KEY_GEN = 0x00000100L;
public static final long CKM_RC2_ECB = 0x00000101L;
public static final long CKM_RC2_CBC = 0x00000102L;
public static final long CKM_RC2_MAC = 0x00000103L;
- /* CKM_RC2_MAC_GENERAL and CKM_RC2_CBC_PAD are new for v2.0 */
public static final long CKM_RC2_MAC_GENERAL = 0x00000104L;
public static final long CKM_RC2_CBC_PAD = 0x00000105L;
@@ -474,7 +483,6 @@ public interface PKCS11Constants {
public static final long CKM_DES_CBC = 0x00000122L;
public static final long CKM_DES_MAC = 0x00000123L;
- /* CKM_DES_MAC_GENERAL and CKM_DES_CBC_PAD are new for v2.0 */
public static final long CKM_DES_MAC_GENERAL = 0x00000124L;
public static final long CKM_DES_CBC_PAD = 0x00000125L;
@@ -484,11 +492,10 @@ public interface PKCS11Constants {
public static final long CKM_DES3_CBC = 0x00000133L;
public static final long CKM_DES3_MAC = 0x00000134L;
- /* CKM_DES3_MAC_GENERAL, CKM_DES3_CBC_PAD, CKM_CDMF_KEY_GEN,
- * CKM_CDMF_ECB, CKM_CDMF_CBC, CKM_CDMF_MAC,
- * CKM_CDMF_MAC_GENERAL, and CKM_CDMF_CBC_PAD are new for v2.0 */
public static final long CKM_DES3_MAC_GENERAL = 0x00000135L;
public static final long CKM_DES3_CBC_PAD = 0x00000136L;
+ public static final long CKM_DES3_CMAC_GENERAL = 0x00000137L;
+ public static final long CKM_DES3_CMAC = 0x00000138L;
public static final long CKM_CDMF_KEY_GEN = 0x00000140L;
public static final long CKM_CDMF_ECB = 0x00000141L;
public static final long CKM_CDMF_CBC = 0x00000142L;
@@ -496,27 +503,26 @@ public interface PKCS11Constants {
public static final long CKM_CDMF_MAC_GENERAL = 0x00000144L;
public static final long CKM_CDMF_CBC_PAD = 0x00000145L;
+ public static final long CKM_DES_OFB64 = 0x00000150L;
+ public static final long CKM_DES_OFB8 = 0x00000151L;
+ public static final long CKM_DES_CFB64 = 0x00000152L;
+ public static final long CKM_DES_CFB8 = 0x00000153L;
+
public static final long CKM_MD2 = 0x00000200L;
- /* CKM_MD2_HMAC and CKM_MD2_HMAC_GENERAL are new for v2.0 */
public static final long CKM_MD2_HMAC = 0x00000201L;
public static final long CKM_MD2_HMAC_GENERAL = 0x00000202L;
public static final long CKM_MD5 = 0x00000210L;
- /* CKM_MD5_HMAC and CKM_MD5_HMAC_GENERAL are new for v2.0 */
public static final long CKM_MD5_HMAC = 0x00000211L;
public static final long CKM_MD5_HMAC_GENERAL = 0x00000212L;
public static final long CKM_SHA_1 = 0x00000220L;
- /* CKM_SHA_1_HMAC and CKM_SHA_1_HMAC_GENERAL are new for v2.0 */
public static final long CKM_SHA_1_HMAC = 0x00000221L;
public static final long CKM_SHA_1_HMAC_GENERAL = 0x00000222L;
- /* CKM_RIPEMD128, CKM_RIPEMD128_HMAC,
- * CKM_RIPEMD128_HMAC_GENERAL, CKM_RIPEMD160, CKM_RIPEMD160_HMAC,
- * and CKM_RIPEMD160_HMAC_GENERAL are new for v2.10 */
public static final long CKM_RIPEMD128 = 0x00000230L;
public static final long CKM_RIPEMD128_HMAC = 0x00000231L;
public static final long CKM_RIPEMD128_HMAC_GENERAL = 0x00000232L;
@@ -524,11 +530,12 @@ public interface PKCS11Constants {
public static final long CKM_RIPEMD160_HMAC = 0x00000241L;
public static final long CKM_RIPEMD160_HMAC_GENERAL = 0x00000242L;
- // v2.20
public static final long CKM_SHA256 = 0x00000250L;
public static final long CKM_SHA256_HMAC = 0x00000251L;
public static final long CKM_SHA256_HMAC_GENERAL = 0x00000252L;
-
+ public static final long CKM_SHA224 = 0x00000255L;
+ public static final long CKM_SHA224_HMAC = 0x00000256L;
+ public static final long CKM_SHA224_HMAC_GENERAL = 0x00000257L;
public static final long CKM_SHA384 = 0x00000260L;
public static final long CKM_SHA384_HMAC = 0x00000261L;
public static final long CKM_SHA384_HMAC_GENERAL = 0x00000262L;
@@ -537,8 +544,13 @@ public interface PKCS11Constants {
public static final long CKM_SHA512_HMAC = 0x00000271L;
public static final long CKM_SHA512_HMAC_GENERAL = 0x00000272L;
- /* All of the following mechanisms are new for v2.0 */
- /* Note that CAST128 and CAST5 are the same algorithm */
+ public static final long CKM_SECURID_KEY_GEN = 0x00000280L;
+ public static final long CKM_SECURID = 0x00000282L;
+ public static final long CKM_HOTP_KEY_GEN = 0x00000290L;
+ public static final long CKM_HOTP = 0x00000291L;
+ public static final long CKM_ACTI = 0x000002A0L;
+ public static final long CKM_ACTI_KEY_GEN = 0x000002A1L;
+
public static final long CKM_CAST_KEY_GEN = 0x00000300L;
public static final long CKM_CAST_ECB = 0x00000301L;
public static final long CKM_CAST_CBC = 0x00000302L;
@@ -551,18 +563,20 @@ public interface PKCS11Constants {
public static final long CKM_CAST3_MAC = 0x00000313L;
public static final long CKM_CAST3_MAC_GENERAL = 0x00000314L;
public static final long CKM_CAST3_CBC_PAD = 0x00000315L;
- public static final long CKM_CAST5_KEY_GEN = 0x00000320L;
- public static final long CKM_CAST128_KEY_GEN = 0x00000320L;
- public static final long CKM_CAST5_ECB = 0x00000321L;
- public static final long CKM_CAST128_ECB = 0x00000321L;
- public static final long CKM_CAST5_CBC = 0x00000322L;
- public static final long CKM_CAST128_CBC = 0x00000322L;
- public static final long CKM_CAST5_MAC = 0x00000323L;
- public static final long CKM_CAST128_MAC = 0x00000323L;
- public static final long CKM_CAST5_MAC_GENERAL = 0x00000324L;
- public static final long CKM_CAST128_MAC_GENERAL = 0x00000324L;
- public static final long CKM_CAST5_CBC_PAD = 0x00000325L;
- public static final long CKM_CAST128_CBC_PAD = 0x00000325L;
+ /* Note that CAST128 and CAST5 are the same algorithm */
+ public static final long CKM_CAST5_KEY_GEN = 0x00000320L;
+ public static final long CKM_CAST128_KEY_GEN = 0x00000320L;
+ public static final long CKM_CAST5_ECB = 0x00000321L;
+ public static final long CKM_CAST128_ECB = 0x00000321L;
+ public static final long CKM_CAST5_CBC /*deprecated*/ = 0x00000322L;
+ public static final long CKM_CAST128_CBC = 0x00000322L;
+ public static final long CKM_CAST5_MAC /*deprecated*/ = 0x00000323L;
+ public static final long CKM_CAST128_MAC = 0x00000323L;
+ public static final long CKM_CAST5_MAC_GENERAL /*deprecated*/
+ = 0x00000324L;
+ public static final long CKM_CAST128_MAC_GENERAL = 0x00000324L;
+ public static final long CKM_CAST5_CBC_PAD /*deprecated*/ = 0x00000325L;
+ public static final long CKM_CAST128_CBC_PAD = 0x00000325L;
public static final long CKM_RC5_KEY_GEN = 0x00000330L;
public static final long CKM_RC5_ECB = 0x00000331L;
public static final long CKM_RC5_CBC = 0x00000332L;
@@ -585,9 +599,6 @@ public interface PKCS11Constants {
public static final long CKM_SSL3_MASTER_KEY_DERIVE = 0x00000371L;
public static final long CKM_SSL3_KEY_AND_MAC_DERIVE = 0x00000372L;
- /* CKM_SSL3_MASTER_KEY_DERIVE_DH, CKM_TLS_PRE_MASTER_KEY_GEN,
- * CKM_TLS_MASTER_KEY_DERIVE, CKM_TLS_KEY_AND_MAC_DERIVE, and
- * CKM_TLS_MASTER_KEY_DERIVE_DH are new for v2.11 */
public static final long CKM_SSL3_MASTER_KEY_DERIVE_DH = 0x00000373L;
public static final long CKM_TLS_PRE_MASTER_KEY_GEN = 0x00000374L;
public static final long CKM_TLS_MASTER_KEY_DERIVE = 0x00000375L;
@@ -601,10 +612,10 @@ public interface PKCS11Constants {
public static final long CKM_MD2_KEY_DERIVATION = 0x00000391L;
public static final long CKM_SHA1_KEY_DERIVATION = 0x00000392L;
- // v2.20
public static final long CKM_SHA256_KEY_DERIVATION = 0x00000393L;
public static final long CKM_SHA384_KEY_DERIVATION = 0x00000394L;
public static final long CKM_SHA512_KEY_DERIVATION = 0x00000395L;
+ public static final long CKM_SHA224_KEY_DERIVATION = 0x00000396L;
public static final long CKM_PBE_MD2_DES_CBC = 0x000003A0L;
public static final long CKM_PBE_MD5_DES_CBC = 0x000003A1L;
@@ -621,22 +632,65 @@ public interface PKCS11Constants {
public static final long CKM_PBE_SHA1_RC2_128_CBC = 0x000003AAL;
public static final long CKM_PBE_SHA1_RC2_40_CBC = 0x000003ABL;
- /* CKM_PKCS5_PBKD2 is new for v2.10 */
public static final long CKM_PKCS5_PBKD2 = 0x000003B0L;
public static final long CKM_PBA_SHA1_WITH_SHA1_HMAC = 0x000003C0L;
- /* CKM_TLS12_MASTER_KEY_DERIVE, CKM_TLS12_KEY_AND_MAC_DERIVE,
- * CKM_TLS12_MASTER_KEY_DERIVE_DH and CKM_TLS_MAC are new for v2.40 */
+ public static final long CKM_WTLS_PRE_MASTER_KEY_GEN = 0x000003D0L;
+ public static final long CKM_WTLS_MASTER_KEY_DERIVE = 0x000003D1L;
+ public static final long CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC = 0x000003D2L;
+ public static final long CKM_WTLS_PRF = 0x000003D3L;
+ public static final long CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE = 0x000003D4L;
+ public static final long CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE = 0x000003D5L;
+
+ public static final long CKM_TLS10_MAC_SERVER = 0x000003D6L;
+ public static final long CKM_TLS10_MAC_CLIENT = 0x000003D7L;
+ public static final long CKM_TLS12_MAC = 0x000003D8L;
+ public static final long CKM_TLS12_KDF = 0x000003D9L;
+
public static final long CKM_TLS12_MASTER_KEY_DERIVE = 0x000003E0L;
public static final long CKM_TLS12_KEY_AND_MAC_DERIVE = 0x000003E1L;
public static final long CKM_TLS12_MASTER_KEY_DERIVE_DH = 0x000003E2L;
+ public static final long CKM_TLS12_KEY_SAFE_DERIVE = 0x000003E3L;
public static final long CKM_TLS_MAC = 0x000003E4L;
+ public static final long CKM_TLS_KDF = 0x000003E5L;
public static final long CKM_KEY_WRAP_LYNKS = 0x00000400L;
public static final long CKM_KEY_WRAP_SET_OAEP = 0x00000401L;
- /* Fortezza mechanisms */
+ public static final long CKM_CMS_SIG = 0x00000500L;
+ public static final long CKM_KIP_DERIVE = 0x00000510L;
+ public static final long CKM_KIP_WRAP = 0x00000511L;
+ public static final long CKM_KIP_MAC = 0x00000512L;
+
+ public static final long CKM_CAMELLIA_KEY_GEN = 0x00000550L;
+ public static final long CKM_CAMELLIA_ECB = 0x00000551L;
+ public static final long CKM_CAMELLIA_CBC = 0x00000552L;
+ public static final long CKM_CAMELLIA_MAC = 0x00000553L;
+ public static final long CKM_CAMELLIA_MAC_GENERAL = 0x00000554L;
+ public static final long CKM_CAMELLIA_CBC_PAD = 0x00000555L;
+ public static final long CKM_CAMELLIA_ECB_ENCRYPT_DATA = 0x00000556L;
+ public static final long CKM_CAMELLIA_CBC_ENCRYPT_DATA = 0x00000557L;
+ public static final long CKM_CAMELLIA_CTR = 0x00000558L;
+
+ public static final long CKM_ARIA_KEY_GEN = 0x00000560L;
+ public static final long CKM_ARIA_ECB = 0x00000561L;
+ public static final long CKM_ARIA_CBC = 0x00000562L;
+ public static final long CKM_ARIA_MAC = 0x00000563L;
+ public static final long CKM_ARIA_MAC_GENERAL = 0x00000564L;
+ public static final long CKM_ARIA_CBC_PAD = 0x00000565L;
+ public static final long CKM_ARIA_ECB_ENCRYPT_DATA = 0x00000566L;
+ public static final long CKM_ARIA_CBC_ENCRYPT_DATA = 0x00000567L;
+
+ public static final long CKM_SEED_KEY_GEN = 0x00000650L;
+ public static final long CKM_SEED_ECB = 0x00000651L;
+ public static final long CKM_SEED_CBC = 0x00000652L;
+ public static final long CKM_SEED_MAC = 0x00000653L;
+ public static final long CKM_SEED_MAC_GENERAL = 0x00000654L;
+ public static final long CKM_SEED_CBC_PAD = 0x00000655L;
+ public static final long CKM_SEED_ECB_ENCRYPT_DATA = 0x00000656L;
+ public static final long CKM_SEED_CBC_ENCRYPT_DATA = 0x00000657L;
+
public static final long CKM_SKIPJACK_KEY_GEN = 0x00001000L;
public static final long CKM_SKIPJACK_ECB64 = 0x00001001L;
public static final long CKM_SKIPJACK_CBC64 = 0x00001002L;
@@ -650,6 +704,7 @@ public interface PKCS11Constants {
public static final long CKM_SKIPJACK_RELAYX = 0x0000100AL;
public static final long CKM_KEA_KEY_PAIR_GEN = 0x00001010L;
public static final long CKM_KEA_KEY_DERIVE = 0x00001011L;
+ public static final long CKM_KEA_DERIVE = 0x00001012L;
public static final long CKM_FORTEZZA_TIMESTAMP = 0x00001020L;
public static final long CKM_BATON_KEY_GEN = 0x00001030L;
public static final long CKM_BATON_ECB128 = 0x00001031L;
@@ -659,20 +714,24 @@ public interface PKCS11Constants {
public static final long CKM_BATON_SHUFFLE = 0x00001035L;
public static final long CKM_BATON_WRAP = 0x00001036L;
- /* CKM_ECDSA_KEY_PAIR_GEN is deprecated in v2.11,
- * CKM_EC_KEY_PAIR_GEN is preferred */
- public static final long CKM_ECDSA_KEY_PAIR_GEN = 0x00001040L;
+ public static final long CKM_ECDSA_KEY_PAIR_GEN /*deprecated*/
+ = 0x00001040L;
public static final long CKM_EC_KEY_PAIR_GEN = 0x00001040L;
public static final long CKM_ECDSA = 0x00001041L;
public static final long CKM_ECDSA_SHA1 = 0x00001042L;
+ public static final long CKM_ECDSA_SHA224 = 0x00001043L;
+ public static final long CKM_ECDSA_SHA256 = 0x00001044L;
+ public static final long CKM_ECDSA_SHA384 = 0x00001045L;
+ public static final long CKM_ECDSA_SHA512 = 0x00001046L;
- /* CKM_ECDH1_DERIVE, CKM_ECDH1_COFACTOR_DERIVE, and CKM_ECMQV_DERIVE
- * are new for v2.11 */
public static final long CKM_ECDH1_DERIVE = 0x00001050L;
public static final long CKM_ECDH1_COFACTOR_DERIVE = 0x00001051L;
public static final long CKM_ECMQV_DERIVE = 0x00001052L;
+ public static final long CKM_ECDH_AES_KEY_WRAP = 0x00001053L;
+ public static final long CKM_RSA_AES_KEY_WRAP = 0x00001054L;
+
public static final long CKM_JUNIPER_KEY_GEN = 0x00001060L;
public static final long CKM_JUNIPER_ECB128 = 0x00001061L;
public static final long CKM_JUNIPER_CBC128 = 0x00001062L;
@@ -681,70 +740,79 @@ public interface PKCS11Constants {
public static final long CKM_JUNIPER_WRAP = 0x00001065L;
public static final long CKM_FASTHASH = 0x00001070L;
- /* CKM_AES_KEY_GEN, CKM_AES_ECB, CKM_AES_CBC, CKM_AES_MAC,
- * CKM_AES_MAC_GENERAL, CKM_AES_CBC_PAD, CKM_DSA_PARAMETER_GEN,
- * CKM_DH_PKCS_PARAMETER_GEN, and CKM_X9_42_DH_PARAMETER_GEN are
- * new for v2.11 */
public static final long CKM_AES_KEY_GEN = 0x00001080L;
public static final long CKM_AES_ECB = 0x00001081L;
public static final long CKM_AES_CBC = 0x00001082L;
public static final long CKM_AES_MAC = 0x00001083L;
public static final long CKM_AES_MAC_GENERAL = 0x00001084L;
public static final long CKM_AES_CBC_PAD = 0x00001085L;
- // v2.20
+ public static final long CKM_AES_CTR = 0x00001086L;
+ public static final long CKM_AES_GCM = 0x00001087L;
+ public static final long CKM_AES_CCM = 0x00001088L;
+ public static final long CKM_AES_CTS = 0x00001089L;
+ public static final long CKM_AES_CMAC = 0x0000108AL;
+ public static final long CKM_AES_CMAC_GENERAL = 0x0000108BL;
+
+ public static final long CKM_AES_XCBC_MAC = 0x0000108CL;
+ public static final long CKM_AES_XCBC_MAC_96 = 0x0000108DL;
+ public static final long CKM_AES_GMAC = 0x0000108EL;
+
public static final long CKM_BLOWFISH_KEY_GEN = 0x00001090L;
public static final long CKM_BLOWFISH_CBC = 0x00001091L;
+ public static final long CKM_TWOFISH_KEY_GEN = 0x00001092L;
+ public static final long CKM_TWOFISH_CBC = 0x00001093L;
+ public static final long CKM_BLOWFISH_CBC_PAD = 0x00001094L;
+ public static final long CKM_TWOFISH_CBC_PAD = 0x00001095L;
+
+ public static final long CKM_DES_ECB_ENCRYPT_DATA = 0x00001100L;
+ public static final long CKM_DES_CBC_ENCRYPT_DATA = 0x00001101L;
+ public static final long CKM_DES3_ECB_ENCRYPT_DATA = 0x00001102L;
+ public static final long CKM_DES3_CBC_ENCRYPT_DATA = 0x00001103L;
+ public static final long CKM_AES_ECB_ENCRYPT_DATA = 0x00001104L;
+ public static final long CKM_AES_CBC_ENCRYPT_DATA = 0x00001105L;
+
+ public static final long CKM_GOSTR3410_KEY_PAIR_GEN = 0x00001200L;
+ public static final long CKM_GOSTR3410 = 0x00001201L;
+ public static final long CKM_GOSTR3410_WITH_GOSTR3411 = 0x00001202L;
+ public static final long CKM_GOSTR3410_KEY_WRAP = 0x00001203L;
+ public static final long CKM_GOSTR3410_DERIVE = 0x00001204L;
+ public static final long CKM_GOSTR3411 = 0x00001210L;
+ public static final long CKM_GOSTR3411_HMAC = 0x00001211L;
+ public static final long CKM_GOST28147_KEY_GEN = 0x00001220L;
+ public static final long CKM_GOST28147_ECB = 0x00001221L;
+ public static final long CKM_GOST28147 = 0x00001222L;
+ public static final long CKM_GOST28147_MAC = 0x00001223L;
+ public static final long CKM_GOST28147_KEY_WRAP = 0x00001224L;
+
public static final long CKM_DSA_PARAMETER_GEN = 0x00002000L;
public static final long CKM_DH_PKCS_PARAMETER_GEN = 0x00002001L;
public static final long CKM_X9_42_DH_PARAMETER_GEN = 0x00002002L;
+ public static final long CKM_DSA_PROBABLISTIC_PARAMETER_GEN = 0x00002003L;
+ public static final long CKM_DSA_SHAWE_TAYLOR_PARAMETER_GEN = 0x00002004L;
+
+ public static final long CKM_AES_OFB = 0x00002104L;
+ public static final long CKM_AES_CFB64 = 0x00002105L;
+ public static final long CKM_AES_CFB8 = 0x00002106L;
+ public static final long CKM_AES_CFB128 = 0x00002107L;
+ public static final long CKM_AES_CFB1 = 0x00002108L;
+ public static final long CKM_AES_KEY_WRAP = 0x00002109L;
+ public static final long CKM_AES_KEY_WRAP_PAD = 0x0000210AL;
+
+ public static final long CKM_RSA_PKCS_TPM_1_1 = 0x00004001L;
+ public static final long CKM_RSA_PKCS_OAEP_TPM_1_1 = 0x00004002L;
public static final long CKM_VENDOR_DEFINED = 0x80000000L;
- // new for v2.20 amendment 3
- public static final long CKM_SHA224 = 0x00000255L;
- public static final long CKM_SHA224_HMAC = 0x00000256L;
- public static final long CKM_SHA224_HMAC_GENERAL = 0x00000257L;
- public static final long CKM_SHA224_KEY_DERIVATION = 0x00000396L;
- public static final long CKM_SHA224_RSA_PKCS = 0x00000046L;
- public static final long CKM_SHA224_RSA_PKCS_PSS = 0x00000047L;
- public static final long CKM_AES_CTR = 0x00001086L;
- /*
- public static final long CKM_CAMELLIA_KEY_GEN = 0x00000550L;
- public static final long CKM_CAMELLIA_ECB = 0x00000551L;
- public static final long CKM_CAMELLIA_CBC = 0x00000552L;
- public static final long CKM_CAMELLIA_MAC = 0x00000553L;
- public static final long CKM_CAMELLIA_MAC_GENERAL = 0x00000554L;
- public static final long CKM_CAMELLIA_CBC_PAD = 0x00000555L;
- public static final long CKM_CAMELLIA_ECB_ENCRYPT_DATA = 0x00000556L;
- public static final long CKM_CAMELLIA_CBC_ENCRYPT_DATA = 0x00000557L;
- public static final long CKM_CAMELLIA_CTR = 0x00000558L;
- public static final long CKM_ARIA_KEY_GEN = 0x00000560L;
- public static final long CKM_ARIA_ECB = 0x00000561L;
- public static final long CKM_ARIA_CBC = 0x00000562L;
- public static final long CKM_ARIA_MAC = 0x00000563L;
- public static final long CKM_ARIA_MAC_GENERAL = 0x00000564L;
- public static final long CKM_ARIA_CBC_PAD = 0x00000565L;
- public static final long CKM_ARIA_ECB_ENCRYPT_DATA = 0x00000566L;
- public static final long CKM_ARIA_CBC_ENCRYPT_DATA = 0x00000567L;
- */
-
// NSS private
public static final long CKM_NSS_TLS_PRF_GENERAL = 0x80000373L;
- // ids for our pseudo mechanisms SecureRandom and KeyStore
+ // internal ids for our pseudo mechanisms SecureRandom and KeyStore
public static final long PCKM_SECURERANDOM = 0x7FFFFF20L;
public static final long PCKM_KEYSTORE = 0x7FFFFF21L;
- /* The flags are defined as follows:
- * Bit Flag Mask Meaning */
- /* performed by HW */
+ /* The flags specify whether or not a mechanism can be used for a
+ * particular task */
public static final long CKF_HW = 0x00000001L;
-
- /* The flags CKF_ENCRYPT, CKF_DECRYPT, CKF_DIGEST, CKF_SIGN,
- * CKG_SIGN_RECOVER, CKF_VERIFY, CKF_VERIFY_RECOVER,
- * CKF_GENERATE, CKF_GENERATE_KEY_PAIR, CKF_WRAP, CKF_UNWRAP,
- * and CKF_DERIVE are new for v2.0. They specify whether or not
- * a mechanism can be used for a particular task */
public static final long CKF_ENCRYPT = 0x00000100L;
public static final long CKF_DECRYPT = 0x00000200L;
public static final long CKF_DIGEST = 0x00000400L;
@@ -758,152 +826,141 @@ public interface PKCS11Constants {
public static final long CKF_UNWRAP = 0x00040000L;
public static final long CKF_DERIVE = 0x00080000L;
- /* CKF_EC_F_P, CKF_EC_F_2M, CKF_EC_ECPARAMETERS, CKF_EC_NAMEDCURVE,
- * CKF_EC_UNCOMPRESS, and CKF_EC_COMPRESS are new for v2.11. They
- * describe a token's EC capabilities not available in mechanism
- * information. */
- public static final long CKF_EC_F_P = 0x00100000L;
- public static final long CKF_EC_F_2M = 0x00200000L;
- public static final long CKF_EC_ECPARAMETERS = 0x00400000L;
- public static final long CKF_EC_NAMEDCURVE = 0x00800000L;
- public static final long CKF_EC_UNCOMPRESS = 0x01000000L;
- public static final long CKF_EC_COMPRESS = 0x02000000L;
+ /* Describe a token's EC capabilities not available in mechanism
+ * information.
+ */
+ public static final long CKF_EC_F_P = 0x00100000L;
+ public static final long CKF_EC_F_2M = 0x00200000L;
+ public static final long CKF_EC_ECPARAMETERS = 0x00400000L;
+ public static final long CKF_EC_NAMEDCURVE = 0x00800000L;
+ public static final long CKF_EC_UNCOMPRESS = 0x01000000L;
+ public static final long CKF_EC_COMPRESS = 0x02000000L;
- /* FALSE for 2.01 */
public static final long CKF_EXTENSION = 0x80000000L;
- /* CK_RV is a value that identifies the return value of a
- * Cryptoki function */
- /* CK_RV was changed from CK_USHORT to CK_ULONG for v2.0 */
- public static final long CKR_OK = 0x00000000L;
- public static final long CKR_CANCEL = 0x00000001L;
- public static final long CKR_HOST_MEMORY = 0x00000002L;
- public static final long CKR_SLOT_ID_INVALID = 0x00000003L;
+ /* Identifies the return value of a Cryptoki function */
+ public static final long CKR_OK = 0x00000000L;
+ public static final long CKR_CANCEL = 0x00000001L;
+ public static final long CKR_HOST_MEMORY = 0x00000002L;
+ public static final long CKR_SLOT_ID_INVALID = 0x00000003L;
- /* CKR_FLAGS_INVALID was removed for v2.0 */
+ public static final long CKR_GENERAL_ERROR = 0x00000005L;
+ public static final long CKR_FUNCTION_FAILED = 0x00000006L;
- /* CKR_GENERAL_ERROR and CKR_FUNCTION_FAILED are new for v2.0 */
- public static final long CKR_GENERAL_ERROR = 0x00000005L;
- public static final long CKR_FUNCTION_FAILED = 0x00000006L;
+ public static final long CKR_ARGUMENTS_BAD = 0x00000007L;
+ public static final long CKR_NO_EVENT = 0x00000008L;
+ public static final long CKR_NEED_TO_CREATE_THREADS
+ = 0x00000009L;
+ public static final long CKR_CANT_LOCK = 0x0000000AL;
- /* CKR_ARGUMENTS_BAD, CKR_NO_EVENT, CKR_NEED_TO_CREATE_THREADS,
- * and CKR_CANT_LOCK are new for v2.01 */
- public static final long CKR_ARGUMENTS_BAD = 0x00000007L;
- public static final long CKR_NO_EVENT = 0x00000008L;
- public static final long CKR_NEED_TO_CREATE_THREADS = 0x00000009L;
- public static final long CKR_CANT_LOCK = 0x0000000AL;
+ public static final long CKR_ATTRIBUTE_READ_ONLY = 0x00000010L;
+ public static final long CKR_ATTRIBUTE_SENSITIVE = 0x00000011L;
+ public static final long CKR_ATTRIBUTE_TYPE_INVALID = 0x00000012L;
+ public static final long CKR_ATTRIBUTE_VALUE_INVALID = 0x00000013L;
+ public static final long CKR_ACTION_PROHIBITED = 0x0000001BL;
- public static final long CKR_ATTRIBUTE_READ_ONLY = 0x00000010L;
- public static final long CKR_ATTRIBUTE_SENSITIVE = 0x00000011L;
- public static final long CKR_ATTRIBUTE_TYPE_INVALID = 0x00000012L;
- public static final long CKR_ATTRIBUTE_VALUE_INVALID = 0x00000013L;
- public static final long CKR_DATA_INVALID = 0x00000020L;
- public static final long CKR_DATA_LEN_RANGE = 0x00000021L;
- public static final long CKR_DEVICE_ERROR = 0x00000030L;
- public static final long CKR_DEVICE_MEMORY = 0x00000031L;
- public static final long CKR_DEVICE_REMOVED = 0x00000032L;
- public static final long CKR_ENCRYPTED_DATA_INVALID = 0x00000040L;
- public static final long CKR_ENCRYPTED_DATA_LEN_RANGE = 0x00000041L;
- public static final long CKR_FUNCTION_CANCELED = 0x00000050L;
- public static final long CKR_FUNCTION_NOT_PARALLEL = 0x00000051L;
+ public static final long CKR_DATA_INVALID = 0x00000020L;
+ public static final long CKR_DATA_LEN_RANGE = 0x00000021L;
+ public static final long CKR_DEVICE_ERROR = 0x00000030L;
+ public static final long CKR_DEVICE_MEMORY = 0x00000031L;
+ public static final long CKR_DEVICE_REMOVED = 0x00000032L;
+ public static final long CKR_ENCRYPTED_DATA_INVALID = 0x00000040L;
+ public static final long CKR_ENCRYPTED_DATA_LEN_RANGE = 0x00000041L;
+ public static final long CKR_FUNCTION_CANCELED = 0x00000050L;
+ public static final long CKR_FUNCTION_NOT_PARALLEL = 0x00000051L;
- /* CKR_FUNCTION_NOT_SUPPORTED is new for v2.0 */
- public static final long CKR_FUNCTION_NOT_SUPPORTED = 0x00000054L;
+ public static final long CKR_FUNCTION_NOT_SUPPORTED = 0x00000054L;
- public static final long CKR_KEY_HANDLE_INVALID = 0x00000060L;
+ public static final long CKR_KEY_HANDLE_INVALID = 0x00000060L;
- /* CKR_KEY_SENSITIVE was removed for v2.0 */
+ public static final long CKR_KEY_SIZE_RANGE = 0x00000062L;
+ public static final long CKR_KEY_TYPE_INCONSISTENT = 0x00000063L;
- public static final long CKR_KEY_SIZE_RANGE = 0x00000062L;
- public static final long CKR_KEY_TYPE_INCONSISTENT = 0x00000063L;
+ public static final long CKR_KEY_NOT_NEEDED = 0x00000064L;
+ public static final long CKR_KEY_CHANGED = 0x00000065L;
+ public static final long CKR_KEY_NEEDED = 0x00000066L;
+ public static final long CKR_KEY_INDIGESTIBLE = 0x00000067L;
+ public static final long CKR_KEY_FUNCTION_NOT_PERMITTED = 0x00000068L;
+ public static final long CKR_KEY_NOT_WRAPPABLE = 0x00000069L;
+ public static final long CKR_KEY_UNEXTRACTABLE = 0x0000006AL;
- /* CKR_KEY_NOT_NEEDED, CKR_KEY_CHANGED, CKR_KEY_NEEDED,
- * CKR_KEY_INDIGESTIBLE, CKR_KEY_FUNCTION_NOT_PERMITTED,
- * CKR_KEY_NOT_WRAPPABLE, and CKR_KEY_UNEXTRACTABLE are new for
- * v2.0 */
- public static final long CKR_KEY_NOT_NEEDED = 0x00000064L;
- public static final long CKR_KEY_CHANGED = 0x00000065L;
- public static final long CKR_KEY_NEEDED = 0x00000066L;
- public static final long CKR_KEY_INDIGESTIBLE = 0x00000067L;
- public static final long CKR_KEY_FUNCTION_NOT_PERMITTED = 0x00000068L;
- public static final long CKR_KEY_NOT_WRAPPABLE = 0x00000069L;
- public static final long CKR_KEY_UNEXTRACTABLE = 0x0000006AL;
+ public static final long CKR_MECHANISM_INVALID = 0x00000070L;
+ public static final long CKR_MECHANISM_PARAM_INVALID = 0x00000071L;
- public static final long CKR_MECHANISM_INVALID = 0x00000070L;
- public static final long CKR_MECHANISM_PARAM_INVALID = 0x00000071L;
+ public static final long CKR_OBJECT_HANDLE_INVALID = 0x00000082L;
+ public static final long CKR_OPERATION_ACTIVE = 0x00000090L;
+ public static final long CKR_OPERATION_NOT_INITIALIZED = 0x00000091L;
+ public static final long CKR_PIN_INCORRECT = 0x000000A0L;
+ public static final long CKR_PIN_INVALID = 0x000000A1L;
+ public static final long CKR_PIN_LEN_RANGE = 0x000000A2L;
- /* CKR_OBJECT_CLASS_INCONSISTENT and CKR_OBJECT_CLASS_INVALID
- * were removed for v2.0 */
- public static final long CKR_OBJECT_HANDLE_INVALID = 0x00000082L;
- public static final long CKR_OPERATION_ACTIVE = 0x00000090L;
- public static final long CKR_OPERATION_NOT_INITIALIZED = 0x00000091L;
- public static final long CKR_PIN_INCORRECT = 0x000000A0L;
- public static final long CKR_PIN_INVALID = 0x000000A1L;
- public static final long CKR_PIN_LEN_RANGE = 0x000000A2L;
+ public static final long CKR_PIN_EXPIRED = 0x000000A3L;
+ public static final long CKR_PIN_LOCKED = 0x000000A4L;
- /* CKR_PIN_EXPIRED and CKR_PIN_LOCKED are new for v2.0 */
- public static final long CKR_PIN_EXPIRED = 0x000000A3L;
- public static final long CKR_PIN_LOCKED = 0x000000A4L;
+ public static final long CKR_SESSION_CLOSED = 0x000000B0L;
+ public static final long CKR_SESSION_COUNT = 0x000000B1L;
+ public static final long CKR_SESSION_HANDLE_INVALID = 0x000000B3L;
+ public static final long CKR_SESSION_PARALLEL_NOT_SUPPORTED = 0x000000B4L;
+ public static final long CKR_SESSION_READ_ONLY = 0x000000B5L;
+ public static final long CKR_SESSION_EXISTS = 0x000000B6L;
- public static final long CKR_SESSION_CLOSED = 0x000000B0L;
- public static final long CKR_SESSION_COUNT = 0x000000B1L;
- public static final long CKR_SESSION_HANDLE_INVALID = 0x000000B3L;
- public static final long CKR_SESSION_PARALLEL_NOT_SUPPORTED = 0x000000B4L;
- public static final long CKR_SESSION_READ_ONLY = 0x000000B5L;
- public static final long CKR_SESSION_EXISTS = 0x000000B6L;
+ public static final long CKR_SESSION_READ_ONLY_EXISTS = 0x000000B7L;
+ public static final long CKR_SESSION_READ_WRITE_SO_EXISTS = 0x000000B8L;
- /* CKR_SESSION_READ_ONLY_EXISTS and
- * CKR_SESSION_READ_WRITE_SO_EXISTS are new for v2.0 */
- public static final long CKR_SESSION_READ_ONLY_EXISTS = 0x000000B7L;
- public static final long CKR_SESSION_READ_WRITE_SO_EXISTS = 0x000000B8L;
+ public static final long CKR_SIGNATURE_INVALID = 0x000000C0L;
+ public static final long CKR_SIGNATURE_LEN_RANGE = 0x000000C1L;
+ public static final long CKR_TEMPLATE_INCOMPLETE = 0x000000D0L;
+ public static final long CKR_TEMPLATE_INCONSISTENT = 0x000000D1L;
+ public static final long CKR_TOKEN_NOT_PRESENT = 0x000000E0L;
+ public static final long CKR_TOKEN_NOT_RECOGNIZED = 0x000000E1L;
+ public static final long CKR_TOKEN_WRITE_PROTECTED = 0x000000E2L;
+ public static final long CKR_UNWRAPPING_KEY_HANDLE_INVALID = 0x000000F0L;
+ public static final long CKR_UNWRAPPING_KEY_SIZE_RANGE = 0x000000F1L;
+ public static final long CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT
+ = 0x000000F2L;
+ public static final long CKR_USER_ALREADY_LOGGED_IN = 0x00000100L;
+ public static final long CKR_USER_NOT_LOGGED_IN = 0x00000101L;
+ public static final long CKR_USER_PIN_NOT_INITIALIZED = 0x00000102L;
+ public static final long CKR_USER_TYPE_INVALID = 0x00000103L;
- public static final long CKR_SIGNATURE_INVALID = 0x000000C0L;
- public static final long CKR_SIGNATURE_LEN_RANGE = 0x000000C1L;
- public static final long CKR_TEMPLATE_INCOMPLETE = 0x000000D0L;
- public static final long CKR_TEMPLATE_INCONSISTENT = 0x000000D1L;
- public static final long CKR_TOKEN_NOT_PRESENT = 0x000000E0L;
- public static final long CKR_TOKEN_NOT_RECOGNIZED = 0x000000E1L;
- public static final long CKR_TOKEN_WRITE_PROTECTED = 0x000000E2L;
- public static final long CKR_UNWRAPPING_KEY_HANDLE_INVALID = 0x000000F0L;
- public static final long CKR_UNWRAPPING_KEY_SIZE_RANGE = 0x000000F1L;
- public static final long CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT = 0x000000F2L;
- public static final long CKR_USER_ALREADY_LOGGED_IN = 0x00000100L;
- public static final long CKR_USER_NOT_LOGGED_IN = 0x00000101L;
- public static final long CKR_USER_PIN_NOT_INITIALIZED = 0x00000102L;
- public static final long CKR_USER_TYPE_INVALID = 0x00000103L;
+ public static final long CKR_USER_ANOTHER_ALREADY_LOGGED_IN = 0x00000104L;
+ public static final long CKR_USER_TOO_MANY_TYPES = 0x00000105L;
- /* CKR_USER_ANOTHER_ALREADY_LOGGED_IN and CKR_USER_TOO_MANY_TYPES
- * are new to v2.01 */
- public static final long CKR_USER_ANOTHER_ALREADY_LOGGED_IN = 0x00000104L;
- public static final long CKR_USER_TOO_MANY_TYPES = 0x00000105L;
+ public static final long CKR_WRAPPED_KEY_INVALID = 0x00000110L;
+ public static final long CKR_WRAPPED_KEY_LEN_RANGE = 0x00000112L;
+ public static final long CKR_WRAPPING_KEY_HANDLE_INVALID = 0x00000113L;
+ public static final long CKR_WRAPPING_KEY_SIZE_RANGE = 0x00000114L;
+ public static final long CKR_WRAPPING_KEY_TYPE_INCONSISTENT = 0x00000115L;
+ public static final long CKR_RANDOM_SEED_NOT_SUPPORTED = 0x00000120L;
- public static final long CKR_WRAPPED_KEY_INVALID = 0x00000110L;
- public static final long CKR_WRAPPED_KEY_LEN_RANGE = 0x00000112L;
- public static final long CKR_WRAPPING_KEY_HANDLE_INVALID = 0x00000113L;
- public static final long CKR_WRAPPING_KEY_SIZE_RANGE = 0x00000114L;
- public static final long CKR_WRAPPING_KEY_TYPE_INCONSISTENT = 0x00000115L;
- public static final long CKR_RANDOM_SEED_NOT_SUPPORTED = 0x00000120L;
+ public static final long CKR_RANDOM_NO_RNG = 0x00000121L;
- /* These are new to v2.0 */
- public static final long CKR_RANDOM_NO_RNG = 0x00000121L;
+ public static final long CKR_DOMAIN_PARAMS_INVALID = 0x00000130L;
- /* These are new to v2.11 */
- public static final long CKR_DOMAIN_PARAMS_INVALID = 0x00000130L;
+ public static final long CKR_CURVE_NOT_SUPPORTED = 0x00000140L;
- /* These are new to v2.0 */
- public static final long CKR_BUFFER_TOO_SMALL = 0x00000150L;
- public static final long CKR_SAVED_STATE_INVALID = 0x00000160L;
- public static final long CKR_INFORMATION_SENSITIVE = 0x00000170L;
- public static final long CKR_STATE_UNSAVEABLE = 0x00000180L;
+ public static final long CKR_BUFFER_TOO_SMALL = 0x00000150L;
+ public static final long CKR_SAVED_STATE_INVALID = 0x00000160L;
+ public static final long CKR_INFORMATION_SENSITIVE = 0x00000170L;
+ public static final long CKR_STATE_UNSAVEABLE = 0x00000180L;
- /* These are new to v2.01 */
- public static final long CKR_CRYPTOKI_NOT_INITIALIZED = 0x00000190L;
- public static final long CKR_CRYPTOKI_ALREADY_INITIALIZED = 0x00000191L;
- public static final long CKR_MUTEX_BAD = 0x000001A0L;
- public static final long CKR_MUTEX_NOT_LOCKED = 0x000001A1L;
+ public static final long CKR_CRYPTOKI_NOT_INITIALIZED = 0x00000190L;
+ public static final long CKR_CRYPTOKI_ALREADY_INITIALIZED = 0x00000191L;
+ public static final long CKR_MUTEX_BAD = 0x000001A0L;
+ public static final long CKR_MUTEX_NOT_LOCKED = 0x000001A1L;
- public static final long CKR_VENDOR_DEFINED = 0x80000000L;
+ public static final long CKR_NEW_PIN_MODE = 0x000001B0L;
+ public static final long CKR_NEXT_OTP = 0x000001B1L;
+
+ public static final long CKR_EXCEEDED_MAX_ITERATIONS = 0x000001B5L;
+ public static final long CKR_FIPS_SELF_TEST_FAILED = 0x000001B6L;
+ public static final long CKR_LIBRARY_LOAD_FAILED = 0x000001B7L;
+ public static final long CKR_PIN_TOO_WEAK = 0x000001B8L;
+ public static final long CKR_PUBLIC_KEY_INVALID = 0x000001B9L;
+ public static final long CKR_FUNCTION_REJECTED = 0x00000200L;
+
+ public static final long CKR_VENDOR_DEFINED = 0x80000000L;
/* flags: bit flags that provide capabilities of the slot
@@ -916,31 +973,56 @@ public interface PKCS11Constants {
/* CKF_DONT_BLOCK is for the function C_WaitForSlotEvent */
public static final long CKF_DONT_BLOCK = 1L;
-
/* The following MGFs are defined */
- public static final long CKG_MGF1_SHA1 = 0x00000001L;
- // new for v2.20 amendment 3
+ public static final long CKG_MGF1_SHA1 = 0x00000001L;
+ public static final long CKG_MGF1_SHA256 = 0x00000002L;
+ public static final long CKG_MGF1_SHA384 = 0x00000003L;
+ public static final long CKG_MGF1_SHA512 = 0x00000004L;
public static final long CKG_MGF1_SHA224 = 0x00000005L;
/* The following encoding parameter sources are defined */
public static final long CKZ_DATA_SPECIFIED = 0x00000001L;
- /* The following PRFs are defined in PKCS #5 v2.0. */
- public static final long CKP_PKCS5_PBKD2_HMAC_SHA1 = 0x00000001L;
-
-
- /* The following salt value sources are defined in PKCS #5 v2.0. */
- public static final long CKZ_SALT_SPECIFIED = 0x00000001L;
-
/* the following EC Key Derivation Functions are defined */
- public static final long CKD_NULL = 0x00000001L;
- public static final long CKD_SHA1_KDF = 0x00000002L;
+ public static final long CKD_NULL = 0x00000001L;
+ public static final long CKD_SHA1_KDF = 0x00000002L;
/* the following X9.42 Diffie-Hellman Key Derivation Functions are defined */
- public static final long CKD_SHA1_KDF_ASN1 = 0x00000003L;
- public static final long CKD_SHA1_KDF_CONCATENATE = 0x00000004L;
+ public static final long CKD_SHA1_KDF_ASN1 = 0x00000003L;
+ public static final long CKD_SHA1_KDF_CONCATENATE = 0x00000004L;
+ public static final long CKD_SHA224_KDF = 0x00000005L;
+ public static final long CKD_SHA256_KDF = 0x00000006L;
+ public static final long CKD_SHA384_KDF = 0x00000007L;
+ public static final long CKD_SHA512_KDF = 0x00000008L;
+ public static final long CKD_CPDIVERSIFY_KDF = 0x00000009L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA1 = 0x00000001L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_GOSTR3411 = 0x00000002L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA224 = 0x00000003L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA256 = 0x00000004L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA384 = 0x00000005L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA512 = 0x00000006L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA512_224 = 0x00000007L;
+ public static final long CKP_PKCS5_PBKD2_HMAC_SHA512_256 = 0x00000008L;
+
+ public static final long CKZ_SALT_SPECIFIED = 0x00000001L;
+
+ public static final long CK_OTP_VALUE = 0x00000000L;
+ public static final long CK_OTP_PIN = 0x00000001L;
+ public static final long CK_OTP_CHALLENGE = 0x00000002L;
+ public static final long CK_OTP_TIME = 0x00000003L;
+ public static final long CK_OTP_COUNTER = 0x00000004L;
+ public static final long CK_OTP_FLAGS = 0x00000005L;
+ public static final long CK_OTP_OUTPUT_LENGTH = 0x00000006L;
+ public static final long CK_OTP_OUTPUT_FORMAT = 0x00000007L;
+
+ public static final long CKF_NEXT_OTP = 0x00000001L;
+ public static final long CKF_EXCLUDE_TIME = 0x00000002L;
+ public static final long CKF_EXCLUDE_COUNTER = 0x00000004L;
+ public static final long CKF_EXCLUDE_CHALLENGE = 0x00000008L;
+ public static final long CKF_EXCLUDE_PIN = 0x00000010L;
+ public static final long CKF_USER_FRIENDLY_OTP = 0x00000020L;
// private NSS attribute (for DSA and DH private keys)
public static final long CKA_NETSCAPE_DB = 0xD5A0DB00L;
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java
index 68163a0491f..8791b4b84d8 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java
@@ -88,6 +88,7 @@ public class PKCS11Exception extends Exception {
0x00000011,
0x00000012,
0x00000013,
+ 0x0000001B,
0x00000020,
0x00000021,
0x00000030,
@@ -158,6 +159,13 @@ public class PKCS11Exception extends Exception {
0x00000191,
0x000001A0,
0x000001A1,
+ 0x000001B0,
+ 0x000001B1,
+ 0x000001B5,
+ 0x000001B6,
+ 0x000001B7,
+ 0x000001B8,
+ 0x000001B9,
0x00000200,
0x80000000,
};
@@ -176,6 +184,7 @@ public class PKCS11Exception extends Exception {
"CKR_ATTRIBUTE_SENSITIVE",
"CKR_ATTRIBUTE_TYPE_INVALID",
"CKR_ATTRIBUTE_VALUE_INVALID",
+ "CKR_ACTION_PROHIBITED",
"CKR_DATA_INVALID",
"CKR_DATA_LEN_RANGE",
"CKR_DEVICE_ERROR",
@@ -246,6 +255,13 @@ public class PKCS11Exception extends Exception {
"CKR_CRYPTOKI_ALREADY_INITIALIZED",
"CKR_MUTEX_BAD",
"CKR_MUTEX_NOT_LOCKED",
+ "CKR_NEW_PIN_MODE",
+ "CKR_NEXT_OTP",
+ "CKR_EXCEEDED_MAX_ITERATIONS",
+ "CKR_FIPS_SELF_TEST_FAILED",
+ "CKR_LIBRARY_LOAD_FAILED",
+ "CKR_PIN_TOO_WEAK",
+ "CKR_PUBLIC_KEY_INVALID",
"CKR_FUNCTION_REJECTED",
"CKR_VENDOR_DEFINED",
};
diff --git a/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md b/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md
index 9f786fa3f50..d5e93ae437b 100644
--- a/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md
+++ b/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md
@@ -1,20 +1,32 @@
-## PKCS #11 Cryptographic Token Interface v2.20 Amendment 3 Header Files
+ASIS PKCS #11 Cryptographic Token Interface v2.40
-### PKCS #11 Cryptographic Token Interface License
-+### OASIS PKCS #11 Cryptographic Token Interface License +``` -License to copy and use this software is granted provided that it is -identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface -(Cryptoki)" in all material mentioning or referencing this software. +Copyright (c) OASIS Open 2016. All Rights Reserved. -License is also granted to make and use derivative works provided that -such works are identified as "derived from the RSA Security Inc. PKCS #11 -Cryptographic Token Interface (Cryptoki)" in all material mentioning or -referencing the derived work. +All capitalized terms in the following text have the meanings assigned to them in the OASIS +Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full Policy may be found at the +OASIS website: [http://www.oasis-open.org/policies-guidelines/ipr] -RSA Security Inc. makes no representations concerning either the -merchantability of this software or the suitability of this software for -any particular purpose. It is provided "as is" without express or implied -warranty of any kind. +This document and translations of it may be copied and furnished to others, and derivative works +that comment on or otherwise explain it or assist in its implementation may be prepared, copied, +published, and distributed, in whole or in part, without restriction of any kind, provided that +the above copyright notice and this section are included on all such copies and derivative works. +However, this document itself may not be modified in any way, including by removing the copyright +notice or references to OASIS, except as needed for the purpose of developing any document or +deliverable produced by an OASIS Technical Committee (in which case the rules applicable to +copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it +into languages other than English. -+The limited permissions granted above are perpetual and will not be revoked by OASIS or its +successors or assigns. + +This document and the information contained herein is provided on an "AS IS" basis and OASIS +DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE +USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF +MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. OASIS AND ITS MEMBERS WILL NOT BE LIABLE FOR +ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THIS DOCUMENT OR +ANY PART THEREOF. + +``` diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c index b21b6deaf29..462b9a5393a 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_convert.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -68,7 +68,8 @@ /* declare file private functions */ -void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength); +CK_VOID_PTR jMechParamToCKMechParamPtrSlow(JNIEnv *env, jobject jParam, + CK_MECHANISM_TYPE ckMech, CK_ULONG *ckpLength); /* @@ -425,8 +426,8 @@ CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute) memset(&ckAttribute, 0, sizeof(CK_ATTRIBUTE)); // TBD: what if jAttribute == NULL?! - TRACE0("\nDEBUG: jAttributeToCKAttribute"); + /* get CK_ATTRIBUTE class */ TRACE0(", getting attribute object class"); jAttributeClass = (*env)->GetObjectClass(env, jAttribute); @@ -437,7 +438,7 @@ CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute) jFieldID = (*env)->GetFieldID(env, jAttributeClass, "type", "J"); if (jFieldID == NULL) { return ckAttribute; } jType = (*env)->GetLongField(env, jAttribute, jFieldID); - TRACE1(", type=0x%X", jType); + TRACE1(", type=0x%lX", jType); /* get pValue */ TRACE0(", getting pValue field"); @@ -450,9 +451,9 @@ CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute) TRACE0(", converting pValue to primitive object"); /* convert the Java pValue object to a CK-type pValue pointer */ - jObjectToPrimitiveCKObjectPtrPtr(env, jPValue, &(ckAttribute.pValue), &(ckAttribute.ulValueLen)); + ckAttribute.pValue = jObjectToPrimitiveCKObjectPtr(env, jPValue, &(ckAttribute.ulValueLen)); - TRACE0("\nFINISHED\n"); + TRACE0("\nDEBUG: jAttributeToCKAttribute FINISHED\n"); return ckAttribute ; } @@ -515,22 +516,19 @@ void masterKeyDeriveParamToCKMasterKeyDeriveParam(JNIEnv *env, jobject jParam, * * @param env - used to call JNI functions to get the Java classes and objects * @param jParam - the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS object to convert - * @return - the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure + * @param ckParamPtr - pointer to the new CK_SSL3_MASTER_KEY_DERIVE_PARAMS structure */ -CK_SSL3_MASTER_KEY_DERIVE_PARAMS -jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, - jobject jParam) +void jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, + jobject jParam, CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr) { - CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam; jclass jSsl3MasterKeyDeriveParamsClass; - memset(&ckParam, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); - if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; } + if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; } masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam, jSsl3MasterKeyDeriveParamsClass, - &ckParam.pVersion, &ckParam.RandomInfo); - return ckParam; + &(ckParamPtr->pVersion), &(ckParamPtr->RandomInfo)); } /* @@ -539,123 +537,116 @@ jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, * * @param env - used to call JNI functions to get the Java classes and objects * @param jParam - the Java CK_TLS12_MASTER_KEY_DERIVE_PARAMS object to convert - * @return - the new CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure + * @param ckParamPtr - pointer to the new CK_TLS12_MASTER_KEY_DERIVE_PARAMS structure */ -CK_TLS12_MASTER_KEY_DERIVE_PARAMS -jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(JNIEnv *env, - jobject jParam) +void jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(JNIEnv *env, + jobject jParam, CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr) { - CK_TLS12_MASTER_KEY_DERIVE_PARAMS ckParam; jclass jTls12MasterKeyDeriveParamsClass; jfieldID fieldID; - memset(&ckParam, 0, sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); jTls12MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); - if (jTls12MasterKeyDeriveParamsClass == NULL) { return ckParam; } + if (jTls12MasterKeyDeriveParamsClass == NULL) { return; } masterKeyDeriveParamToCKMasterKeyDeriveParam(env, jParam, - jTls12MasterKeyDeriveParamsClass, &ckParam.pVersion, - &ckParam.RandomInfo); + jTls12MasterKeyDeriveParamsClass, &ckParamPtr->pVersion, + &ckParamPtr->RandomInfo); fieldID = (*env)->GetFieldID(env, jTls12MasterKeyDeriveParamsClass, "prfHashMechanism", "J"); if (fieldID != NULL) { jlong prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID); - ckParam.prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; + ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; } - return ckParam; } /* * converts the Java CK_TLS_PRF_PARAMS object to a CK_TLS_PRF_PARAMS structure */ -CK_TLS_PRF_PARAMS jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam) +void jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam, +CK_TLS_PRF_PARAMS_PTR ckParamPtr) { jclass jTlsPrfParamsClass; - CK_TLS_PRF_PARAMS ckParam; jfieldID fieldID; jobject jSeed, jLabel, jOutput; - memset(&ckParam, 0, sizeof(CK_TLS_PRF_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_TLS_PRF_PARAMS)); // TBD: what if jParam == NULL?! /* get pSeed */ jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS); - if (jTlsPrfParamsClass == NULL) { return ckParam; } + if (jTlsPrfParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSeed = (*env)->GetObjectField(env, jParam, fieldID); /* get pLabel */ fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jLabel = (*env)->GetObjectField(env, jParam, fieldID); /* get pOutput */ fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jOutput = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - jByteArrayToCKByteArray(env, jSeed, &(ckParam.pSeed), &(ckParam.ulSeedLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - jByteArrayToCKByteArray(env, jLabel, &(ckParam.pLabel), &(ckParam.ulLabelLen)); + jByteArrayToCKByteArray(env, jSeed, &(ckParamPtr->pSeed), &(ckParamPtr->ulSeedLen)); + if ((*env)->ExceptionCheck(env)) { return; } + jByteArrayToCKByteArray(env, jLabel, &(ckParamPtr->pLabel), &(ckParamPtr->ulLabelLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pSeed); - return ckParam; + free(ckParamPtr->pSeed); + return; } - ckParam.pulOutputLen = malloc(sizeof(CK_ULONG)); - if (ckParam.pulOutputLen == NULL) { - free(ckParam.pSeed); - free(ckParam.pLabel); + ckParamPtr->pulOutputLen = malloc(sizeof(CK_ULONG)); + if (ckParamPtr->pulOutputLen == NULL) { + free(ckParamPtr->pSeed); + free(ckParamPtr->pLabel); throwOutOfMemoryError(env, 0); - return ckParam; + return; } - jByteArrayToCKByteArray(env, jOutput, &(ckParam.pOutput), ckParam.pulOutputLen); + jByteArrayToCKByteArray(env, jOutput, &(ckParamPtr->pOutput), ckParamPtr->pulOutputLen); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pSeed); - free(ckParam.pLabel); - free(ckParam.pulOutputLen); - return ckParam; + free(ckParamPtr->pSeed); + free(ckParamPtr->pLabel); + free(ckParamPtr->pOutput); + return; } - - return ckParam ; } /* * converts the Java CK_TLS_MAC_PARAMS object to a CK_TLS_MAC_PARAMS structure */ -CK_TLS_MAC_PARAMS jTlsMacParamsToCKTlsMacParam(JNIEnv *env, jobject jParam) +void jTlsMacParamsToCKTlsMacParam(JNIEnv *env, jobject jParam, + CK_TLS_MAC_PARAMS_PTR ckParamPtr) { jclass jTlsMacParamsClass; - CK_TLS_MAC_PARAMS ckParam; jfieldID fieldID; jlong jPrfMechanism, jUlMacLength, jUlServerOrClient; - memset(&ckParam, 0, sizeof(CK_TLS_MAC_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_TLS_MAC_PARAMS)); jTlsMacParamsClass = (*env)->FindClass(env, CLASS_TLS_MAC_PARAMS); - if (jTlsMacParamsClass == NULL) { return ckParam; } + if (jTlsMacParamsClass == NULL) { return; } /* get prfMechanism */ fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "prfMechanism", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrfMechanism = (*env)->GetLongField(env, jParam, fieldID); /* get ulMacLength */ fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulMacLength", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jUlMacLength = (*env)->GetLongField(env, jParam, fieldID); /* get ulServerOrClient */ fieldID = (*env)->GetFieldID(env, jTlsMacParamsClass, "ulServerOrClient", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jUlServerOrClient = (*env)->GetLongField(env, jParam, fieldID); /* populate java values */ - ckParam.prfMechanism = jLongToCKULong(jPrfMechanism); - ckParam.ulMacLength = jLongToCKULong(jUlMacLength); - ckParam.ulServerOrClient = jLongToCKULong(jUlServerOrClient); - - return ckParam; + ckParamPtr->prfMechanism = jLongToCKULong(jPrfMechanism); + ckParamPtr->ulMacLength = jLongToCKULong(jUlMacLength); + ckParamPtr->ulServerOrClient = jLongToCKULong(jUlServerOrClient); } void keyMatParamToCKKeyMatParam(JNIEnv *env, jobject jParam, @@ -747,7 +738,7 @@ void keyMatParamToCKKeyMatParam(JNIEnv *env, jobject jParam, free(cKKeyMatParamRandomInfo->pClientRandom); return; } - /* allocate memory for pRetrunedKeyMaterial */ + /* allocate memory for pReturnedKeyMaterial */ *cKKeyMatParamPReturnedKeyMaterial = (CK_SSL3_KEY_MAT_OUT_PTR)malloc(sizeof(CK_SSL3_KEY_MAT_OUT)); if (*cKKeyMatParamPReturnedKeyMaterial == NULL) { @@ -789,22 +780,20 @@ void keyMatParamToCKKeyMatParam(JNIEnv *env, jobject jParam, * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_SSL3_KEY_MAT_PARAMS object to convert - * @return - the new CK_SSL3_KEY_MAT_PARAMS structure + * @param ckParamPtr - pointer to the new CK_SSL3_KEY_MAT_PARAMS structure */ -CK_SSL3_KEY_MAT_PARAMS -jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam) +void jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam, + CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr) { - CK_SSL3_KEY_MAT_PARAMS ckParam; jclass jSsl3KeyMatParamsClass; - memset(&ckParam, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_SSL3_KEY_MAT_PARAMS)); jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS); - if (jSsl3KeyMatParamsClass == NULL) { return ckParam; } + if (jSsl3KeyMatParamsClass == NULL) { return; } keyMatParamToCKKeyMatParam(env, jParam, jSsl3KeyMatParamsClass, - &ckParam.ulMacSizeInBits, &ckParam.ulKeySizeInBits, - &ckParam.ulIVSizeInBits, &ckParam.bIsExport, - &ckParam.RandomInfo, &ckParam.pReturnedKeyMaterial); - return ckParam; + &(ckParamPtr->ulMacSizeInBits), &(ckParamPtr->ulKeySizeInBits), + &(ckParamPtr->ulIVSizeInBits), &(ckParamPtr->bIsExport), + &(ckParamPtr->RandomInfo), &(ckParamPtr->pReturnedKeyMaterial)); } /* @@ -813,29 +802,27 @@ jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam) * * @param env - used to call JNI functions to get the Java classes and objects * @param jParam - the Java CK_TLS12_KEY_MAT_PARAMS object to convert - * @return - the new CK_TLS12_KEY_MAT_PARAMS structure + * @param ckParamPtr - pointer to the new CK_TLS12_KEY_MAT_PARAMS structure */ -CK_TLS12_KEY_MAT_PARAMS jTls12KeyMatParamToCKTls12KeyMatParam(JNIEnv *env, - jobject jParam) +void jTls12KeyMatParamToCKTls12KeyMatParam(JNIEnv *env, + jobject jParam, CK_TLS12_KEY_MAT_PARAMS_PTR ckParamPtr) { - CK_TLS12_KEY_MAT_PARAMS ckParam; jclass jTls12KeyMatParamsClass; jfieldID fieldID; - memset(&ckParam, 0, sizeof(CK_TLS12_KEY_MAT_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_TLS12_KEY_MAT_PARAMS)); jTls12KeyMatParamsClass = (*env)->FindClass(env, CLASS_TLS12_KEY_MAT_PARAMS); - if (jTls12KeyMatParamsClass == NULL) { return ckParam; } + if (jTls12KeyMatParamsClass == NULL) { return; } keyMatParamToCKKeyMatParam(env, jParam, jTls12KeyMatParamsClass, - &ckParam.ulMacSizeInBits, &ckParam.ulKeySizeInBits, - &ckParam.ulIVSizeInBits, &ckParam.bIsExport, - &ckParam.RandomInfo, &ckParam.pReturnedKeyMaterial); + &(ckParamPtr->ulMacSizeInBits), &(ckParamPtr->ulKeySizeInBits), + &(ckParamPtr->ulIVSizeInBits), &(ckParamPtr->bIsExport), + &(ckParamPtr->RandomInfo), &(ckParamPtr->pReturnedKeyMaterial)); fieldID = (*env)->GetFieldID(env, jTls12KeyMatParamsClass, "prfHashMechanism", "J"); if (fieldID != NULL) { jlong prfHashMechanism = (*env)->GetLongField(env, jParam, fieldID); - ckParam.prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; + ckParamPtr->prfHashMechanism = (CK_MECHANISM_TYPE)prfHashMechanism; } - return ckParam; } /* @@ -843,10 +830,10 @@ CK_TLS12_KEY_MAT_PARAMS jTls12KeyMatParamToCKTls12KeyMatParam(JNIEnv *env, * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_AES_CTR_PARAMS object to convert - * @param ckpParam - pointer to the new CK_AES_CTR_PARAMS structure + * @param ckParamPtr - pointer to the new CK_AES_CTR_PARAMS structure */ void jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam, - CK_AES_CTR_PARAMS_PTR ckpParam) { + CK_AES_CTR_PARAMS_PTR ckParamPtr) { jclass jAesCtrParamsClass; jfieldID fieldID; jlong jCounterBits; @@ -857,6 +844,9 @@ void jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam, /* get ulCounterBits */ jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS); if (jAesCtrParamsClass == NULL) { return; } + if (!(*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) { + return; + } fieldID = (*env)->GetFieldID(env, jAesCtrParamsClass, "ulCounterBits", "J"); if (fieldID == NULL) { return; } jCounterBits = (*env)->GetLongField(env, jParam, fieldID); @@ -867,40 +857,147 @@ void jAesCtrParamsToCKAesCtrParam(JNIEnv *env, jobject jParam, jCb = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckpParam->ulCounterBits = jLongToCKULong(jCounterBits); + ckParamPtr->ulCounterBits = jLongToCKULong(jCounterBits); jByteArrayToCKByteArray(env, jCb, &ckBytes, &ckTemp); if ((*env)->ExceptionCheck(env)) { return; } if (ckTemp != 16) { - TRACE1("ERROR: WRONG CTR IV LENGTH %d", ckTemp); + TRACE1("\nERROR: WRONG CTR IV LENGTH %lu", ckTemp); } else { - memcpy(ckpParam->cb, ckBytes, ckTemp); + memcpy(ckParamPtr->cb, ckBytes, ckTemp); free(ckBytes); } } /* - * converts a Java CK_MECHANISM object into a CK_MECHANISM structure + * converts the Java CK_GCM_PARAMS object to a CK_GCM_PARAMS structure + * + * @param env - used to call JNI funktions to get the Java classes and objects + * @param jParam - the Java CK_GCM_PARAMS object to convert + * @param ckpParam - pointer to the new CK_GCM_PARAMS structure + */ +void jGCMParamsToCKGCMParam(JNIEnv *env, jobject jParam, + CK_GCM_PARAMS_PTR ckpParam) { + jclass jGcmParamsClass; + jfieldID fieldID; + jobject jIv, jAad; + jlong jTagLen; + + /* get iv */ + jGcmParamsClass = (*env)->FindClass(env, CLASS_GCM_PARAMS); + if (jGcmParamsClass == NULL) { return; } + if (!(*env)->IsInstanceOf(env, jParam, jGcmParamsClass)) { + return; + } + + fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "iv", "[B"); + if (fieldID == NULL) { return; } + jIv = (*env)->GetObjectField(env, jParam, fieldID); + + /* get aad */ + fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "aad", "[B"); + if (fieldID == NULL) { return; } + jAad = (*env)->GetObjectField(env, jParam, fieldID); + + /* get tagLength */ + fieldID = (*env)->GetFieldID(env, jGcmParamsClass, "tagBits", "J"); + if (fieldID == NULL) { return; } + jTagLen = (*env)->GetLongField(env, jParam, fieldID); + + + /* populate java values */ + jByteArrayToCKByteArray(env, jIv, &(ckpParam->pIv), &(ckpParam->ulIvLen)); + if ((*env)->ExceptionCheck(env)) { return; } + + jByteArrayToCKByteArray(env, jAad, &(ckpParam->pAAD), &(ckpParam->ulAADLen)); + if ((*env)->ExceptionCheck(env)) { return; } + + ckpParam->ulTagBits = jLongToCKULong(jTagLen); +} + +/* + * converts the Java CK_CCM_PARAMS object to a CK_CCM_PARAMS structure + * + * @param env - used to call JNI functions to get the Java classes and objects + * @param jParam - the Java CK_CCM_PARAMS object to convert + * @param ckpParam - pointer to the new CK_CCM_PARAMS structure + */ +void jCCMParamsToCKCCMParam(JNIEnv *env, jobject jParam, + CK_CCM_PARAMS_PTR ckpParam) { + jclass jCcmParamsClass; + jfieldID fieldID; + jobject jNonce, jAad; + jlong jDataLen, jMacLen; + + /* get iv */ + jCcmParamsClass = (*env)->FindClass(env, CLASS_CCM_PARAMS); + if (jCcmParamsClass == NULL) { return; } + + if (!(*env)->IsInstanceOf(env, jParam, jCcmParamsClass)) { + return; + } + fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "dataLen", "J"); + if (fieldID == NULL) { return; } + jDataLen = (*env)->GetLongField(env, jParam, fieldID); + + fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "nonce", "[B"); + if (fieldID == NULL) { return; } + jNonce = (*env)->GetObjectField(env, jParam, fieldID); + + /* get aad */ + fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "aad", "[B"); + if (fieldID == NULL) { return; } + jAad = (*env)->GetObjectField(env, jParam, fieldID); + + /* get macLen */ + fieldID = (*env)->GetFieldID(env, jCcmParamsClass, "macLen", "J"); + if (fieldID == NULL) { return; } + jMacLen = (*env)->GetLongField(env, jParam, fieldID); + + /* populate java values */ + ckpParam->ulDataLen = jLongToCKULong(jDataLen); + jByteArrayToCKByteArray(env, jNonce, &(ckpParam->pNonce), + &(ckpParam->ulNonceLen)); + jByteArrayToCKByteArray(env, jAad, &(ckpParam->pAAD), + &(ckpParam->ulAADLen)); + ckpParam->ulMACLen = jLongToCKULong(jMacLen); + if ((*env)->ExceptionCheck(env)) { return; } +} + +/* + * converts a Java CK_MECHANISM object into a pointer to a CK_MECHANISM + * structure. NOTE: CALLER IS RESPONSIBLE FOR FREEING THE RETURNED POINTER * * @param env - used to call JNI funktions to get the values out of the Java object * @param jMechanism - the Java CK_MECHANISM object to convert - * @return - the new CK_MECHANISM structure + * @return - pointer to the new CK_MECHANISM structure */ -void jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR ckMechanismPtr) +CK_MECHANISM_PTR jMechanismToCKMechanismPtr(JNIEnv *env, jobject jMech) { - jlong jMechanismType = (*env)->GetLongField(env, jMechanism, mech_mechanismID); - jobject jParameter = (*env)->GetObjectField(env, jMechanism, mech_pParameterID); + CK_MECHANISM_PTR ckpMech; + jlong jMechType = (*env)->GetLongField(env, jMech, mech_mechanismID); + jobject jParam = (*env)->GetObjectField(env, jMech, mech_pParameterID); - (*ckMechanismPtr).mechanism = jLongToCKULong(jMechanismType); - - /* convert the specific Java mechanism parameter object to a pointer to a CK-type mechanism - * structure - */ - if (jParameter == NULL) { - (*ckMechanismPtr).pParameter = NULL; - (*ckMechanismPtr).ulParameterLen = 0; - } else { - jMechanismParameterToCKMechanismParameter(env, jParameter, &(*ckMechanismPtr).pParameter, &(*ckMechanismPtr).ulParameterLen); + /* allocate memory for CK_MECHANISM_PTR */ + ckpMech = (CK_MECHANISM_PTR) malloc(sizeof(CK_MECHANISM)); + if (ckpMech == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; } + TRACE1("DEBUG jMechanismToCKMechanismPtr: allocated mech 0x%lX\n", ckpMech); + + ckpMech->mechanism = jLongToCKULong(jMechType); + + /* convert the specific Java mechanism parameter object to a pointer to a + * CK-type mechanism structure + */ + if (jParam == NULL) { + ckpMech->pParameter = NULL; + ckpMech->ulParameterLen = 0; + } else { + ckpMech->pParameter = jMechParamToCKMechParamPtr(env, jParam, + ckpMech->mechanism, &(ckpMech->ulParameterLen)); + } + return ckpMech; } /* @@ -909,15 +1006,14 @@ void jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR c * jobject ckAttributeValueToJObject(JNIEnv *env, * const CK_ATTRIBUTE_PTR ckpAttribute); * - * void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, + * CK_VOID_PTR jObjectToPrimitiveCKObjectPtr(JNIEnv *env, * jobject jObject, - * CK_VOID_PTR *ckpObjectPtr, * CK_ULONG *pLength); * - * void jMechanismParameterToCKMechanismParameter(JNIEnv *env, - * jobject jParam, - * CK_VOID_PTR *ckpParamPtr, - * CK_ULONG *ckpLength); + * CK_VOID_PTR jMechParamToCKMechParamPtr(JNIEnv *env, + * jobject jParam, + * CK_MECHANISM_TYPE ckMech, + * CK_ULONG *ckpLength); * * These functions are used if a PKCS#11 mechanism or attribute structure gets * convertet to a Java attribute or mechanism object or vice versa. @@ -927,22 +1023,21 @@ void jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR c * be a CK_ULONG, CK_BYTE[], CK_CHAR[], big integer, CK_BBOOL, CK_UTF8CHAR[], * CK_DATE or CK_FLAGS that gets converted to a corresponding Java object. * - * jObjectToPrimitiveCKObjectPtrPtr is used by jAttributeToCKAttributePtr for + * jObjectToPrimitiveCKObjectPtr is used by jAttributeToCKAttributePtr for * converting the Java attribute value to a PKCS#11 attribute value pointer. * For now only primitive datatypes and arrays of primitive datatypes can get * converted. Otherwise this function throws a PKCS#11Exception with the * errorcode CKR_VENDOR_DEFINED. * - * jMechanismParameterToCKMechanismParameter converts a Java mechanism parameter - * to a PKCS#11 mechanism parameter. First this function determines what mechanism - * parameter the Java object is, then it allocates the memory for the new PKCS#11 - * structure and calls the corresponding function to convert the Java object to - * a PKCS#11 mechanism parameter structure. + * jMechParamToCKMechParamPtr converts a Java mechanism parameter to a PKCS#11 + * mechanism parameter. Based on the specified PKCS#11 mechanism type, this + * function will allocate memory for a PKCS#11 parameter structure and + * populate its field using the Java object. */ /* - * converts the pValue of a CK_ATTRIBUTE structure into a Java Object by checking the type - * of the attribute. + * converts the pValue of a CK_ATTRIBUTE structure into a Java Object by + * checking the type of the attribute. * * @param env - used to call JNI funktions to create the new Java object * @param ckpAttribute - the pointer to the CK_ATTRIBUTE structure that contains the type @@ -1096,474 +1191,283 @@ jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribu * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java mechanism parameter object to convert - * @param ckpParamPtr - the reference of the new pointer to the new CK mechanism parameter - * structure + * @param ckMech - the PKCS#11 mechanism type * @param ckpLength - the reference of the length in bytes of the new CK mechanism parameter * structure + * @return pointer to the new CK mechanism parameter structure */ -void jMechanismParameterToCKMechanismParameter(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength) +CK_VOID_PTR jMechParamToCKMechParamPtr(JNIEnv *env, jobject jParam, + CK_MECHANISM_TYPE ckMech, CK_ULONG *ckpLength) { + CK_VOID_PTR ckpParamPtr; if (jParam == NULL) { - *ckpParamPtr = NULL; + ckpParamPtr = NULL; *ckpLength = 0; } else if ((*env)->IsInstanceOf(env, jParam, jByteArrayClass)) { - jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *)ckpParamPtr, ckpLength); + jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *) &ckpParamPtr, ckpLength); } else if ((*env)->IsInstanceOf(env, jParam, jLongClass)) { - *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam); + ckpParamPtr = jLongObjectToCKULongPtr(env, jParam); *ckpLength = sizeof(CK_ULONG); } else { - TRACE0("\nSLOW PATH jMechanismParameterToCKMechanismParameter\n"); - jMechanismParameterToCKMechanismParameterSlow(env, jParam, ckpParamPtr, ckpLength); + ckpParamPtr = jMechParamToCKMechParamPtrSlow(env, jParam, ckMech, ckpLength); } + return ckpParamPtr; } -void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength) +CK_VOID_PTR jMechParamToCKMechParamPtrSlow(JNIEnv *env, jobject jParam, + CK_MECHANISM_TYPE ckMech, CK_ULONG *ckpLength) { - /* get all Java mechanism parameter classes */ - jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass; - jclass jTls12MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass; - jclass jTls12KeyMatParamsClass; - jclass jTlsPrfParamsClass, jTlsMacParamsClass, jAesCtrParamsClass; - jclass jRsaPkcsOaepParamsClass; - jclass jPbeParamsClass, jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass; - jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass; - jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass; - TRACE0("\nDEBUG: jMechanismParameterToCKMechanismParameter"); + CK_VOID_PTR ckpParamPtr = NULL; - /* most common cases, i.e. NULL/byte[]/long, are already handled by - * jMechanismParameterToCKMechanismParameter before calling this method. + /* + * Most common cases, i.e. NULL/byte[]/long, are already handled by + * jMechParamToCKMechParam before calling this method. */ - jVersionClass = (*env)->FindClass(env, CLASS_VERSION); - if (jVersionClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) { - /* - * CK_VERSION used by CKM_SSL3_PRE_MASTER_KEY_GEN - */ - CK_VERSION_PTR ckpParam; + TRACE1("\nDEBUG: jMechParamToCKMechParamPtrSlow, mech=0x%lX", ckMech); - /* convert jParameter to CKParameter */ - ckpParam = jVersionToCKVersionPtr(env, jParam); + switch (ckMech) { + case CKM_SSL3_PRE_MASTER_KEY_GEN: + case CKM_TLS_PRE_MASTER_KEY_GEN: + *ckpLength = sizeof(CK_VERSION); + ckpParamPtr = jVersionToCKVersionPtr(env, jParam); + break; + case CKM_SSL3_MASTER_KEY_DERIVE: + case CKM_TLS_MASTER_KEY_DERIVE: + case CKM_SSL3_MASTER_KEY_DERIVE_DH: + case CKM_TLS_MASTER_KEY_DERIVE_DH: + ckpParamPtr = + malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS); - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_VERSION); - *ckpParamPtr = ckpParam; - return; + jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam, + (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) ckpParamPtr); + break; + case CKM_SSL3_KEY_AND_MAC_DERIVE: + case CKM_TLS_KEY_AND_MAC_DERIVE: + ckpParamPtr = + malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS); + + jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam, + (CK_SSL3_KEY_MAT_PARAMS_PTR) ckpParamPtr); + break; + case CKM_TLS12_KEY_AND_MAC_DERIVE: + ckpParamPtr = + malloc(sizeof(CK_TLS12_KEY_MAT_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_TLS12_KEY_MAT_PARAMS); + + jTls12KeyMatParamToCKTls12KeyMatParam(env, jParam, + (CK_TLS12_KEY_MAT_PARAMS_PTR) ckpParamPtr); + break; + case CKM_TLS12_MASTER_KEY_DERIVE: + case CKM_TLS12_MASTER_KEY_DERIVE_DH: + ckpParamPtr = + malloc(sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); + + jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(env, jParam, + (CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR) ckpParamPtr); + break; + case CKM_TLS_PRF: + case CKM_NSS_TLS_PRF_GENERAL: + ckpParamPtr = malloc(sizeof(CK_TLS_PRF_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_TLS_PRF_PARAMS); + + jTlsPrfParamsToCKTlsPrfParam(env, jParam, + (CK_TLS_PRF_PARAMS_PTR) ckpParamPtr); + break; + case CKM_TLS_MAC: + ckpParamPtr = malloc(sizeof(CK_TLS_MAC_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_TLS_MAC_PARAMS); + + jTlsMacParamsToCKTlsMacParam(env, jParam, + (CK_TLS_MAC_PARAMS_PTR) ckpParamPtr); + break; + case CKM_AES_CTR: + ckpParamPtr = malloc(sizeof(CK_AES_CTR_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_AES_CTR_PARAMS); + + jAesCtrParamsToCKAesCtrParam(env, jParam, + (CK_AES_CTR_PARAMS_PTR) ckpParamPtr); + break; + case CKM_AES_GCM: + ckpParamPtr = malloc(sizeof(CK_GCM_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_GCM_PARAMS); + + jGCMParamsToCKGCMParam(env, jParam, (CK_GCM_PARAMS_PTR) ckpParamPtr); + break; + case CKM_AES_CCM: + ckpParamPtr = malloc(sizeof(CK_CCM_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_CCM_PARAMS); + + jCCMParamsToCKCCMParam(env, jParam, + (CK_CCM_PARAMS_PTR) ckpParamPtr); + break; + case CKM_RSA_PKCS_OAEP: + ckpParamPtr = malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS); + + jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam, + (CK_RSA_PKCS_OAEP_PARAMS_PTR) ckpParamPtr); + break; + case CKM_PBE_SHA1_DES3_EDE_CBC: + case CKM_PBE_SHA1_DES2_EDE_CBC: + case CKM_PBA_SHA1_WITH_SHA1_HMAC: + ckpParamPtr = malloc(sizeof(CK_PBE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + + *ckpLength = sizeof(CK_PBE_PARAMS); + + jPbeParamToCKPbeParam(env, jParam, (CK_PBE_PARAMS_PTR) ckpParamPtr); + break; + case CKM_PKCS5_PBKD2: + ckpParamPtr = malloc(sizeof(CK_PKCS5_PBKD2_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS); + + jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam, + (CK_PKCS5_PBKD2_PARAMS_PTR) ckpParamPtr); + break; + case CKM_RSA_PKCS_PSS: + case CKM_SHA1_RSA_PKCS_PSS: + case CKM_SHA256_RSA_PKCS_PSS: + case CKM_SHA384_RSA_PKCS_PSS: + case CKM_SHA512_RSA_PKCS_PSS: + case CKM_SHA224_RSA_PKCS_PSS: + ckpParamPtr = malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS); + + jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam, + (CK_RSA_PKCS_PSS_PARAMS_PTR) ckpParamPtr); + break; + case CKM_ECDH1_DERIVE: + case CKM_ECDH1_COFACTOR_DERIVE: + ckpParamPtr = malloc(sizeof(CK_ECDH1_DERIVE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS); + + jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam, + (CK_ECDH1_DERIVE_PARAMS_PTR) ckpParamPtr); + break; + case CKM_ECMQV_DERIVE: + ckpParamPtr = malloc(sizeof(CK_ECDH2_DERIVE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS); + + jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam, + (CK_ECDH2_DERIVE_PARAMS_PTR) ckpParamPtr); + break; + case CKM_X9_42_DH_DERIVE: + ckpParamPtr = malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS); + + /* convert jParameter to CKParameter */ + jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam, + (CK_X9_42_DH1_DERIVE_PARAMS_PTR) ckpParamPtr); + break; + case CKM_X9_42_DH_HYBRID_DERIVE: + case CKM_X9_42_MQV_DERIVE: + ckpParamPtr = malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); + if (ckpParamPtr == NULL) { + throwOutOfMemoryError(env, 0); + return NULL; + } + *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS); + + jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam, + (CK_X9_42_DH2_DERIVE_PARAMS_PTR) ckpParamPtr); + break; + // defined by pkcs11.h but we don't support + case CKM_KEA_DERIVE: // CK_KEA_DERIVE_PARAMS + case CKM_RC2_CBC: // CK_RC2_CBC_PARAMS + case CKM_RC2_MAC_GENERAL: // CK_RC2_MAC_GENERAL_PARAMS + case CKM_RC5_ECB: // CK_RC5_PARAMS + case CKM_RC5_MAC: // CK_RC5_PARAMS + case CKM_RC5_CBC: // CK_RC5_CBC_PARAMS + case CKM_RC5_MAC_GENERAL: // CK_RC5_MAC_GENERAL_PARAMS + case CKM_SKIPJACK_PRIVATE_WRAP: // CK_SKIPJACK_PRIVATE_WRAP_PARAMS + case CKM_SKIPJACK_RELAYX: // CK_SKIPJACK_RELAYX_PARAMS + case CKM_KEY_WRAP_SET_OAEP: // CK_KEY_WRAP_SET_OAEP_PARAMS + throwPKCS11RuntimeException(env, "No parameter support for this mchanism"); + break; + default: + /* if everything faild up to here */ + /* try if the parameter is a primitive Java type */ + ckpParamPtr = jObjectToPrimitiveCKObjectPtr(env, jParam, ckpLength); + /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */ + /* *ckpLength = 1; */ + } + TRACE0("\nDEBUG: jMechParamToCKMechParamPtrSlow FINISHED\n"); + + if ((*env)->ExceptionCheck(env)) { + free(ckpParamPtr); + *ckpLength = 0; + return NULL; } - jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); - if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) { - /* - * CK_SSL3_MASTER_KEY_DERIVE_PARAMS - */ - CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam; - - ckpParam = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS); - if (jSsl3KeyMatParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) { - /* - * CK_SSL3_KEY_MAT_PARAMS - */ - CK_SSL3_KEY_MAT_PARAMS_PTR ckpParam; - - ckpParam = (CK_SSL3_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jTls12KeyMatParamsClass = (*env)->FindClass(env, CLASS_TLS12_KEY_MAT_PARAMS); - if (jTls12KeyMatParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jTls12KeyMatParamsClass)) { - /* - * CK_TLS12_KEY_MAT_PARAMS - */ - CK_TLS12_KEY_MAT_PARAMS_PTR ckpParam; - - ckpParam = (CK_TLS12_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_TLS12_KEY_MAT_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jTls12KeyMatParamToCKTls12KeyMatParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_TLS12_KEY_MAT_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jTls12MasterKeyDeriveParamsClass = - (*env)->FindClass(env, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); - if (jTls12MasterKeyDeriveParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jTls12MasterKeyDeriveParamsClass)) { - /* - * CK_TLS12_MASTER_KEY_DERIVE_PARAMS - */ - CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam; - - ckpParam = (CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR)malloc( - sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jTls12MasterKeyDeriveParamToCKTls12MasterKeyDeriveParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS); - if (jTlsPrfParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) { - /* - * CK_TLS_PRF_PARAMS - */ - CK_TLS_PRF_PARAMS_PTR ckpParam; - - ckpParam = (CK_TLS_PRF_PARAMS_PTR) malloc(sizeof(CK_TLS_PRF_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jTlsPrfParamsToCKTlsPrfParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_TLS_PRF_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jTlsMacParamsClass = (*env)->FindClass(env, CLASS_TLS_MAC_PARAMS); - if (jTlsMacParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jTlsMacParamsClass)) { - CK_TLS_MAC_PARAMS_PTR ckpParam; - - ckpParam = (CK_TLS_MAC_PARAMS_PTR) malloc(sizeof(CK_TLS_MAC_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jTlsMacParamsToCKTlsMacParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_TLS_MAC_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jAesCtrParamsClass = (*env)->FindClass(env, CLASS_AES_CTR_PARAMS); - if (jAesCtrParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jAesCtrParamsClass)) { - /* - * CK_AES_CTR_PARAMS - */ - CK_AES_CTR_PARAMS_PTR ckpParam; - - ckpParam = (CK_AES_CTR_PARAMS_PTR) malloc(sizeof(CK_AES_CTR_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - jAesCtrParamsToCKAesCtrParam(env, jParam, ckpParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_AES_CTR_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS); - if (jRsaPkcsOaepParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) { - /* - * CK_RSA_PKCS_OAEP_PARAMS - */ - CK_RSA_PKCS_OAEP_PARAMS_PTR ckpParam; - - ckpParam = (CK_RSA_PKCS_OAEP_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS); - if (jPbeParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) { - /* - * CK_PBE_PARAMS - */ - CK_PBE_PARAMS_PTR ckpParam; - - ckpParam = (CK_PBE_PARAMS_PTR) malloc(sizeof(CK_PBE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jPbeParamToCKPbeParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_PBE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS); - if (jPkcs5Pbkd2ParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) { - /* - * CK_PKCS5_PBKD2_PARAMS - */ - CK_PKCS5_PBKD2_PARAMS_PTR ckpParam; - - ckpParam = (CK_PKCS5_PBKD2_PARAMS_PTR) malloc(sizeof(CK_PKCS5_PBKD2_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS); - if (jRsaPkcsPssParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) { - /* - * CK_RSA_PKCS_PSS_PARAMS - */ - CK_RSA_PKCS_PSS_PARAMS_PTR ckpParam; - - ckpParam = (CK_RSA_PKCS_PSS_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS); - if (jEcdh1DeriveParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) { - /* - * CK_ECDH1_DERIVE_PARAMS - */ - CK_ECDH1_DERIVE_PARAMS_PTR ckpParam; - - ckpParam = (CK_ECDH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH1_DERIVE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS); - if (jEcdh2DeriveParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) { - /* - * CK_ECDH2_DERIVE_PARAMS - */ - CK_ECDH2_DERIVE_PARAMS_PTR ckpParam; - - ckpParam = (CK_ECDH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH2_DERIVE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS); - if (jX942Dh1DeriveParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) { - /* - * CK_X9_42_DH1_DERIVE_PARAMS - */ - CK_X9_42_DH1_DERIVE_PARAMS_PTR ckpParam; - - ckpParam = (CK_X9_42_DH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS); - if (jX942Dh2DeriveParamsClass == NULL) { return; } - if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) { - /* - * CK_X9_42_DH2_DERIVE_PARAMS - */ - CK_X9_42_DH2_DERIVE_PARAMS_PTR ckpParam; - - ckpParam = (CK_X9_42_DH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); - if (ckpParam == NULL) { - throwOutOfMemoryError(env, 0); - return; - } - - /* convert jParameter to CKParameter */ - *ckpParam = jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam); - if ((*env)->ExceptionCheck(env)) { - free(ckpParam); - return; - } - - /* get length and pointer of parameter */ - *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS); - *ckpParamPtr = ckpParam; - return; - } - - /* if everything faild up to here */ - /* try if the parameter is a primitive Java type */ - jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength); - /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */ - /* *ckpLength = 1; */ - - TRACE0("FINISHED\n"); + return ckpParamPtr; } - /* the mechanism parameter convertion functions: */ /* @@ -1573,47 +1477,45 @@ void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, * @param jParam - the Java CK_RSA_PKCS_OAEP_PARAMS object to convert * @return - the new CK_RSA_PKCS_OAEP_PARAMS structure */ -CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam) +void jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam, +CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr) { jclass jRsaPkcsOaepParamsClass; - CK_RSA_PKCS_OAEP_PARAMS ckParam; jfieldID fieldID; jlong jHashAlg, jMgf, jSource; jobject jSourceData; CK_BYTE_PTR ckpByte; - memset(&ckParam, 0, sizeof(CK_RSA_PKCS_OAEP_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_RSA_PKCS_OAEP_PARAMS)); /* get hashAlg */ jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS); - if (jRsaPkcsOaepParamsClass == NULL) { return ckParam; } + if (jRsaPkcsOaepParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jHashAlg = (*env)->GetLongField(env, jParam, fieldID); /* get mgf */ fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jMgf = (*env)->GetLongField(env, jParam, fieldID); /* get source */ fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSource = (*env)->GetLongField(env, jParam, fieldID); /* get sourceData and sourceDataLength */ fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSourceData = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckParam.hashAlg = jLongToCKULong(jHashAlg); - ckParam.mgf = jLongToCKULong(jMgf); - ckParam.source = jLongToCKULong(jSource); - jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParam.ulSourceDataLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - ckParam.pSourceData = (CK_VOID_PTR) ckpByte; - - return ckParam ; + ckParamPtr->hashAlg = jLongToCKULong(jHashAlg); + ckParamPtr->mgf = jLongToCKULong(jMgf); + ckParamPtr->source = jLongToCKULong(jSource); + jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParamPtr->ulSourceDataLen)); + if ((*env)->ExceptionCheck(env)) { return; } + ckParamPtr->pSourceData = (CK_VOID_PTR) ckpByte; } /* @@ -1621,57 +1523,55 @@ CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobje * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_PBE_PARAMS object to convert - * @return - the new CK_PBE_PARAMS structure + * @param ckParamPtr pointer to the new CK_PBE_PARAMS structure */ -CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam) +void jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam, +CK_PBE_PARAMS_PTR ckParamPtr) { jclass jPbeParamsClass; - CK_PBE_PARAMS ckParam; jfieldID fieldID; jlong jIteration; jobject jInitVector, jPassword, jSalt; CK_ULONG ckTemp; - memset(&ckParam, 0, sizeof(CK_PBE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_PBE_PARAMS)); /* get pInitVector */ jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS); - if (jPbeParamsClass == NULL) { return ckParam; } + if (jPbeParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jInitVector = (*env)->GetObjectField(env, jParam, fieldID); /* get pPassword and ulPasswordLength */ fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPassword = (*env)->GetObjectField(env, jParam, fieldID); /* get pSalt and ulSaltLength */ fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSalt = (*env)->GetObjectField(env, jParam, fieldID); /* get ulIteration */ fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jIteration = (*env)->GetLongField(env, jParam, fieldID); /* populate java values */ - ckParam.ulIteration = jLongToCKULong(jIteration); - jCharArrayToCKCharArray(env, jInitVector, &(ckParam.pInitVector), &ckTemp); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - jCharArrayToCKCharArray(env, jPassword, &(ckParam.pPassword), &(ckParam.ulPasswordLen)); + ckParamPtr->ulIteration = jLongToCKULong(jIteration); + jCharArrayToCKCharArray(env, jInitVector, &(ckParamPtr->pInitVector), &ckTemp); + if ((*env)->ExceptionCheck(env)) { return; } + jCharArrayToCKCharArray(env, jPassword, &(ckParamPtr->pPassword), &(ckParamPtr->ulPasswordLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pInitVector); - return ckParam; + free(ckParamPtr->pInitVector); + return; } - jCharArrayToCKCharArray(env, jSalt, &(ckParam.pSalt), &(ckParam.ulSaltLen)); + jCharArrayToCKCharArray(env, jSalt, &(ckParamPtr->pSalt), &(ckParamPtr->ulSaltLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pInitVector); - free(ckParam.pPassword); - return ckParam; + free(ckParamPtr->pInitVector); + free(ckParamPtr->pPassword); + return; } - - return ckParam ; } /* @@ -1741,57 +1641,55 @@ void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, job * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_PKCS5_PBKD2_PARAMS object to convert - * @return - the new CK_PKCS5_PBKD2_PARAMS structure + * @param ckParamPtr - pointer to the new CK_PKCS5_PBKD2_PARAMS structure */ -CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam) +void jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam, +CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr) { jclass jPkcs5Pbkd2ParamsClass; - CK_PKCS5_PBKD2_PARAMS ckParam; jfieldID fieldID; jlong jSaltSource, jIteration, jPrf; jobject jSaltSourceData, jPrfData; - memset(&ckParam, 0, sizeof(CK_PKCS5_PBKD2_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_PKCS5_PBKD2_PARAMS)); /* get saltSource */ jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS); - if (jPkcs5Pbkd2ParamsClass == NULL) { return ckParam; } + if (jPkcs5Pbkd2ParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSaltSource = (*env)->GetLongField(env, jParam, fieldID); /* get pSaltSourceData */ fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID); /* get iterations */ fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jIteration = (*env)->GetLongField(env, jParam, fieldID); /* get prf */ fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrf = (*env)->GetLongField(env, jParam, fieldID); /* get pPrfData and ulPrfDataLength in byte */ fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrfData = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckParam.saltSource = jLongToCKULong(jSaltSource); - jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - ckParam.iterations = jLongToCKULong(jIteration); - ckParam.prf = jLongToCKULong(jPrf); - jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen)); + ckParamPtr->saltSource = jLongToCKULong(jSaltSource); + jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParamPtr->pSaltSourceData), &(ckParamPtr->ulSaltSourceDataLen)); + if ((*env)->ExceptionCheck(env)) { return; } + ckParamPtr->iterations = jLongToCKULong(jIteration); + ckParamPtr->prf = jLongToCKULong(jPrf); + jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParamPtr->pPrfData), &(ckParamPtr->ulPrfDataLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pSaltSourceData); - return ckParam; + free(ckParamPtr->pSaltSourceData); + return; } - - return ckParam ; } /* @@ -1799,39 +1697,40 @@ CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject j * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_RSA_PKCS_PSS_PARAMS object to convert - * @return - the new CK_RSA_PKCS_PSS_PARAMS structure + * @param ckParamPtr - pointer to the new CK_RSA_PKCS_PSS_PARAMS structure */ -CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam) +void jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam, +CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr) { jclass jRsaPkcsPssParamsClass; - CK_RSA_PKCS_PSS_PARAMS ckParam; jfieldID fieldID; jlong jHashAlg, jMgf, jSLen; - memset(&ckParam, 0, sizeof(CK_RSA_PKCS_PSS_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_RSA_PKCS_PSS_PARAMS)); /* get hashAlg */ jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS); - if (jRsaPkcsPssParamsClass == NULL) { return ckParam; } + if (jRsaPkcsPssParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jHashAlg = (*env)->GetLongField(env, jParam, fieldID); /* get mgf */ fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jMgf = (*env)->GetLongField(env, jParam, fieldID); /* get sLen */ fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSLen = (*env)->GetLongField(env, jParam, fieldID); /* populate java values */ - ckParam.hashAlg = jLongToCKULong(jHashAlg); - ckParam.mgf = jLongToCKULong(jMgf); - ckParam.sLen = jLongToCKULong(jSLen); - - return ckParam ; + ckParamPtr->hashAlg = jLongToCKULong(jHashAlg); + ckParamPtr->mgf = jLongToCKULong(jMgf); + ckParamPtr->sLen = jLongToCKULong(jSLen); + TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, hashAlg=0x%lX\n", ckParamPtr->hashAlg); + TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, mgf=0x%lX\n", ckParamPtr->mgf); + TRACE1("DEBUG: jRsaPkcsPssParamToCKRsaPkcsPssParam, sLen=%lu\n", ckParamPtr->sLen); } /* @@ -1839,46 +1738,44 @@ CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_ECDH1_DERIVE_PARAMS object to convert - * @return - the new CK_ECDH1_DERIVE_PARAMS structure + * @param ckParamPtr - the new CK_ECDH1_DERIVE_PARAMS structure */ -CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam) +void jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam, +CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr) { jclass jEcdh1DeriveParamsClass; - CK_ECDH1_DERIVE_PARAMS ckParam; jfieldID fieldID; jlong jLong; jobject jSharedData, jPublicData; - memset(&ckParam, 0, sizeof(CK_ECDH1_DERIVE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_ECDH1_DERIVE_PARAMS)); /* get kdf */ jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS); - if (jEcdh1DeriveParamsClass == NULL) { return ckParam; } + if (jEcdh1DeriveParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jLong = (*env)->GetLongField(env, jParam, fieldID); - ckParam.kdf = jLongToCKULong(jLong); + ckParamPtr->kdf = jLongToCKULong(jLong); /* get pSharedData and ulSharedDataLen */ fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSharedData = (*env)->GetObjectField(env, jParam, fieldID); /* get pPublicData and ulPublicDataLen */ fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPublicData = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckParam.kdf = jLongToCKULong(jLong); - jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen)); + ckParamPtr->kdf = jLongToCKULong(jLong); + jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData), &(ckParamPtr->ulSharedDataLen)); + if ((*env)->ExceptionCheck(env)) { return; } + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pSharedData); - return ckParam; + free(ckParamPtr->pSharedData); + return; } - - return ckParam ; } /* @@ -1886,67 +1783,66 @@ CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobjec * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_ECDH2_DERIVE_PARAMS object to convert - * @return - the new CK_ECDH2_DERIVE_PARAMS structure + * @param ckParamPtr - pointer to the new CK_ECDH2_DERIVE_PARAMS structure */ -CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam) +void jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam, +CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr) { jclass jEcdh2DeriveParamsClass; - CK_ECDH2_DERIVE_PARAMS ckParam; jfieldID fieldID; jlong jKdf, jPrivateDataLen, jPrivateData; jobject jSharedData, jPublicData, jPublicData2; - memset(&ckParam, 0, sizeof(CK_ECDH2_DERIVE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_ECDH2_DERIVE_PARAMS)); /* get kdf */ jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS); - if (jEcdh2DeriveParamsClass == NULL) { return ckParam; } + if (jEcdh2DeriveParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jKdf = (*env)->GetLongField(env, jParam, fieldID); /* get pSharedData and ulSharedDataLen */ fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jSharedData = (*env)->GetObjectField(env, jParam, fieldID); /* get pPublicData and ulPublicDataLen */ fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPublicData = (*env)->GetObjectField(env, jParam, fieldID); /* get ulPrivateDataLen */ fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID); /* get hPrivateData */ fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrivateData = (*env)->GetLongField(env, jParam, fieldID); /* get pPublicData2 and ulPublicDataLen2 */ fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckParam.kdf = jLongToCKULong(jKdf); - jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen)); + ckParamPtr->kdf = jLongToCKULong(jKdf); + jByteArrayToCKByteArray(env, jSharedData, &(ckParamPtr->pSharedData), &(ckParamPtr->ulSharedDataLen)); + if ((*env)->ExceptionCheck(env)) { return; } + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pSharedData); - return ckParam; + free(ckParamPtr->pSharedData); + return; } - ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen); - ckParam.hPrivateData = jLongToCKULong(jPrivateData); - jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2)); + ckParamPtr->ulPrivateDataLen = jLongToCKULong(jPrivateDataLen); + ckParamPtr->hPrivateData = jLongToCKULong(jPrivateData); + jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2), &(ckParamPtr->ulPublicDataLen2)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pSharedData); - free(ckParam.pPublicData); - return ckParam; + free(ckParamPtr->pSharedData); + free(ckParamPtr->pPublicData); + return; } - return ckParam ; } /* @@ -1954,45 +1850,43 @@ CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobjec * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_X9_42_DH1_DERIVE_PARAMS object to convert - * @return - the new CK_X9_42_DH1_DERIVE_PARAMS structure + * @param ckParamPtr - pointer to the new CK_X9_42_DH1_DERIVE_PARAMS structure */ -CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam) +void jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam, + CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr) { jclass jX942Dh1DeriveParamsClass; - CK_X9_42_DH1_DERIVE_PARAMS ckParam; jfieldID fieldID; jlong jKdf; jobject jOtherInfo, jPublicData; - memset(&ckParam, 0, sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_X9_42_DH1_DERIVE_PARAMS)); /* get kdf */ jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS); - if (jX942Dh1DeriveParamsClass == NULL) { return ckParam; } + if (jX942Dh1DeriveParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jKdf = (*env)->GetLongField(env, jParam, fieldID); /* get pOtherInfo and ulOtherInfoLen */ fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID); /* get pPublicData and ulPublicDataLen */ fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPublicData = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckParam.kdf = jLongToCKULong(jKdf); - jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen)); + ckParamPtr->kdf = jLongToCKULong(jKdf); + jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo), &(ckParamPtr->ulOtherInfoLen)); + if ((*env)->ExceptionCheck(env)) { return; } + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pOtherInfo); - return ckParam; + free(ckParamPtr->pOtherInfo); + return; } - - return ckParam ; } /* @@ -2000,66 +1894,64 @@ CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env * * @param env - used to call JNI funktions to get the Java classes and objects * @param jParam - the Java CK_X9_42_DH2_DERIVE_PARAMS object to convert - * @return - the new CK_X9_42_DH2_DERIVE_PARAMS structure + * @param ckParamPtr - pointer to the new CK_X9_42_DH2_DERIVE_PARAMS structure */ -CK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam) +void jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam, + CK_X9_42_DH2_DERIVE_PARAMS_PTR ckParamPtr) { jclass jX942Dh2DeriveParamsClass; - CK_X9_42_DH2_DERIVE_PARAMS ckParam; jfieldID fieldID; jlong jKdf, jPrivateDataLen, jPrivateData; jobject jOtherInfo, jPublicData, jPublicData2; - memset(&ckParam, 0, sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); + memset(ckParamPtr, 0, sizeof(CK_X9_42_DH2_DERIVE_PARAMS)); /* get kdf */ jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS); - if (jX942Dh2DeriveParamsClass == NULL) { return ckParam; } + if (jX942Dh2DeriveParamsClass == NULL) { return; } fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jKdf = (*env)->GetLongField(env, jParam, fieldID); /* get pOtherInfo and ulOtherInfoLen */ fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID); /* get pPublicData and ulPublicDataLen */ fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPublicData = (*env)->GetObjectField(env, jParam, fieldID); /* get ulPrivateDataLen */ fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID); /* get hPrivateData */ fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPrivateData = (*env)->GetLongField(env, jParam, fieldID); /* get pPublicData2 and ulPublicDataLen2 */ fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B"); - if (fieldID == NULL) { return ckParam; } + if (fieldID == NULL) { return; } jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID); /* populate java values */ - ckParam.kdf = jLongToCKULong(jKdf); - jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen)); - if ((*env)->ExceptionCheck(env)) { return ckParam; } - jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen)); + ckParamPtr->kdf = jLongToCKULong(jKdf); + jByteArrayToCKByteArray(env, jOtherInfo, &(ckParamPtr->pOtherInfo), &(ckParamPtr->ulOtherInfoLen)); + if ((*env)->ExceptionCheck(env)) { return; } + jByteArrayToCKByteArray(env, jPublicData, &(ckParamPtr->pPublicData), &(ckParamPtr->ulPublicDataLen)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pOtherInfo); - return ckParam; + free(ckParamPtr->pOtherInfo); + return; } - ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen); - ckParam.hPrivateData = jLongToCKULong(jPrivateData); - jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2)); + ckParamPtr->ulPrivateDataLen = jLongToCKULong(jPrivateDataLen); + ckParamPtr->hPrivateData = jLongToCKULong(jPrivateData); + jByteArrayToCKByteArray(env, jPublicData2, &(ckParamPtr->pPublicData2), &(ckParamPtr->ulPublicDataLen2)); if ((*env)->ExceptionCheck(env)) { - free(ckParam.pOtherInfo); - free(ckParam.pPublicData); - return ckParam; + free(ckParamPtr->pOtherInfo); + free(ckParamPtr->pPublicData); + return; } - - return ckParam ; } diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c index 2696483f730..bc424e76400 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_crypt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -71,7 +71,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptInit jobject jMechanism, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckKeyHandle; CK_RV rv; @@ -80,15 +80,14 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptInit ckSessionHandle = jLongToCKULong(jSessionHandle); ckKeyHandle = jLongToCKULong(jKeyHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return; } - rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, &ckMechanism, + rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } + // if OAEP, then cannot free here + freeCKMechanismPtr(ckpMechanism); if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } } @@ -98,54 +97,67 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptInit /* * Class: sun_security_pkcs11_wrapper_PKCS11 * Method: C_Encrypt - * Signature: (J[BII[BII)I + * Signature: (JJ[BIIJ[BII)I * Parametermapping: *PKCS11* * @param jlong jSessionHandle CK_SESSION_HANDLE hSession + * @param jlong directIn CK_BYTE_PTR pData * @param jbyteArray jData CK_BYTE_PTR pData * CK_ULONG ulDataLen - * @return jbyteArray jEncryptedData CK_BYTE_PTR pEncryptedData + * @param jlong directOut CK_BYTE_PTR pEncryptedData + * @return jint encryptedDataLen CK_BYTE_PTR pEncryptedData * CK_ULONG_PTR pulEncryptedDataLen */ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Encrypt (JNIEnv *env, jobject obj, jlong jSessionHandle, - jbyteArray jIn, jint jInOfs, jint jInLen, - jbyteArray jOut, jint jOutOfs, jint jOutLen) + jlong directIn, jbyteArray jIn, jint jInOfs, jint jInLen, + jlong directOut, jbyteArray jOut, jint jOutOfs, jint jOutLen) { CK_SESSION_HANDLE ckSessionHandle; CK_RV rv; CK_BYTE_PTR inBufP; CK_BYTE_PTR outBufP; - CK_ULONG ckEncryptedPartLen; + CK_ULONG ckEncryptedLen = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } ckSessionHandle = jLongToCKULong(jSessionHandle); - inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL); - if (inBufP == NULL) { return 0; } - - outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); - if (outBufP == NULL) { - // Make sure to release inBufP - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - return 0; + if (directIn != 0) { + inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn); + } else { + inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL); + if (inBufP == NULL) { return 0; } } - ckEncryptedPartLen = jOutLen; + if (directOut != 0) { + outBufP = (CK_BYTE_PTR) jlong_to_ptr(directOut); + } else { + outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); + if (outBufP == NULL) { + goto cleanup; + } + } + + ckEncryptedLen = jOutLen; rv = (*ckpFunctions->C_Encrypt)(ckSessionHandle, (CK_BYTE_PTR)(inBufP + jInOfs), jInLen, (CK_BYTE_PTR)(outBufP + jOutOfs), - &ckEncryptedPartLen); - - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); + &ckEncryptedLen); ckAssertReturnValueOK(env, rv); - return ckEncryptedPartLen; + +cleanup: + if (directIn == 0 && inBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); + } + if (directOut == 0 && outBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); + } + return ckEncryptedLen; } #endif @@ -172,7 +184,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate CK_BYTE_PTR inBufP; CK_BYTE_PTR outBufP; - CK_ULONG ckEncryptedPartLen; + CK_ULONG ckEncryptedPartLen = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } @@ -191,34 +203,26 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptUpdate } else { outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); if (outBufP == NULL) { - // Make sure to release inBufP - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - return 0; + goto cleanup; } } ckEncryptedPartLen = jOutLen; - //printf("EU: inBufP=%i, jInOfs=%i, jInLen=%i, outBufP=%i\n", - // inBufP, jInOfs, jInLen, outBufP); - rv = (*ckpFunctions->C_EncryptUpdate)(ckSessionHandle, (CK_BYTE_PTR)(inBufP + jInOfs), jInLen, (CK_BYTE_PTR)(outBufP + jOutOfs), &ckEncryptedPartLen); - //printf("EU: ckEncryptedPartLen=%i\n", ckEncryptedPartLen); - - if (directIn == 0) { - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - } - - if (directOut == 0) { - (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); - } - ckAssertReturnValueOK(env, rv); +cleanup: + if (directIn == 0 && inBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); + } + if (directOut == 0 && outBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); + } return ckEncryptedPartLen; } #endif @@ -257,14 +261,10 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1EncryptFinal ckLastEncryptedPartLen = jOutLen; - //printf("EF: outBufP=%i\n", outBufP); - rv = (*ckpFunctions->C_EncryptFinal)(ckSessionHandle, (CK_BYTE_PTR)(outBufP + jOutOfs), &ckLastEncryptedPartLen); - //printf("EF: ckLastEncryptedPartLen=%i", ckLastEncryptedPartLen); - if (directOut == 0) { (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); } @@ -291,7 +291,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptInit jobject jMechanism, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckKeyHandle; CK_RV rv; @@ -300,15 +300,14 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptInit ckSessionHandle = jLongToCKULong(jSessionHandle); ckKeyHandle = jLongToCKULong(jKeyHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return; } - rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, &ckMechanism, + rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } + // if OAEP, then cannot free here + freeCKMechanismPtr(ckpMechanism); if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } } @@ -318,7 +317,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptInit /* * Class: sun_security_pkcs11_wrapper_PKCS11 * Method: C_Decrypt - * Signature: (J[BII[BII)I + * Signature: (JJ[BIIJ[BII)I * Parametermapping: *PKCS11* * @param jlong jSessionHandle CK_SESSION_HANDLE hSession * @param jbyteArray jEncryptedData CK_BYTE_PTR pEncryptedData @@ -329,44 +328,53 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptInit JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Decrypt (JNIEnv *env, jobject obj, jlong jSessionHandle, - jbyteArray jIn, jint jInOfs, jint jInLen, - jbyteArray jOut, jint jOutOfs, jint jOutLen) + jlong directIn, jbyteArray jIn, jint jInOfs, jint jInLen, + jlong directOut, jbyteArray jOut, jint jOutOfs, jint jOutLen) { CK_SESSION_HANDLE ckSessionHandle; CK_RV rv; CK_BYTE_PTR inBufP; CK_BYTE_PTR outBufP; - CK_ULONG ckPartLen; + CK_ULONG ckOutLen = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } ckSessionHandle = jLongToCKULong(jSessionHandle); - inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL); - if (inBufP == NULL) { return 0; } - - outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); - if (outBufP == NULL) { - // Make sure to release inBufP - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - return 0; + if (directIn != 0) { + inBufP = (CK_BYTE_PTR) jlong_to_ptr(directIn); + } else { + inBufP = (*env)->GetPrimitiveArrayCritical(env, jIn, NULL); + if (inBufP == NULL) { return 0; } } - ckPartLen = jOutLen; + if (directOut != 0) { + outBufP = (CK_BYTE_PTR) jlong_to_ptr(directOut); + } else { + outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); + if (outBufP == NULL) { + goto cleanup; + } + } + ckOutLen = jOutLen; rv = (*ckpFunctions->C_Decrypt)(ckSessionHandle, (CK_BYTE_PTR)(inBufP + jInOfs), jInLen, (CK_BYTE_PTR)(outBufP + jOutOfs), - &ckPartLen); - - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); + &ckOutLen); ckAssertReturnValueOK(env, rv); - return ckPartLen; +cleanup: + if (directIn == 0 && inBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); + } + if (directOut == 0 && outBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); + } + return ckOutLen; } #endif @@ -393,7 +401,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate CK_BYTE_PTR inBufP; CK_BYTE_PTR outBufP; - CK_ULONG ckDecryptedPartLen; + CK_ULONG ckDecryptedPartLen = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } @@ -412,28 +420,24 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptUpdate } else { outBufP = (*env)->GetPrimitiveArrayCritical(env, jOut, NULL); if (outBufP == NULL) { - // Make sure to release inBufP - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - return 0; + goto cleanup; } } ckDecryptedPartLen = jOutLen; - rv = (*ckpFunctions->C_DecryptUpdate)(ckSessionHandle, (CK_BYTE_PTR)(inBufP + jInOfs), jInLen, (CK_BYTE_PTR)(outBufP + jOutOfs), &ckDecryptedPartLen); - if (directIn == 0) { - (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); - } - - if (directOut == 0) { - (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); - } - ckAssertReturnValueOK(env, rv); +cleanup: + if (directIn == 0 && inBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jIn, inBufP, JNI_ABORT); + } + if (directOut == 0 && outBufP != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jOut, outBufP, JNI_COMMIT); + } return ckDecryptedPartLen; } diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_digest.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_digest.c index 68e4ff5e65f..77b9eb11cfe 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_digest.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_digest.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -68,21 +68,19 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestInit (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return; } - rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism); + rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, ckpMechanism); - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } + freeCKMechanismPtr(ckpMechanism); if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } } @@ -101,53 +99,50 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestInit * CK_ULONG_PTR pulDigestLen */ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestSingle - (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jbyteArray jIn, jint jInOfs, jint jInLen, jbyteArray jDigest, jint jDigestOfs, jint jDigestLen) + (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, + jbyteArray jIn, jint jInOfs, jint jInLen, jbyteArray jDigest, + jint jDigestOfs, jint jDigestLen) { CK_SESSION_HANDLE ckSessionHandle; CK_RV rv; - CK_BYTE_PTR bufP; CK_BYTE BUF[MAX_STACK_BUFFER_LEN]; + CK_BYTE_PTR bufP = BUF; CK_BYTE DIGESTBUF[MAX_DIGEST_LEN]; - CK_ULONG ckDigestLength = min(MAX_DIGEST_LEN, jDigestLen); - CK_MECHANISM ckMechanism; + CK_ULONG ckDigestLength = 0; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return 0; } - rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism); + rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, ckpMechanism); + if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { goto cleanup; } - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } - - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; } - - if (jInLen <= MAX_STACK_BUFFER_LEN) { - bufP = BUF; - } else { + if (jInLen > MAX_STACK_BUFFER_LEN) { /* always use single part op, even for large data */ bufP = (CK_BYTE_PTR) malloc((size_t)jInLen); if (bufP == NULL) { throwOutOfMemoryError(env, 0); - return 0; + goto cleanup; } } (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)bufP); if ((*env)->ExceptionCheck(env)) { - if (bufP != BUF) { free(bufP); } - return 0; + goto cleanup; } + ckDigestLength = min(MAX_DIGEST_LEN, jDigestLen); + rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength); if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF); } - +cleanup: + freeCKMechanismPtr(ckpMechanism); if (bufP != BUF) { free(bufP); } return ckDigestLength; @@ -165,7 +160,8 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestSingle * CK_ULONG ulDataLen */ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestUpdate - (JNIEnv *env, jobject obj, jlong jSessionHandle, jlong directIn, jbyteArray jIn, jint jInOfs, jint jInLen) + (JNIEnv *env, jobject obj, jlong jSessionHandle, jlong directIn, jbyteArray jIn, + jint jInOfs, jint jInLen) { CK_SESSION_HANDLE ckSessionHandle; CK_RV rv; @@ -256,7 +252,8 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestKey * CK_ULONG_PTR pulDigestLen */ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestFinal - (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jDigest, jint jDigestOfs, jint jDigestLen) + (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jDigest, + jint jDigestOfs, jint jDigestLen) { CK_SESSION_HANDLE ckSessionHandle; CK_RV rv; diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_general.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_general.c index ea7fd1704eb..ad4857d8d59 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_general.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_general.c @@ -67,6 +67,7 @@ jobject ckMechanismInfoPtrToJMechanismInfo(JNIEnv *env, const CK_MECHANISM_INFO_ jfieldID pNativeDataID; jfieldID mech_mechanismID; jfieldID mech_pParameterID; +jfieldID mech_pHandleID; jclass jByteArrayClass; jclass jLongClass; @@ -84,6 +85,23 @@ JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) { /* The native implementation of the methods of the PKCS11Implementation class */ /* ************************************************************************** */ +/* + * This method is used to do free the memory allocated for CK_MECHANISM structure. + * + * Class: sun_security_pkcs11_wrapper_PKCS11 + * Method: freeMechanism + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL +Java_sun_security_pkcs11_wrapper_PKCS11_freeMechanism +(JNIEnv *env, jclass thisClass, jlong ckpMechanism) { + if (ckpMechanism != 0L) { + freeCKMechanismPtr((CK_MECHANISM_PTR) ckpMechanism); + TRACE1("DEBUG PKCS11_freeMechanism: free pMech = %x\n", (jlong)ckpMechanism); + } + return 0L; +} + /* * This method is used to do static initialization. This method is static and * synchronized. Summary: use this method like a static initialization block. @@ -115,11 +133,11 @@ jclass fetchClass(JNIEnv *env, const char *name) { void prefetchFields(JNIEnv *env, jclass thisClass) { jclass tmpClass; - /* PKCS11 */ + /* PKCS11 - pNativeData */ pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J"); if (pNativeDataID == NULL) { return; } - /* CK_MECHANISM */ + /* CK_MECHANISM - mechanism, pParameter, pHandle */ tmpClass = (*env)->FindClass(env, CLASS_MECHANISM); if (tmpClass == NULL) { return; } mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J"); @@ -127,6 +145,10 @@ void prefetchFields(JNIEnv *env, jclass thisClass) { mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter", "Ljava/lang/Object;"); if (mech_pParameterID == NULL) { return; } + mech_pHandleID = (*env)->GetFieldID(env, tmpClass, "pHandle", "J"); + if (mech_pHandleID == NULL) { return; } + + /* java classes for primitive types - byte[], long */ jByteArrayClass = fetchClass(env, "[B"); if (jByteArrayClass == NULL) { return; } jLongClass = fetchClass(env, "java/lang/Long"); diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c index 5a4fa0022e0..89fd033c29d 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c @@ -155,7 +155,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_getNativeKeyInfo jbyte* nativeKeyInfoArrayRawCkAttributes = NULL; jbyte* nativeKeyInfoArrayRawCkAttributesPtr = NULL; jbyte* nativeKeyInfoArrayRawDataPtr = NULL; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; char iv[16] = {0x0}; CK_ULONG ckWrappedKeyLength = 0U; jbyte* wrappedKeySizeWrappedKeyArrayPtr = NULL; @@ -310,8 +310,8 @@ Java_sun_security_pkcs11_wrapper_PKCS11_getNativeKeyInfo // Key is sensitive. Need to extract it wrapped. if (jWrappingKeyHandle != 0) { - jMechanismToCKMechanism(env, jWrappingMech, &ckMechanism); - rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, + ckpMechanism = jMechanismToCKMechanismPtr(env, jWrappingMech); + rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, ckpMechanism, jLongToCKULong(jWrappingKeyHandle), ckObjectHandle, NULL_PTR, &ckWrappedKeyLength); if (ckWrappedKeyLength != 0) { @@ -339,7 +339,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_getNativeKeyInfo wrappedKeyBufferPtr = (CK_BYTE_PTR) (wrappedKeySizeWrappedKeyArrayPtr + sizeof(unsigned long)); - rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, + rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, ckpMechanism, jLongToCKULong(jWrappingKeyHandle),ckObjectHandle, wrappedKeyBufferPtr, &ckWrappedKeyLength); if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { @@ -382,6 +382,7 @@ cleanup: && returnValue != nativeKeyInfoWrappedKeyArray) { (*env)->DeleteLocalRef(env, nativeKeyInfoWrappedKeyArray); } + freeCKMechanismPtr(ckpMechanism); return returnValue; } @@ -417,7 +418,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_createNativeKey unsigned long totalDataSize = 0UL; jbyte* wrappedKeySizePtr = NULL; unsigned int i = 0U; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; char iv[16] = {0x0}; CK_ULONG ckWrappedKeyLength = 0UL; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); @@ -468,8 +469,8 @@ Java_sun_security_pkcs11_wrapper_PKCS11_createNativeKey jLongToCKULong(nativeKeyInfoCkAttributesCount), &ckObjectHandle); } else { // Wrapped key - jMechanismToCKMechanism(env, jWrappingMech, &ckMechanism); - rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, + ckpMechanism = jMechanismToCKMechanismPtr(env, jWrappingMech); + rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, ckpMechanism, jLongToCKULong(jWrappingKeyHandle), (CK_BYTE_PTR)(wrappedKeySizePtr + sizeof(unsigned long)), ckWrappedKeyLength, @@ -490,6 +491,7 @@ cleanup: nativeKeyInfoArrayRaw, JNI_ABORT); } + freeCKMechanismPtr(ckpMechanism); return jObjectHandle; } #endif @@ -510,9 +512,9 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jobjectArray jTemplate) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR; - CK_ULONG ckAttributesLength; + CK_ULONG ckAttributesLength = 0; CK_OBJECT_HANDLE ckKeyHandle = 0; jlong jKeyHandle = 0L; CK_RV rv; @@ -521,24 +523,21 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey if (ckpFunctions == NULL) { return 0L; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return 0L ; } jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength); if ((*env)->ExceptionCheck(env)) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } - return 0L; + goto cleanup; } - rv = (*ckpFunctions->C_GenerateKey)(ckSessionHandle, &ckMechanism, ckpAttributes, ckAttributesLength, &ckKeyHandle); + rv = (*ckpFunctions->C_GenerateKey)(ckSessionHandle, ckpMechanism, ckpAttributes, ckAttributesLength, &ckKeyHandle); if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { jKeyHandle = ckULongToJLong(ckKeyHandle); /* cheack, if we must give a initialization vector back to Java */ - switch (ckMechanism.mechanism) { + switch (ckpMechanism->mechanism) { case CKM_PBE_MD2_DES_CBC: case CKM_PBE_MD5_DES_CBC: case CKM_PBE_MD5_CAST_CBC: @@ -548,14 +547,12 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey case CKM_PBE_SHA1_CAST128_CBC: /* case CKM_PBE_SHA1_CAST5_CBC: the same as CKM_PBE_SHA1_CAST128_CBC */ /* we must copy back the initialization vector to the jMechanism object */ - copyBackPBEInitializationVector(env, &ckMechanism, jMechanism); + copyBackPBEInitializationVector(env, ckpMechanism, jMechanism); break; } } - - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } +cleanup: + freeCKMechanismPtr(ckpMechanism); freeCKAttributeArray(ckpAttributes, ckAttributesLength); return jKeyHandle ; @@ -582,14 +579,14 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Generate jobjectArray jPublicKeyTemplate, jobjectArray jPrivateKeyTemplate) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_ATTRIBUTE_PTR ckpPublicKeyAttributes = NULL_PTR; CK_ATTRIBUTE_PTR ckpPrivateKeyAttributes = NULL_PTR; - CK_ULONG ckPublicKeyAttributesLength; - CK_ULONG ckPrivateKeyAttributesLength; + CK_ULONG ckPublicKeyAttributesLength = 0; + CK_ULONG ckPrivateKeyAttributesLength = 0; CK_OBJECT_HANDLE_PTR ckpPublicKeyHandle; /* pointer to Public Key */ CK_OBJECT_HANDLE_PTR ckpPrivateKeyHandle; /* pointer to Private Key */ - CK_OBJECT_HANDLE_PTR ckpKeyHandles; /* pointer to array with Public and Private Key */ + CK_OBJECT_HANDLE_PTR ckpKeyHandles = NULL; /* pointer to array with Public and Private Key */ jlongArray jKeyHandles = NULL; CK_RV rv; int attempts; @@ -599,37 +596,25 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Generate if (ckpFunctions == NULL) { return NULL; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return NULL; } ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) malloc(2 * sizeof(CK_OBJECT_HANDLE)); if (ckpKeyHandles == NULL) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } throwOutOfMemoryError(env, 0); - return NULL; + goto cleanup; } ckpPublicKeyHandle = ckpKeyHandles; /* first element of array is Public 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; + goto cleanup; } jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength); if ((*env)->ExceptionCheck(env)) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } - free(ckpKeyHandles); - freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength); - return NULL; + goto cleanup; } /* @@ -650,7 +635,7 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Generate * Call C_GenerateKeyPair() several times if CKR_FUNCTION_FAILED occurs. */ for (attempts = 0; attempts < MAX_ATTEMPTS; attempts++) { - rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism, + rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, ckpMechanism, ckpPublicKeyAttributes, ckPublicKeyAttributesLength, ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength, ckpPublicKeyHandle, ckpPrivateKeyHandle); @@ -666,13 +651,11 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Generate jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2); } - if(ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } +cleanup: + freeCKMechanismPtr(ckpMechanism); free(ckpKeyHandles); freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength); freeCKAttributeArray(ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength); - return jKeyHandles ; } #endif @@ -694,7 +677,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1WrapKey (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jWrappingKeyHandle, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckWrappingKeyHandle; CK_OBJECT_HANDLE ckKeyHandle; jbyteArray jWrappedKey = NULL; @@ -707,33 +690,30 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1WrapKey if (ckpFunctions == NULL) { return NULL; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return NULL; } ckWrappingKeyHandle = jLongToCKULong(jWrappingKeyHandle); ckKeyHandle = jLongToCKULong(jKeyHandle); - rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength); + rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, ckpMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength); if (rv == CKR_BUFFER_TOO_SMALL) { ckpWrappedKey = (CK_BYTE_PTR) malloc(ckWrappedKeyLength); if (ckpWrappedKey == NULL) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } throwOutOfMemoryError(env, 0); - return NULL; + goto cleanup; } - rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength); + rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, ckpMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength); } if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { jWrappedKey = ckByteArrayToJByteArray(env, ckpWrappedKey, ckWrappedKeyLength); } +cleanup: if (ckpWrappedKey != BUF) { free(ckpWrappedKey); } - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } + freeCKMechanismPtr(ckpMechanism); + return jWrappedKey ; } #endif @@ -758,12 +738,12 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1UnwrapKey jbyteArray jWrappedKey, jobjectArray jTemplate) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckUnwrappingKeyHandle; CK_BYTE_PTR ckpWrappedKey = NULL_PTR; CK_ULONG ckWrappedKeyLength; CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR; - CK_ULONG ckAttributesLength; + CK_ULONG ckAttributesLength = 0; CK_OBJECT_HANDLE ckKeyHandle = 0; jlong jKeyHandle = 0L; CK_RV rv; @@ -772,29 +752,22 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1UnwrapKey if (ckpFunctions == NULL) { return 0L; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return 0L; } ckUnwrappingKeyHandle = jLongToCKULong(jUnwrappingKeyHandle); jByteArrayToCKByteArray(env, jWrappedKey, &ckpWrappedKey, &ckWrappedKeyLength); if ((*env)->ExceptionCheck(env)) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } - return 0L; + goto cleanup; } jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength); if ((*env)->ExceptionCheck(env)) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } - free(ckpWrappedKey); - return 0L; + goto cleanup; } - rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, ckUnwrappingKeyHandle, + rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, ckpMechanism, ckUnwrappingKeyHandle, ckpWrappedKey, ckWrappedKeyLength, ckpAttributes, ckAttributesLength, &ckKeyHandle); @@ -803,16 +776,14 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1UnwrapKey #if 0 /* cheack, if we must give a initialization vector back to Java */ - if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) { + if (ckpMechanism->mechanism == CKM_KEY_WRAP_SET_OAEP) { /* we must copy back the unwrapped key info to the jMechanism object */ - copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism); + copyBackSetUnwrappedKey(env, ckpMechanism, jMechanism); } #endif } - - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } +cleanup: + freeCKMechanismPtr(ckpMechanism); freeCKAttributeArray(ckpAttributes, ckAttributesLength); free(ckpWrappedKey); @@ -834,26 +805,27 @@ static void freeMasterKeyDeriveParams(CK_SSL3_RANDOM_DATA *RandomInfo, CK_VERSIO } } -void ssl3FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckMechanism) { - CK_SSL3_MASTER_KEY_DERIVE_PARAMS *params = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *) ckMechanism->pParameter; +void ssl3FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckpMechanism) { + CK_SSL3_MASTER_KEY_DERIVE_PARAMS *params = + (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *) ckpMechanism->pParameter; if (params == NULL) { return; } freeMasterKeyDeriveParams(&(params->RandomInfo), params->pVersion); } -void tls12FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckMechanism) { +void tls12FreeMasterKeyDeriveParams(CK_MECHANISM_PTR ckpMechanism) { CK_TLS12_MASTER_KEY_DERIVE_PARAMS *params = - (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckMechanism->pParameter; + (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckpMechanism->pParameter; if (params == NULL) { return; } freeMasterKeyDeriveParams(&(params->RandomInfo), params->pVersion); } -void freeEcdh1DeriveParams(CK_MECHANISM_PTR ckMechanism) { +void freeEcdh1DeriveParams(CK_MECHANISM_PTR ckpMechanism) { CK_ECDH1_DERIVE_PARAMS *params = - (CK_ECDH1_DERIVE_PARAMS *)ckMechanism->pParameter; + (CK_ECDH1_DERIVE_PARAMS *)ckpMechanism->pParameter; if (params == NULL) { return; } @@ -869,7 +841,7 @@ void freeEcdh1DeriveParams(CK_MECHANISM_PTR ckMechanism) { /* * Copy back the PRF output to Java. */ -void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism) +void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism) { jclass jMechanismClass, jTLSPrfParamsClass; CK_TLS_PRF_PARAMS *ckTLSPrfParams; @@ -890,13 +862,13 @@ void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMecha if (fieldID == NULL) { return; } jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); ckMechanismType = jLongToCKULong(jMechanismType); - if (ckMechanismType != ckMechanism->mechanism) { + if (ckMechanismType != ckpMechanism->mechanism) { /* we do not have maching types, this should not occur */ return; } /* get the native CK_TLS_PRF_PARAMS */ - ckTLSPrfParams = (CK_TLS_PRF_PARAMS *) ckMechanism->pParameter; + ckTLSPrfParams = (CK_TLS_PRF_PARAMS *) ckpMechanism->pParameter; if (ckTLSPrfParams != NULL_PTR) { /* get the Java CK_TLS_PRF_PARAMS object (pParameter) */ fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;"); @@ -950,10 +922,10 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jBaseKeyHandle, jobjectArray jTemplate) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckBaseKeyHandle; CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR; - CK_ULONG ckAttributesLength; + CK_ULONG ckAttributesLength = 0; CK_OBJECT_HANDLE ckKeyHandle = 0; jlong jKeyHandle = 0L; CK_RV rv; @@ -963,19 +935,16 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey if (ckpFunctions == NULL) { return 0L; } ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return 0L; } ckBaseKeyHandle = jLongToCKULong(jBaseKeyHandle); jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength); if ((*env)->ExceptionCheck(env)) { - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); - } - return 0L; + goto cleanup; } - switch (ckMechanism.mechanism) { + switch (ckpMechanism->mechanism) { case CKM_SSL3_KEY_AND_MAC_DERIVE: case CKM_TLS_KEY_AND_MAC_DERIVE: case CKM_TLS12_KEY_AND_MAC_DERIVE: @@ -989,60 +958,60 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey break; } - rv = (*ckpFunctions->C_DeriveKey)(ckSessionHandle, &ckMechanism, ckBaseKeyHandle, + rv = (*ckpFunctions->C_DeriveKey)(ckSessionHandle, ckpMechanism, ckBaseKeyHandle, ckpAttributes, ckAttributesLength, phKey); jKeyHandle = ckLongToJLong(ckKeyHandle); - freeCKAttributeArray(ckpAttributes, ckAttributesLength); - - switch (ckMechanism.mechanism) { + switch (ckpMechanism->mechanism) { case CKM_SSL3_MASTER_KEY_DERIVE: case CKM_TLS_MASTER_KEY_DERIVE: /* we must copy back the client version */ - ssl3CopyBackClientVersion(env, &ckMechanism, jMechanism); - ssl3FreeMasterKeyDeriveParams(&ckMechanism); + ssl3CopyBackClientVersion(env, ckpMechanism, jMechanism); + ssl3FreeMasterKeyDeriveParams(ckpMechanism); break; case CKM_TLS12_MASTER_KEY_DERIVE: - tls12CopyBackClientVersion(env, &ckMechanism, jMechanism); - tls12FreeMasterKeyDeriveParams(&ckMechanism); + tls12CopyBackClientVersion(env, ckpMechanism, jMechanism); + tls12FreeMasterKeyDeriveParams(ckpMechanism); break; case CKM_SSL3_MASTER_KEY_DERIVE_DH: case CKM_TLS_MASTER_KEY_DERIVE_DH: - ssl3FreeMasterKeyDeriveParams(&ckMechanism); + ssl3FreeMasterKeyDeriveParams(ckpMechanism); break; case CKM_TLS12_MASTER_KEY_DERIVE_DH: - tls12FreeMasterKeyDeriveParams(&ckMechanism); + tls12FreeMasterKeyDeriveParams(ckpMechanism); break; case CKM_SSL3_KEY_AND_MAC_DERIVE: case CKM_TLS_KEY_AND_MAC_DERIVE: /* we must copy back the unwrapped key info to the jMechanism object */ - ssl3CopyBackKeyMatParams(env, &ckMechanism, jMechanism); + ssl3CopyBackKeyMatParams(env, ckpMechanism, jMechanism); break; case CKM_TLS12_KEY_AND_MAC_DERIVE: /* we must copy back the unwrapped key info to the jMechanism object */ - tls12CopyBackKeyMatParams(env, &ckMechanism, jMechanism); + tls12CopyBackKeyMatParams(env, ckpMechanism, jMechanism); break; case CKM_TLS_PRF: - copyBackTLSPrfParams(env, &ckMechanism, jMechanism); + copyBackTLSPrfParams(env, ckpMechanism, jMechanism); break; case CKM_ECDH1_DERIVE: - freeEcdh1DeriveParams(&ckMechanism); + freeEcdh1DeriveParams(ckpMechanism); break; default: // empty break; } - - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); + if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { + jKeyHandle =0L; } - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; } + +cleanup: + freeCKMechanismPtr(ckpMechanism); + freeCKAttributeArray(ckpAttributes, ckAttributesLength); return jKeyHandle ; } -static void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism, +static void copyBackClientVersion(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism, CK_VERSION *ckVersion, const char *class_master_key_derive_params) { jclass jMasterKeyDeriveParamsClass, jMechanismClass, jVersionClass; @@ -1059,7 +1028,7 @@ static void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobjec if (fieldID == NULL) { return; } jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); ckMechanismType = jLongToCKULong(jMechanismType); - if (ckMechanismType != ckMechanism->mechanism) { + if (ckMechanismType != ckpMechanism->mechanism) { /* we do not have maching types, this should not occur */ return; } @@ -1102,14 +1071,14 @@ static void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobjec * mechanisms when used for deriving a key. * */ -void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, +void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism) { CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams; ckSSL3MasterKeyDeriveParams = - (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *)ckMechanism->pParameter; + (CK_SSL3_MASTER_KEY_DERIVE_PARAMS *)ckpMechanism->pParameter; if (ckSSL3MasterKeyDeriveParams != NULL_PTR) { - copyBackClientVersion(env, ckMechanism, jMechanism, + copyBackClientVersion(env, ckpMechanism, jMechanism, ckSSL3MasterKeyDeriveParams->pVersion, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS); } @@ -1121,20 +1090,20 @@ void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, * CKM_TLS12_MASTER_KEY_DERIVE mechanism when used for deriving a key. * */ -void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, +void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism) { CK_TLS12_MASTER_KEY_DERIVE_PARAMS *ckTLS12MasterKeyDeriveParams; ckTLS12MasterKeyDeriveParams = - (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckMechanism->pParameter; + (CK_TLS12_MASTER_KEY_DERIVE_PARAMS *)ckpMechanism->pParameter; if (ckTLS12MasterKeyDeriveParams != NULL_PTR) { - copyBackClientVersion(env, ckMechanism, jMechanism, + copyBackClientVersion(env, ckpMechanism, jMechanism, ckTLS12MasterKeyDeriveParams->pVersion, CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS); } } -static void copyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, +static void copyBackKeyMatParams(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism, CK_SSL3_RANDOM_DATA *RandomInfo, CK_SSL3_KEY_MAT_OUT_PTR ckSSL3KeyMatOut, const char *class_key_mat_params) { @@ -1157,7 +1126,7 @@ static void copyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, if (fieldID == NULL) { return; } jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID); ckMechanismType = jLongToCKULong(jMechanismType); - if (ckMechanismType != ckMechanism->mechanism) { + if (ckMechanismType != ckpMechanism->mechanism) { /* we do not have maching types, this should not occur */ return; } @@ -1264,13 +1233,13 @@ static void copyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, * when used for deriving a key. * */ -void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, +void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism) { CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam; - ckSSL3KeyMatParam = (CK_SSL3_KEY_MAT_PARAMS *)ckMechanism->pParameter; + ckSSL3KeyMatParam = (CK_SSL3_KEY_MAT_PARAMS *)ckpMechanism->pParameter; if (ckSSL3KeyMatParam != NULL_PTR) { - copyBackKeyMatParams(env, ckMechanism, jMechanism, + copyBackKeyMatParams(env, ckpMechanism, jMechanism, &(ckSSL3KeyMatParam->RandomInfo), ckSSL3KeyMatParam->pReturnedKeyMaterial, CLASS_SSL3_KEY_MAT_PARAMS); @@ -1283,13 +1252,13 @@ void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, * CKM_TLS12_KEY_AND_MAC_DERIVE mechanism when used for deriving a key. * */ -void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, +void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM_PTR ckpMechanism, jobject jMechanism) { CK_TLS12_KEY_MAT_PARAMS *ckTLS12KeyMatParam; - ckTLS12KeyMatParam = (CK_TLS12_KEY_MAT_PARAMS *) ckMechanism->pParameter; + ckTLS12KeyMatParam = (CK_TLS12_KEY_MAT_PARAMS *)ckpMechanism->pParameter; if (ckTLS12KeyMatParam != NULL_PTR) { - copyBackKeyMatParams(env, ckMechanism, jMechanism, + copyBackKeyMatParams(env, ckpMechanism, jMechanism, &(ckTLS12KeyMatParam->RandomInfo), ckTLS12KeyMatParam->pReturnedKeyMaterial, CLASS_TLS12_KEY_MAT_PARAMS); diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_mutex.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_mutex.c index 452b4f5d041..8c1f1fa4afd 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_mutex.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_mutex.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -181,7 +181,7 @@ CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs) jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID); /* we try to convert the reserved parameter also */ - jObjectToPrimitiveCKObjectPtrPtr(env, jReserved, &(ckpInitArgs->pReserved), &ckReservedLength); + ckpInitArgs->pReserved = jObjectToPrimitiveCKObjectPtr(env, jReserved, &ckReservedLength); return ckpInitArgs ; } diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_sign.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_sign.c index 8fbcde06d44..83bf3936dc8 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_sign.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_sign.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -63,31 +63,38 @@ * Parametermapping: *PKCS11* * @param jlong jSessionHandle CK_SESSION_HANDLE hSession * @param jobject jMechanism CK_MECHANISM_PTR pMechanism - * @return jlong jKeyHandle CK_OBJECT_HANDLE hKey + * @param jlong jKeyHandle CK_OBJECT_HANDLE hKey */ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckKeyHandle; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return; } + TRACE0("DEBUG: C_SignInit\n"); + ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return; } + ckKeyHandle = jLongToCKULong(jKeyHandle); - rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); + rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); + if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || + (ckpMechanism->pParameter == NULL)) { + freeCKMechanismPtr(ckpMechanism); + } else { + (*env)->SetLongField(env, jMechanism, mech_pHandleID, (jlong)ckpMechanism); + TRACE1("DEBUG C_SignInit: stored pMech = 0x%lX\n", (jlong)ckpMechanism); } - - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } + TRACE0("FINISHED\n"); } #endif @@ -95,7 +102,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit /* * Class: sun_security_pkcs11_wrapper_PKCS11 * Method: C_Sign - * Signature: (J[B)[B + * Signature: (J[BI)[B * Parametermapping: *PKCS11* * @param jlong jSessionHandle CK_SESSION_HANDLE hSession * @param jbyteArray jData CK_BYTE_PTR pData @@ -108,69 +115,45 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign { CK_SESSION_HANDLE ckSessionHandle; CK_BYTE_PTR ckpData = NULL_PTR; - CK_BYTE_PTR ckpSignature; CK_ULONG ckDataLength; - CK_ULONG ckSignatureLength = 0; + CK_BYTE_PTR bufP; + CK_ULONG ckSignatureLength; + CK_BYTE BUF[MAX_STACK_BUFFER_LEN]; jbyteArray jSignature = NULL; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return NULL; } + TRACE0("DEBUG: C_Sign\n"); + ckSessionHandle = jLongToCKULong(jSessionHandle); jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength); - if ((*env)->ExceptionCheck(env)) { return NULL; } - - /* START standard code */ - - /* first determine the length of the signature */ - rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength); - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { - free(ckpData); + if ((*env)->ExceptionCheck(env)) { return NULL; } - ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE)); - if (ckpSignature == NULL) { - free(ckpData); - throwOutOfMemoryError(env, 0); - return NULL; - } + TRACE1("DEBUG C_Sign: data length = %lu\n", ckDataLength); - /* now get the signature */ - rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength); - /* END standard code */ + // unknown signature length + bufP = BUF; + ckSignatureLength = MAX_STACK_BUFFER_LEN; + rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, + bufP, &ckSignatureLength); - /* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */ -/* - ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE)); - if (ckpSignature == NULL) { - free(ckpData); - throwOutOfMemoryError(env, 0); - return NULL; - } - rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength); + TRACE1("DEBUG C_Sign: ret rv=0x%lX\n", rv); - if (rv == CKR_BUFFER_TOO_SMALL) { - free(ckpSignature); - ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE)); - if (ckpSignature == NULL) { - free(ckpData); - throwOutOfMemoryError(env, 0); - return NULL; - } - rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength); - } - */ - /* END workaround code */ if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { - jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength); + jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength); + TRACE1("DEBUG C_Sign: signature length = %lu\n", ckSignatureLength); } - free(ckpData); - free(ckpSignature); - return jSignature ; + free(ckpData); + if (bufP != BUF) { free(bufP); } + + TRACE0("FINISHED\n"); + return jSignature; } #endif @@ -220,21 +203,20 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignUpdate jsize chunkLen = min(bufLen, jInLen); (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP); if ((*env)->ExceptionCheck(env)) { - if (bufP != BUF) { free(bufP); } - return; + goto cleanup; } rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen); if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { - if (bufP != BUF) { - free(bufP); - } - return; + goto cleanup; } jInOfs += chunkLen; jInLen -= chunkLen; } +cleanup: if (bufP != BUF) { free(bufP); } + + return; } #endif @@ -294,32 +276,37 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignFina * Parametermapping: *PKCS11* * @param jlong jSessionHandle CK_SESSION_HANDLE hSession * @param jobject jMechanism CK_MECHANISM_PTR pMechanism - * @return jlong jKeyHandle CK_OBJECT_HANDLE hKey + * @param jlong jKeyHandle CK_OBJECT_HANDLE hKey */ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverInit (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckKeyHandle; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return; } + TRACE0("DEBUG: C_SignRecoverInit\n"); + ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return; } ckKeyHandle = jLongToCKULong(jKeyHandle); - rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); + rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); + if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || + (ckpMechanism->pParameter == NULL)) { + freeCKMechanismPtr(ckpMechanism); + } else { + (*env)->SetLongField(env, jMechanism, mech_pHandleID, (jlong)ckpMechanism); + TRACE1("DEBUG C_SignRecoverInit, stored pMech = 0x%lX\n", (jlong)ckpMechanism); } - - if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } + TRACE0("FINISHED\n"); } #endif @@ -344,7 +331,7 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecover CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN]; CK_BYTE_PTR inBufP; CK_BYTE_PTR outBufP = OUTBUF; - CK_ULONG ckSignatureLength = MAX_STACK_BUFFER_LEN; + CK_ULONG ckSignatureLength = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } @@ -353,36 +340,35 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecover if (jInLen <= MAX_STACK_BUFFER_LEN) { inBufP = INBUF; + ckSignatureLength = MAX_STACK_BUFFER_LEN; } else { inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen); if (inBufP == NULL) { throwOutOfMemoryError(env, 0); return 0; } + ckSignatureLength = jInLen; } (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP); if ((*env)->ExceptionCheck(env)) { - if (inBufP != INBUF) { free(inBufP); } - return 0; + goto cleanup; } + rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength); /* re-alloc larger buffer if it fits into our Java buffer */ if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) { outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength); if (outBufP == NULL) { - if (inBufP != INBUF) { - free(inBufP); - } throwOutOfMemoryError(env, 0); - return 0; + goto cleanup; } rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength); } if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP); } - +cleanup: if (inBufP != INBUF) { free(inBufP); } if (outBufP != OUTBUF) { free(outBufP); } @@ -398,32 +384,39 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecover * Parametermapping: *PKCS11* * @param jlong jSessionHandle CK_SESSION_HANDLE hSession * @param jobject jMechanism CK_MECHANISM_PTR pMechanism - * @return jlong jKeyHandle CK_OBJECT_HANDLE hKey + * @param jlong jKeyHandle CK_OBJECT_HANDLE hKey */ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckKeyHandle; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return; } + TRACE0("DEBUG: C_VerifyInit\n"); + ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); - if ((*env)->ExceptionCheck(env)) { return; } + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); + if ((*env)->ExceptionCheck(env)) { + return; + } ckKeyHandle = jLongToCKULong(jKeyHandle); - rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); + rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); - if(ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); + if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || + (ckpMechanism->pParameter == NULL)) { + freeCKMechanismPtr(ckpMechanism); + } else { + (*env)->SetLongField(env, jMechanism, mech_pHandleID, (jlong)ckpMechanism); + TRACE1("DEBUG C_VerifyInit: stored pMech = 0x%lX\n", (jlong)ckpMechanism); } - - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } + TRACE0("FINISHED\n"); } #endif @@ -447,28 +440,31 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Verify CK_BYTE_PTR ckpSignature = NULL_PTR; CK_ULONG ckDataLength; CK_ULONG ckSignatureLength; - CK_RV rv; + CK_RV rv = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return; } ckSessionHandle = jLongToCKULong(jSessionHandle); + jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength); - if ((*env)->ExceptionCheck(env)) { return; } + if ((*env)->ExceptionCheck(env)) { + return; + } jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength); if ((*env)->ExceptionCheck(env)) { - free(ckpData); - return; + goto cleanup; } /* verify the signature */ rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength); +cleanup: free(ckpData); free(ckpSignature); - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } + ckAssertReturnValueOK(env, rv); } #endif @@ -510,7 +506,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyUpdate bufP = (CK_BYTE_PTR) malloc((size_t)bufLen); if (bufP == NULL) { throwOutOfMemoryError(env, 0); - return; + goto cleanup; } } @@ -518,19 +514,18 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyUpdate jsize chunkLen = min(bufLen, jInLen); (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP); if ((*env)->ExceptionCheck(env)) { - if (bufP != BUF) { free(bufP); } - return; + goto cleanup; } rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen); if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { - if (bufP != BUF) { free(bufP); } - return; + goto cleanup; } jInOfs += chunkLen; jInLen -= chunkLen; } +cleanup: if (bufP != BUF) { free(bufP); } } #endif @@ -558,14 +553,16 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyFinal ckSessionHandle = jLongToCKULong(jSessionHandle); jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength); - if ((*env)->ExceptionCheck(env)) { return; } + if ((*env)->ExceptionCheck(env)) { + return; + } /* verify the signature */ rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength); free(ckpSignature); - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } + ckAssertReturnValueOK(env, rv); } #endif @@ -583,26 +580,31 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverI (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) { CK_SESSION_HANDLE ckSessionHandle; - CK_MECHANISM ckMechanism; + CK_MECHANISM_PTR ckpMechanism = NULL; CK_OBJECT_HANDLE ckKeyHandle; CK_RV rv; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return; } + TRACE0("DEBUG: C_VerifyRecoverInit\n"); + ckSessionHandle = jLongToCKULong(jSessionHandle); - jMechanismToCKMechanism(env, jMechanism, &ckMechanism); + ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); if ((*env)->ExceptionCheck(env)) { return; } ckKeyHandle = jLongToCKULong(jKeyHandle); - rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); + rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); - if (ckMechanism.pParameter != NULL_PTR) { - free(ckMechanism.pParameter); + if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || + (ckpMechanism->pParameter == NULL)) { + freeCKMechanismPtr(ckpMechanism); + } else { + (*env)->SetLongField(env, jMechanism, mech_pHandleID, (jlong)ckpMechanism); + TRACE1("DEBUG C_VerifyRecoverInit: stored pMech = 0x%lX\n", (jlong)ckpMechanism); } - - if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } + TRACE0("FINISHED\n"); } #endif @@ -627,7 +629,7 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecover CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN]; CK_BYTE_PTR inBufP; CK_BYTE_PTR outBufP = OUTBUF; - CK_ULONG ckDataLength = MAX_STACK_BUFFER_LEN; + CK_ULONG ckDataLength = 0; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); if (ckpFunctions == NULL) { return 0; } @@ -636,18 +638,19 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecover if (jInLen <= MAX_STACK_BUFFER_LEN) { inBufP = INBUF; + ckDataLength = MAX_STACK_BUFFER_LEN; } else { inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen); if (inBufP == NULL) { throwOutOfMemoryError(env, 0); return 0; } + ckDataLength = jInLen; } (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP); if ((*env)->ExceptionCheck(env)) { - if (inBufP != INBUF) { free(inBufP); } - return 0; + goto cleanup; } rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength); @@ -656,9 +659,8 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecover if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) { outBufP = (CK_BYTE_PTR) malloc(ckDataLength); if (outBufP == NULL) { - if (inBufP != INBUF) { free(inBufP); } throwOutOfMemoryError(env, 0); - return 0; + goto cleanup; } rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength); } @@ -666,6 +668,7 @@ JNIEXPORT jint JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecover (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP); } +cleanup: if (inBufP != INBUF) { free(inBufP); } if (outBufP != OUTBUF) { free(outBufP); } diff --git a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c index 87d34543731..683f2fce2ca 100644 --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -277,16 +277,32 @@ void throwDisconnectedRuntimeException(JNIEnv *env) * @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