--- /dev/null Wed Oct 15 20:55:00 2014 +++ new/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoException.java Wed Oct 15 20:55:00 2014 @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2014, 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 com.oracle.security.ucrypto; + +import java.util.*; +import java.security.ProviderException; + +/** + * The exception class used by SunUcrypto provider. An exception + * object of this class indicates that a function call to the underlying + * native calls returned a value not equal to CRYPTO_SUCCESS. + * + * @since 1.9 + */ +public final class UcryptoException extends ProviderException { + + private static final long serialVersionUID = -933864511110035746L; + + // NOTE: check /usr/include/sys/crypto/common.h for updates + private static final String ERROR_MSG[] = { + "CRYPTO_SUCCESS", + "CRYPTO_CANCEL", + "CRYPTO_HOST_MEMORY", + "CRYPTO_GENERAL_ERROR", + "CRYPTO_FAILED", + "CRYPTO_ARGUMENTS_BAD", + "CRYPTO_ATTRIBUTE_READ_ONLY", + "CRYPTO_ATTRIBUTE_SENSITIVE", + "CRYPTO_ATTRIBUTE_TYPE_INVALID", + "CRYPTO_ATTRIBUTE_VALUE_INVALID", + "CRYPTO_CANCELED", + "CRYPTO_DATA_INVALID", + "CRYPTO_DATA_LEN_RANGE", + "CRYPTO_DEVICE_ERROR", + "CRYPTO_DEVICE_MEMORY", + "CRYPTO_DEVICE_REMOVED", + "CRYPTO_ENCRYPTED_DATA_INVALID", + "CRYPTO_ENCRYPTED_DATA_LEN_RANGE", + "CRYPTO_KEY_HANDLE_INVALID", + "CRYPTO_KEY_SIZE_RANGE", + "CRYPTO_KEY_TYPE_INCONSISTENT", + "CRYPTO_KEY_NOT_NEEDED", + "CRYPTO_KEY_CHANGED", + "CRYPTO_KEY_NEEDED", + "CRYPTO_KEY_INDIGESTIBLE", + "CRYPTO_KEY_FUNCTION_NOT_PERMITTED", + "CRYPTO_KEY_NOT_WRAPPABLE", + "CRYPTO_KEY_UNEXTRACTABLE", + "CRYPTO_MECHANISM_INVALID", + "CRYPTO_MECHANISM_PARAM_INVALID", + "CRYPTO_OBJECT_HANDLE_INVALID", + "CRYPTO_OPERATION_IS_ACTIVE", + "CRYPTO_OPERATION_NOT_INITIALIZED", + "CRYPTO_PIN_INCORRECT", + "CRYPTO_PIN_INVALID", + "CRYPTO_PIN_LEN_RANGE", + "CRYPTO_PIN_EXPIRED", + "CRYPTO_PIN_LOCKED", + "CRYPTO_SESSION_CLOSED", + "CRYPTO_SESSION_COUNT", + "CRYPTO_SESSION_HANDLE_INVALID", + "CRYPTO_SESSION_READ_ONLY", + "CRYPTO_SESSION_EXISTS", + "CRYPTO_SESSION_READ_ONLY_EXISTS", + "CRYPTO_SESSION_READ_WRITE_SO_EXISTS", + "CRYPTO_SIGNATURE_INVALID", + "CRYPTO_SIGNATURE_LEN_RANGE", + "CRYPTO_TEMPLATE_INCOMPLETE", + "CRYPTO_TEMPLATE_INCONSISTENT", + "CRYPTO_UNWRAPPING_KEY_HANDLE_INVALID", + "CRYPTO_UNWRAPPING_KEY_SIZE_RANGE", + "CRYPTO_UNWRAPPING_KEY_TYPE_INCONSISTENT", + "CRYPTO_USER_ALREADY_LOGGED_IN", + "CRYPTO_USER_NOT_LOGGED_IN", + "CRYPTO_USER_PIN_NOT_INITIALIZED", + "CRYPTO_USER_TYPE_INVALID", + "CRYPTO_USER_ANOTHER_ALREADY_LOGGED_IN", + "CRYPTO_USER_TOO_MANY_TYPES", + "CRYPTO_WRAPPED_KEY_INVALID", + "CRYPTO_WRAPPED_KEY_LEN_RANGE", + "CRYPTO_WRAPPING_KEY_HANDLE_INVALID", + "CRYPTO_WRAPPING_KEY_SIZE_RANGE", + "CRYPTO_WRAPPING_KEY_TYPE_INCONSISTENT", + "CRYPTO_RANDOM_SEED_NOT_SUPPORTED", + "CRYPTO_RANDOM_NO_RNG", + "CRYPTO_DOMAIN_PARAMS_INVALID", + "CRYPTO_BUFFER_TOO_SMALL", + "CRYPTO_INFORMATION_SENSITIVE", + "CRYPTO_NOT_SUPPORTED", + "CRYPTO_QUEUED", + "CRYPTO_BUFFER_TOO_BIG", + "CRYPTO_INVALID_CONTEXT", + "CRYPTO_INVALID_MAC", + "CRYPTO_MECH_NOT_SUPPORTED", + "CRYPTO_INCONSISTENT_ATTRIBUTE", + "CRYPTO_NO_PERMISSION", + "CRYPTO_INVALID_PROVIDER_ID", + "CRYPTO_VERSION_MISMATCH", + "CRYPTO_BUSY", + "CRYPTO_UNKNOWN_PROVIDER", + "CRYPTO_MODVERIFICATION_FAILED", + "CRYPTO_OLD_CTX_TEMPLATE", + "CRYPTO_WEAK_KEY", + "CRYPTO_FIPS140_ERROR" + }; + + /** + * The error code if this exception is triggered by a Ucrypto error. + */ + private final int errorCode; + + /** + * This method gets the corresponding text error message from a + * predefined mapping. If mapping is not found, then it returns the error + * code as a hex-string. + * + * @return The message or the error code; e.g. "CRYPTO_DATA_INVALID" or + * "0x88". + */ + static String getErrorMessage(int errorCode) { + String message; + if (errorCode < ERROR_MSG.length) { + message = ERROR_MSG[errorCode]; + } else { + message = "0x" + Integer.toHexString(errorCode); + } + return message; + } + + /** + * Constructor taking the error code as defined for the CRYPTO_* constants + */ + public UcryptoException(int rv) { + super(getErrorMessage(rv)); + this.errorCode = rv; + } + + public UcryptoException(String message) { + super(message); + errorCode = -1; + } + + public UcryptoException(String message, Throwable cause) { + super(message, cause); + errorCode = -1; + } + + /** + * Returns the Ucrypto error code. + * + * @return The error code. + */ + public int getErrorCode() { + return errorCode; + } +}