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 7004 by doda, Mon Dec 18 10:41:13 2017 UTC revision 7133 by doda, Thu Jun 14 10:57:13 2018 UTC
# Line 72  Line 72 
72    
73  #define CMP(a,b) memcmp(a, b, SSH_BLOCKSIZE)  #define CMP(a,b) memcmp(a, b, SSH_BLOCKSIZE)
74    
75    static unsigned char *encbuff = NULL;
76    static unsigned int encbufflen = 0;
77    
78  static char *get_cipher_name(int cipher);  static char *get_cipher_name(int cipher);
79    
# Line 200  BOOL CRYPT_detect_attack(PTInstVar pvar, Line 202  BOOL CRYPT_detect_attack(PTInstVar pvar,
202    
203  BOOL CRYPT_encrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen)  BOOL CRYPT_encrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen)
204  {  {
205          unsigned char *newbuf = NULL;          unsigned char *newbuff = NULL;
206          unsigned int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;          unsigned int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
207          unsigned char lastiv[1];          unsigned char lastiv[1];
208          char tmp[80];          char tmp[80];
# Line 218  BOOL CRYPT_encrypt_aead(PTInstVar pvar, Line 220  BOOL CRYPT_encrypt_aead(PTInstVar pvar,
220                  return FALSE;                  return FALSE;
221          }          }
222    
223          if ((newbuf = malloc(bytes)) == NULL)          if (bytes > encbufflen) {
224                  goto err;                  if ((newbuff = realloc(encbuff, bytes)) == NULL)
225                            goto err;
226                    encbuff = newbuff;
227                    encbufflen = bytes;
228            }
229    
230          if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))          if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))
231                  goto err;                  goto err;
# Line 227  BOOL CRYPT_encrypt_aead(PTInstVar pvar, Line 233  BOOL CRYPT_encrypt_aead(PTInstVar pvar,
233          if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0)          if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0)
234                  goto err;                  goto err;
235    
236          if (EVP_Cipher(evp, newbuf, data+aadlen, bytes) < 0)          if (EVP_Cipher(evp, encbuff, data+aadlen, bytes) < 0)
237                  goto err;                  goto err;
238    
239          memcpy(data+aadlen, newbuf, bytes);          memcpy(data+aadlen, encbuff, bytes);
240    
241          if (EVP_Cipher(evp, NULL, NULL, 0) < 0)          if (EVP_Cipher(evp, NULL, NULL, 0) < 0)
242                  goto err;                  goto err;
# Line 238  BOOL CRYPT_encrypt_aead(PTInstVar pvar, Line 244  BOOL CRYPT_encrypt_aead(PTInstVar pvar,
244          if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_GET_TAG, authlen, data+aadlen+bytes))          if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_GET_TAG, authlen, data+aadlen+bytes))
245                  goto err;                  goto err;
246    
         free(newbuf);  
   
247          return TRUE;          return TRUE;
248    
249  err:  err:
         free(newbuf);  
   
250          UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");          UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
251          _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,          _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
252                      get_cipher_name(pvar->crypt_state.sender_cipher));                      get_cipher_name(pvar->crypt_state.sender_cipher));
# Line 254  err: Line 256  err:
256    
257  BOOL CRYPT_decrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen)  BOOL CRYPT_decrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen)
258  {  {
259          unsigned char *newbuf = NULL;          unsigned char *newbuff = NULL;
260          unsigned int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;          unsigned int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
261          unsigned char lastiv[1];          unsigned char lastiv[1];
262          char tmp[80];          char tmp[80];
# Line 272  BOOL CRYPT_decrypt_aead(PTInstVar pvar, Line 274  BOOL CRYPT_decrypt_aead(PTInstVar pvar,
274                  return FALSE;                  return FALSE;
275          }          }
276    
277          if ((newbuf = malloc(bytes)) == NULL)          if (bytes > encbufflen) {
278                  goto err;                  if ((newbuff = realloc(encbuff, bytes)) == NULL)
279                            goto err;
280                    encbuff = newbuff;
281                    encbufflen = bytes;
282            }
283    
284          if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))          if (!EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_IV_GEN, 1, lastiv))
285                  goto err;                  goto err;
# Line 284  BOOL CRYPT_decrypt_aead(PTInstVar pvar, Line 290  BOOL CRYPT_decrypt_aead(PTInstVar pvar,
290          if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0)          if (aadlen && !EVP_Cipher(evp, NULL, data, aadlen) < 0)
291                  goto err;                  goto err;
292    
293          if (EVP_Cipher(evp, newbuf, data+aadlen, bytes) < 0)          if (EVP_Cipher(evp, encbuff, data+aadlen, bytes) < 0)
294                  goto err;                  goto err;
295    
296          memcpy(data+aadlen, newbuf, bytes);          memcpy(data+aadlen, encbuff, bytes);
         free(newbuf);  
