JNIEXPORT jint JNICALL Java_com_intel_diceros_crypto_engines_AESOpensslEngine_processBlock( JNIEnv *env, jobject object, jlong aesContext, jbyteArray in, jint inOff, jint inLen, jbyteArray out, jint outOff) { unsigned char * input = (unsigned char *) (*env)->GetByteArrayElements(env, in, 0); unsigned char * output = (unsigned char *) (*env)->GetByteArrayElements(env, out, 0); AESContext* aesCtx = (AESContext*) aesContext; EVP_CIPHER_CTX * ctx = (EVP_CIPHER_CTX *) aesCtx->context; int outLength = 0; cryptUpdate cryptUpdateFunc = getCryptUpdateFunc( ctx->encrypt == ENCRYPTION); if (!cryptUpdateFunc(ctx, output + outOff, &outLength, input + inOff, inLen)) { THROW(env, "java/security/GeneralSecurityException", "Error in EVP_EncryptUpdate or EVP_DecryptUpdate"); ERR_print_errors_fp(stderr); return 0; } (*env)->ReleaseByteArrayElements(env, in, (jbyte *) input, 0); (*env)->ReleaseByteArrayElements(env, out, (jbyte *) output, 0); return outLength; }
JNIEXPORT void JNICALL Java_com_intel_diceros_crypto_engines_AESOpensslEngine_updateAADFromByteArray( JNIEnv *env, jobject object, jlong cipherContext, jbyteArray src, jint offset, jint len) { unsigned char * aad = (unsigned char *) (*env)->GetByteArrayElements(env, src, 0); CipherContext* cipherCtx = (CipherContext*) cipherContext; EVP_CIPHER_CTX * ctx = (EVP_CIPHER_CTX *) cipherCtx->opensslCtx; int outlen; cryptUpdate cryptUpdateFunc = getCryptUpdateFunc( ctx->encrypt == ENCRYPTION); if (!cryptUpdateFunc(ctx, NULL, &outlen, aad + offset, len)) { THROW(env, "java/security/GeneralSecurityException", "Error in updateAAD"); } (*env)->ReleaseByteArrayElements(env, src, (jbyte *) aad, 0); }
JNIEXPORT jint JNICALL Java_com_intel_diceros_crypto_engines_AESOpensslEngine_bufferCrypt( JNIEnv *env, jobject object, jlong aesContext, jobject input, jint inputPos, jint inputLimit, jobject output, jint outputPos, jboolean isUpdate) { jbyte* bInput = (*env)->GetDirectBufferAddress(env, input); jbyte* bOutput = (*env)->GetDirectBufferAddress(env, output); if (NULL == bInput || NULL == bOutput) { return 0; } //EVP_CIPHER_CTX_set_padding(context, 0); AESContext* aesCtx = (AESContext*) aesContext; EVP_CIPHER_CTX * ctx = (EVP_CIPHER_CTX *) aesCtx->context; cryptUpdate cryptUpdateFunc = getCryptUpdateFunc( ctx->encrypt == ENCRYPTION); cryptFinal cryptFinalFunc = getCryptFinalFunc(ctx->encrypt == ENCRYPTION); int outLenUpdate = 0; int outLengthFinal = 0; int inputLength = inputLimit - inputPos; if (!cryptUpdateFunc(ctx, (unsigned char *) bOutput + outputPos, &outLenUpdate, (const unsigned char *) bInput + inputPos, inputLength)) { THROW(env, "java/security/GeneralSecurityException", "Error in EVP_EncryptUpdate or EVP_DecryptUpdate"); ERR_print_errors_fp(stderr); return 0; } if (isUpdate == JNI_FALSE) { if (!cryptFinalFunc(ctx, (unsigned char *) bOutput + outputPos + outLenUpdate, &outLengthFinal)) { //THROW(env, "javax/crypto/IllegalBlockSizeException", // "Input length not multiple of 16 bytes..."); THROW(env, "java/security/GeneralSecurityException", "Error in EVP_EncryptFinal_ex or EVP_DecryptFinal_ex"); ERR_print_errors_fp(stderr); return 0; } } return outLenUpdate + outLengthFinal; }
JNIEXPORT void JNICALL Java_com_intel_diceros_crypto_engines_AESOpensslEngine_updateAADFromByteBuffer( JNIEnv *env, jobject object, jlong cipherContext, jobject src, jint inputPos, jint inputLimit) { jbyte* aad = (*env)->GetDirectBufferAddress(env, src); if (NULL == aad) { return 0; } CipherContext* cipherCtx = (CipherContext*) cipherContext; EVP_CIPHER_CTX * ctx = (EVP_CIPHER_CTX *) cipherCtx->opensslCtx; int inputLen = inputLimit - inputPos; int outlen; cryptUpdate cryptUpdateFunc = getCryptUpdateFunc( ctx->encrypt == ENCRYPTION); if (!cryptUpdateFunc(ctx, NULL, &outlen, (unsigned char *)aad + inputPos, inputLen)) { THROW(env, "java/security/GeneralSecurityException", "Error in updateAAD"); } }