jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/UcryptoException.java
author iris
Wed, 20 Jan 2016 11:02:36 -0800
changeset 35302 e4d2275861c3
parent 31538 0981099a3e54
permissions -rw-r--r--
8136494: Update "@since 1.9" to "@since 9" to match java.version.specification Reviewed-by: alanb, chegar, lancea, prr

/*
 * 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 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;
    }
}