예제 #1
0
파일: e_ubsec.c 프로젝트: GarikRC/openssl
/* (de)initialisation functions. */
static int ubsec_init(ENGINE *e)
{
    t_UBSEC_ubsec_bytes_to_bits *p1;
    t_UBSEC_ubsec_bits_to_bytes *p2;
    t_UBSEC_ubsec_open *p3;
    t_UBSEC_ubsec_close *p4;
#  ifndef OPENSSL_NO_DH
    t_UBSEC_diffie_hellman_generate_ioctl *p5;
    t_UBSEC_diffie_hellman_agree_ioctl *p6;
#  endif
/* #ifndef OPENSSL_NO_RSA */
    t_UBSEC_rsa_mod_exp_ioctl *p7;
    t_UBSEC_rsa_mod_exp_crt_ioctl *p8;
/* #endif */
#  ifndef OPENSSL_NO_DSA
    t_UBSEC_dsa_sign_ioctl *p9;
    t_UBSEC_dsa_verify_ioctl *p10;
#  endif
    t_UBSEC_math_accelerate_ioctl *p11;
    t_UBSEC_rng_ioctl *p12;
    t_UBSEC_max_key_len_ioctl *p13;
    int fd = 0;

    if (ubsec_dso != NULL) {
        UBSECerr(UBSEC_F_UBSEC_INIT, UBSEC_R_ALREADY_LOADED);
        goto err;
    }
    /*
     * Attempt to load libubsec.so/ubsec.dll/whatever.
     */
    ubsec_dso = DSO_load(NULL, get_UBSEC_LIBNAME(), NULL, 0);
    if (ubsec_dso == NULL) {
        UBSECerr(UBSEC_F_UBSEC_INIT, UBSEC_R_DSO_FAILURE);
        goto err;
    }

#define BINDIT(t, name) (t *)DSO_bind_func(ubsec_dso, name)
    if ((p1 = BINDIT(t_UBSEC_ubsec_bytes_to_bits, UBSEC_F1)) == NULL
        || (p2 = BINDIT(t_UBSEC_ubsec_bits_to_bytes, UBSEC_F2)) == NULL
        || (p3 = BINDIT(t_UBSEC_ubsec_open, UBSEC_F3)) == NULL
        || (p4 = BINDIT(t_UBSEC_ubsec_close, UBSEC_F4)) == NULL
#  ifndef OPENSSL_NO_DH
        || (p5 = BINDIT(t_UBSEC_diffie_hellman_generate_ioctl, UBSEC_F5)) == NULL
        || (p6 = BINDIT(t_UBSEC_diffie_hellman_agree_ioctl, UBSEC_F6)) == NULL
#  endif
/* #ifndef OPENSSL_NO_RSA */
        || (p7 = BINDIT(t_UBSEC_rsa_mod_exp_ioctl, UBSEC_F7)) == NULL
        || (p8 = BINDIT(t_UBSEC_rsa_mod_exp_crt_ioctl, UBSEC_F8)) == NULL
/* #endif */
#  ifndef OPENSSL_NO_DSA
        || (p9 = BINDIT(t_UBSEC_dsa_sign_ioctl, UBSEC_F9)) == NULL
        || (p10 = BINDIT(t_UBSEC_dsa_verify_ioctl, UBSEC_F10)) == NULL
#  endif
        || (p11 = BINDIT(t_UBSEC_math_accelerate_ioctl, UBSEC_F11)) == NULL
        || (p12 = BINDIT(t_UBSEC_rng_ioctl, UBSEC_F12)) == NULL
        || (p13 = BINDIT(t_UBSEC_max_key_len_ioctl, UBSEC_F13)) == NULL) {
        UBSECerr(UBSEC_F_UBSEC_INIT, UBSEC_R_DSO_FAILURE);
        goto err;
    }

    /* Copy the pointers */
    p_UBSEC_ubsec_bytes_to_bits = p1;
    p_UBSEC_ubsec_bits_to_bytes = p2;
    p_UBSEC_ubsec_open = p3;
    p_UBSEC_ubsec_close = p4;
#  ifndef OPENSSL_NO_DH
    p_UBSEC_diffie_hellman_generate_ioctl = p5;
    p_UBSEC_diffie_hellman_agree_ioctl = p6;
#  endif
#  ifndef OPENSSL_NO_RSA
    p_UBSEC_rsa_mod_exp_ioctl = p7;
    p_UBSEC_rsa_mod_exp_crt_ioctl = p8;
#  endif
#  ifndef OPENSSL_NO_DSA
    p_UBSEC_dsa_sign_ioctl = p9;
    p_UBSEC_dsa_verify_ioctl = p10;
#  endif
    p_UBSEC_math_accelerate_ioctl = p11;
    p_UBSEC_rng_ioctl = p12;
    p_UBSEC_max_key_len_ioctl = p13;

    /* Perform an open to see if there's actually any unit running. */
    if (((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) > 0)
        && (p_UBSEC_max_key_len_ioctl(fd, &max_key_len) == 0)) {
        p_UBSEC_ubsec_close(fd);
        return 1;
    } else {
        UBSECerr(UBSEC_F_UBSEC_INIT, UBSEC_R_UNIT_FAILURE);
    }

 err:
    DSO_free(ubsec_dso);
    ubsec_dso = NULL;
    p_UBSEC_ubsec_bytes_to_bits = NULL;
    p_UBSEC_ubsec_bits_to_bytes = NULL;
    p_UBSEC_ubsec_open = NULL;
    p_UBSEC_ubsec_close = NULL;
#  ifndef OPENSSL_NO_DH
    p_UBSEC_diffie_hellman_generate_ioctl = NULL;
    p_UBSEC_diffie_hellman_agree_ioctl = NULL;
#  endif
#  ifndef OPENSSL_NO_RSA
    p_UBSEC_rsa_mod_exp_ioctl = NULL;
    p_UBSEC_rsa_mod_exp_crt_ioctl = NULL;
#  endif
#  ifndef OPENSSL_NO_DSA
    p_UBSEC_dsa_sign_ioctl = NULL;
    p_UBSEC_dsa_verify_ioctl = NULL;
#  endif
    p_UBSEC_math_accelerate_ioctl = NULL;
    p_UBSEC_rng_ioctl = NULL;
    p_UBSEC_max_key_len_ioctl = NULL;

    return 0;
}
예제 #2
0
int cluster_labs_init(ENGINE *e)
{

    cl_engine_init *p1;
    cl_mod_exp *p2;
    cl_mod_exp_crt *p3;
    cl_rsa_mod_exp *p4;
    cl_rsa_priv_enc *p5;
    cl_rsa_priv_dec *p6;
    cl_rsa_pub_enc *p7;
    cl_rsa_pub_dec *p8;
    cl_rand_bytes *p20;
    cl_dsa_sign *p30;
    cl_dsa_verify *p31;

    /* engine already loaded */
    if (cluster_labs_dso != NULL) {
        CLerr(CL_F_CLUSTER_LABS_INIT, CL_R_ALREADY_LOADED);
        goto err;
    }
    /* try to load engine    */
    cluster_labs_dso = DSO_load(NULL, CLUSTER_LABS_LIB_NAME, NULL, 0);
    if (cluster_labs_dso == NULL) {
        CLerr(CL_F_CLUSTER_LABS_INIT, CL_R_DSO_FAILURE);
        goto err;
    }
    /* bind functions */
#define BINDIT(t, name) (t *)DSO_bind_func(cluster_labs_dso, name)
    if ((p1 = (cl_engine_init, CLUSTER_LABS_F1)) == NULL
        || (p2 = BINDIT(cl_mod_exp, CLUSTER_LABS_F2)) == NULL
        || (p3 = BINDIT(cl_mod_exp_crt, CLUSTER_LABS_F3)) == NULL
        || (p4 = BINDIT(cl_rsa_mod_exp, CLUSTER_LABS_F4)) == NULL
        || (p5 = BINDIT(cl_rsa_priv_enc, CLUSTER_LABS_F5)) == NULL
        || (p6 = BINDIT(cl_rsa_priv_dec, CLUSTER_LABS_F6)) == NULL
        || (p7 = BINDIT(cl_rsa_pub_enc, CLUSTER_LABS_F7)) == NULL
        || (p8 = BINDIT(cl_rsa_pub_dec, CLUSTER_LABS_F8)) == NULL
        || (p20 = BINDIT(cl_rand_bytes, CLUSTER_LABS_F20)) == NULL
        || (p30 = BINDIT(cl_dsa_sign, CLUSTER_LABS_F30)) == NULL
        || (p31 = BINDIT(cl_dsa_verify, CLUSTER_LABS_F31)) == NULL) {
        CLerr(CL_F_CLUSTER_LABS_INIT, CL_R_DSO_FAILURE);
        goto err;
    }

    /* copy function pointers */
    p_cl_engine_init = p1;
    p_cl_mod_exp = p2;
    p_cl_mod_exp_crt = p3;
    p_cl_rsa_mod_exp = p4;
    p_cl_rsa_priv_enc = p5;
    p_cl_rsa_priv_dec = p6;
    p_cl_rsa_pub_enc = p7;
    p_cl_rsa_pub_dec = p8;
    p_cl_rand_bytes = p20;
    p_cl_dsa_sign = p30;
    p_cl_dsa_verify = p31;

    /* cluster labs engine init */
    if (p_cl_engine_init() == 0) {
        CLerr(CL_F_CLUSTER_LABS_INIT, CL_R_INIT_FAILED);
        goto err;
    }

    return (1);

 err:
    /* reset all pointers */
    DSO_free(cluster_labs_dso);
    cluster_labs_dso = NULL;
    p_cl_engine_init = NULL;
    p_cl_mod_exp = NULL;
    p_cl_mod_exp_crt = NULL;
    p_cl_rsa_mod_exp = NULL;
    p_cl_rsa_priv_enc = NULL;
    p_cl_rsa_priv_dec = NULL;
    p_cl_rsa_pub_enc = NULL;
    p_cl_rsa_pub_dec = NULL;
    p_cl_rand_bytes = NULL;
    p_cl_dsa_sign = NULL;
    p_cl_dsa_verify = NULL;

    return (0);
}
예제 #3
0
파일: e_chil.c 프로젝트: 1234-/openssl
/* (de)initialisation functions. */
static int hwcrhk_init(ENGINE *e)
{
    HWCryptoHook_Init_t *p1;
    HWCryptoHook_Finish_t *p2;
    HWCryptoHook_ModExp_t *p3;
#  ifndef OPENSSL_NO_RSA
    HWCryptoHook_RSA_t *p4;
    HWCryptoHook_RSALoadKey_t *p5;
    HWCryptoHook_RSAGetPublicKey_t *p6;
    HWCryptoHook_RSAUnloadKey_t *p7;
#  endif
    HWCryptoHook_RandomBytes_t *p8;
    HWCryptoHook_ModExpCRT_t *p9;

    if (hwcrhk_dso != NULL) {
        HWCRHKerr(HWCRHK_F_HWCRHK_INIT, HWCRHK_R_ALREADY_LOADED);
        goto err;
    }
    /* Attempt to load libnfhwcrhk.so/nfhwcrhk.dll/whatever. */
    hwcrhk_dso = DSO_load(NULL, get_HWCRHK_LIBNAME(), NULL, 0);
    if (hwcrhk_dso == NULL) {
        HWCRHKerr(HWCRHK_F_HWCRHK_INIT, HWCRHK_R_DSO_FAILURE);
        goto err;
    }

#define BINDIT(t, name) (t *)DSO_bind_func(hwcrhk_dso, name)
    if ((p1 = BINDIT(HWCryptoHook_Init_t, n_hwcrhk_Init)) == NULL
        || (p2 = BINDIT(HWCryptoHook_Finish_t, n_hwcrhk_Finish)) == NULL
        || (p3 = BINDIT(HWCryptoHook_ModExp_t, n_hwcrhk_ModExp)) == NULL
#  ifndef OPENSSL_NO_RSA
        || (p4 = BINDIT(HWCryptoHook_RSA_t, n_hwcrhk_RSA)) == NULL
        || (p5 = BINDIT(HWCryptoHook_RSALoadKey_t, n_hwcrhk_RSALoadKey)) == NULL
        || (p6 = BINDIT(HWCryptoHook_RSAGetPublicKey_t, n_hwcrhk_RSAGetPublicKey)) == NULL
        || (p7 = BINDIT(HWCryptoHook_RSAUnloadKey_t, n_hwcrhk_RSAUnloadKey)) == NULL
#  endif
        || (p8 = BINDIT(HWCryptoHook_RandomBytes_t, n_hwcrhk_RandomBytes)) == NULL
        || (p9 = BINDIT(HWCryptoHook_ModExpCRT_t, n_hwcrhk_ModExpCRT)) == NULL) {
        HWCRHKerr(HWCRHK_F_HWCRHK_INIT, HWCRHK_R_DSO_FAILURE);
        goto err;
    }
    /* Copy the pointers */
    p_hwcrhk_Init = p1;
    p_hwcrhk_Finish = p2;
    p_hwcrhk_ModExp = p3;
#  ifndef OPENSSL_NO_RSA
    p_hwcrhk_RSA = p4;
    p_hwcrhk_RSALoadKey = p5;
    p_hwcrhk_RSAGetPublicKey = p6;
    p_hwcrhk_RSAUnloadKey = p7;
#  endif
    p_hwcrhk_RandomBytes = p8;
    p_hwcrhk_ModExpCRT = p9;

    /*
     * Check if the application decided to support dynamic locks, and if it
     * does, use them.
     */
    if (disable_mutex_callbacks == 0) {
        hwcrhk_globals.mutex_init = hwcrhk_mutex_init;
        hwcrhk_globals.mutex_acquire = hwcrhk_mutex_lock;
        hwcrhk_globals.mutex_release = hwcrhk_mutex_unlock;
        hwcrhk_globals.mutex_destroy = hwcrhk_mutex_destroy;
    }

    /*
     * Try and get a context - if not, we may have a DSO but no accelerator!
     */
    if (!get_context(&hwcrhk_context, &password_context)) {
        HWCRHKerr(HWCRHK_F_HWCRHK_INIT, HWCRHK_R_UNIT_FAILURE);
        goto err;
    }
    /* Everything's fine. */
#  ifndef OPENSSL_NO_RSA
    if (hndidx_rsa == -1)
        hndidx_rsa = RSA_get_ex_new_index(0,
                                          "nFast HWCryptoHook RSA key handle",
                                          NULL, NULL, NULL);
#  endif
    return 1;
 err:
    DSO_free(hwcrhk_dso);
    hwcrhk_dso = NULL;
    p_hwcrhk_Init = NULL;
    p_hwcrhk_Finish = NULL;
    p_hwcrhk_ModExp = NULL;
#  ifndef OPENSSL_NO_RSA
    p_hwcrhk_RSA = NULL;
    p_hwcrhk_RSALoadKey = NULL;
    p_hwcrhk_RSAGetPublicKey = NULL;
    p_hwcrhk_RSAUnloadKey = NULL;
#  endif
    p_hwcrhk_ModExpCRT = NULL;
    p_hwcrhk_RandomBytes = NULL;
    return 0;
}