BruceWind / AESJniEncrypt

🛡 Make safest code in Android. (基于libsodium实现chacha20算法,key在native中,防止被二次打包){长期维护,请star,勿fork}

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

并发执行加密函数encode会导致失败

forest606 opened this issue · comments

实际测试发现并发执行encode后,程序异常,解密失败,定位后发现是并发调用encode,encode能支持并发吗?

commented

奇怪,应该不会这样子啊。你确定吗?

commented

是我代码里有static的字段吗, 我太久没看这个仓库了。如果有你试着改改。最近几天我上不了网。

同步调用encode就没有问题,所以应该是并发引起的

确实有static字段:
static state_t* state;
// The array that stores the round keys.
static uint8_t RoundKey[176];
// The Key input to the AES Program
static const uint8_t* Key;
#if defined(CBC) && CBC
// Initial Vector used only for CBC mode
static uint8_t* Iv;
#endif

解决了,将
static state_t* state;
static uint8_t RoundKey[176];
static const uint8_t* Key;
定义为局部变量,能够解决并发问题

commented

Okay, Can u give me a pull request? Thanx a lot.

commented

If u have more suggestions for this repository, I can add you to an organization and we will maintain it together.

好的,正在整理

帮我设置为开发者吧,一直提示我没有权限push

AESJniEncrypt forest$ git push origin develop
ERROR: Permission to BruceWind/AESJniEncrypt.git denied to forest606.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

From 889c28113ffdc90e29541a711750308c5b2af635 Mon Sep 17 00:00:00 2001
From: "forest.liu" forest606@gmail.com
Date: Mon, 3 Jun 2019 19:54:53 +0800
Subject: [PATCH] Support concurrently call encrypt and decrypt


aesjni/src/main/cpp/aes.c | 74 +++++++++++++++++++++++------------------------
1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/aesjni/src/main/cpp/aes.c b/aesjni/src/main/cpp/aes.c
index 9f8a572..185c7eb 100644
--- a/aesjni/src/main/cpp/aes.c
+++ b/aesjni/src/main/cpp/aes.c
@@ -62,13 +62,13 @@ NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0)
/*****************************************************************************/
// state - array holding the intermediate results during decryption.
typedef uint8_t state_t[4][4];
-static state_t* state;
+//static state_t* state;

// The array that stores the round keys.
-static uint8_t RoundKey[176];
+//static uint8_t RoundKey[176];

// The Key input to the AES Program
-static const uint8_t* Key;
+//static const uint8_t* Key;
#if defined(CBC) && CBC
// Initial Vector used only for CBC mode
static uint8_t* Iv;
@@ -151,7 +151,7 @@ static uint8_t getSBoxInvert(uint8_t num)
}

