native-lib.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "utils.h"
#include
#include
using std::string;
char *path;
//获取sm2的密钥
EC_KEY *getEcKey() {
std::string p1 = path;
p1.append("/private");
std::string p2 = path;
p2.append("/public");
char *privateChar = (char *) malloc(1024);
memset(privateChar, 0, 1024);
readBufFromFile((char *) p1.c_str(), privateChar);
char *publicChar = (char *) malloc(1024);
memset(publicChar, 0, 1024);
readBufFromFile((char *) p2.c_str(), publicChar);
EC_KEY *ec_key;
ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1);
BN_CTX *ctx1 = BN_CTX_new();
EC_POINT *pubkey_point = EC_POINT_hex2point(ec_key->group, publicChar, NULL, ctx1);
int iret = EC_KEY_set_public_key(ec_key, pubkey_point);
BIGNUM *bn_prikey = BN_new();
iret = BN_hex2bn(&bn_prikey, privateChar);
iret = EC_KEY_set_private_key(ec_key, bn_prikey);
p1.clear();
p2.clear();
free(publicChar);
free(privateChar);
BN_free(bn_prikey);
EC_POINT_free(pubkey_point);
return ec_key;
}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_yooking_gmssldemo_MainActivity_aesEnc(JNIEnv *env,
jobject instance,
jbyteArray in_,
jint length,
jbyteArray key_) {
jbyte *in = env->GetByteArrayElements(in_, NULL);
jbyte *key = env->GetByteArrayElements(key_, NULL);
int pading = AES_BLOCK_SIZE - length % AES_BLOCK_SIZE;
int block = length / AES_BLOCK_SIZE;
int endLen = AES_BLOCK_SIZE - pading;
unsigned char *p = (unsigned char *) malloc(AES_BLOCK_SIZE + 1);
memset(p, 0, AES_BLOCK_SIZE + 1);
memset(p + endLen, pading, (size_t) pading);
memcpy(p, in + block * AES_BLOCK_SIZE, (size_t) endLen);
AES_KEY aes_key;
AES_set_encrypt_key((const unsigned char *) key, 16 * 8, &aes_key);
unsigned char *out = (unsigned char *) malloc((size_t) (length + pading + 1));
memset(out, 0, (size_t) (length + pading + 1));
for (int i = 0; i < block; i++) {
AES_encrypt((const unsigned char *) (in + (i * AES_BLOCK_SIZE)),
out + i * AES_BLOCK_SIZE,
&aes_key);
}
AES_encrypt(p, out + block * AES_BLOCK_SIZE, &aes_key);
jbyteArray array = env->NewByteArray(length + pading);
env->SetByteArrayRegion(array, 0, length + pading, (const jbyte *) out);
free(p);
free(out);
env->ReleaseByteArrayElements(in_, in, 0);
env->ReleaseByteArrayElements(key_, key, 0);
return array;
}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_yooking_gmssldemo_MainActivity_aesDec(JNIEnv *env,
jobject instance,
jbyteArray in_,
jint length,
jbyteArray key_) {
jbyte *in = env->GetByteArrayElements(in_, NULL);
jbyte *key = env->GetByteArrayElements(key_, NULL);
AES_KEY aes_key;
AES_set_decrypt_key((const unsigned char *) key, 16 * 8, &aes_key);
unsigned char *out = (unsigned char *) malloc(length);
memset(out, 0, length);
for (int i = 0; i < length / 16; i++) {
AES_decrypt((const unsigned char *) (in + (i * AES_BLOCK_SIZE)),
out + i * AES_BLOCK_SIZE,
&aes_key);
}
//去补位
int padinglen = out[length - 1];
memset(out + length - padinglen, 0, padinglen);
jbyteArray array = env->NewByteArray(length - padinglen);
env->SetByteArrayRegion(array, 0, length - padinglen, (const jbyte *) out);
free(out);
env->ReleaseByteArrayElements(in_, in, 0);
env->ReleaseByteArrayElements(key_, key, 0);
return array;
}
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_yooking_gmssldemo_MainActivity_sha1(JNIEnv *env,
jobject instance,
jbyteArray in_,
jint length) {
jbyte *in = env->GetByteArrayElements(in_, NULL);
unsigned char *sha1Msg = (unsigned char *) malloc(SHA_DIGEST_LENGTH + 1);
memset(sha1Msg, 0, SHA_DIGEST_LENGTH + 1);
SHA1((const unsigned ch