1 /*
   2  * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #ifndef SPARCT4_NATIVE_FUNC_H
  27 #define SPARCT4_NATIVE_FUNC_H
  28 #include <md5.h>
  29 #include <sha1.h>
  30 #include <sha2.h>
  31 #include <libsoftcrypto.h> // redirects to libucrypto.h starting 11.3
  32 
  33 jboolean* loadNative();
  34 
  35 /* function pointer definitions */
  36 
  37 typedef void (*MD5INIT_FN_PTR)(MD5_CTX *context);
  38 
  39 typedef void (*MD5UPDATE_FN_PTR)
  40      (MD5_CTX *context, unsigned char *input,
  41       unsigned int inlen);
  42 
  43 typedef void (*MD5FINAL_FN_PTR)
  44      (unsigned char *output, MD5_CTX *context);
  45 
  46 typedef void (*SHA1INIT_FN_PTR)(SHA1_CTX *context);
  47 
  48 typedef void (*SHA1UPDATE_FN_PTR)
  49      (SHA1_CTX *context, unsigned char *input,
  50       unsigned int inlen);
  51 
  52 typedef void (*SHA1FINAL_FN_PTR)
  53      (unsigned char *output, SHA1_CTX *context);
  54 
  55 typedef void (*SHA2INIT_FN_PTR)(uint64_t mech, SHA2_CTX *context);
  56 
  57 typedef void (*SHA2UPDATE_FN_PTR)
  58      (SHA2_CTX *context, unsigned char *input,
  59       unsigned int inlen);
  60 
  61 typedef void (*SHA2FINAL_FN_PTR)
  62      (unsigned char *output, SHA2_CTX *context);
  63 
  64 typedef int (*UCRYPTO_VERSION_FN_PTR)();
  65 
  66 typedef int (*UCRYPTO_GET_MECHLIST_FN_PTR)(char *str);
  67 
  68 typedef int (*UCRYPTO_ENCRYPT_INIT_FN_PTR)
  69      (crypto_ctx_t *context, ucrypto_mech_t mech_type,
  70       uchar_t *key_str, size_t key_len,
  71       void *iv, size_t iv_len);
  72 typedef int (*UCRYPTO_ENCRYPT_UPDATE_FN_PTR)
  73      (crypto_ctx_t *context, uchar_t *in,
  74       size_t in_len, uchar_t *out, size_t *out_len);
  75 typedef int (*UCRYPTO_ENCRYPT_FINAL_FN_PTR)
  76      (crypto_ctx_t *context, uchar_t *out,
  77       size_t *out_len);
  78 typedef int (*UCRYPTO_ENCRYPT_FN_PTR)
  79      (ucrypto_mech_t mech_type, uchar_t *key_str,
  80       size_t key_len, void *iv, size_t iv_len, uchar_t *in,
  81       size_t in_len, uchar_t *out, size_t *out_len);
  82 
  83 typedef int (*UCRYPTO_DECRYPT_INIT_FN_PTR)
  84      (crypto_ctx_t *context,
  85       ucrypto_mech_t mech_type, uchar_t *key_str, size_t key_len,
  86       void *iv, size_t iv_len);
  87 typedef int (*UCRYPTO_DECRYPT_UPDATE_FN_PTR)
  88      (crypto_ctx_t *context, uchar_t *in,
  89       size_t in_len, uchar_t *out, size_t *out_len);
  90 typedef int (*UCRYPTO_DECRYPT_FINAL_FN_PTR)
  91      (crypto_ctx_t *context, uchar_t *out,
  92       size_t *out_len);
  93 typedef int (*UCRYPTO_DECRYPT_FN_PTR)
  94      (ucrypto_mech_t mech_type, uchar_t *key_str,
  95       size_t key_len, void *iv, size_t iv_len, uchar_t *in,
  96       size_t in_len, uchar_t *out, size_t *out_len);
  97 
  98 typedef int (*UCRYPTO_SIGN_INIT_FN_PTR)
  99      (crypto_ctx_t *context, ucrypto_mech_t mech_type,
 100       uchar_t *key_str, size_t key_len,
 101       void *iv, size_t iv_len);
 102 typedef int (*UCRYPTO_SIGN_UPDATE_FN_PTR)
 103      (crypto_ctx_t *context, uchar_t *data_str, size_t data_len);
 104 typedef int (*UCRYPTO_SIGN_FINAL_FN_PTR)
 105      (crypto_ctx_t *context, uchar_t *sig_str, size_t *sig_len);
 106 
 107 typedef int (*UCRYPTO_VERIFY_INIT_FN_PTR)
 108      (crypto_ctx_t *context, ucrypto_mech_t mech_type,
 109       uchar_t *key_str, size_t key_len,
 110       void *iv, size_t iv_len);
 111 typedef int (*UCRYPTO_VERIFY_UPDATE_FN_PTR)
 112      (crypto_ctx_t *context, uchar_t *data_str, size_t data_len);
 113 typedef int (*UCRYPTO_VERIFY_FINAL_FN_PTR)
 114      (crypto_ctx_t *context, uchar_t *sig_str, size_t *sig_len);
 115 
 116 typedef int (*UCRYPTO_DIGEST_INIT_FN_PTR)
 117      (crypto_ctx_t *context, ucrypto_mech_t mech_type,
 118       void *param, size_t param_len);
 119 typedef int (*UCRYPTO_DIGEST_UPDATE_FN_PTR)
 120      (crypto_ctx_t *context, const uchar_t *data, size_t data_len);
 121 typedef int (*UCRYPTO_DIGEST_FINAL_FN_PTR)
 122      (crypto_ctx_t *context, uchar_t *digest, size_t *digest_len);
 123 
 124 typedef void (*UCRYPTO_FREE_CONTEXT_FN_PTR)
 125      (crypto_ctx_t *context);
 126 
 127 typedef char* (*UCRYPTO_STRERROR_FN_PTR)(int rv);
 128 
 129 
 130 
 131 /* dynamically resolved functions from libmd, and libsoftcrypto
 132    libraries */
 133 typedef struct T4CRYPTO_FUNCTION_TABLE {
 134   MD5INIT_FN_PTR                 md5Init;
 135   MD5UPDATE_FN_PTR               md5Update;
 136   MD5FINAL_FN_PTR                md5Final;
 137   SHA1INIT_FN_PTR                sha1Init;
 138   SHA1UPDATE_FN_PTR              sha1Update;
 139   SHA1FINAL_FN_PTR               sha1Final;
 140   SHA2INIT_FN_PTR                sha2Init;
 141   SHA2UPDATE_FN_PTR              sha2Update;
 142   SHA2FINAL_FN_PTR               sha2Final;
 143   UCRYPTO_VERSION_FN_PTR         ucryptoVersion;
 144   UCRYPTO_GET_MECHLIST_FN_PTR    ucryptoGetMechList;
 145   UCRYPTO_ENCRYPT_INIT_FN_PTR    ucryptoEncryptInit;
 146   UCRYPTO_ENCRYPT_UPDATE_FN_PTR  ucryptoEncryptUpdate;
 147   UCRYPTO_ENCRYPT_FINAL_FN_PTR   ucryptoEncryptFinal;
 148   UCRYPTO_ENCRYPT_FN_PTR         ucryptoEncrypt;
 149   UCRYPTO_DECRYPT_INIT_FN_PTR    ucryptoDecryptInit;
 150   UCRYPTO_DECRYPT_UPDATE_FN_PTR  ucryptoDecryptUpdate;
 151   UCRYPTO_DECRYPT_FINAL_FN_PTR   ucryptoDecryptFinal;
 152   UCRYPTO_DECRYPT_FN_PTR         ucryptoDecrypt;
 153   UCRYPTO_SIGN_INIT_FN_PTR       ucryptoSignInit;
 154   UCRYPTO_SIGN_UPDATE_FN_PTR     ucryptoSignUpdate;
 155   UCRYPTO_SIGN_FINAL_FN_PTR      ucryptoSignFinal;
 156   UCRYPTO_VERIFY_INIT_FN_PTR     ucryptoVerifyInit;
 157   UCRYPTO_VERIFY_UPDATE_FN_PTR   ucryptoVerifyUpdate;
 158   UCRYPTO_VERIFY_FINAL_FN_PTR    ucryptoVerifyFinal;
 159   UCRYPTO_DIGEST_INIT_FN_PTR     ucryptoDigestInit;
 160   UCRYPTO_DIGEST_UPDATE_FN_PTR   ucryptoDigestUpdate;
 161   UCRYPTO_DIGEST_FINAL_FN_PTR    ucryptoDigestFinal;
 162   UCRYPTO_FREE_CONTEXT_FN_PTR    ucryptoFreeContext;
 163   UCRYPTO_STRERROR_FN_PTR        ucryptoStrerror;
 164 } T4CRYPTO_FUNCTION_TABLE;
 165 
 166 typedef T4CRYPTO_FUNCTION_TABLE *T4CRYPTO_FUNCTION_TABLE_PTR;
 167 
 168 /* global function table */
 169 T4CRYPTO_FUNCTION_TABLE_PTR ftab;
 170 
 171 #endif