adds aes wrappers
parent
0c0c2c936e
commit
efc7466c67
|
@ -29,6 +29,30 @@ extern "C" {
|
||||||
JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_Aes_mallocNativeStruct
|
JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_Aes_mallocNativeStruct
|
||||||
(JNIEnv *, jobject);
|
(JNIEnv *, jobject);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: com_wolfssl_wolfcrypt_Aes
|
||||||
|
* Method: wc_AesSetKey
|
||||||
|
* Signature: ([B[BI)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Aes_wc_1AesSetKey
|
||||||
|
(JNIEnv *, jobject, jbyteArray, jbyteArray, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: com_wolfssl_wolfcrypt_Aes
|
||||||
|
* Method: native_update
|
||||||
|
* Signature: (I[BII[BI)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Aes_native_1update__I_3BII_3BI
|
||||||
|
(JNIEnv *, jobject, jint, jbyteArray, jint, jint, jbyteArray, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: com_wolfssl_wolfcrypt_Aes
|
||||||
|
* Method: native_update
|
||||||
|
* Signature: (ILjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Aes_native_1update__ILjava_nio_ByteBuffer_2IILjava_nio_ByteBuffer_2
|
||||||
|
(JNIEnv *, jobject, jint, jobject, jint, jint, jobject);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
117
jni/jni_aes.c
117
jni/jni_aes.c
|
@ -25,6 +25,7 @@
|
||||||
#include <wolfssl/wolfcrypt/aes.h>
|
#include <wolfssl/wolfcrypt/aes.h>
|
||||||
|
|
||||||
#include <com_wolfssl_wolfcrypt_Aes.h>
|
#include <com_wolfssl_wolfcrypt_Aes.h>
|
||||||
|
#include <wolfcrypt_jni_NativeStruct.h>
|
||||||
#include <wolfcrypt_jni_error.h>
|
#include <wolfcrypt_jni_error.h>
|
||||||
|
|
||||||
/* #define WOLFCRYPT_JNI_DEBUG_ON */
|
/* #define WOLFCRYPT_JNI_DEBUG_ON */
|
||||||
|
@ -35,18 +36,122 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_Aes_mallocNativeStruct(
|
||||||
{
|
{
|
||||||
jlong ret = 0;
|
jlong ret = 0;
|
||||||
|
|
||||||
#ifdef NO_AES
|
#ifndef NO_AES
|
||||||
throwNotCompiledInException(env);
|
|
||||||
#else
|
|
||||||
|
|
||||||
ret = (jlong) XMALLOC(sizeof(Aes), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
ret = (jlong) XMALLOC(sizeof(Aes), NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
throwOutOfMemoryException(env, "Failed to allocate Aes object");
|
throwOutOfMemoryException(env, "Failed to allocate Aes object");
|
||||||
|
|
||||||
LogStr("new Aes() = %p\n", ret);
|
LogStr("new Aes() = %p\n", (void*)ret);
|
||||||
|
#else
|
||||||
|
throwNotCompiledInException(env);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_wolfssl_wolfcrypt_Aes_wc_1AesSetKey(
|
||||||
|
JNIEnv* env, jobject this, jbyteArray key_object, jbyteArray iv_object,
|
||||||
|
jint opmode)
|
||||||
|
{
|
||||||
|
#ifndef NO_AES
|
||||||
|
int ret = 0;
|
||||||
|
Aes* aes = (Aes*) getNativeStruct(env, this);
|
||||||
|
byte* key = getByteArray(env, key_object);
|
||||||
|
byte* iv = getByteArray(env, iv_object);
|
||||||
|
word32 keySz = getByteArrayLength(env, key_object);
|
||||||
|
|
||||||
|
ret = wc_AesSetKey(aes, key, keySz, iv, opmode);
|
||||||
|
if (ret != 0)
|
||||||
|
throwWolfCryptExceptionFromError(env, ret);
|
||||||
|
|
||||||
|
LogStr("wc_AesSetKey(aes=%p, key, iv, opmode) = %d\n", aes, ret);
|
||||||
|
#else
|
||||||
|
throwNotCompiledInException(env);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_com_wolfssl_wolfcrypt_Aes_native_1update__I_3BII_3BI(
|
||||||
|
JNIEnv* env, jobject this, jint opmode,
|
||||||
|
jbyteArray input_object, jint offset, jint length,
|
||||||
|
jbyteArray output_object, jint outputOffset)
|
||||||
|
{
|
||||||
|
#ifndef NO_AES
|
||||||
|
int ret = 0;
|
||||||
|
Aes* aes = (Aes*) getNativeStruct(env, this);
|
||||||
|
byte* input = getByteArray(env, input_object);
|
||||||
|
byte* output = getByteArray(env, output_object);
|
||||||
|
|
||||||
|
if (opmode == AES_ENCRYPTION) {
|
||||||
|
ret = wc_AesCbcEncrypt(aes, output+outputOffset, input+offset, length);
|
||||||
|
LogStr("wc_AesCbcEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = wc_AesCbcDecrypt(aes, output+outputOffset, input+offset, length);
|
||||||
|
LogStr("wc_AesCbcDecrypt(aes=%p, out, in, inSz) = %d\n", aes, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
releaseByteArray(env, output_object, output, ret);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
throwWolfCryptExceptionFromError(env, ret);
|
||||||
|
ret = 0; /* 0 bytes stored in output */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogStr("input[%u]: [%p]\n", (word32)length, input + offset);
|
||||||
|
LogHex((byte*) input + offset, length);
|
||||||
|
LogStr("output[%u]: [%p]\n", (word32)length, output + outputOffset);
|
||||||
|
LogHex((byte*) output + outputOffset, length);
|
||||||
|
#else
|
||||||
|
throwNotCompiledInException(env);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_com_wolfssl_wolfcrypt_Aes_native_1update__ILjava_nio_ByteBuffer_2IILjava_nio_ByteBuffer_2(
|
||||||
|
JNIEnv* env, jobject this, jint opmode,
|
||||||
|
jobject input_object, jint offset, jint length,
|
||||||
|
jobject output_object)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
#ifndef NO_AES
|
||||||
|
Aes* aes = (Aes*) getNativeStruct(env, this);
|
||||||
|
byte* input = getDirectBufferAddress(env, input_object);
|
||||||
|
byte* output = getDirectBufferAddress(env, output_object);
|
||||||
|
|
||||||
|
if (opmode == AES_ENCRYPTION) {
|
||||||
|
ret = wc_AesCbcEncrypt(aes, output, input + offset, length);
|
||||||
|
LogStr("wc_AesCbcEncrypt(aes=%p, out, in, inSz) = %d\n", aes, ret);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = wc_AesCbcDecrypt(aes, output, input + offset, length);
|
||||||
|
LogStr("wc_AesCbcDecrypt(aes=%p, out, in, inSz) = %d\n", aes, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
throwWolfCryptExceptionFromError(env, ret);
|
||||||
|
ret = 0; /* 0 bytes stored in output */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogStr("input[%u]: [%p]\n", (word32)length, input + offset);
|
||||||
|
LogHex((byte*) input + offset, length);
|
||||||
|
LogStr("output[%u]: [%p]\n", (word32)length, output);
|
||||||
|
LogHex((byte*) output, length);
|
||||||
|
#else
|
||||||
|
throwNotCompiledInException(env);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,15 @@
|
||||||
|
|
||||||
package com.wolfssl.wolfcrypt;
|
package com.wolfssl.wolfcrypt;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import javax.crypto.ShortBufferException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for the native WolfCrypt Aes implementation.
|
* Wrapper for the native WolfCrypt Aes implementation.
|
||||||
*
|
*
|
||||||
* @author Moisés Guimarães
|
* @author Moisés Guimarães
|
||||||
* @version 1.0, February 2015
|
* @version 2.0, March 2017
|
||||||
*/
|
*/
|
||||||
public class Aes extends NativeStruct {
|
public class Aes extends NativeStruct {
|
||||||
|
|
||||||
|
@ -36,5 +40,83 @@ public class Aes extends NativeStruct {
|
||||||
public static final int ENCRYPT_MODE = 0;
|
public static final int ENCRYPT_MODE = 0;
|
||||||
public static final int DECRYPT_MODE = 1;
|
public static final int DECRYPT_MODE = 1;
|
||||||
|
|
||||||
|
private WolfCryptState state = WolfCryptState.UNINITIALIZED;
|
||||||
|
|
||||||
|
private int opmode;
|
||||||
|
|
||||||
protected native long mallocNativeStruct() throws OutOfMemoryError;
|
protected native long mallocNativeStruct() throws OutOfMemoryError;
|
||||||
|
|
||||||
|
private native void wc_AesSetKey(byte[] key, byte[] iv, int opmode);
|
||||||
|
|
||||||
|
private native int native_update(int opmode, byte[] input, int offset,
|
||||||
|
int length, byte[] output, int outputOffset);
|
||||||
|
|
||||||
|
private native int native_update(int opmode, ByteBuffer plain, int offset,
|
||||||
|
int length, ByteBuffer cipher);
|
||||||
|
|
||||||
|
public Aes() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Aes(byte[] key, byte[] iv, int opmode) {
|
||||||
|
setKey(key, iv, opmode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKey(byte[] key, byte[] iv, int opmode) {
|
||||||
|
wc_AesSetKey(key, iv, opmode);
|
||||||
|
|
||||||
|
this.opmode = opmode;
|
||||||
|
state = WolfCryptState.READY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] update(byte[] input, int offset, int length) {
|
||||||
|
byte[] output;
|
||||||
|
|
||||||
|
if (state == WolfCryptState.READY) {
|
||||||
|
output = new byte[input.length];
|
||||||
|
|
||||||
|
native_update(opmode, input, offset, length, output, 0);
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"No available key to perform the opperation.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int update(byte[] input, int offset, int length, byte[] output,
|
||||||
|
int outputOffset) throws ShortBufferException {
|
||||||
|
if (state == WolfCryptState.READY) {
|
||||||
|
if (outputOffset + length > output.length)
|
||||||
|
throw new ShortBufferException(
|
||||||
|
"output buffer is too small to hold the result.");
|
||||||
|
|
||||||
|
return native_update(opmode, input, offset, length, output,
|
||||||
|
outputOffset);
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"No available key to perform the opperation.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int update(ByteBuffer input, ByteBuffer output)
|
||||||
|
throws ShortBufferException {
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (state == WolfCryptState.READY) {
|
||||||
|
if (output.remaining() < input.remaining())
|
||||||
|
throw new ShortBufferException(
|
||||||
|
"output buffer is too small to hold the result.");
|
||||||
|
|
||||||
|
ret = native_update(opmode, input, input.position(),
|
||||||
|
input.remaining(), output);
|
||||||
|
|
||||||
|
output.position(output.position() + input.remaining());
|
||||||
|
input.position(input.position() + input.remaining());
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"No available key to perform the opperation.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -23,15 +23,224 @@ package com.wolfssl.wolfcrypt;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import javax.crypto.ShortBufferException;
|
||||||
|
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.internal.runners.statements.Fail;
|
||||||
|
|
||||||
import com.wolfssl.wolfcrypt.Aes;
|
import com.wolfssl.wolfcrypt.Aes;
|
||||||
|
|
||||||
public class AesTest {
|
public class AesTest {
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void checkAvailability() {
|
||||||
|
try {
|
||||||
|
new Aes();
|
||||||
|
} catch (WolfCryptException e) {
|
||||||
|
if (e.getError() == WolfCryptError.NOT_COMPILED_IN)
|
||||||
|
System.out.println("Aes test skipped: " + e.getError());
|
||||||
|
Assume.assumeNoException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void constructorShouldInitializeNativeStruct() {
|
public void constructorShouldInitializeNativeStruct() {
|
||||||
assertNotEquals(NativeStruct.NULL, new Aes().getNativeStruct());
|
assertNotEquals(NativeStruct.NULL, new Aes().getNativeStruct());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected=ShortBufferException.class)
|
||||||
|
public void updateShouldMatchUsingByteByffer() throws ShortBufferException {
|
||||||
|
String[] keys = new String[] {
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", };
|
||||||
|
String[] ivs = new String[] {
|
||||||
|
"000102030405060708090A0B0C0D0E0F",
|
||||||
|
"7649ABAC8119B246CEE98E9B12E9197D",
|
||||||
|
"5086CB9B507219EE95DB113A917678B2",
|
||||||
|
"73BED6B8E3C1743B7116E69E22229516",
|
||||||
|
"000102030405060708090A0B0C0D0E0F",
|
||||||
|
"4F021DB243BC633D7178183A9FA071E8",
|
||||||
|
"B4D9ADA9AD7DEDF4E5E738763F69145A",
|
||||||
|
"571B242012FB7AE07FA9BAAC3DF102E0",
|
||||||
|
"000102030405060708090A0B0C0D0E0F",
|
||||||
|
"F58C4C04D6E5F1BA779EABFB5F7BFBD6",
|
||||||
|
"9CFC4E967EDB808D679F777BC6702C7D",
|
||||||
|
"39F23369A9D9BACFA530E26304231461" };
|
||||||
|
String[] inputs = new String[] {
|
||||||
|
"6bc1bee22e409f96e93d7e117393172a",
|
||||||
|
"ae2d8a571e03ac9c9eb76fac45af8e51",
|
||||||
|
"30c81c46a35ce411e5fbc1191a0a52ef",
|
||||||
|
"f69f2445df4f9b17ad2b417be66c3710",
|
||||||
|
"6bc1bee22e409f96e93d7e117393172a",
|
||||||
|
"ae2d8a571e03ac9c9eb76fac45af8e51",
|
||||||
|
"30c81c46a35ce411e5fbc1191a0a52ef",
|
||||||
|
"f69f2445df4f9b17ad2b417be66c3710",
|
||||||
|
"6bc1bee22e409f96e93d7e117393172a",
|
||||||
|
"ae2d8a571e03ac9c9eb76fac45af8e51",
|
||||||
|
"30c81c46a35ce411e5fbc1191a0a52ef",
|
||||||
|
"f69f2445df4f9b17ad2b417be66c3710" };
|
||||||
|
String[] outputs = new String[] {
|
||||||
|
"7649abac8119b246cee98e9b12e9197d",
|
||||||
|
"5086cb9b507219ee95db113a917678b2",
|
||||||
|
"73bed6b8e3c1743b7116e69e22229516",
|
||||||
|
"3ff1caa1681fac09120eca307586e1a7",
|
||||||
|
"4f021db243bc633d7178183a9fa071e8",
|
||||||
|
"b4d9ada9ad7dedf4e5e738763f69145a",
|
||||||
|
"571b242012fb7ae07fa9baac3df102e0",
|
||||||
|
"08b0e27988598881d920a9e64f5615cd",
|
||||||
|
"f58c4c04d6e5f1ba779eabfb5f7bfbd6",
|
||||||
|
"9cfc4e967edb808d679f777bc6702c7d",
|
||||||
|
"39f23369a9d9bacfa530e26304231461",
|
||||||
|
"b2eb05e2c39be9fcda6c19078c6a9d1b" };
|
||||||
|
|
||||||
|
ByteBuffer input = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE);
|
||||||
|
ByteBuffer output = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE);
|
||||||
|
ByteBuffer plain = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE);
|
||||||
|
ByteBuffer cipher = ByteBuffer.allocateDirect(Aes.BLOCK_SIZE);
|
||||||
|
|
||||||
|
for (int i = 0; i < inputs.length; i++) {
|
||||||
|
Aes enc = new Aes(Util.h2b(keys[i]), Util.h2b(ivs[i]),
|
||||||
|
Aes.ENCRYPT_MODE);
|
||||||
|
Aes dec = new Aes(Util.h2b(keys[i]), Util.h2b(ivs[i]),
|
||||||
|
Aes.DECRYPT_MODE);
|
||||||
|
|
||||||
|
input.put(Util.h2b(inputs[i])).rewind();
|
||||||
|
output.put(Util.h2b(outputs[i])).rewind();
|
||||||
|
|
||||||
|
try {
|
||||||
|
assertEquals(Aes.BLOCK_SIZE, enc.update(input, cipher));
|
||||||
|
assertEquals(Aes.BLOCK_SIZE, dec.update(output, plain));
|
||||||
|
} catch (ShortBufferException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(Aes.BLOCK_SIZE, input.position());
|
||||||
|
assertEquals(0, input.remaining());
|
||||||
|
assertEquals(Aes.BLOCK_SIZE, output.position());
|
||||||
|
assertEquals(0, output.remaining());
|
||||||
|
assertEquals(Aes.BLOCK_SIZE, cipher.position());
|
||||||
|
assertEquals(0, cipher.remaining());
|
||||||
|
assertEquals(Aes.BLOCK_SIZE, plain.position());
|
||||||
|
assertEquals(0, plain.remaining());
|
||||||
|
|
||||||
|
input.rewind();
|
||||||
|
output.rewind();
|
||||||
|
cipher.rewind();
|
||||||
|
plain.rewind();
|
||||||
|
|
||||||
|
assertEquals(output, cipher);
|
||||||
|
assertEquals(input, plain);
|
||||||
|
|
||||||
|
/* tests ShortBufferException */
|
||||||
|
if (i == inputs.length - 1) {
|
||||||
|
cipher.position(cipher.limit());
|
||||||
|
enc.update(input, cipher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected=ShortBufferException.class)
|
||||||
|
public void updateShouldMatchUsingByteArray() throws ShortBufferException {
|
||||||
|
String[] keys = new String[] {
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"2b7e151628aed2a6abf7158809cf4f3c",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
|
||||||
|
"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", };
|
||||||
|
String[] ivs = new String[] {
|
||||||
|
"000102030405060708090A0B0C0D0E0F",
|
||||||
|
"7649ABAC8119B246CEE98E9B12E9197D",
|
||||||
|
"5086CB9B507219EE95DB113A917678B2",
|
||||||
|
"73BED6B8E3C1743B7116E69E22229516",
|
||||||
|
"000102030405060708090A0B0C0D0E0F",
|
||||||
|
"4F021DB243BC633D7178183A9FA071E8",
|
||||||
|
"B4D9ADA9AD7DEDF4E5E738763F69145A",
|
||||||
|
"571B242012FB7AE07FA9BAAC3DF102E0",
|
||||||
|
"000102030405060708090A0B0C0D0E0F",
|
||||||
|
"F58C4C04D6E5F1BA779EABFB5F7BFBD6",
|
||||||
|
"9CFC4E967EDB808D679F777BC6702C7D",
|
||||||
|
"39F23369A9D9BACFA530E26304231461" };
|
||||||
|
String[] inputs = new String[] {
|
||||||
|
"6bc1bee22e409f96e93d7e117393172a",
|
||||||
|
"ae2d8a571e03ac9c9eb76fac45af8e51",
|
||||||
|
"30c81c46a35ce411e5fbc1191a0a52ef",
|
||||||
|
"f69f2445df4f9b17ad2b417be66c3710",
|
||||||
|
"6bc1bee22e409f96e93d7e117393172a",
|
||||||
|
"ae2d8a571e03ac9c9eb76fac45af8e51",
|
||||||
|
"30c81c46a35ce411e5fbc1191a0a52ef",
|
||||||
|
"f69f2445df4f9b17ad2b417be66c3710",
|
||||||
|
"6bc1bee22e409f96e93d7e117393172a",
|
||||||
|
"ae2d8a571e03ac9c9eb76fac45af8e51",
|
||||||
|
"30c81c46a35ce411e5fbc1191a0a52ef",
|
||||||
|
"f69f2445df4f9b17ad2b417be66c3710" };
|
||||||
|
String[] outputs = new String[] {
|
||||||
|
"7649abac8119b246cee98e9b12e9197d",
|
||||||
|
"5086cb9b507219ee95db113a917678b2",
|
||||||
|
"73bed6b8e3c1743b7116e69e22229516",
|
||||||
|
"3ff1caa1681fac09120eca307586e1a7",
|
||||||
|
"4f021db243bc633d7178183a9fa071e8",
|
||||||
|
"b4d9ada9ad7dedf4e5e738763f69145a",
|
||||||
|
"571b242012fb7ae07fa9baac3df102e0",
|
||||||
|
"08b0e27988598881d920a9e64f5615cd",
|
||||||
|
"f58c4c04d6e5f1ba779eabfb5f7bfbd6",
|
||||||
|
"9cfc4e967edb808d679f777bc6702c7d",
|
||||||
|
"39f23369a9d9bacfa530e26304231461",
|
||||||
|
"b2eb05e2c39be9fcda6c19078c6a9d1b" };
|
||||||
|
|
||||||
|
for (int i = 0; i < inputs.length; i++) {
|
||||||
|
Aes enc = new Aes(Util.h2b(keys[i]), Util.h2b(ivs[i]),
|
||||||
|
Aes.ENCRYPT_MODE);
|
||||||
|
Aes dec = new Aes(Util.h2b(keys[i]), Util.h2b(ivs[i]),
|
||||||
|
Aes.DECRYPT_MODE);
|
||||||
|
|
||||||
|
byte[] input = Util.h2b(inputs[i]);
|
||||||
|
byte[] output = Util.h2b(outputs[i]);
|
||||||
|
byte[] cipher = new byte[Aes.BLOCK_SIZE];
|
||||||
|
byte[] plain = new byte[Aes.BLOCK_SIZE];
|
||||||
|
|
||||||
|
if (i % 2 == 0) {
|
||||||
|
cipher = enc.update(input, 0, input.length);
|
||||||
|
plain = dec.update(output, 0, output.length);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
assertEquals(Aes.BLOCK_SIZE,
|
||||||
|
enc.update(input, 0, input.length, cipher, 0));
|
||||||
|
assertEquals(Aes.BLOCK_SIZE,
|
||||||
|
dec.update(output, 0, output.length, plain, 0));
|
||||||
|
} catch (ShortBufferException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertArrayEquals(output, cipher);
|
||||||
|
assertArrayEquals(input, plain);
|
||||||
|
|
||||||
|
/* tests ShortBufferException */
|
||||||
|
if (i == inputs.length - 1)
|
||||||
|
enc.update(input, 0, input.length, cipher, Aes.BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue