For now, only cipher tests were changed. Maybe the same applies to hashes (not so much because of performance, but certain engines may crash on unaligned data). --- examples/async_cipher.c | 40 +++++++++++++++++++++++----------------- examples/async_speed.c | 19 ++++++++++++++----- examples/cipher.c | 42 +++++++++++++++++++++++++----------------- examples/speed.c | 23 +++++++++++++++++------ 4 files changed, 79 insertions(+), 45 deletions(-)
diff --git a/examples/async_cipher.c b/examples/async_cipher.c index aae9379..1b58e1b 100644 --- a/examples/async_cipher.c +++ b/examples/async_cipher.c @@ -22,8 +22,8 @@ static int test_crypto(int cfd) { - char plaintext[DATA_SIZE]; - char ciphertext[DATA_SIZE]; + char plaintext_raw[DATA_SIZE + 63], *plaintext; + char ciphertext_raw[DATA_SIZE + 63], *ciphertext; char iv[BLOCK_SIZE]; char key[KEY_SIZE]; @@ -35,7 +35,6 @@ test_crypto(int cfd) memset(&sess, 0, sizeof(sess)); memset(&cryp, 0, sizeof(cryp)); - memset(plaintext, 0x15, sizeof(plaintext)); memset(key, 0x33, sizeof(key)); memset(iv, 0x03, sizeof(iv)); @@ -51,9 +50,13 @@ test_crypto(int cfd) printf("%s: got the session\n", __func__); + plaintext = (char *)(((unsigned long)plaintext_raw + sess.alignmask) & ~sess.alignmask); + ciphertext = (char *)(((unsigned long)ciphertext_raw + sess.alignmask) & ~sess.alignmask); + memset(plaintext, 0x15, DATA_SIZE); + /* Encrypt data.in to data.encrypted */ cryp.ses = sess.ses; - cryp.len = sizeof(plaintext); + cryp.len = DATA_SIZE; cryp.src = plaintext; cryp.dst = ciphertext; cryp.iv = iv; @@ -78,7 +81,7 @@ test_crypto(int cfd) /* Decrypt data.encrypted to data.decrypted */ cryp.ses = sess.ses; - cryp.len = sizeof(plaintext); + cryp.len = DATA_SIZE; cryp.src = ciphertext; cryp.dst = ciphertext; cryp.iv = iv; @@ -90,7 +93,7 @@ test_crypto(int cfd) printf("%s: data encrypted\n", __func__); /* Verify the result */ - if (memcmp(plaintext, ciphertext, sizeof(plaintext)) != 0) { + if (memcmp(plaintext, ciphertext, DATA_SIZE) != 0) { fprintf(stderr, "FAIL: Decrypted data are different from the input data.\n"); return 1; @@ -108,11 +111,12 @@ test_crypto(int cfd) static int test_aes(int cfd) { - char plaintext1[BLOCK_SIZE]; + char plaintext1_raw[BLOCK_SIZE + 63], *plaintext1; char ciphertext1[BLOCK_SIZE] = { 0xdf, 0x55, 0x6a, 0x33, 0x43, 0x8d, 0xb8, 0x7b, 0xc4, 0x1b, 0x17, 0x52, 0xc5, 0x5e, 0x5e, 0x49 }; char iv1[BLOCK_SIZE]; char key1[KEY_SIZE] = { 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - char plaintext2[BLOCK_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 }; + char plaintext2_data[BLOCK_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 }; + char plaintext2_raw[BLOCK_SIZE + 63], *plaintext2; char ciphertext2[BLOCK_SIZE] = { 0xb7, 0x97, 0x2b, 0x39, 0x41, 0xc4, 0x4b, 0x90, 0xaf, 0xa7, 0xb2, 0x64, 0xbf, 0xba, 0x73, 0x87 }; char iv2[BLOCK_SIZE]; char key2[KEY_SIZE]; @@ -120,16 +124,11 @@ static int test_aes(int cfd) struct session_op sess1, sess2; struct crypt_op cryp1, cryp2; - printf("running %s\n", __func__); - memset(&sess1, 0, sizeof(sess1)); memset(&sess2, 0, sizeof(sess2)); memset(&cryp1, 0, sizeof(cryp1)); memset(&cryp2, 0, sizeof(cryp2)); - memset(plaintext1, 0x0, sizeof(plaintext1)); - memset(iv1, 0x0, sizeof(iv1)); - /* Get crypto session for AES128 */ sess1.cipher = CRYPTO_AES_CBC; sess1.keylen = KEY_SIZE; @@ -139,6 +138,10 @@ static int test_aes(int cfd) return 1; } + plaintext1 = (char *)(((unsigned long)plaintext1_raw + sess1.alignmask) & ~sess1.alignmask); + memset(plaintext1, 0x0, BLOCK_SIZE); + + memset(iv1, 0x0, sizeof(iv1)); memset(key2, 0x0, sizeof(key2)); /* Get second crypto session for AES128 */ @@ -150,9 +153,12 @@ static int test_aes(int cfd) return 1; } + plaintext2 = (char *)(((unsigned long)plaintext2_raw + sess2.alignmask) & ~sess2.alignmask); + memcpy(plaintext2, plaintext2_data, BLOCK_SIZE); + /* Encrypt data.in to data.encrypted */ cryp1.ses = sess1.ses; - cryp1.len = sizeof(plaintext1); + cryp1.len = BLOCK_SIZE; cryp1.src = plaintext1; cryp1.dst = plaintext1; cryp1.iv = iv1; @@ -165,7 +171,7 @@ static int test_aes(int cfd) /* Encrypt data.in to data.encrypted */ cryp2.ses = sess2.ses; - cryp2.len = sizeof(plaintext2); + cryp2.len = BLOCK_SIZE; cryp2.src = plaintext2; cryp2.dst = plaintext2; cryp2.iv = iv2; @@ -179,7 +185,7 @@ static int test_aes(int cfd) printf("cryp1 + cryp2 successfully read\n"); /* Verify the result */ - if (memcmp(plaintext1, ciphertext1, sizeof(plaintext1)) != 0) { + if (memcmp(plaintext1, ciphertext1, BLOCK_SIZE) != 0) { int i; fprintf(stderr, "FAIL: Decrypted data are different from the input data.\n"); @@ -200,7 +206,7 @@ static int test_aes(int cfd) /* Test 2 */ /* Verify the result */ - if (memcmp(plaintext2, ciphertext2, sizeof(plaintext2)) != 0) { + if (memcmp(plaintext2, ciphertext2, BLOCK_SIZE) != 0) { int i; fprintf(stderr, "FAIL: Decrypted data are different from the input data.\n"); diff --git a/examples/async_speed.c b/examples/async_speed.c index 7d98bae..679219b 100644 --- a/examples/async_speed.c +++ b/examples/async_speed.c @@ -69,7 +69,7 @@ static void value2human(double bytes, double time, double* data, double* speed,c } -int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) +int encrypt_data(struct session_op *sess, int fdc, int chunksize, int alignmask) { struct crypt_op cop; char *buffer[64], iv[32]; @@ -86,7 +86,17 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) fflush(stdout); for (rc = 0; rc < 64; rc++) { - buffer[rc] = malloc(chunksize); + if (alignmask) { + if (posix_memalign((void **)(buffer + rc), alignmask + 1, chunksize)) { + printf("posix_memalign() failed!\n"); + return 1; + } + } else { + if (!(buffer[rc] = malloc(chunksize))) { + perror("malloc()"); + return 1; + } + } memset(buffer[rc], val++, chunksize); } pfd.fd = fdc; @@ -111,7 +121,6 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) cop.len = chunksize; cop.iv = (unsigned char *)iv; cop.op = COP_ENCRYPT; - cop.flags = flags; cop.src = cop.dst = (unsigned char *)buffer[bufidx]; bufidx = (bufidx + 1) % 64; @@ -171,7 +180,7 @@ int main(void) } for (i = 256; i <= (64 * 4096); i *= 2) { - if (encrypt_data(&sess, fdc, i, 0)) + if (encrypt_data(&sess, fdc, i, sess.alignmask)) break; } @@ -187,7 +196,7 @@ int main(void) } for (i = 256; i <= (64 * 1024); i *= 2) { - if (encrypt_data(&sess, fdc, i, 0)) + if (encrypt_data(&sess, fdc, i, sess.alignmask)) break; } diff --git a/examples/cipher.c b/examples/cipher.c index b07b252..17ee466 100644 --- a/examples/cipher.c +++ b/examples/cipher.c @@ -19,8 +19,8 @@ static int test_crypto(int cfd) { - char plaintext[DATA_SIZE]; - char ciphertext[DATA_SIZE]; + char plaintext_raw[DATA_SIZE + 63], *plaintext; + char ciphertext_raw[DATA_SIZE + 63], *ciphertext; char iv[BLOCK_SIZE]; char key[KEY_SIZE]; @@ -30,7 +30,6 @@ test_crypto(int cfd) memset(&sess, 0, sizeof(sess)); memset(&cryp, 0, sizeof(cryp)); - memset(plaintext, 0x15, sizeof(plaintext)); memset(key, 0x33, sizeof(key)); memset(iv, 0x03, sizeof(iv)); @@ -43,10 +42,13 @@ test_crypto(int cfd) return 1; } + plaintext = (char *)(((unsigned long)plaintext_raw + sess.alignmask) & ~sess.alignmask); + ciphertext = (char *)(((unsigned long)ciphertext_raw + sess.alignmask) & ~sess.alignmask); + memset(plaintext, 0x15, DATA_SIZE); /* Encrypt data.in to data.encrypted */ cryp.ses = sess.ses; - cryp.len = sizeof(plaintext); + cryp.len = DATA_SIZE; cryp.src = plaintext; cryp.dst = ciphertext; cryp.iv = iv; @@ -65,10 +67,10 @@ test_crypto(int cfd) perror("ioctl(CIOCGSESSION)"); return 1; } - + /* Decrypt data.encrypted to data.decrypted */ cryp.ses = sess.ses; - cryp.len = sizeof(plaintext); + cryp.len = DATA_SIZE; cryp.src = ciphertext; cryp.dst = ciphertext; cryp.iv = iv; @@ -79,7 +81,7 @@ test_crypto(int cfd) } /* Verify the result */ - if (memcmp(plaintext, ciphertext, sizeof(plaintext)) != 0) { + if (memcmp(plaintext, ciphertext, DATA_SIZE) != 0) { fprintf(stderr, "FAIL: Decrypted data are different from the input data.\n"); return 1; @@ -97,11 +99,12 @@ test_crypto(int cfd) static int test_aes(int cfd) { - char plaintext1[BLOCK_SIZE]; + char plaintext1_raw[BLOCK_SIZE + 63], *plaintext1; char ciphertext1[BLOCK_SIZE] = { 0xdf, 0x55, 0x6a, 0x33, 0x43, 0x8d, 0xb8, 0x7b, 0xc4, 0x1b, 0x17, 0x52, 0xc5, 0x5e, 0x5e, 0x49 }; char iv1[BLOCK_SIZE]; char key1[KEY_SIZE] = { 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - char plaintext2[BLOCK_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 }; + char plaintext2_data[BLOCK_SIZE] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 }; + char plaintext2_raw[BLOCK_SIZE + 63], *plaintext2; char ciphertext2[BLOCK_SIZE] = { 0xb7, 0x97, 0x2b, 0x39, 0x41, 0xc4, 0x4b, 0x90, 0xaf, 0xa7, 0xb2, 0x64, 0xbf, 0xba, 0x73, 0x87 }; char iv2[BLOCK_SIZE]; char key2[KEY_SIZE]; @@ -112,9 +115,6 @@ static int test_aes(int cfd) memset(&sess, 0, sizeof(sess)); memset(&cryp, 0, sizeof(cryp)); - memset(plaintext1, 0x0, sizeof(plaintext1)); - memset(iv1, 0x0, sizeof(iv1)); - /* Get crypto session for AES128 */ sess.cipher = CRYPTO_AES_CBC; sess.keylen = KEY_SIZE; @@ -124,9 +124,14 @@ static int test_aes(int cfd) return 1; } + plaintext1 = (char *)(((unsigned long)plaintext1_raw + sess.alignmask) & ~sess.alignmask); + + memset(plaintext1, 0x0, BLOCK_SIZE); + memset(iv1, 0x0, sizeof(iv1)); + /* Encrypt data.in to data.encrypted */ cryp.ses = sess.ses; - cryp.len = sizeof(plaintext1); + cryp.len = BLOCK_SIZE; cryp.src = plaintext1; cryp.dst = plaintext1; cryp.iv = iv1; @@ -137,7 +142,7 @@ static int test_aes(int cfd) } /* Verify the result */ - if (memcmp(plaintext1, ciphertext1, sizeof(plaintext1)) != 0) { + if (memcmp(plaintext1, ciphertext1, BLOCK_SIZE) != 0) { fprintf(stderr, "FAIL: Decrypted data are different from the input data.\n"); return 1; @@ -147,7 +152,7 @@ static int test_aes(int cfd) memset(key2, 0x0, sizeof(key2)); memset(iv2, 0x0, sizeof(iv2)); - + /* Get crypto session for AES128 */ sess.cipher = CRYPTO_AES_CBC; sess.keylen = KEY_SIZE; @@ -157,9 +162,12 @@ static int test_aes(int cfd) return 1; } + plaintext2 = (char *)(((unsigned long)plaintext2_raw + sess.alignmask) & ~sess.alignmask); + memcpy(plaintext2, plaintext2_data, BLOCK_SIZE); + /* Encrypt data.in to data.encrypted */ cryp.ses = sess.ses; - cryp.len = sizeof(plaintext2); + cryp.len = BLOCK_SIZE; cryp.src = plaintext2; cryp.dst = plaintext2; cryp.iv = iv2; @@ -170,7 +178,7 @@ static int test_aes(int cfd) } /* Verify the result */ - if (memcmp(plaintext2, ciphertext2, sizeof(plaintext2)) != 0) { + if (memcmp(plaintext2, ciphertext2, BLOCK_SIZE) != 0) { fprintf(stderr, "FAIL: Decrypted data are different from the input data.\n"); return 1; diff --git a/examples/speed.c b/examples/speed.c index d58c70f..998772d 100644 --- a/examples/speed.c +++ b/examples/speed.c @@ -65,7 +65,7 @@ static void value2human(double bytes, double time, double* data, double* speed,c } -int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) +int encrypt_data(struct session_op *sess, int fdc, int chunksize, int alignmask) { struct crypt_op cop; char *buffer, iv[32]; @@ -75,7 +75,18 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) double secs, ddata, dspeed; char metric[16]; - buffer = malloc(chunksize); + if (alignmask) { + if (posix_memalign((void **)&buffer, alignmask, chunksize)) { + printf("posix_memalign() failed!\n"); + return 1; + } + } else { + if (!(buffer = malloc(chunksize))) { + perror("malloc()"); + return 1; + } + } + memset(iv, 0x23, 32); printf("\tEncrypting in chunks of %d bytes: ", chunksize); @@ -93,7 +104,6 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) cop.len = chunksize; cop.iv = (unsigned char *)iv; cop.op = COP_ENCRYPT; - cop.flags = flags; cop.src = cop.dst = (unsigned char *)buffer; if (ioctl(fdc, CIOCCRYPT, &cop)) { @@ -105,11 +115,12 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags) gettimeofday(&end, NULL); secs = udifftimeval(start, end)/ 1000000.0; - + value2human(total, secs, &ddata, &dspeed, metric); printf ("done. %.2f %s in %.2f secs: ", ddata, metric, secs); printf ("%.2f %s/sec\n", dspeed, metric); + free(buffer); return 0; } @@ -129,7 +140,7 @@ int main(void) perror("ioctl(CRIOGET)"); return 1; } - + fprintf(stderr, "Testing NULL cipher: \n"); memset(&sess, 0, sizeof(sess)); sess.cipher = CRYPTO_NULL; @@ -141,7 +152,7 @@ int main(void) } for (i = 256; i <= (64 * 4096); i *= 2) { - if (encrypt_data(&sess, fdc, i, 0)) + if (encrypt_data(&sess, fdc, i, sess.alignmask)) break; } -- 1.7.3.2 _______________________________________________ Cryptodev-linux-devel mailing list Cryptodev-linux-devel@gna.org https://mail.gna.org/listinfo/cryptodev-linux-devel