| @@ -43,6 +43,8 @@ knownenc := array[] of { · 42 unmodified lines |
| 43 | "aes256-ctr", | 43 | "aes256-ctr", |
| 44 | "arcfour128", | 44 | "arcfour128", |
| 45 | "arcfour256", | 45 | "arcfour256", |
| | 46 | "3des-cbc", |
| | 47 | # "blowfish-cbc", # doesn't work |
| 46 | }; | 48 | }; |
| 47 | knownmac := array[] of { | 49 | knownmac := array[] of { |
| 48 | "none", | 50 | "none", |
| @@ -58,7 +60,7 @@ knowncompr := array[] of { · 9 unmodified lines |
| 58 | # what we want to do by default, first is preferred | 60 | # what we want to do by default, first is preferred |
| 59 | defkex := array[] of {Dgroupexchange, Dgroup14, Dgroup1}; | 61 | defkex := array[] of {Dgroupexchange, Dgroup14, Dgroup1}; |
| 60 | defhostkey := array[] of {Hrsa, Hdss}; | 62 | defhostkey := array[] of {Hrsa, Hdss}; |
| 61 | defenc := array[] of {Eaes128cbc, Eaes192cbc, Eaes256cbc, Eaes128ctr, Eaes192ctr, Eaes256ctr, Earcfour128, Earcfour256, Earcfour}; | 63 | defenc := array[] of {Eaes128cbc, Eaes192cbc, Eaes256cbc, Eaes128ctr, Eaes192ctr, Eaes256ctr, Earcfour128, Earcfour256, Earcfour, E3descbc}; |
| 62 | defmac := array[] of {Msha1_96, Msha1, Mmd5, Mmd5_96}; | 64 | defmac := array[] of {Msha1_96, Msha1, Mmd5, Mmd5_96}; |
| 63 | defcompr := array[] of {Cnone}; | 65 | defcompr := array[] of {Cnone}; |
| 64 | | 66 | |
| @@ -558,13 +560,10 @@ Cryptalg.new(t: int): ref Cryptalg · 493 unmodified lines |
| 558 | Eaes128cbc => return ref Cryptalg.Aes (kr->AESbsize, 128, nil); | 560 | Eaes128cbc => return ref Cryptalg.Aes (kr->AESbsize, 128, nil); |
| 559 | Eaes192cbc => return ref Cryptalg.Aes (kr->AESbsize, 192, nil); | 561 | Eaes192cbc => return ref Cryptalg.Aes (kr->AESbsize, 192, nil); |
| 560 | Eaes256cbc => return ref Cryptalg.Aes (kr->AESbsize, 256, nil); | 562 | Eaes256cbc => return ref Cryptalg.Aes (kr->AESbsize, 256, nil); |
| 561 | Eblowfish => return ref Cryptalg.Blowfish (kr->BFbsize, 128, nil); | 563 | Eblowfish => return ref Cryptalg.Blowfish (kr->BFbsize, 128, nil); # broken! |
| 562 | Eidea => return ref Cryptalg.Idea (kr->IDEAbsize, 128, nil); | 564 | Eidea => return ref Cryptalg.Idea (kr->IDEAbsize, 128, nil); |
| 563 | Earcfour => return ref Cryptalg.Arcfour (8, 128, nil); | 565 | Earcfour => return ref Cryptalg.Arcfour (8, 128, nil); |
| 564 | Etripledes => | 566 | E3descbc => return ref Cryptalg.Tripledes (kr->DESbsize, 192, nil, nil); # 168 bits are used |
| 565 | # of 192 bits, only 168 are used! | | |
| 566 | #return ref Cryptalg.Tripledes (kr->DESbsize, 192, nil); | | |
| 567 | raise "not yet implemented"; | | |
| 568 | Eaes128ctr => return ref Cryptalg.Aesctr (kr->AESbsize, 128, nil, nil); | 567 | Eaes128ctr => return ref Cryptalg.Aesctr (kr->AESbsize, 128, nil, nil); |
| 569 | Eaes192ctr => return ref Cryptalg.Aesctr (kr->AESbsize, 192, nil, nil); | 568 | Eaes192ctr => return ref Cryptalg.Aesctr (kr->AESbsize, 192, nil, nil); |
| 570 | Eaes256ctr => return ref Cryptalg.Aesctr (kr->AESbsize, 256, nil, nil); | 569 | Eaes256ctr => return ref Cryptalg.Aesctr (kr->AESbsize, 256, nil, nil); |
| @@ -613,16 +612,19 @@ Cryptalg.setup(cc: self ref Cryptalg, key, ivec: array of byte) · 42 unmodified lines |
| 613 | pick c := cc { | 612 | pick c := cc { |
| 614 | None => ; | 613 | None => ; |
| 615 | Aes => c.state = kr->aessetup(key, ivec); | 614 | Aes => c.state = kr->aessetup(key, ivec); |
| 616 | Blowfish => c.state = kr->blowfishsetup(key, ivec); | 615 | Blowfish => c.state = kr->blowfishsetup(key, ivec); # broken! |
| 617 | Idea => c.state = kr->ideasetup(key, ivec); | 616 | Idea => c.state = kr->ideasetup(key, ivec); |
| 618 | Arcfour => c.state = kr->rc4setup(key); | 617 | Arcfour => c.state = kr->rc4setup(key); |
| 619 | Tripledes => raise "not yet implemented"; | 618 | Tripledes => |
| | 619 | c.states = array[] of { |
| | 620 | kr->dessetup(key[0:8], nil), |
| | 621 | kr->dessetup(key[8:16], nil), |
| | 622 | kr->dessetup(key[16:24], nil) |
| | 623 | }; |
| | 624 | c.iv = ivec[:8]; |
| 620 | Aesctr => | 625 | Aesctr => |
| 621 | c.counter = array[kr->AESbsize] of byte; | 626 | c.counter = array[kr->AESbsize] of byte; |
| 622 | c.counter[:] = ivec[:kr->AESbsize]; | 627 | c.counter[:] = ivec[:kr->AESbsize]; |
| 623 | #say("aesctr x:"); | | |
| 624 | #hexdump(c.x); | | |
| 625 | | | |
| 626 | c.key = array[len key] of byte; | 628 | c.key = array[len key] of byte; |
| 627 | c.key[:] = key; | 629 | c.key[:] = key; |
| 628 | Arcfour2 => | 630 | Arcfour2 => |
| @@ -636,11 +638,32 @@ Cryptalg.crypt(cc: self ref Cryptalg, buf: array of byte, n, direction: int) · 7 unmodified lines |
| 636 | pick c := cc { | 638 | pick c := cc { |
| 637 | None => ; | 639 | None => ; |
| 638 | Aes => kr->aescbc(c.state, buf, n, direction); | 640 | Aes => kr->aescbc(c.state, buf, n, direction); |
| 639 | Blowfish => kr->blowfishcbc(c.state, buf, n, direction); | 641 | Blowfish => kr->blowfishcbc(c.state, buf, n, direction); # broken! |
| 640 | Idea => kr->ideacbc(c.state, buf, n, direction); | 642 | Idea => kr->ideacbc(c.state, buf, n, direction); |
| 641 | Arcfour or | 643 | Arcfour or |
| 642 | Arcfour2 => kr->rc4(c.state, buf, n); | 644 | Arcfour2 => kr->rc4(c.state, buf, n); |
| 643 | Tripledes => raise "not yet implemented"; | 645 | Tripledes => |
| | 646 | buf = buf[:n]; |
| | 647 | while(len buf > 0) { |
| | 648 | block := buf[:kr->DESbsize]; |
| | 649 | if(direction == kr->Encrypt) { |
| | 650 | bufxor(block, c.iv); |
| | 651 | kr->desecb(c.states[0], block, len block, kr->Encrypt); |
| | 652 | kr->desecb(c.states[1], block, len block, kr->Decrypt); |
| | 653 | kr->desecb(c.states[2], block, len block, kr->Encrypt); |
| | 654 | c.iv[:] = block; |
| | 655 | buf = buf[len block:]; |
| | 656 | } else { |
| | 657 | orig := array[len block] of byte; |
| | 658 | orig[:] = block; |
| | 659 | kr->desecb(c.states[2], block, len block, kr->Decrypt); |
| | 660 | kr->desecb(c.states[1], block, len block, kr->Encrypt); |
| | 661 | kr->desecb(c.states[0], block, len block, kr->Decrypt); |
| | 662 | bufxor(block, c.iv); |
| | 663 | c.iv[:] = orig; |
| | 664 | buf = buf[len block:]; |
| | 665 | } |
| | 666 | } |
| 644 | Aesctr => | 667 | Aesctr => |
| 645 | key := array[kr->AESbsize] of byte; | 668 | key := array[kr->AESbsize] of byte; |
| 646 | for(o := 0; o < n; o += kr->AESbsize) { | 669 | for(o := 0; o < n; o += kr->AESbsize) { |