// This function produces Nb(Nr+1) round keys. The round keys are used in each round to decrypt the states.
-static void KeyExpansion(void)
+static void KeyExpansion(uint8_t *RoundKey, const uint8_t *Key)
{
uint32_t i, j, k;
uint8_t tempa[4]; // Used for the column/row operations
@@ -218,7 +218,7 @@ static void KeyExpansion(void)

// This function adds the round key to state.
// The round key is added to the state by an XOR function.
-static void AddRoundKey(uint8_t round)
+static void AddRoundKey(state_t* state, uint8_t *RoundKey, uint8_t round)
{
uint8_t i,j;
for(i=0;i<4;++i)
@@ -232,7 +232,7 @@ static void AddRoundKey(uint8_t round)

// The SubBytes Function Substitutes the values in the
// state matrix with values in an S-box.
-static void SubBytes(void)
+static void SubBytes(state_t* state)
{
uint8_t i, j;
for(i = 0; i < 4; ++i)
@@ -247,7 +247,7 @@ static void SubBytes(void)
// The ShiftRows() function shifts the rows in the state to the left.
// Each row is shifted with different offset.
// Offset = Row number. So the first row is not shifted.
-static void ShiftRows(void)
+static void ShiftRows(state_t* state)
{
uint8_t temp;

@@ -281,7 +281,7 @@ static uint8_t xtime(uint8_t x)
}

// MixColumns function mixes the columns of the state matrix
-static void MixColumns(void)
+static void MixColumns(state_t* state)
{
uint8_t i;
uint8_t Tmp,Tm,t;
@@ -319,7 +319,7 @@ static uint8_t Multiply(uint8_t x, uint8_t y)
// MixColumns function mixes the columns of the state matrix.
// The method used to multiply may be difficult to understand for the inexperienced.
// Please use the references to gain more information.
-static void InvMixColumns(void)
+static void InvMixColumns(state_t* state)
{
int i;
uint8_t a,b,c,d;
@@ -340,7 +340,7 @@ static void InvMixColumns(void)

// The SubBytes Function Substitutes the values in the
// state matrix with values in an S-box.
-static void InvSubBytes(void)
+static void InvSubBytes(state_t* state)
{
uint8_t i,j;
for(i=0;i<4;++i)
@@ -352,7 +352,7 @@ static void InvSubBytes(void)
}
}

-static void InvShiftRows(void)
+static void InvShiftRows(state_t* state)
{
uint8_t temp;

@@ -382,54 +382,54 @@ static void InvShiftRows(void)

// Cipher is the main function that encrypts the PlainText.
-static void Cipher(void)
+static void Cipher(state_t* state, uint8_t *RoundKey)
{
uint8_t round = 0;

// Add the First round key to the state before starting the rounds.

  • AddRoundKey(0);
  • AddRoundKey(state, RoundKey, 0);

    // There will be Nr rounds.
    // The first Nr-1 rounds are identical.
    // These Nr-1 rounds are executed in the loop below.
    for(round = 1; round < Nr; ++round)
    {

  • SubBytes();
  • ShiftRows();
  • MixColumns();
  • AddRoundKey(round);
  • SubBytes(state);
  • ShiftRows(state);
  • MixColumns(state);
  • AddRoundKey(state, RoundKey, round);
    }

// The last round is given below.
// The MixColumns function is not here in the last round.

  • SubBytes();
  • ShiftRows();
  • AddRoundKey(Nr);
  • SubBytes(state);
  • ShiftRows(state);
  • AddRoundKey(state, RoundKey, Nr);
    }

-static void InvCipher(void)
+static void InvCipher(state_t* state, uint8_t *RoundKey)
{
uint8_t round=0;

// Add the First round key to the state before starting the rounds.

  • AddRoundKey(Nr);
  • AddRoundKey(state, RoundKey, Nr);

    // There will be Nr rounds.
    // The first Nr-1 rounds are identical.
    // These Nr-1 rounds are executed in the loop below.
    for(round=Nr-1;round>0;round--)
    {

  • InvShiftRows();
  • InvSubBytes();
  • AddRoundKey(round);
  • InvMixColumns();
  • InvShiftRows(state);
  • InvSubBytes(state);
  • AddRoundKey(state, RoundKey, round);
  • InvMixColumns(state);
    }

// The last round is given below.
// The MixColumns function is not here in the last round.

  • InvShiftRows();
  • InvSubBytes();
  • AddRoundKey(0);
  • InvShiftRows(state);
  • InvSubBytes(state);
  • AddRoundKey(state, RoundKey, 0);
    }

static void BlockCopy(uint8_t* output, uint8_t* input)
@@ -453,26 +453,26 @@ void AES128_ECB_encrypt(uint8_t* input, const uint8_t* key, uint8_t* output)
{
// Copy input to output, and work in-memory on output
BlockCopy(output, input);

  • state = (state_t*)output;
  • state_t* state = (state_t*)output;
  • Key = key;
  • KeyExpansion();
  • uint8_t RoundKey[176] = {0};

  • KeyExpansion(RoundKey, key);

    // The next function call encrypts the PlainText with the Key using AES algorithm.

  • Cipher();
  • Cipher(state, RoundKey);
    }

void AES128_ECB_decrypt(uint8_t* input, const uint8_t* key, uint8_t *output)
{
// Copy input to output, and work in-memory on output
BlockCopy(output, input);

  • state = (state_t*)output;
  • state_t* state = (state_t*)output;

    // The KeyExpansion routine must be called before encryption.

  • Key = key;
  • KeyExpansion();
  • uint8_t RoundKey[176] = {0};
  • KeyExpansion(RoundKey, key);
  • InvCipher();
  • InvCipher(state, RoundKey);
    }

/**

2.13.2

commented

#23 (comment)

sorry,the reply is late.
u can do this:
1.fork the repo to your github.
2.modify code.
3.push code to your repo.
4.create a pull request to my repo.

commented

Sorry ever one, AES is no longer supported.
I have pushed code that use chacah20 instead of AES. #40