diff options
author | Tim Rice <tim@multitalents.net> | 2002-03-22 13:27:40 -0800 |
---|---|---|
committer | Tim Rice <tim@multitalents.net> | 2002-03-22 13:27:40 -0800 |
commit | f29a6539c06a7fb60da79eba861fc61b13d6e793 (patch) | |
tree | d4795a2ab1ec73f0e29bd89327ee14f51dda68fc /cipher.c | |
parent | 4435a55a4ba0faa25f39aa883aac9d7d964a1858 (diff) |
[cipher.c] fix problem with OpenBSD sync
Diffstat (limited to 'cipher.c')
-rw-r--r-- | cipher.c | 76 |
1 files changed, 38 insertions, 38 deletions
@@ -507,6 +507,44 @@ ssh_rijndael_cbc(EVP_CIPHER_CTX *ctx, u_char *dest, const u_char *src, | |||
507 | for (i = blocks; i > 0; i--, cnow-=RIJNDAEL_BLOCKSIZE, | 507 | for (i = blocks; i > 0; i--, cnow-=RIJNDAEL_BLOCKSIZE, |
508 | plain-=RIJNDAEL_BLOCKSIZE) { | 508 | plain-=RIJNDAEL_BLOCKSIZE) { |
509 | rijndael_decrypt(&c->r_ctx, cnow, plain); | 509 | rijndael_decrypt(&c->r_ctx, cnow, plain); |
510 | ivp = (i == 1) ? c->r_iv : cnow-RIJNDAEL_BLOCKSIZE; | ||
511 | for (j = 0; j < RIJNDAEL_BLOCKSIZE; j++) | ||
512 | plain[j] ^= ivp[j]; | ||
513 | } | ||
514 | memcpy(c->r_iv, buf, RIJNDAEL_BLOCKSIZE); | ||
515 | } | ||
516 | return (1); | ||
517 | } | ||
518 | static int | ||
519 | ssh_rijndael_cleanup(EVP_CIPHER_CTX *ctx) | ||
520 | { | ||
521 | struct ssh_rijndael_ctx *c; | ||
522 | |||
523 | if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) { | ||
524 | memset(c, 0, sizeof(*c)); | ||
525 | xfree(c); | ||
526 | EVP_CIPHER_CTX_set_app_data(ctx, NULL); | ||
527 | } | ||
528 | return (1); | ||
529 | } | ||
530 | static EVP_CIPHER * | ||
531 | evp_rijndael(void) | ||
532 | { | ||
533 | static EVP_CIPHER rijndal_cbc; | ||
534 | |||
535 | memset(&rijndal_cbc, 0, sizeof(EVP_CIPHER)); | ||
536 | rijndal_cbc.nid = NID_undef; | ||
537 | rijndal_cbc.block_size = RIJNDAEL_BLOCKSIZE; | ||
538 | rijndal_cbc.iv_len = RIJNDAEL_BLOCKSIZE; | ||
539 | rijndal_cbc.key_len = 16; | ||
540 | rijndal_cbc.init = ssh_rijndael_init; | ||
541 | rijndal_cbc.cleanup = ssh_rijndael_cleanup; | ||
542 | rijndal_cbc.do_cipher = ssh_rijndael_cbc; | ||
543 | #ifndef SSH_OLD_EVP | ||
544 | rijndal_cbc.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | | ||
545 | EVP_CIPH_ALWAYS_CALL_INIT; | ||
546 | #endif | ||
547 | return (&rijndal_cbc); | ||
510 | } | 548 | } |
511 | 549 | ||
512 | /* | 550 | /* |
@@ -675,42 +713,4 @@ cipher_set_keycontext(CipherContext *cc, u_char *dat) | |||
675 | plen = EVP_X_STATE_LEN(cc->evp); | 713 | plen = EVP_X_STATE_LEN(cc->evp); |
676 | memcpy(EVP_X_STATE(cc->evp), dat, plen); | 714 | memcpy(EVP_X_STATE(cc->evp), dat, plen); |
677 | } | 715 | } |
678 | ivp = (i == 1) ? c->r_iv : cnow-RIJNDAEL_BLOCKSIZE; | ||
679 | for (j = 0; j < RIJNDAEL_BLOCKSIZE; j++) | ||
680 | plain[j] ^= ivp[j]; | ||
681 | } | ||
682 | memcpy(c->r_iv, buf, RIJNDAEL_BLOCKSIZE); | ||
683 | } | ||
684 | return (1); | ||
685 | } | ||
686 | static int | ||
687 | ssh_rijndael_cleanup(EVP_CIPHER_CTX *ctx) | ||
688 | { | ||
689 | struct ssh_rijndael_ctx *c; | ||
690 | |||
691 | if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) { | ||
692 | memset(c, 0, sizeof(*c)); | ||
693 | xfree(c); | ||
694 | EVP_CIPHER_CTX_set_app_data(ctx, NULL); | ||
695 | } | ||
696 | return (1); | ||
697 | } | ||
698 | static EVP_CIPHER * | ||
699 | evp_rijndael(void) | ||
700 | { | ||
701 | static EVP_CIPHER rijndal_cbc; | ||
702 | |||
703 | memset(&rijndal_cbc, 0, sizeof(EVP_CIPHER)); | ||
704 | rijndal_cbc.nid = NID_undef; | ||
705 | rijndal_cbc.block_size = RIJNDAEL_BLOCKSIZE; | ||
706 | rijndal_cbc.iv_len = RIJNDAEL_BLOCKSIZE; | ||
707 | rijndal_cbc.key_len = 16; | ||
708 | rijndal_cbc.init = ssh_rijndael_init; | ||
709 | rijndal_cbc.cleanup = ssh_rijndael_cleanup; | ||
710 | rijndal_cbc.do_cipher = ssh_rijndael_cbc; | ||
711 | #ifndef SSH_OLD_EVP | ||
712 | rijndal_cbc.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | | ||
713 | EVP_CIPH_ALWAYS_CALL_INIT; | ||
714 | #endif | ||
715 | return (&rijndal_cbc); | ||
716 | } | 716 | } |