diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:14 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:14 -0800 |
commit | 1c0fed63c71ddb230f3b304aac12caffbedf2f21 (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /openssl | |
parent | 2fb02ef3025449e24e756a7f645ea6eab7a1fd4f (diff) | |
download | libcore-1c0fed63c71ddb230f3b304aac12caffbedf2f21.zip libcore-1c0fed63c71ddb230f3b304aac12caffbedf2f21.tar.gz libcore-1c0fed63c71ddb230f3b304aac12caffbedf2f21.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'openssl')
-rw-r--r-- | openssl/src/main/java/org/openssl/NativeBN.java | 184 | ||||
-rw-r--r-- | openssl/src/main/native/BNInterface.c | 878 | ||||
-rw-r--r-- | openssl/src/main/native/sub.mk | 18 |
3 files changed, 0 insertions, 1080 deletions
diff --git a/openssl/src/main/java/org/openssl/NativeBN.java b/openssl/src/main/java/org/openssl/NativeBN.java deleted file mode 100644 index 44464e0..0000000 --- a/openssl/src/main/java/org/openssl/NativeBN.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed 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.openssl; - -public class NativeBN { - - public static native int ERR_get_error(); - // unsigned long ERR_get_error(void); - - public static native String ERR_error_string(int e); - // char *ERR_error_string(unsigned long e, char *buf); - - public static native int BN_CTX_new(); - // BN_CTX *BN_CTX_new(void); - - public static native int BN_new(); - // BIGNUM *BN_new(void); - - public static native void BN_free(int a); - // void BN_free(BIGNUM *a); - - public static native int BN_cmp(int a, int b); - // int BN_cmp(const BIGNUM *a, const BIGNUM *b); - - public static native boolean BN_copy(int to, int from); - // Returns boolean success AND NOT result BIGNUM handle! - // BIGNUM *BN_copy(BIGNUM *to, const BIGNUM *from); -// public static native int BN_dup(int from); - // BIGNUM *BN_dup(const BIGNUM *a); - - - public static native boolean putLongInt(int a, long dw); - - public static native boolean putULongInt(int a, long dw, boolean neg); - - public static native int BN_dec2bn(int a, String str); - // int BN_dec2bn(BIGNUM **a, const char *str); - - public static native int BN_hex2bn(int a, String str); - // int BN_hex2bn(BIGNUM **a, const char *str); - - public static native boolean BN_bin2bn(byte[] s, int len, boolean neg, int ret); - // Returns boolean success AND NOT result BIGNUM handle! - // BIGNUM * BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); - // BN-Docu: s is taken as unsigned big endian; - // Additional parameter: neg. - - public static native boolean litEndInts2bn(int[] ints, int len, boolean neg, int ret); - - public static native boolean twosComp2bn(byte[] s, int len, int ret); - - - public static native long longInt(int a); - // unsigned long BN_get_word(BIGNUM *a); - - public static native String BN_bn2dec(int a); - // char * BN_bn2dec(const BIGNUM *a); - - public static native String BN_bn2hex(int a); - // char * BN_bn2hex(const BIGNUM *a); - - public static native byte[] BN_bn2bin(int a, byte[] to); - // Returns result byte[] AND NOT length. - // int BN_bn2bin(const BIGNUM *a, unsigned char *to); - - public static native int[] bn2litEndInts(int a, int[] to); - - public static native byte[] bn2twosComp(int a, byte[] to); - - - public static native int sign(int a); - // Returns -1, 0, 1 AND NOT boolean. - // #define BN_is_negative(a) ((a)->neg != 0) - - public static native void BN_set_negative(int b, int n); - // void BN_set_negative(BIGNUM *b, int n); - - - public static native boolean twosCompFitsIntoBytes(int a, int byteCnt); - - public static native int bitLength(int a); - - public static native boolean BN_is_bit_set(int a, int n); - // int BN_is_bit_set(const BIGNUM *a, int n); - - public static native boolean modifyBit(int a, int n, int op); - // Returns boolean success. - // op: 0 = reset; 1 = set; -1 = flip - // uses BN_set_bit(), BN_clear_bit() and BN_is_bit_set() - - public static native boolean BN_lshift(int r, int a, int n); - // int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); -// public static native int BN_rshift(BigInteger r, BigInteger a, int n); - // int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); - - - public static native boolean BN_add_word(int a, int w); - // ATTENTION: w is treated as unsigned. - // int BN_add_word(BIGNUM *a, BN_ULONG w); - - public static native boolean BN_sub_word(int a, int w); - // ATTENTION: w is treated as unsigned. - // int BN_sub_word(BIGNUM *a, BN_ULONG w); - - public static native boolean BN_mul_word(int a, int w); - // ATTENTION: w is treated as unsigned. - // int BN_mul_word(BIGNUM *a, BN_ULONG w); - - public static native int BN_div_word(int a, int w); - // ATTENTION: w is treated as unsigned. - // BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); - - public static native int BN_mod_word(int a, int w); - // ATTENTION: w is treated as unsigned. - // BN_ULONG BN_mod_word(BIGNUM *a, BN_ULONG w); - - public static native boolean BN_add(int r, int a, int b); - // int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); - - public static native boolean BN_sub(int r, int a, int b); - // int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); - - - public static native boolean BN_gcd(int r, int a, int b, int ctx); - // int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); - - public static native boolean BN_mul(int r, int a, int b, int ctx); - // int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); - - public static native boolean BN_exp(int r, int a, int p, int ctx); - // int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); - - // OPTIONAL: -// public static native int BN_sqr(BigInteger r, BigInteger a, BN_CTX ctx); - // int BN_sqr(BIGNUM *r, const BIGNUM *a,BN_CTX *ctx); - - public static native boolean BN_div(int dv, int rem, int m, int d, int ctx); - // int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); - - public static native boolean BN_nnmod(int r, int a, int m, int ctx); - // int BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); - - public static native boolean BN_mod_exp(int r, int a, int p, int m, int ctx); - // int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx); - - // OPTIONAL: -// public static native boolean BN_mod_sqr(BigInteger r, BigInteger a, BigInteger m, BN_CTX ctx); - // int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); - - - public static native boolean BN_mod_inverse(int ret, int a, int n, int ctx); - // Returns boolean success AND NOT result BIGNUM handle! - // BIGNUM * BN_mod_inverse(BIGNUM *ret, const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); - - - public static native boolean BN_generate_prime_ex(int ret, int bits, boolean safe, - int add, int rem, int cb); - // int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, - // const BIGNUM *add, const BIGNUM *rem, BN_GENCB *cb); - - public static native boolean BN_is_prime_ex(int p, int nchecks, int ctx, int cb); - // int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); - - // OPTIONAL: - // int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, - // int do_trial_division, BN_GENCB *cb); - -// RAND_add(rnd); - -} diff --git a/openssl/src/main/native/BNInterface.c b/openssl/src/main/native/BNInterface.c deleted file mode 100644 index 4132e4f..0000000 --- a/openssl/src/main/native/BNInterface.c +++ /dev/null @@ -1,878 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed 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. - */ - -/* - * Native glue for Java class org.openssl.NativeBN - */ - -#include <jni.h> -#include <JNIHelp.h> -#include <openssl/err.h> -#include <openssl/crypto.h> -#include <openssl/bn.h> -#include <stdio.h> - -#define mcSignednessBull void * -#ifndef FALSE -#define FALSE 0 -#define TRUE 1 -#endif - - -static void -throwOutOfMemoryException(JNIEnv* env, const char* message) -{ - jniThrowException(env, "java/lang/OutOfMemoryError", message); -} - -static void -throwNewNullPointerException (JNIEnv* env, const char* message) -{ - jniThrowException(env, "java/lang/NullPointerException", message); -} - -static int isValidHandle (JNIEnv* env, void* handle, const char *message) -{ - if (handle == NULL) { - throwNewNullPointerException(env, message); - return FALSE; - } - else return TRUE; -} - -static int oneValidHandle (JNIEnv* env, void* a) -{ - return isValidHandle(env, a, "Mandatory handle (first) passed as null"); -} - -static int twoValidHandles (JNIEnv* env, void* a, void *b) -{ - if (!oneValidHandle(env, a)) return FALSE; - return isValidHandle(env, b, "Mandatory handle (second) passed as null"); -} - -static int threeValidHandles (JNIEnv* env, void* a, void *b, void* c) -{ - if (!twoValidHandles(env, a, b)) return FALSE; - return isValidHandle(env, c, "Mandatory handle (third) passed as null"); -} - -static int fourValidHandles (JNIEnv* env, void* a, void *b, void* c, void* d) -{ - if (!threeValidHandles(env, a, b, c)) return FALSE; - return isValidHandle(env, d, "Mandatory handle (fourth) passed as null"); -} - - -/** - * public static native int ERR_get_error(); - */ -static unsigned long NativeBN_ERR_get_error(JNIEnv* env, jclass cls) { - unsigned long e = ERR_get_error(); - return e; -} - -/** - * public static native String ERR_error_string(int); - */ -static jstring NativeBN_ERR_error_string(JNIEnv* env, jclass cls, unsigned long e) { - jstring returnJString = 0; - char* errStr; - errStr = ERR_error_string(e, NULL); - returnJString = ((*env)->NewStringUTF(env, (mcSignednessBull)errStr)); - return returnJString; -} - - -/** - * public static native int BN_CTX_new() - */ -static BN_CTX* NativeBN_BN_CTX_new(JNIEnv* env, jclass cls) { - return BN_CTX_new(); -} - - -/** - * public static native int BN_new() - */ -static BIGNUM* NativeBN_BN_new(JNIEnv* env, jclass cls) { - return BN_new(); -} - -/** - * public static native int BN_free() - */ -static void NativeBN_BN_free(JNIEnv* env, jclass cls, BIGNUM* a) { - if (!oneValidHandle(env, a)) return; - BN_free(a); -} - - -/** - * public static native int BN_cmp(int, int) - */ -static int NativeBN_BN_cmp(JNIEnv* env, jclass cls, BIGNUM* a, BIGNUM* b) { - if (!twoValidHandles(env, a, b)) return 1; - return BN_cmp(a, b); -} - -/** - * public static native int BN_copy(int, int) - */ -static jboolean NativeBN_BN_copy(JNIEnv* env, jclass cls, BIGNUM* to, BIGNUM* from) { - if (!twoValidHandles(env, to, from)) return FALSE; - return (BN_copy(to, from) != NULL); -} - - -/** - * public static native int putULongInt(int, long, int) - */ -static jboolean NativeBN_putULongInt(JNIEnv* env, jclass cls, BIGNUM* a, unsigned long long dw, jboolean neg) { - if (!oneValidHandle(env, a)) return FALSE; - unsigned int hi = dw >> 32; // This shifts without sign extension. - int lo = (int)dw; // This truncates implicitely. - - // cf. litEndInts2bn: - bn_check_top(a); - if (bn_wexpand(a, 2) != NULL) { - a->d[0] = lo; - a->d[1] = hi; - a->top = 2; - a->neg = neg; - bn_correct_top(a); - return TRUE; - } - else return FALSE; -} - -/** - * public static native int putLongInt(int, long) - */ -static jboolean NativeBN_putLongInt(JNIEnv* env, jclass cls, BIGNUM* a, long long dw) { - if (dw >= 0) return NativeBN_putULongInt(env, cls, a, dw, FALSE); - else return NativeBN_putULongInt(env, cls, a, -dw, TRUE); -} - -/** - * public static native int BN_dec2bn(int, java.lang.String) - */ -static int NativeBN_BN_dec2bn(JNIEnv* env, jclass cls, BIGNUM* a, jstring str) { - if (!oneValidHandle(env, a)) return -1; - char* tmpStr = (char*)(*env)->GetStringUTFChars(env, str, NULL); - if (tmpStr != NULL) { - int len = BN_dec2bn(&a, tmpStr); - (*env)->ReleaseStringUTFChars(env, str, tmpStr); - return len; // len == 0: Error - } - else return -1; // Error outside BN. -} - -/** - * public static native int BN_hex2bn(int, java.lang.String) - */ -static int NativeBN_BN_hex2bn(JNIEnv* env, jclass cls, BIGNUM* a, jstring str) { - if (!oneValidHandle(env, a)) return -1; - char* tmpStr = (char*)(*env)->GetStringUTFChars(env, str, NULL); - if (tmpStr != NULL) { - int len = BN_hex2bn(&a, tmpStr); - (*env)->ReleaseStringUTFChars(env, str, tmpStr); - return len; // len == 0: Error - } - else return -1; // Error outside BN. -} - -/** - * public static native boolean BN_bin2bn(byte[], int, int, int) - */ -static jboolean NativeBN_BN_bin2bn(JNIEnv* env, jclass cls, jbyteArray arr, int len, jboolean neg, BIGNUM* ret) { - if (!oneValidHandle(env, ret)) return FALSE; - jboolean success; - unsigned char * tmpBytes; - tmpBytes = (unsigned char *)((*env)->GetPrimitiveArrayCritical(env, arr, 0)); - if (tmpBytes != NULL) { - success = (BN_bin2bn(tmpBytes, len, ret) != NULL); - if (neg) { - BN_set_negative(ret, 1); - } - (*env)->ReleasePrimitiveArrayCritical(env, arr, tmpBytes, JNI_ABORT); - return success; - } - else return -1; // Error outside BN. mc FIXME: what to do in this case? Does JNI throw exception itself? -} - -/** - * public static native boolean litEndInts2bn(int[], int, int, int) - * Note: - * This procedure directly writes the internal representation of BIGNUMs. - * We do so as there is no direct interface based on Little Endian Integer Arrays. - * Also note that the same representation is used in the Cordoba Java Implementation of BigIntegers, - * whereof certain functionality is still being used. - */ -static jboolean NativeBN_litEndInts2bn(JNIEnv* env, jclass cls, jintArray arr, int len, jboolean neg, BIGNUM* ret) { - if (!oneValidHandle(env, ret)) return FALSE; - bn_check_top(ret); - if (len > 0) { - BN_ULONG* tmpInts; // BN_ULONG is 4 Bytes on this system for sure, i.e. same as jint! - tmpInts = (BN_ULONG*)((*env)->GetPrimitiveArrayCritical(env, arr, 0)); - if ((tmpInts != NULL) && (bn_wexpand(ret, len) != NULL)) { - int i = len; do { i--; ret->d[i] = tmpInts[i]; } while (i > 0); - (*env)->ReleasePrimitiveArrayCritical(env, arr, tmpInts, JNI_ABORT); - ret->top = len; - ret->neg = neg; - // need to call this due to clear byte at top if avoiding - // having the top bit set (-ve number) - // Basically get rid of top zero ints: - bn_correct_top(ret); - return TRUE; - } - else { - if (tmpInts != NULL) - (*env)->ReleasePrimitiveArrayCritical(env, arr, tmpInts, JNI_ABORT); - return FALSE; - } - } - else { // (len = 0) means value = 0 and sign will be 0, too. - ret->top = 0; - return TRUE; - } -} - - -#define BYTES2INT(bytes, k) \ - ( (bytes[k + 3] & 0xFF) \ - | (bytes[k + 2] & 0xFF) << 8 \ - | (bytes[k + 1] & 0xFF) << 16 \ - | (bytes[k + 0] & 0xFF) << 24 ) - -static jboolean negBigEndianBytes2bn(JNIEnv* env, jclass cls, unsigned char* bytes, int bytesLen, BIGNUM* ret) { -// We rely on: (BN_BITS2 == 32), i.e. BN_ULONG is unsigned int and has 4 bytes: -// - bn_check_top(ret); -// FIXME: ASSERT (bytesLen > 0); - int intLen = (bytesLen + 3) / 4; - int firstNonzeroDigit = -2; - if (bn_wexpand(ret, intLen) != NULL) { - BN_ULONG* d = ret->d; - BN_ULONG di; - ret->top = intLen; - int highBytes = bytesLen % 4; - int k = bytesLen; - // Put bytes to the int array starting from the end of the byte array - int i = 0; - while (k > highBytes) { - k -= 4; - di = BYTES2INT(bytes, k); - if (di != 0) { - d[i] = -di; - firstNonzeroDigit = i; - i++; - while (k > highBytes) { - k -= 4; - d[i] = ~BYTES2INT(bytes, k); - i++; - } - break; - } else { - d[i] = 0; - i++; - } - } - if (highBytes != 0) { - di = -1; - // Put the first bytes in the highest element of the int array - if (firstNonzeroDigit != -2) { - for (k = 0; k < highBytes; k++) { - di = (di << 8) | (bytes[k] & 0xFF); - } - d[i] = ~di; - } else { - for (k = 0; k < highBytes; k++) { - di = (di << 8) | (bytes[k] & 0xFF); - } - d[i] = -di; - } - } - return TRUE; - } - else return FALSE; -} - -/** - * public static native boolean twosComp2bn(byte[], int, int) - */ -static jboolean NativeBN_twosComp2bn(JNIEnv* env, jclass cls, jbyteArray arr, int bytesLen, BIGNUM* ret) { - if (!oneValidHandle(env, ret)) return FALSE; - jboolean success; - unsigned char* tmpBytes; - tmpBytes = (unsigned char*)((*env)->GetPrimitiveArrayCritical(env, arr, 0)); - if (tmpBytes != NULL) { - if ((tmpBytes[0] & 0X80) == 0) { // Positive value! - // - // We can use the existing BN implementation for unsigned big endian bytes: - // - success = (BN_bin2bn(tmpBytes, bytesLen, ret) != NULL); - BN_set_negative(ret, FALSE); - } - else { // Negative value! - // - // We need to apply two's complement: - // - success = negBigEndianBytes2bn(env, cls, tmpBytes, bytesLen, ret); - BN_set_negative(ret, TRUE); - } - (*env)->ReleasePrimitiveArrayCritical(env, arr, tmpBytes, JNI_ABORT); - return success; - } - else return -1; // Error outside BN. mc FIXME: what to do in this case? Does JNI throw exception itself? -} - - -/** - * public static native long longInt(int) - */ -static long long NativeBN_longInt(JNIEnv* env, jclass cls, BIGNUM* a) { - if (!oneValidHandle(env, a)) return -1; - bn_check_top(a); - int intLen = a->top; - BN_ULONG* d = a->d; - switch (intLen) { - case 0: - return 0; - case 1: - if (!a->neg) return d[0] & 0X00000000FFFFFFFFLL; - else return -(d[0] & 0X00000000FFFFFFFFLL); - default: - if (!a->neg) return ((long long)d[1] << 32) | (d[0] & 0XFFFFFFFFLL); - else return -(((long long)d[1] << 32) | (d[0] & 0XFFFFFFFFLL)); - } -} - - -static char* leadingZerosTrimmed(char* s) { - char* p = s; - if (*p == '-') { - p++; - while ((*p == '0') && (*(p + 1) != 0)) { p++; } - p--; - *p = '-'; - } else { - while ((*p == '0') && (*(p + 1) != 0)) { p++; } - } - return p; -} - -/** - * public static native java.lang.String BN_bn2dec(int) - */ -static jstring NativeBN_BN_bn2dec(JNIEnv* env, jclass cls, BIGNUM* a) { - if (!oneValidHandle(env, a)) return NULL; - char* tmpStr; - char* retStr; - tmpStr = BN_bn2dec(a); - if (tmpStr != NULL) { - retStr = leadingZerosTrimmed(tmpStr); - jstring returnJString = ((*env)->NewStringUTF(env, (mcSignednessBull)retStr)); - OPENSSL_free(tmpStr); - return returnJString; - } - else return NULL; -} - -/** - * public static native java.lang.String BN_bn2hex(int) - */ -static jstring NativeBN_BN_bn2hex(JNIEnv* env, jclass cls, BIGNUM* a) { - if (!oneValidHandle(env, a)) return NULL; - char* tmpStr; - char* retStr; - tmpStr = BN_bn2hex(a); - if (tmpStr != NULL) { - retStr = leadingZerosTrimmed(tmpStr); - jstring returnJString = ((*env)->NewStringUTF(env, (mcSignednessBull)retStr)); - OPENSSL_free(tmpStr); - return returnJString; - } - else return NULL; -} - -/** - * public static native byte[] BN_bn2bin(int, byte[]) - */ -static jbyteArray NativeBN_BN_bn2bin(JNIEnv* env, jclass cls, BIGNUM* a, jbyteArray to) { - if (!oneValidHandle(env, a)) return NULL; - jbyteArray returnJBytes = to; - unsigned char * tmpBytes; - int len, byteCnt; - byteCnt = BN_num_bytes(a); -// FIXME: Currently ignoring array passed in to: - returnJBytes = (*env)->NewByteArray(env, byteCnt); -// FIXME: is it neccessary to check for returnJBytes != NULL? - tmpBytes = (unsigned char *)((*env)->GetPrimitiveArrayCritical(env, returnJBytes, NULL)); - if (tmpBytes != NULL) { - len = BN_bn2bin(a, tmpBytes); - (*env)->ReleasePrimitiveArrayCritical(env, returnJBytes, tmpBytes, 0); - return returnJBytes; - } - else return NULL; -} - -/** - * public static native int[] bn2litEndInts(int, int[]) - * cf. litEndInts2bn - */ -static jintArray NativeBN_bn2litEndInts(JNIEnv* env, jclass cls, BIGNUM* a, jintArray to) { - if (!oneValidHandle(env, a)) return NULL; - jintArray returnJInts = to; - bn_check_top(a); - int len = a->top; - if (len > 0) { -// FIXME: Currently ignoring array passed in to: - returnJInts = (*env)->NewIntArray(env, len); -// FIXME: is it neccessary to check for returnJBytes != NULL? - BN_ULONG* tmpInts = (BN_ULONG*)((*env)->GetPrimitiveArrayCritical(env, returnJInts, NULL)); - if (tmpInts != NULL) { - int i = len; do { i--; tmpInts[i] = a->d[i]; } while (i > 0); - (*env)->ReleasePrimitiveArrayCritical(env, returnJInts, tmpInts, 0); - return returnJInts; - } - else return NULL; - } - else { // value = 0 - return NULL; // Client should not call when sign = 0! - } -} - -/** - * public static native byte[] bn2twosComp(int, byte[]) - */ -static jbyteArray NativeBN_bn2twosComp(JNIEnv* env, jclass cls, BIGNUM* a, jbyteArray to) { - if (!oneValidHandle(env, a)) return NULL; - jbyteArray returnJBytes = to; - unsigned char * tmpBytes; - int len, byteCnt; - byteCnt = BN_num_bytes(a); -// FIXME: Currently ignoring array passed in to: - returnJBytes = (*env)->NewByteArray(env, byteCnt); -// FIXME: is it neccessary to check for returnJBytes != NULL? - tmpBytes = (unsigned char *)((*env)->GetPrimitiveArrayCritical(env, returnJBytes, NULL)); - if (tmpBytes != NULL) { - len = BN_bn2bin(a, tmpBytes); - (*env)->ReleasePrimitiveArrayCritical(env, returnJBytes, tmpBytes, 0); - return returnJBytes; - } - else return NULL; -} - - -/** - * public static native int sign(int) - */ -static int NativeBN_sign(JNIEnv* env, jclass cls, BIGNUM* a) { - if (!oneValidHandle(env, a)) return -2; - if (BN_is_zero(a)) return 0; - else if (BN_is_negative(a)) return -1; - else return 1; -} - -/** - * public static native void BN_set_negative(int, int) - */ -static void NativeBN_BN_set_negative(JNIEnv* env, jclass cls, BIGNUM* b, int n) { - if (!oneValidHandle(env, b)) return; - BN_set_negative(b, n); -} - - -/** - * public static native int twosCompFitsIntoBytes(int, int) - */ -static jboolean NativeBN_twosCompFitsIntoBytes(JNIEnv* env, jclass cls, BIGNUM* a, int byteCnt) { -// byteCnt IN {1, 2, 4, 8, 12, 16, ... (k * 4)} -// We rely on: (BN_BITS2 == 32), i.e. BN_ULONG is unsigned int and has 4 bytes: -// -// LOGD("NativeBN_twosCompFitsIntoBytes"); - if (!oneValidHandle(env, a)) return FALSE; - bn_check_top(a); - int intLen = a->top; - BN_ULONG* d = a->d; - BN_ULONG msd; // most significant digit - switch (byteCnt) { - case 1: - if (intLen > 1) return FALSE; - else if (intLen == 0) return TRUE; - msd = d[0]; - if (a->neg) msd--; - return ((msd & 0XFFFFFF80) == 0); - case 2: - if (intLen > 1) return FALSE; - else if (intLen == 0) return TRUE; - msd = d[0]; - if (a->neg) msd--; - return ((msd & 0XFFFF8000) == 0); - case 4: - if (intLen > 1) return FALSE; - else if (intLen == 0) return TRUE; - msd = d[0]; - if (a->neg) msd--; - return ((msd & 0X80000000) == 0); - case 8: - if (intLen > 2) return FALSE; - else if (intLen == 0) return TRUE; - msd = d[1]; - if ((a->neg) && (d[0]) == 0) msd--; - return ((msd & 0X80000000) == 0); - default: - if (intLen > byteCnt / 4) return FALSE; - else if (intLen == 0) return TRUE; - int i = intLen - 1; - msd = d[i]; - if (a->neg) { - // Handle negative values correctly: - // i.e. decrement the msd if all other digits are 0: - do { i--; } while (!((i < 0) || (d[i] != 0))); - if (i < 0) msd--; // Only if all lower significant digits are 0 we decrement the most significant one. - } - return ((msd & 0X80000000) == 0); - } -} - -/** - * public static native int bitLength(int) - */ -static int NativeBN_bitLength(JNIEnv* env, jclass cls, BIGNUM* a) { -// We rely on: (BN_BITS2 == 32), i.e. BN_ULONG is unsigned int and has 4 bytes: -// - if (!oneValidHandle(env, a)) return FALSE; - bn_check_top(a); - int intLen = a->top; - if (intLen == 0) return 0; - BN_ULONG* d = a->d; - int i = intLen - 1; - BN_ULONG msd = d[i]; // most significant digit - if (a->neg) { - // Handle negative values correctly: - // i.e. decrement the msd if all other digits are 0: - // while ((i > 0) && (d[i] != 0)) { i--; } - do { i--; } while (!((i < 0) || (d[i] != 0))); - if (i < 0) msd--; // Only if all lower significant digits are 0 we decrement the most significant one. - } - return (intLen - 1) * 32 + BN_num_bits_word(msd); -} - -/** - * public static native int BN_num_bits(int) - */ -// static int NativeBN_BN_num_bits(JNIEnv* env, jclass cls, BIGNUM* a) { -// LOGD("NativeBN_BN_num_bits"); -// if (!oneValidHandle(env, a)) return FALSE; -// return BN_num_bits(a); -// } - -/** - * public static native boolean BN_is_bit_set(int, int) - */ -static jboolean NativeBN_BN_is_bit_set(JNIEnv* env, jclass cls, BIGNUM* a, int n) { - if (!oneValidHandle(env, a)) return FALSE; - return (jboolean)BN_is_bit_set(a, n); -} - -/** - * public static native void modifyBit(int, int, int) - */ -static jboolean NativeBN_modifyBit(JNIEnv* env, jclass cls, BIGNUM* a, int n, int op) { -// LOGD("NativeBN_BN_modifyBit"); - if (!oneValidHandle(env, a)) return FALSE; - switch (op) { - case 1: return BN_set_bit(a, n); - case 0: return BN_clear_bit(a, n); - case -1: - if (BN_is_bit_set(a, n)) return BN_clear_bit(a, n); - else return BN_set_bit(a, n); - } - return FALSE; -} - -/** - * public static native int BN_lshift(int, int, int) - */ -static jboolean NativeBN_BN_lshift(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, int n) { -// LOGD("NativeBN_BN_lshift %p %p %d", r, a, n); - if (!twoValidHandles(env, r, a)) return FALSE; - if (n >= 0) return BN_lshift(r, a, n); - - n = -n; -// return BN_rshift(r, a, n); -// Following code insourced from bn_shift.c in order to have bug fixed: -// FIXME: Should report to openssl team!!! - - int i,j,nw,lb,rb; - BN_ULONG *t,*f; - BN_ULONG l,tmp; - - bn_check_top(r); - bn_check_top(a); - - nw=n/BN_BITS2; - rb=n%BN_BITS2; - lb=BN_BITS2-rb; -// Changed "nw > a->top || a->top == 0" to nw >= a->top" as considering this a bug: - if (nw >= a->top) - { - BN_zero(r); - return(1); - } - if (r != a) - { - r->neg=a->neg; - if (bn_wexpand(r,a->top-nw+1) == NULL) return(0); - } - else - { - if (n == 0) - return 1; /* or the copying loop will go berserk */ - } - - f= &(a->d[nw]); - t=r->d; - j=a->top-nw; - r->top=j; - - if (rb == 0) - { - for (i=j; i != 0; i--) - *(t++)= *(f++); - } - else - { - l= *(f++); - for (i=j-1; i != 0; i--) - { - tmp =(l>>rb)&BN_MASK2; - l= *(f++); - *(t++) =(tmp|(l<<lb))&BN_MASK2; - } - *(t++) =(l>>rb)&BN_MASK2; - } - bn_correct_top(r); - bn_check_top(r); - return(1); -} - - -/** - * public static native boolean BN_add_word(int, int) - */ -static jboolean NativeBN_BN_add_word(JNIEnv* env, jclass cls, BIGNUM *a, BN_ULONG w) { - if (!oneValidHandle(env, a)) return FALSE; - return BN_add_word(a, w); -} - -/** - * public static native boolean BN_sub_word(int, int) - */ -static jboolean NativeBN_BN_sub_word(JNIEnv* env, jclass cls, BIGNUM *a, BN_ULONG w) { - if (!oneValidHandle(env, a)) return FALSE; - return BN_sub_word(a, w); -} - -/** - * public static native boolean BN_mul_word(int, int) - */ -static jboolean NativeBN_BN_mul_word(JNIEnv* env, jclass cls, BIGNUM *a, BN_ULONG w) { - if (!oneValidHandle(env, a)) return FALSE; - return BN_mul_word(a, w); -} - -/** - * public static native boolean BN_div_word(int, int) - */ -static BN_ULONG NativeBN_BN_div_word(JNIEnv* env, jclass cls, BIGNUM *a, BN_ULONG w) { - if (!oneValidHandle(env, a)) return FALSE; - return BN_div_word(a, w); -} - -/** - * public static native boolean BN_mod_word(int, int) - */ -static BN_ULONG NativeBN_BN_mod_word(JNIEnv* env, jclass cls, BIGNUM *a, BN_ULONG w) { - if (!oneValidHandle(env, a)) return FALSE; - return BN_mod_word(a, w); -} - - - -/** - * public static native int BN_add(int, int, int) - */ -static jboolean NativeBN_BN_add(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* b) { - if (!threeValidHandles(env, r, a, b)) return FALSE; - return BN_add(r, a, b); -} - -/** - * public static native int BN_sub(int, int, int) - */ -static jboolean NativeBN_BN_sub(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* b) { - if (!threeValidHandles(env, r, a, b)) return FALSE; - return BN_sub(r, a, b); -} - - -/** - * public static native int BN_gcd(int, int, int, int) - */ -static jboolean NativeBN_BN_gcd(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* b, BN_CTX* ctx) { - if (!threeValidHandles(env, r, a, b)) return FALSE; - return BN_gcd(r, a, b, ctx); -} - -/** - * public static native int BN_mul(int, int, int, int) - */ -static jboolean NativeBN_BN_mul(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* b, BN_CTX* ctx) { - if (!threeValidHandles(env, r, a, b)) return FALSE; - return BN_mul(r, a, b, ctx); -} - -/** - * public static native int BN_exp(int, int, int, int) - */ -static jboolean NativeBN_BN_exp(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* p, BN_CTX* ctx) { - if (!threeValidHandles(env, r, a, p)) return FALSE; - return BN_exp(r, a, p, ctx); -} - -/** - * public static native boolean BN_div(int, int, int, int, int) - */ -static jboolean NativeBN_BN_div(JNIEnv* env, jclass cls, BIGNUM* dv, BIGNUM* rem, BIGNUM* m, BIGNUM* d, BN_CTX* ctx) { - if (!fourValidHandles(env, (rem ? rem : dv), (dv ? dv : rem), m, d)) return FALSE; - return BN_div(dv, rem, m, d, ctx); -} - -/** - * public static native int BN_nnmod(int, int, int, int) - */ -static jboolean NativeBN_BN_nnmod(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* m, BN_CTX* ctx) { - if (!threeValidHandles(env, r, a, m)) return FALSE; - return BN_nnmod(r, a, m, ctx); -} - -/** - * public static native int BN_mod_exp(int, int, int, int, int) - */ -static jboolean NativeBN_BN_mod_exp(JNIEnv* env, jclass cls, BIGNUM* r, BIGNUM* a, BIGNUM* p, BIGNUM* m, BN_CTX* ctx) { - if (!fourValidHandles(env, r, a, p, m)) return FALSE; - return BN_mod_exp(r, a, p, m, ctx); -} - - -/** - * public static native int BN_mod_inverse(int, int, int, int) - */ -static jboolean NativeBN_BN_mod_inverse(JNIEnv* env, jclass cls, BIGNUM* ret, BIGNUM* a, BIGNUM* n, BN_CTX* ctx) { - if (!threeValidHandles(env, ret, a, n)) return FALSE; - return (BN_mod_inverse(ret, a, n, ctx) != NULL); -} - - -/** - * public static native int BN_generate_prime_ex(int, int, boolean, int, int, int) - */ -static jboolean NativeBN_BN_generate_prime_ex(JNIEnv* env, jclass cls, BIGNUM* ret, int bits, jboolean safe, - BIGNUM* add, BIGNUM* rem, jint cb) { - if (!oneValidHandle(env, ret)) return FALSE; - return BN_generate_prime_ex(ret, bits, safe, add, rem, cb); -} - -/** - * public static native int BN_mod_inverse(int, int, int, int) - */ -static jboolean NativeBN_BN_is_prime_ex(JNIEnv* env, jclass cls, BIGNUM* p, int nchecks, BN_CTX* ctx, jint cb) { - if (!oneValidHandle(env, p)) return FALSE; - return BN_is_prime_ex(p, nchecks, ctx, cb); -} - - -/** - * Defines the mapping from Java methods and their signatures - * to native functions. Order is Java name, Java signature, - * then pointer to C function. - */ -static JNINativeMethod METHODS[] = { - { "ERR_get_error", "()I", (void*)NativeBN_ERR_get_error }, - { "ERR_error_string", "(I)Ljava/lang/String;", (void*)NativeBN_ERR_error_string }, - { "BN_CTX_new", "()I", (void*)NativeBN_BN_CTX_new }, - { "BN_new", "()I", (void*)NativeBN_BN_new }, - { "BN_free", "(I)V", (void*)NativeBN_BN_free }, - { "BN_cmp", "(II)I", (void*)NativeBN_BN_cmp }, - { "BN_copy", "(II)Z", (void*)NativeBN_BN_copy }, - { "putLongInt", "(IJ)Z", (void*)NativeBN_putLongInt }, - { "putULongInt", "(IJZ)Z", (void*)NativeBN_putULongInt }, - { "BN_dec2bn", "(ILjava/lang/String;)I", (void*)NativeBN_BN_dec2bn }, - { "BN_hex2bn", "(ILjava/lang/String;)I", (void*)NativeBN_BN_hex2bn }, - { "BN_bin2bn", "([BIZI)Z", (void*)NativeBN_BN_bin2bn }, - { "litEndInts2bn", "([IIZI)Z", (void*)NativeBN_litEndInts2bn }, - { "twosComp2bn", "([BII)Z", (void*)NativeBN_twosComp2bn }, - { "longInt", "(I)J", (void*)NativeBN_longInt }, - { "BN_bn2dec", "(I)Ljava/lang/String;", (void*)NativeBN_BN_bn2dec }, - { "BN_bn2hex", "(I)Ljava/lang/String;", (void*)NativeBN_BN_bn2hex }, - { "BN_bn2bin", "(I[B)[B", (void*)NativeBN_BN_bn2bin }, - { "bn2litEndInts", "(I[I)[I", (void*)NativeBN_bn2litEndInts }, - { "bn2twosComp", "(I[B)[B", (void*)NativeBN_bn2twosComp }, - { "sign", "(I)I", (void*)NativeBN_sign }, - { "BN_set_negative", "(II)V", (void*)NativeBN_BN_set_negative }, - { "twosCompFitsIntoBytes", "(II)Z", (void*)NativeBN_twosCompFitsIntoBytes }, - { "bitLength", "(I)I", (void*)NativeBN_bitLength }, -// { "BN_num_bits", "(I)I", (void*)NativeBN_BN_num_bits }, - { "BN_is_bit_set", "(II)Z", (void*)NativeBN_BN_is_bit_set }, - { "modifyBit", "(III)Z", (void*)NativeBN_modifyBit }, - { "BN_lshift", "(III)Z", (void*)NativeBN_BN_lshift }, - { "BN_add_word", "(II)Z", (void*)NativeBN_BN_add_word }, - { "BN_sub_word", "(II)Z", (void*)NativeBN_BN_sub_word }, - { "BN_mul_word", "(II)Z", (void*)NativeBN_BN_mul_word }, - { "BN_div_word", "(II)I", (void*)NativeBN_BN_div_word }, - { "BN_mod_word", "(II)I", (void*)NativeBN_BN_mod_word }, - { "BN_add", "(III)Z", (void*)NativeBN_BN_add }, - { "BN_sub", "(III)Z", (void*)NativeBN_BN_sub }, - { "BN_gcd", "(IIII)Z", (void*)NativeBN_BN_gcd }, - { "BN_mul", "(IIII)Z", (void*)NativeBN_BN_mul }, - { "BN_exp", "(IIII)Z", (void*)NativeBN_BN_exp }, - { "BN_div", "(IIIII)Z", (void*)NativeBN_BN_div }, - { "BN_nnmod", "(IIII)Z", (void*)NativeBN_BN_nnmod }, - { "BN_mod_exp", "(IIIII)Z", (void*)NativeBN_BN_mod_exp }, - { "BN_mod_inverse", "(IIII)Z", (void*)NativeBN_BN_mod_inverse }, - { "BN_generate_prime_ex", "(IIZIII)Z", (void*)NativeBN_BN_generate_prime_ex }, - { "BN_is_prime_ex", "(IIII)Z", (void*)NativeBN_BN_is_prime_ex } -}; - -/* - * Peforms the actual registration of the native methods. - * Also looks up the fields that belong to the class (if - * any) and stores the field IDs. - */ -int register_org_openssl_NativeBN(JNIEnv* env) { -/* - jclass clazz; - - clazz = (*env)->FindClass(env, "org/openssl/NativeBN"); - if (clazz == NULL) { - return -1; - } -*/ - return jniRegisterNativeMethods(env, "org/openssl/NativeBN", METHODS, NELEM(METHODS)); -} diff --git a/openssl/src/main/native/sub.mk b/openssl/src/main/native/sub.mk deleted file mode 100644 index fccf735..0000000 --- a/openssl/src/main/native/sub.mk +++ /dev/null @@ -1,18 +0,0 @@ -# This file is included by the top-level libcore Makefile. -# It's not a normal makefile, so we don't include CLEAR_VARS -# or BUILD_*_LIBRARY. - -LOCAL_SRC_FILES := \ - BNInterface.c - -LOCAL_C_INCLUDES += \ - external/openssl/include - -# Any shared/static libs that are listed here must also -# be listed in libs/nativehelper/Makefile. -# TODO: fix this requirement - -LOCAL_SHARED_LIBRARIES += \ - libcrypto - -LOCAL_STATIC_LIBRARIES += |