297    
298          if (EVP_Cipher(evp, NULL, NULL, 0) < 0)          if (EVP_Cipher(evp, NULL, NULL, 0) < 0)
299                  return FALSE;                  return FALSE;
# Line 296  BOOL CRYPT_decrypt_aead(PTInstVar pvar, Line 301  BOOL CRYPT_decrypt_aead(PTInstVar pvar,
301                  return TRUE;                  return TRUE;
302    
303  err:  err:
         free(newbuf);  
   
304          UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");          UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
305          _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,          _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
306                      get_cipher_name(pvar->crypt_state.receiver_cipher));                      get_cipher_name(pvar->crypt_state.receiver_cipher));
# Line 311  static void no_encrypt(PTInstVar pvar, u Line 314  static void no_encrypt(PTInstVar pvar, u
314    
315  static void crypt_SSH2_encrypt(PTInstVar pvar, unsigned char *buf, int bytes)  static void crypt_SSH2_encrypt(PTInstVar pvar, unsigned char *buf, int bytes)
316  {  {
317          unsigned char *newbuf;          unsigned char *newbuff;
318          int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;          int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
319          char tmp[80];          char tmp[80];
320    
# Line 328  static void crypt_SSH2_encrypt(PTInstVar Line 331  static void crypt_SSH2_encrypt(PTInstVar
331                  return;                  return;
332          }          }
333    
334          if ((newbuf = malloc(bytes)) == NULL)          if (bytes > encbufflen) {
335                  return;                  if ((newbuff = realloc(encbuff, bytes)) == NULL)
336                            return;
337                    encbuff = newbuff;
338                    encbufflen = bytes;
339            }
340    
341          if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {          if (EVP_Cipher(&pvar->evpcip[MODE_OUT], encbuff, buf, bytes) == 0) {
342                  UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");                  UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
343                  _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,                  _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
344                              get_cipher_name(pvar->crypt_state.sender_cipher));                              get_cipher_name(pvar->crypt_state.sender_cipher));
345                  notify_fatal_error(pvar, tmp, TRUE);                  notify_fatal_error(pvar, tmp, TRUE);
346          } else {          } else {
347                  memcpy(buf, newbuf, bytes);                  memcpy(buf, encbuff, bytes);
348          }          }
   
         free(newbuf);  
349  }  }
350    
351  static void crypt_SSH2_decrypt(PTInstVar pvar, unsigned char *buf, int bytes)  static void crypt_SSH2_decrypt(PTInstVar pvar, unsigned char *buf, int bytes)
352  {  {
353          unsigned char *newbuf;          unsigned char *newbuff;
354          int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;          int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
355          char tmp[80];          char tmp[80];
356    
# Line 362  static void crypt_SSH2_decrypt(PTInstVar Line 367  static void crypt_SSH2_decrypt(PTInstVar
367                  return;                  return;
368          }          }
369    
370          if ((newbuf = malloc(bytes)) == NULL)          if (bytes > encbufflen) {
371                  return;                  if ((newbuff = malloc(bytes)) == NULL)
372                            return;
373                    encbuff = newbuff;
374                    encbufflen = bytes;
375            }
376    
377          if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {          if (EVP_Cipher(&pvar->evpcip[MODE_IN], encbuff, buf, bytes) == 0) {
378                  UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");                  UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
379                  _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,                  _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
380                              get_cipher_name(pvar->crypt_state.receiver_cipher));                              get_cipher_name(pvar->crypt_state.receiver_cipher));
381                  notify_fatal_error(pvar, tmp, TRUE);                  notify_fatal_error(pvar, tmp, TRUE);
382          } else {          } else {
383                  memcpy(buf, newbuf, bytes);                  memcpy(buf, encbuff, bytes);
384          }          }
   
         free(newbuf);  
385  }  }
386    
387  static void c3DES_encrypt(PTInstVar pvar, unsigned char *buf, int bytes)  static void c3DES_encrypt(PTInstVar pvar, unsigned char *buf, int bytes)
# Line 1307  void CRYPT_free_public_key(CRYPTPublicKe Line 1314  void CRYPT_free_public_key(CRYPTPublicKe
1314    
1315  void CRYPT_end(PTInstVar pvar)  void CRYPT_end(PTInstVar pvar)
1316  {  {
1317            free(encbuff);
1318            encbuff = NULL;
1319            encbufflen = 0;
1320    
1321          destroy_public_key(&pvar->crypt_state.host_key);          destroy_public_key(&pvar->crypt_state.host_key);
1322          destroy_public_key(&pvar->crypt_state.server_key);          destroy_public_key(&pvar->crypt_state.server_key);
1323    

Legend:
Removed from v.7004  
changed lines
  Added in v.7133

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