Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
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;
}
Esempio n. 4
0
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");
  }
}