mysql ssl编译_GmSSL的编译和使用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值