1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 * <p>
10 * http://www.apache.org/licenses/LICENSE-2.0
11 * <p>
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package org.apache.commons.crypto.cipher;
19
20 import java.nio.ByteBuffer;
21
22 /**
23 * JNI implementation for OpenSSL 1.x called from {@link OpenSsl}. The native methods in this
24 * class are defined in OpenSslNative.h (generated by javah).
25 */
26 final class OpenSslNative {
27
28 /**
29 * Cleans the context at native.
30 *
31 * @param context The cipher context address
32 */
33 public static native void clean(long context);
34
35 /**
36 * Allows various cipher specific parameters to be determined and set.
37 *
38 * it will call OpenSSL's API
39 * int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
40 * In OpenSSL, data type of ptr can be char* or long*. Here, we map java's
41 * byte[] to native void*ptr. Note that the byte order is ByteOrder.nativeOrder.
42 *
43 * @param context The cipher context address
44 * @param type CtrlValues
45 * @param arg argument like a tag length
46 * @param data byte buffer or null
47 * @return return 0 if there is any error, else return 1.
48 */
49 public static native int ctrl(long context, int type, int arg, byte[] data);
50
51 /**
52 * Finishes a multiple-part operation. The data is encrypted or decrypted,
53 * depending on how this cipher was initialized.
54 *
55 * @param context The cipher context address
56 * @param output The byte buffer for the result
57 * @param offset The offset in output where the result is stored
58 * @param maxOutputLength The maximum length for output
59 * @return The number of bytes stored in output
60 */
61 public static native int doFinal(long context, ByteBuffer output,
62 int offset, int maxOutputLength);
63
64 /**
65 * Finishes a multiple-part operation. The data is encrypted or decrypted,
66 * depending on how this cipher was initialized.
67 *
68 * @param context The cipher context address
69 * @param output The byte array for the result
70 * @param offset The offset in output where the result is stored
71 * @param maxOutputLength The maximum length for output
72 * @return The number of bytes stored in output
73 */
74 public static native int doFinalByteArray(long context, byte[] output,
75 int offset, int maxOutputLength);
76
77 /**
78 * Declares a native method to initialize the cipher context.
79 *
80 * @param context The cipher context address
81 * @param mode ENCRYPT_MODE or DECRYPT_MODE
82 * @param alg Algorithm Mode of OpenSsl
83 * @param padding the padding mode of OpenSsl cipher
84 * @param key crypto key
85 * @param iv crypto iv
86 * @return the context address of cipher
87 */
88 public static native long init(long context, int mode, int alg,
89 int padding, byte[] key, byte[] iv);
90
91 /**
92 * Declares a native method to initialize the cipher context.
93 *
94 * @param algorithm The algorithm name of cipher
95 * @param padding The padding name of cipher
96 * @return the context address of cipher
97 */
98 public static native long initContext(int algorithm, int padding);
99
100 /**
101 * Declares a native method to initialize JNI field and method IDs.
102 */
103 public static native void initIDs();
104
105 /**
106 * Continues a multiple-part encryption/decryption operation. The data is
107 * encrypted or decrypted, depending on how this cipher was initialized.
108 *
109 * @param context The cipher context address
110 * @param input The input byte buffer
111 * @param inputOffset The offset in input where the input starts
112 * @param inputLength The input length
113 * @param output The byte buffer for the result
114 * @param outputOffset The offset in output where the result is stored
115 * @param maxOutputLength The maximum length for output
116 * @return The number of bytes stored in output
117 */
118 public static native int update(long context, ByteBuffer input,
119 int inputOffset, int inputLength, ByteBuffer output,
120 int outputOffset, int maxOutputLength);
121
122 /**
123 * Continues a multiple-part encryption/decryption operation. The data is
124 * encrypted or decrypted, depending on how this cipher was initialized.
125 *
126 * @param context The cipher context address
127 * @param input The input byte array
128 * @param inputOffset The offset in input where the input starts
129 * @param inputLength The input length
130 * @param output The byte array for the result
131 * @param outputOffset The offset in output where the result is stored
132 * @param maxOutputLength The maximum length for output
133 * @return The number of bytes stored in output
134 */
135 public static native int updateByteArray(long context, byte[] input,
136 int inputOffset, int inputLength, byte[] output, int outputOffset,
137 int maxOutputLength);
138
139 /**
140 * Continues a multiple-part encryption/decryption operation. The data is
141 * encrypted or decrypted, depending on how this cipher was initialized.
142 *
143 * @param context The cipher context address
144 * @param input The input byte array
145 * @param inputOffset The offset in input where the input starts
146 * @param inputLength The input length
147 * @param output The byte buffer for the result
148 * @param outputOffset The offset in output where the result is stored
149 * @param maxOutputLength The maximum length for output
150 * @return The number of bytes stored in output
151 */
152 public static native int updateByteArrayByteBuffer(long context, byte[] input,
153 int inputOffset, int inputLength,
154 ByteBuffer output, int outputOffset, int maxOutputLength);
155
156 /**
157 * Hides this constructor from external access.
158 */
159 private OpenSslNative() {
160 }
161 }