From 9edbd0767c9523f4b14c365016f27deb2a974d92 Mon Sep 17 00:00:00 2001 From: couturier Date: Thu, 4 Nov 2021 15:43:57 +0100 Subject: [PATCH] new --- OneRoundIoT/openssl/Makefile | 6 +- .../openssl/openssl_evp_chacha20_poly1305 | Bin 0 -> 23128 bytes .../openssl/openssl_evp_chacha20_poly1305.c | 4 +- .../openssl_evp_chacha20_poly1305_v2.c | 499 ++++++++++++++++++ 4 files changed, 506 insertions(+), 3 deletions(-) create mode 100755 OneRoundIoT/openssl/openssl_evp_chacha20_poly1305 create mode 100644 OneRoundIoT/openssl/openssl_evp_chacha20_poly1305_v2.c diff --git a/OneRoundIoT/openssl/Makefile b/OneRoundIoT/openssl/Makefile index 150f06a..59643a3 100644 --- a/OneRoundIoT/openssl/Makefile +++ b/OneRoundIoT/openssl/Makefile @@ -8,6 +8,7 @@ OBJ5 = pixmap_io.o openssl_evp_gcm.o OBJ6 = pixmap_io.o openssl_evp_hmac.o OBJ7 = pixmap_io.o openssl_evp_ocb.o OBJ8 = pixmap_io.o openssl_chacha20_poly1305.o +OBJ9 = pixmap_io.o openssl_chacha20_poly1305_v2.o openssl_evp: $(OBJ) $(C) -o $@ $^ $(CFLAGS) @@ -34,11 +35,14 @@ openssl_evp_ocb: $(OBJ7) openssl_evp_chacha20_poly1305: $(OBJ7) $(C) -o $@ $^ $(CFLAGS) +openssl_evp_chacha20_poly1305_v2: $(OBJ7) + $(C) -o $@ $^ $(CFLAGS) + %.o: %.c $(C) -c -o $@ $< -O3 clean: - rm -rf $(OBJ) openssl_evp openssl_evp_cmac openssl_evp_ccm openssl_evp_ocb + rm -rf $(OBJ) openssl_evp openssl_evp_cmac openssl_evp_ccm openssl_evp_ocb openssl_evp_chacha20_poly1305_v2 openssl_evp_chacha20_poly1305 diff --git a/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305 b/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305 new file mode 100755 index 0000000000000000000000000000000000000000..1a11e749ded26bd58e5d6e23639a5341d6080070 GIT binary patch literal 23128 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 literal 0 HcmV?d00001 diff --git a/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305.c b/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305.c index dbe0bc3..a0e7d8d 100755 --- a/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305.c +++ b/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305.c @@ -72,11 +72,11 @@ int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, //256 //avant ecb if(ctr) { - if(1 != CMAC_Init(ctx, key, 16, EVP_chacha20_poly1305(), NULL)) + if(1 != CMAC_Init(ctx, key, 32, EVP_chacha20_poly1305(), NULL)) handleErrors(); } else - if(1 != CMAC_Init(ctx, key, 16, EVP_chacha20_poly1305(), NULL)) + if(1 != CMAC_Init(ctx, key, 32, EVP_chacha20_poly1305(), NULL)) handleErrors(); size_t mactlen; unsigned char mact[16] = {0}; diff --git a/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305_v2.c b/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305_v2.c new file mode 100644 index 0000000..928ee2a --- /dev/null +++ b/OneRoundIoT/openssl/openssl_evp_chacha20_poly1305_v2.c @@ -0,0 +1,499 @@ +//gcc pixmap_io.c -c +//gcc openssl_evp.c pixmap_io.o -o openssl_evp -I /usr/include/openssl/ -lcrypto -O3 -std=c99 + + +#include +#include +#include +#include +#include +#include +#include +#include "pixmap_io.h" + +typedef unsigned char uchar; + +int nb_test=1; +int ctr=0; + + + + + +double TimeStart() +{ + struct timeval tstart; + gettimeofday(&tstart,0); + return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) ); +} + +double TimeStop(double t) +{ + struct timeval tend; + + gettimeofday(&tend,0); + t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t; + return (t); +} + + +void handleErrors(void) +{ + ERR_print_errors_fp(stderr); + abort(); +} + + +int encryptccm(unsigned char *plaintext, int plaintext_len, unsigned char *aad, + int aad_len, unsigned char *key, unsigned char *iv, + unsigned char *ciphertext, unsigned char *tag) +{ + EVP_CIPHER_CTX *ctx; + + int len; + + int ciphertext_len; + + + /* Create and initialise the context */ + if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); + + /* Initialise the encryption operation. */ + if(1 != EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, NULL)) + handleErrors(); + + /* Setting IV len to 7. Not strictly necessary as this is the default + * but shown here for the purposes of this example */ + if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, 7, NULL)) + handleErrors(); + + /* Set tag length */ + EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, NULL); + + /* Initialise key and IV */ + if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv)) handleErrors(); + + /* Provide the total plaintext length + */ + if(1 != EVP_EncryptUpdate(ctx, NULL, &len, NULL, plaintext_len)) + handleErrors(); + + /* Provide any AAD data. This can be called zero or one times as + * required + */ + if(1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_len)) + handleErrors(); + + /* Provide the message to be encrypted, and obtain the encrypted output. + * EVP_EncryptUpdate can only be called once for this + */ + if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) + handleErrors(); + ciphertext_len = len; + + /* Finalise the encryption. Normally ciphertext bytes may be written at + * this stage, but this does not occur in CCM mode + */ + if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors(); + ciphertext_len += len; + + /* Get the tag */ + if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, tag)) + handleErrors(); + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + + return ciphertext_len; +} + + +int decryptccm(unsigned char *ciphertext, int ciphertext_len, unsigned char *aad, + int aad_len, unsigned char *tag, unsigned char *key, unsigned char *iv, + unsigned char *plaintext) +{ + EVP_CIPHER_CTX *ctx; + int len; + int plaintext_len; + int ret; + + /* Create and initialise the context */ + if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); + + /* Initialise the decryption operation. */ + if(1 != EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, NULL)) + handleErrors(); + + /* Setting IV len to 7. Not strictly necessary as this is the default + * but shown here for the purposes of this example */ + if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, 7, NULL)) + handleErrors(); + + /* Set expected tag value. */ + if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, tag)) + handleErrors(); + + /* Initialise key and IV */ + if(1 != EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv)) handleErrors(); + + + /* Provide the total ciphertext length + */ + if(1 != EVP_DecryptUpdate(ctx, NULL, &len, NULL, ciphertext_len)) + handleErrors(); + + /* Provide any AAD data. This can be called zero or more times as + * required + */ + if(1 != EVP_DecryptUpdate(ctx, NULL, &len, aad, aad_len)) + handleErrors(); + + /* Provide the message to be decrypted, and obtain the plaintext output. + * EVP_DecryptUpdate can be called multiple times if necessary + */ + ret = EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len); + + // printf("RET %d len %d\n",ret,len); + + plaintext_len = len; + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + + if(ret > 0) + { + /* Success */ + return plaintext_len; + } + else + { + /* Verify failed */ + return -1; + } +} + + + + +/* int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, */ +/* unsigned char *iv, unsigned char *ciphertext, int ctr, int index) */ +/* { */ +/* EVP_CIPHER_CTX *ctx; */ + +/* int len; */ + +/* int ciphertext_len; */ + +/* /\* Create and initialise the context *\/ */ +/* if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); */ + +/* /\* Initialise the encryption operation. IMPORTANT - ensure you use a key */ +/* * and IV size appropriate for your cipher */ +/* * In this example we are using 256 bit AES (i.e. a 256 bit key). The */ +/* * IV size for *most* modes is the same as the block size. For AES this */ +/* * is 128 bits *\/ */ +/* //static double time=0; */ +/* //double t=0; */ +/* //t=TimeStart(); */ +/* //256 */ +/* //avant ecb */ +/* if(ctr) { */ +/* if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv)) */ +/* handleErrors(); */ +/* } */ +/* else */ +/* if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) */ +/* handleErrors(); */ + +/* //time+=TimeStop(t); */ +/* //printf("Time init %f\n",time); */ + + +/* // int cipherBlockSize = EVP_CIPHER_CTX_block_size(ctx); */ +/* // printf("INFO(evp_encrypt): block size: %d\n", cipherBlockSize); */ + + +/* /\* Provide the message to be encrypted, and obtain the encrypted output. */ +/* * EVP_EncryptUpdate can be called multiple times if necessary */ +/* *\/ */ + +/* /\* */ +/* static double time=0; */ +/* double t=0; */ +/* t=TimeStart(); */ +/* *\/ */ +/* for(int i=0;i ecb */ +/* if(ctr) { */ +/* if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv)) */ +/* handleErrors(); */ +/* } */ +/* else */ +/* if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) */ +/* handleErrors(); */ + +/* /\* Provide the message to be decrypted, and obtain the plaintext output. */ +/* * EVP_DecryptUpdate can be called multiple times if necessary */ +/* *\/ */ + +/* /\* static double time=0; */ +/* double t=0; */ +/* t=TimeStart(); */ +/* *\/ */ +/* for(int i=0;i