OpenSsl20XNativeJna.java
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.apache.commons.crypto.jna;
- import java.nio.ByteBuffer;
- import org.apache.commons.crypto.Crypto;
- import com.sun.jna.Native;
- import com.sun.jna.NativeLong;
- import com.sun.jna.ptr.PointerByReference;
- final class OpenSsl20XNativeJna implements OpenSslInterfaceNativeJna {
- static final boolean INIT_OK;
- static final Throwable INIT_ERROR;
- static {
- boolean ok = false;
- Throwable thrown = null;
- try {
- final String libName = System.getProperty(Crypto.CONF_PREFIX + OpenSslNativeJna.class.getSimpleName(), "crypto");
- OpenSslJna.debug("Native.register('%s')", libName);
- Native.register(libName);
- ok = true;
- } catch (final Exception | UnsatisfiedLinkError e) {
- thrown = e;
- } finally {
- INIT_OK = ok;
- INIT_ERROR = thrown;
- }
- }
- // Try to keep methods aligned across versions
- /**
- * Gets engine by id.
- *
- * @param id
- * engine id.
- * @return engine instance
- */
- public static native PointerByReference ENGINE_by_id(String id);
- /**
- * Cleanups before program exit, it will avoid memory leaks.
- *
- * @return 0 on success, 1 otherwise.
- */
- public static native int ENGINE_cleanup();
- /**
- * Releases all functional references.
- *
- * @param e
- * engine reference.
- * @return 0 on success, 1 otherwise.
- */
- public static native int ENGINE_finish(PointerByReference e);
- /**
- * Frees the structural reference
- *
- * @param e
- * engine reference.
- * @return 0 on success, 1 otherwise.
- */
- public static native int ENGINE_free(PointerByReference e);
- /**
- * Obtains a functional reference from an existing structural reference.
- *
- * @param e
- * engine reference
- * @return zero if the ENGINE was not already operational and couldn't be successfully
- * initialized
- */
- public static native int ENGINE_init(PointerByReference e);
- /**
- * Sets the engine as the default for random number generation.
- *
- * @param e
- * engine reference.
- * @param flags
- * ENGINE_METHOD_RAND.
- * @return zero if failed.
- */
- public static native int ENGINE_set_default(PointerByReference e, int flags);
- /**
- * Generates a human-readable string representing the error code e.
- *
- * @see <a href="https://www.openssl.org/docs/man1.0.2/man3/ERR_error_string.html">ERR_error_string</a>
- *
- * @param err
- * the error code
- * @param null_
- * buf is NULL, the error string is placed in a static buffer
- * @return the human-readable error messages.
- */
- public static native String ERR_error_string(NativeLong err, char[] null_);
- // TODO: NOT USED?
- /**
- * Registers the error strings for all libcrypto functions.
- */
- public static native void ERR_load_crypto_strings();
- /**
- * @return the earliest error code from the thread's error queue without modifying it.
- */
- public static native NativeLong ERR_peek_error();
- /**
- * @return an OpenSSL AES EVP cipher instance with a 128-bit key CBC mode.
- */
- public static native PointerByReference EVP_aes_128_cbc();
- /**
- * @return an OpenSSL AES EVP cipher instance with a 128-bit key CTR mode.
- */
- public static native PointerByReference EVP_aes_128_ctr();
- /**
- * @return an OpenSSL AES EVP cipher instance with a 192-bit key CBC mode.
- */
- public static native PointerByReference EVP_aes_192_cbc();
- /**
- * @return an OpenSSL AES EVP cipher instance with a 192-bit key CTR mode.
- */
- public static native PointerByReference EVP_aes_192_ctr();
- /**
- * @return an OpenSSL AES EVP cipher instance with a 256-bit key CBC mode.
- */
- public static native PointerByReference EVP_aes_256_cbc();
- /**
- * @return an OpenSSL AES EVP cipher instance with a 256-bit key CTR mode.
- */
- public static native PointerByReference EVP_aes_256_ctr();
- /**
- * Clears all information from a cipher context and free up any allocated * memory associate
- * with it.
- *
- * @param c
- * openssl evp cipher
- */
- public static native void EVP_CIPHER_CTX_cleanup(PointerByReference c);
- /**
- * Clears all information from a cipher context and free up any allocated memory associate with
- * it, including ctx itself.
- *
- * @param c
- * openssl evp cipher
- */
- public static native void EVP_CIPHER_CTX_free(PointerByReference c);
- // TODO: NOT USED?
- /**
- * EVP_CIPHER_CTX_init() remains as an alias for EVP_CIPHER_CTX_reset.
- *
- * @param p
- * cipher context
- */
- public static native void EVP_CIPHER_CTX_init(PointerByReference p);
- /**
- * Creates a cipher context.
- *
- * @return a pointer to a newly created EVP_CIPHER_CTX for success and NULL for failure.
- */
- public static native PointerByReference EVP_CIPHER_CTX_new();
- /**
- * Enables or disables padding.
- *
- * @param c
- * cipher context.
- * @param pad
- * If the pad parameter is zero then no padding is performed.
- * @return always returns 1
- */
- public static native int EVP_CIPHER_CTX_set_padding(PointerByReference c, int pad);
- /**
- * Finishes a multiple-part operation.
- *
- * @param ctx
- * cipher context
- * @param bout
- * output byte buffer
- * @param outl
- * output length
- * @return 1 for success and 0 for failure.
- */
- public static native int EVP_CipherFinal_ex(PointerByReference ctx, ByteBuffer bout,
- int[] outl);
- /**
- * Init a cipher.
- *
- * @param ctx
- * cipher context
- * @param cipher
- * evp cipher instance
- * @param impl
- * engine
- * @param key
- * key
- * @param iv
- * iv
- * @param enc
- * 1 for encryption, 0 for decryption
- * @return 1 for success and 0 for failure.
- */
- public static native int EVP_CipherInit_ex(PointerByReference ctx, PointerByReference cipher,
- PointerByReference impl, byte[] key, byte[] iv, int enc);
- // ENGINE API: https://www.openssl.org/docs/man1.0.2/man3/engine.html
- /**
- * Continues a multiple-part encryption/decryption operation.
- *
- * @param ctx
- * cipher context
- * @param bout
- * output byte buffer
- * @param outl
- * output length
- * @param in
- * input byte buffer
- * @param inl
- * input length
- * @return 1 for success and 0 for failure.
- */
- public static native int EVP_CipherUpdate(PointerByReference ctx, ByteBuffer bout, int[] outl,
- ByteBuffer in, int inl);
- /**
- * Generates random data.
- *
- * @param buf
- * the bytes for generated random.
- * @param num
- * buffer length.
- * @return 1 on success, 0 otherwise.
- */
- public static native int RAND_bytes(ByteBuffer buf, int num);
- // Random generator
- /**
- * OpenSSL uses for random number generation.
- *
- * @return pointers to the respective methods.
- */
- public static native PointerByReference RAND_get_rand_method();
- /**
- * OpenSSL uses for random number generation.
- *
- * @return pointers to the respective methods.
- */
- public static native PointerByReference RAND_SSLeay();
- /**
- * TODO (does not appear to be used yet)
- * @return OPENSSL_VERSION_NUMBER which is a numeric release version identifier
- */
- public static native NativeLong SSLeay();
- /**
- * Retrieves version/build information about OpenSSL library.
- * This is returned by {@link OpenSslNativeJna#OpenSSLVersion(int)}
- *
- * @param type
- * type can be SSLEAY_VERSION, SSLEAY_CFLAGS, SSLEAY_BUILT_ON...
- * @return A pointer to a constant string describing the version of the OpenSSL library or
- * giving information about the library build.
- */
- public static native String SSLeay_version(int type);
- // ================== instance interface methods ==================
- @Override
- public PointerByReference _ENGINE_by_id(final String string) {
- return ENGINE_by_id(string);
- }
- @Override
- public int _ENGINE_cleanup() {
- return ENGINE_cleanup();
- }
- @Override
- public int _ENGINE_finish(final PointerByReference rdrandEngine) {
- return ENGINE_finish(rdrandEngine);
- }
- @Override
- public int _ENGINE_free(final PointerByReference rdrandEngine) {
- return ENGINE_free(rdrandEngine);
- }
- @Override
- public int _ENGINE_init(final PointerByReference rdrandEngine) {
- return ENGINE_init(rdrandEngine);
- }
- @Override
- public void _ENGINE_load_rdrand() {
- // Not available
- }
- @Override
- public int _ENGINE_set_default(final PointerByReference rdrandEngine, final int flags) {
- return ENGINE_set_default(rdrandEngine, flags);
- }
- @Override
- public String _ERR_error_string(final NativeLong err, final char[] buff) {
- return ERR_error_string(err, buff);
- }
- @Override
- public NativeLong _ERR_peek_error() {
- return ERR_peek_error();
- }
- @Override
- public PointerByReference _EVP_aes_128_cbc() {
- return EVP_aes_128_cbc();
- }
- @Override
- public PointerByReference _EVP_aes_128_ctr() {
- return EVP_aes_128_ctr();
- }
- @Override
- public PointerByReference _EVP_aes_192_cbc() {
- return EVP_aes_192_cbc();
- }
- @Override
- public PointerByReference _EVP_aes_192_ctr() {
- return EVP_aes_192_ctr();
- }
- @Override
- public PointerByReference _EVP_aes_256_cbc() {
- return EVP_aes_256_cbc();
- }
- @Override
- public PointerByReference _EVP_aes_256_ctr() {
- return EVP_aes_256_ctr();
- }
- @Override
- public void _EVP_CIPHER_CTX_cleanup(final PointerByReference context) {
- EVP_CIPHER_CTX_cleanup(context);
- }
- @Override
- public void _EVP_CIPHER_CTX_free(final PointerByReference context) {
- EVP_CIPHER_CTX_free(context);
- }
- @Override
- public PointerByReference _EVP_CIPHER_CTX_new() {
- return EVP_CIPHER_CTX_new();
- }
- @Override
- public int _EVP_CIPHER_CTX_set_padding(final PointerByReference context, final int padding) {
- return EVP_CIPHER_CTX_set_padding(context, padding);
- }
- @Override
- public int _EVP_CipherFinal_ex(final PointerByReference context, final ByteBuffer outBuffer, final int[] outlen) {
- return EVP_CipherFinal_ex(context, outBuffer, outlen);
- }
- @Override
- public int _EVP_CipherInit_ex(final PointerByReference context, final PointerByReference algo, final PointerByReference impl, final byte[] encoded,
- final byte[] iv, final int cipherMode) {
- return EVP_CipherInit_ex(context, algo, impl, encoded, iv, cipherMode);
- }
- @Override
- public int _EVP_CipherUpdate(final PointerByReference context, final ByteBuffer outBuffer, final int[] outlen, final ByteBuffer inBuffer,
- final int remaining) {
- return EVP_CipherUpdate(context, outBuffer, outlen, inBuffer, remaining);
- }
- @Override
- public Throwable _INIT_ERROR() {
- return INIT_ERROR;
- }
- @Override
- public boolean _INIT_OK() {
- return INIT_OK;
- }
- @Override
- public String _OpenSSL_version(final int i) {
- return SSLeay_version(i);
- }
- @Override
- public int _RAND_bytes(final ByteBuffer buf, final int length) {
- return RAND_bytes(buf, length) ;
- }
- @Override
- public PointerByReference _RAND_get_rand_method() {
- return RAND_get_rand_method();
- }
- @Override
- public PointerByReference _RAND_SSLeay() {
- return RAND_SSLeay();
- }
- }