Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/crypt.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9216 by nmaya, Sat Apr 17 09:52:01 2021 UTC revision 9217 by nmaya, Sun Apr 25 02:18:41 2021 UTC
# Line 205  BOOL CRYPT_encrypt_aead(PTInstVar pvar, Line 205  BOOL CRYPT_encrypt_aead(PTInstVar pvar,
205          unsigned char lastiv[1];          unsigned char lastiv[1];
206          char tmp[80];          char tmp[80];
207          struct sshcipher_ctx *cc = pvar->cc[MODE_OUT];          struct sshcipher_ctx *cc = pvar->cc[MODE_OUT];
208            unsigned int newbuff_len = bytes;
209    
210          if (bytes == 0)          if (bytes == 0)
211                  return TRUE;                  return TRUE;
# Line 218  BOOL CRYPT_encrypt_aead(PTInstVar pvar, Line 219  BOOL CRYPT_encrypt_aead(PTInstVar pvar,
219                  return FALSE;                  return FALSE;
220          }          }
221    
222          if (bytes > encbufflen) {          if (cc->cipher->id == SSH2_CIPHER_CHACHAPOLY) {
223                  if ((newbuff = realloc(encbuff, bytes)) == NULL)                  // chacha20-poly1305 では aadlen も暗号化の対象
224                    //   aadlen と bytes は別々に暗号化される
225                    // chachapoly_crypt の中で認証データ(AEAD tag)も生成される
226                    newbuff_len += aadlen + authlen;
227            }
228            if (newbuff_len > encbufflen) {
229                    if ((newbuff = realloc(encbuff, newbuff_len)) == NULL)
230                          goto err;                          goto err;
231                  encbuff = newbuff;                  encbuff = newbuff;
232                  encbufflen = bytes;                  encbufflen = newbuff_len;
233            }
234    
235            if (cc->cipher->id == SSH2_CIPHER_CHACHAPOLY) {
236                    if (chachapoly_crypt(cc->cp_ctx, pvar->ssh_state.sender_sequence_number,
237                                         encbuff, data, bytes, aadlen, authlen, 1) != 0) {
238                            goto err;
239                    }
240                    memcpy(data, encbuff, aadlen + bytes + authlen);
241                    return TRUE;
242          }          }
243    
244          if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))          if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))
# Line 231  BOOL CRYPT_encrypt_aead(PTInstVar pvar, Line 247  BOOL CRYPT_encrypt_aead(PTInstVar pvar,
247          if (aadlen && !EVP_Cipher(cc->evp, NULL, data, aadlen) < 0)          if (aadlen && !EVP_Cipher(cc->evp, NULL, data, aadlen) < 0)
248                  goto err;                  goto err;
249    
250            // AES-GCM では aadlen を暗号化しないので、その先だけ暗号化する
251          if (EVP_Cipher(cc->evp, encbuff, data+aadlen, bytes) < 0)          if (EVP_Cipher(cc->evp, encbuff, data+aadlen, bytes) < 0)
252                  goto err;                  goto err;
253    
# Line 258  BOOL CRYPT_decrypt_aead(PTInstVar pvar, Line 275  BOOL CRYPT_decrypt_aead(PTInstVar pvar,
275          unsigned int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;          unsigned int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
276          unsigned char lastiv[1];          unsigned char lastiv[1];
277          char tmp[80];          char tmp[80];
278          struct sshcipher_ctx *cc = pvar->cc[MODE_OUT];          struct sshcipher_ctx *cc = pvar->cc[MODE_IN];
279            unsigned int newbuff_len = bytes;
280    
281          if (bytes == 0)          if (bytes == 0)
282                  return TRUE;                  return TRUE;
# Line 272  BOOL CRYPT_decrypt_aead(PTInstVar pvar, Line 290  BOOL CRYPT_decrypt_aead(PTInstVar pvar,
290                  return FALSE;                  return FALSE;
291          }          }
292    
293          if (bytes > encbufflen) {          if (cc->cipher->id == SSH2_CIPHER_CHACHAPOLY) {
294                  if ((newbuff = realloc(encbuff, bytes)) == NULL)                  // chacha20-poly1305 では aadlen も暗号化されている
295                    newbuff_len += aadlen;
296            }
297            if (newbuff_len > encbufflen) {
298                    if ((newbuff = realloc(encbuff, newbuff_len)) == NULL)
299                          goto err;                          goto err;
300                  encbuff = newbuff;                  encbuff = newbuff;
301                  encbufflen = bytes;                  encbufflen = newbuff_len;
302            }
303    
304            if (cc->cipher->id == SSH2_CIPHER_CHACHAPOLY) {
305                    if (chachapoly_crypt(cc->cp_ctx, pvar->ssh_state.receiver_sequence_number,
306                                         encbuff, data, bytes, aadlen, authlen, 0) != 0) {
307                            goto err;
308                    }
309                    memcpy(data, encbuff, aadlen + bytes);
310                    return TRUE;
311          }          }
312    
313          if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))          if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))
# Line 288  BOOL CRYPT_decrypt_aead(PTInstVar pvar, Line 319  BOOL CRYPT_decrypt_aead(PTInstVar pvar,
319          if (aadlen && !EVP_Cipher(cc->evp, NULL, data, aadlen) < 0)          if (aadlen && !EVP_Cipher(cc->evp, NULL, data, aadlen) < 0)
320                  goto err;                  goto err;
321    
322            // AES-GCM では aadlen を暗号化しないので、その先だけ復号する
323          if (EVP_Cipher(cc->evp, encbuff, data+aadlen, bytes) < 0)          if (EVP_Cipher(cc->evp, encbuff, data+aadlen, bytes) < 0)
324                  goto err;                  goto err;
325    
# Line 593  BOOL CRYPT_set_supported_ciphers(PTInstV Line 625  BOOL CRYPT_set_supported_ciphers(PTInstV
625                              | (1 << SSH2_CIPHER_CAMELLIA256_CTR)                              | (1 << SSH2_CIPHER_CAMELLIA256_CTR)
626                              | (1 << SSH2_CIPHER_AES128_GCM)                              | (1 << SSH2_CIPHER_AES128_GCM)
627                              | (1 << SSH2_CIPHER_AES256_GCM)                              | (1 << SSH2_CIPHER_AES256_GCM)
628                                | (1 << SSH2_CIPHER_CHACHAPOLY)
629                  );                  );
630          }          }
631    

Legend:
Removed from v.9216  
changed lines
  Added in v.9217

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26