a73x

a9ca5b81

Upgrade russh to 0.62 for post-quantum key exchange

a73x   2026-08-08 18:35

Commit message
Upgrade russh to 0.62 for post-quantum key exchange

Cargo.lock
Old New
@@ -10,30 +10,31 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10 10
11 [[package]] 11 [[package]]
12 name = "aead" 12 name = "aead"
13 version = "0.5.2" 13 version = "0.6.1"
14 source = "registry+https://github.com/rust-lang/crates.io-index" 14 source = "registry+https://github.com/rust-lang/crates.io-index"
15 checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 15 checksum = "1973cfbc1a2daf9cf550e74e1f088c28e7f7d8c1e1418fb6c9dc5184b7e84c99"
16 dependencies = [ 16 dependencies = [
17 "crypto-common", 17 "crypto-common 0.2.2",
18 "generic-array", 18 "inout",
19 ] 19 ]
20 20
21 [[package]] 21 [[package]]
22 name = "aes" 22 name = "aes"
23 version = "0.8.4" 23 version = "0.9.2"
24 source = "registry+https://github.com/rust-lang/crates.io-index" 24 source = "registry+https://github.com/rust-lang/crates.io-index"
25 checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 25 checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58"
26 dependencies = [ 26 dependencies = [
27 "cfg-if",
28 "cipher", 27 "cipher",
29 "cpufeatures", 28 "cpubits",
29 "cpufeatures 0.3.0",
30 "zeroize",
30 ] 31 ]
31 32
32 [[package]] 33 [[package]]
33 name = "aes-gcm" 34 name = "aes-gcm"
34 version = "0.10.3" 35 version = "0.11.0"
35 source = "registry+https://github.com/rust-lang/crates.io-index" 36 source = "registry+https://github.com/rust-lang/crates.io-index"
36 checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" 37 checksum = "fdf011db2e21ce0d575593d749db5554b47fed37aff429e4dc50bc91ac93a028"
37 dependencies = [ 38 dependencies = [
38 "aead", 39 "aead",
39 "aes", 40 "aes",
@@ -41,19 +42,7 @@ dependencies = [
41 "ctr", 42 "ctr",
42 "ghash", 43 "ghash",
43 "subtle", 44 "subtle",
44 ] 45 "zeroize",
45
46 [[package]]
47 name = "ahash"
48 version = "0.8.12"
49 source = "registry+https://github.com/rust-lang/crates.io-index"
50 checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
51 dependencies = [
52 "cfg-if",
53 "const-random",
54 "once_cell",
55 "version_check",
56 "zerocopy",
57 ] 46 ]
58 47
59 [[package]] 48 [[package]]
@@ -156,6 +145,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
156 checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" 145 checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
157 146
158 [[package]] 147 [[package]]
148 name = "argon2"
149 version = "0.6.0-rc.8"
150 source = "registry+https://github.com/rust-lang/crates.io-index"
151 checksum = "7af50940b73bf4e16c15c448a2b121c63f2d68e3e54b6a8731673cb4aa0cdff5"
152 dependencies = [
153 "base64ct",
154 "blake2",
155 "cpufeatures 0.3.0",
156 "password-hash",
157 ]
158
159 [[package]]
159 name = "askama" 160 name = "askama"
160 version = "0.15.6" 161 version = "0.15.6"
161 source = "registry+https://github.com/rust-lang/crates.io-index" 162 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -232,17 +233,6 @@ dependencies = [
232 ] 233 ]
233 234
234 [[package]] 235 [[package]]
235 name = "async-trait"
236 version = "0.1.89"
237 source = "registry+https://github.com/rust-lang/crates.io-index"
238 checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
239 dependencies = [
240 "proc-macro2",
241 "quote",
242 "syn 2.0.117",
243 ]
244
245 [[package]]
246 name = "atomic" 236 name = "atomic"
247 version = "0.6.1" 237 version = "0.6.1"
248 source = "registry+https://github.com/rust-lang/crates.io-index" 238 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -264,6 +254,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
264 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 254 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
265 255
266 [[package]] 256 [[package]]
257 name = "aws-lc-rs"
258 version = "1.18.0"
259 source = "registry+https://github.com/rust-lang/crates.io-index"
260 checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e"
261 dependencies = [
262 "aws-lc-sys",
263 "untrusted",
264 "zeroize",
265 ]
266
267 [[package]]
268 name = "aws-lc-sys"
269 version = "0.44.0"
270 source = "registry+https://github.com/rust-lang/crates.io-index"
271 checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483"
272 dependencies = [
273 "cc",
274 "cmake",
275 "dunce",
276 "fs_extra",
277 "pkg-config",
278 ]
279
280 [[package]]
267 name = "axum" 281 name = "axum"
268 version = "0.8.8" 282 version = "0.8.8"
269 source = "registry+https://github.com/rust-lang/crates.io-index" 283 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -317,9 +331,9 @@ dependencies = [
317 331
318 [[package]] 332 [[package]]
319 name = "base16ct" 333 name = "base16ct"
320 version = "0.2.0" 334 version = "1.0.0"
321 source = "registry+https://github.com/rust-lang/crates.io-index" 335 source = "registry+https://github.com/rust-lang/crates.io-index"
322 checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 336 checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6"
323 337
324 [[package]] 338 [[package]]
325 name = "base64" 339 name = "base64"
@@ -344,13 +358,13 @@ dependencies = [
344 358
345 [[package]] 359 [[package]]
346 name = "bcrypt-pbkdf" 360 name = "bcrypt-pbkdf"
347 version = "0.10.0" 361 version = "0.11.0"
348 source = "registry+https://github.com/rust-lang/crates.io-index" 362 source = "registry+https://github.com/rust-lang/crates.io-index"
349 checksum = "6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2" 363 checksum = "144e573728da132683b9488acd528274c790e07fc06ff81ee29f9d8f8b1041e0"
350 dependencies = [ 364 dependencies = [
351 "blowfish", 365 "blowfish",
352 "pbkdf2", 366 "pbkdf2",
353 "sha2", 367 "sha2 0.11.0",
354 ] 368 ]
355 369
356 [[package]] 370 [[package]]
@@ -394,8 +408,14 @@ name = "bitflags"
394 version = "2.11.0" 408 version = "2.11.0"
395 source = "registry+https://github.com/rust-lang/crates.io-index" 409 source = "registry+https://github.com/rust-lang/crates.io-index"
396 checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 410 checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
411
412 [[package]]
413 name = "blake2"
414 version = "0.11.0-rc.6"
415 source = "registry+https://github.com/rust-lang/crates.io-index"
416 checksum = "061f1a09225e328e1ffbb378d2d49923c0ca5fee19fb5ac1cc9c1e9d52b93690"
397 dependencies = [ 417 dependencies = [
398 "serde_core", 418 "digest 0.11.3",
399 ] 419 ]
400 420
401 [[package]] 421 [[package]]
@@ -404,23 +424,33 @@ version = "0.10.4"
404 source = "registry+https://github.com/rust-lang/crates.io-index" 424 source = "registry+https://github.com/rust-lang/crates.io-index"
405 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 425 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
406 dependencies = [ 426 dependencies = [
407 "generic-array", 427 "generic-array 0.14.7",
428 ]
429
430 [[package]]
431 name = "block-buffer"
432 version = "0.12.1"
433 source = "registry+https://github.com/rust-lang/crates.io-index"
434 checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa"
435 dependencies = [
436 "hybrid-array",
437 "zeroize",
408 ] 438 ]
409 439
410 [[package]] 440 [[package]]
411 name = "block-padding" 441 name = "block-padding"
412 version = "0.3.3" 442 version = "0.4.2"
413 source = "registry+https://github.com/rust-lang/crates.io-index" 443 source = "registry+https://github.com/rust-lang/crates.io-index"
414 checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" 444 checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b"
415 dependencies = [ 445 dependencies = [
416 "generic-array", 446 "hybrid-array",
417 ] 447 ]
418 448
419 [[package]] 449 [[package]]
420 name = "blowfish" 450 name = "blowfish"
421 version = "0.9.1" 451 version = "0.10.0"
422 source = "registry+https://github.com/rust-lang/crates.io-index" 452 source = "registry+https://github.com/rust-lang/crates.io-index"
423 checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" 453 checksum = "62ce3946557b35e71d1bbe07ec385073ce9eda05043f95de134eb578fcf1a298"
424 dependencies = [ 454 dependencies = [
425 "byteorder", 455 "byteorder",
426 "cipher", 456 "cipher",
@@ -467,9 +497,9 @@ dependencies = [
467 497
468 [[package]] 498 [[package]]
469 name = "cbc" 499 name = "cbc"
470 version = "0.1.2" 500 version = "0.2.1"
471 source = "registry+https://github.com/rust-lang/crates.io-index" 501 source = "registry+https://github.com/rust-lang/crates.io-index"
472 checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" 502 checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896"
473 dependencies = [ 503 dependencies = [
474 "cipher", 504 "cipher",
475 ] 505 ]
@@ -500,13 +530,15 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
500 530
501 [[package]] 531 [[package]]
502 name = "chacha20" 532 name = "chacha20"
503 version = "0.9.1" 533 version = "0.10.1"
504 source = "registry+https://github.com/rust-lang/crates.io-index" 534 source = "registry+https://github.com/rust-lang/crates.io-index"
505 checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" 535 checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
506 dependencies = [ 536 dependencies = [
507 "cfg-if", 537 "cfg-if",
508 "cipher", 538 "cipher",
509 "cpufeatures", 539 "cpufeatures 0.3.0",
540 "rand_core 0.10.1",
541 "zeroize",
510 ] 542 ]
511 543
512 [[package]] 544 [[package]]
@@ -552,12 +584,14 @@ dependencies = [
552 584
553 [[package]] 585 [[package]]
554 name = "cipher" 586 name = "cipher"
555 version = "0.4.4" 587 version = "0.5.2"
556 source = "registry+https://github.com/rust-lang/crates.io-index" 588 source = "registry+https://github.com/rust-lang/crates.io-index"
557 checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 589 checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c"
558 dependencies = [ 590 dependencies = [
559 "crypto-common", 591 "block-buffer 0.12.1",
592 "crypto-common 0.2.2",
560 "inout", 593 "inout",
594 "zeroize",
561 ] 595 ]
562 596
563 [[package]] 597 [[package]]
@@ -620,6 +654,21 @@ dependencies = [
620 ] 654 ]
621 655
622 [[package]] 656 [[package]]
657 name = "cmake"
658 version = "0.1.58"
659 source = "registry+https://github.com/rust-lang/crates.io-index"
660 checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"
661 dependencies = [
662 "cc",
663 ]
664
665 [[package]]
666 name = "cmov"
667 version = "0.5.4"
668 source = "registry+https://github.com/rust-lang/crates.io-index"
669 checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a"
670
671 [[package]]
623 name = "colorchoice" 672 name = "colorchoice"
624 version = "1.0.5" 673 version = "1.0.5"
625 source = "registry+https://github.com/rust-lang/crates.io-index" 674 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -646,24 +695,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
646 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 695 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
647 696
648 [[package]] 697 [[package]]
649 name = "const-random" 698 name = "const-oid"
650 version = "0.1.18" 699 version = "0.10.2"
651 source = "registry+https://github.com/rust-lang/crates.io-index"
652 checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
653 dependencies = [
654 "const-random-macro",
655 ]
656
657 [[package]]
658 name = "const-random-macro"
659 version = "0.1.16"
660 source = "registry+https://github.com/rust-lang/crates.io-index" 700 source = "registry+https://github.com/rust-lang/crates.io-index"
661 checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" 701 checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
662 dependencies = [
663 "getrandom 0.2.17",
664 "once_cell",
665 "tiny-keccak",
666 ]
667 702
668 [[package]] 703 [[package]]
669 name = "convert_case" 704 name = "convert_case"
@@ -681,6 +716,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
681 checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 716 checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
682 717
683 [[package]] 718 [[package]]
719 name = "cpubits"
720 version = "0.1.1"
721 source = "registry+https://github.com/rust-lang/crates.io-index"
722 checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae"
723
724 [[package]]
684 name = "cpufeatures" 725 name = "cpufeatures"
685 version = "0.2.17" 726 version = "0.2.17"
686 source = "registry+https://github.com/rust-lang/crates.io-index" 727 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -690,6 +731,15 @@ dependencies = [
690 ] 731 ]
691 732
692 [[package]] 733 [[package]]
734 name = "cpufeatures"
735 version = "0.3.0"
736 source = "registry+https://github.com/rust-lang/crates.io-index"
737 checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
738 dependencies = [
739 "libc",
740 ]
741
742 [[package]]
693 name = "crc32fast" 743 name = "crc32fast"
694 version = "1.5.0" 744 version = "1.5.0"
695 source = "registry+https://github.com/rust-lang/crates.io-index" 745 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -794,12 +844,17 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
794 844
795 [[package]] 845 [[package]]
796 name = "crypto-bigint" 846 name = "crypto-bigint"
797 version = "0.5.5" 847 version = "0.7.5"
798 source = "registry+https://github.com/rust-lang/crates.io-index" 848 source = "registry+https://github.com/rust-lang/crates.io-index"
799 checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 849 checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271"
800 dependencies = [ 850 dependencies = [
801 "generic-array", 851 "cpubits",
802 "rand_core 0.6.4", 852 "ctutils",
853 "getrandom 0.4.2",
854 "hybrid-array",
855 "num-traits",
856 "rand_core 0.10.1",
857 "serdect",
803 "subtle", 858 "subtle",
804 "zeroize", 859 "zeroize",
805 ] 860 ]
@@ -810,12 +865,32 @@ version = "0.1.7"
810 source = "registry+https://github.com/rust-lang/crates.io-index" 865 source = "registry+https://github.com/rust-lang/crates.io-index"
811 checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 866 checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
812 dependencies = [ 867 dependencies = [
813 "generic-array", 868 "generic-array 0.14.7",
814 "rand_core 0.6.4",
815 "typenum", 869 "typenum",
816 ] 870 ]
817 871
818 [[package]] 872 [[package]]
873 name = "crypto-common"
874 version = "0.2.2"
875 source = "registry+https://github.com/rust-lang/crates.io-index"
876 checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453"
877 dependencies = [
878 "getrandom 0.4.2",
879 "hybrid-array",
880 "rand_core 0.10.1",
881 ]
882
883 [[package]]
884 name = "crypto-primes"
885 version = "0.7.2"
886 source = "registry+https://github.com/rust-lang/crates.io-index"
887 checksum = "3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8f"
888 dependencies = [
889 "crypto-bigint",
890 "rand_core 0.10.1",
891 ]
892
893 [[package]]
819 name = "csscolorparser" 894 name = "csscolorparser"
820 version = "0.6.2" 895 version = "0.6.2"
821 source = "registry+https://github.com/rust-lang/crates.io-index" 896 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -850,24 +925,51 @@ dependencies = [
850 925
851 [[package]] 926 [[package]]
852 name = "ctr" 927 name = "ctr"
853 version = "0.9.2" 928 version = "0.10.1"
854 source = "registry+https://github.com/rust-lang/crates.io-index" 929 source = "registry+https://github.com/rust-lang/crates.io-index"
855 checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 930 checksum = "baaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21"
856 dependencies = [ 931 dependencies = [
857 "cipher", 932 "cipher",
858 ] 933 ]
859 934
860 [[package]] 935 [[package]]
936 name = "ctutils"
937 version = "0.4.2"
938 source = "registry+https://github.com/rust-lang/crates.io-index"
939 checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e"
940 dependencies = [
941 "cmov",
942 "subtle",
943 ]
944
945 [[package]]
861 name = "curve25519-dalek" 946 name = "curve25519-dalek"
862 version = "4.1.3" 947 version = "4.1.3"
863 source = "registry+https://github.com/rust-lang/crates.io-index" 948 source = "registry+https://github.com/rust-lang/crates.io-index"
864 checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 949 checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
865 dependencies = [ 950 dependencies = [
866 "cfg-if", 951 "cfg-if",
867 "cpufeatures", 952 "cpufeatures 0.2.17",
953 "curve25519-dalek-derive",
954 "digest 0.10.7",
955 "fiat-crypto 0.2.9",
956 "rustc_version",
957 "subtle",
958 "zeroize",
959 ]
960
961 [[package]]
962 name = "curve25519-dalek"
963 version = "5.0.0"
964 source = "registry+https://github.com/rust-lang/crates.io-index"
965 checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23"
966 dependencies = [
967 "cfg-if",
968 "cpufeatures 0.3.0",
868 "curve25519-dalek-derive", 969 "curve25519-dalek-derive",
869 "digest", 970 "digest 0.11.3",
870 "fiat-crypto", 971 "fiat-crypto 0.3.0",
972 "rand_core 0.10.1",
871 "rustc_version", 973 "rustc_version",
872 "subtle", 974 "subtle",
873 "zeroize", 975 "zeroize",
@@ -947,7 +1049,17 @@ version = "0.7.10"
947 source = "registry+https://github.com/rust-lang/crates.io-index" 1049 source = "registry+https://github.com/rust-lang/crates.io-index"
948 checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 1050 checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
949 dependencies = [ 1051 dependencies = [
950 "const-oid", 1052 "const-oid 0.9.6",
1053 "zeroize",
1054 ]
1055
1056 [[package]]
1057 name = "der"
1058 version = "0.8.1"
1059 source = "registry+https://github.com/rust-lang/crates.io-index"
1060 checksum = "a69dedd701da44b0536442edf09c81a64b0ab97a7a4a5e3d1971f00027cbc63d"
1061 dependencies = [
1062 "const-oid 0.10.2",
951 "pem-rfc7468", 1063 "pem-rfc7468",
952 "zeroize", 1064 "zeroize",
953 ] 1065 ]
@@ -985,9 +1097,9 @@ dependencies = [
985 1097
986 [[package]] 1098 [[package]]
987 name = "des" 1099 name = "des"
988 version = "0.8.1" 1100 version = "0.9.0"
989 source = "registry+https://github.com/rust-lang/crates.io-index" 1101 source = "registry+https://github.com/rust-lang/crates.io-index"
990 checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" 1102 checksum = "916a94e407b54f9034d71dd748234cd1e516ced6284009906ae246f177eafe5a"
991 dependencies = [ 1103 dependencies = [
992 "cipher", 1104 "cipher",
993 ] 1105 ]
@@ -998,10 +1110,20 @@ version = "0.10.7"
998 source = "registry+https://github.com/rust-lang/crates.io-index" 1110 source = "registry+https://github.com/rust-lang/crates.io-index"
999 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1111 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
1000 dependencies = [ 1112 dependencies = [
1001 "block-buffer", 1113 "block-buffer 0.10.4",
1002 "const-oid", 1114 "crypto-common 0.1.7",
1003 "crypto-common", 1115 ]
1004 "subtle", 1116
1117 [[package]]
1118 name = "digest"
1119 version = "0.11.3"
1120 source = "registry+https://github.com/rust-lang/crates.io-index"
1121 checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"
1122 dependencies = [
1123 "block-buffer 0.12.1",
1124 "const-oid 0.10.2",
1125 "crypto-common 0.2.2",
1126 "ctutils",
1005 ] 1127 ]
1006 1128
1007 [[package]] 1129 [[package]]
@@ -1061,17 +1183,24 @@ dependencies = [
1061 ] 1183 ]
1062 1184
1063 [[package]] 1185 [[package]]
1186 name = "dunce"
1187 version = "1.0.5"
1188 source = "registry+https://github.com/rust-lang/crates.io-index"
1189 checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
1190
1191 [[package]]
1064 name = "ecdsa" 1192 name = "ecdsa"
1065 version = "0.16.9" 1193 version = "0.17.0"
1066 source = "registry+https://github.com/rust-lang/crates.io-index" 1194 source = "registry+https://github.com/rust-lang/crates.io-index"
1067 checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 1195 checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0"
1068 dependencies = [ 1196 dependencies = [
1069 "der", 1197 "der 0.8.1",
1070 "digest", 1198 "digest 0.11.3",
1071 "elliptic-curve", 1199 "elliptic-curve",
1072 "rfc6979", 1200 "rfc6979",
1073 "signature", 1201 "signature 3.0.0",
1074 "spki", 1202 "spki 0.8.0",
1203 "zeroize",
1075 ] 1204 ]
1076 1205
1077 [[package]] 1206 [[package]]
@@ -1080,8 +1209,18 @@ version = "2.2.3"
1080 source = "registry+https://github.com/rust-lang/crates.io-index" 1209 source = "registry+https://github.com/rust-lang/crates.io-index"
1081 checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" 1210 checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
1082 dependencies = [ 1211 dependencies = [
1083 "pkcs8", 1212 "pkcs8 0.10.2",
1084 "signature", 1213 "signature 2.2.0",
1214 ]
1215
1216 [[package]]
1217 name = "ed25519"
1218 version = "3.0.0"
1219 source = "registry+https://github.com/rust-lang/crates.io-index"
1220 checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a"
1221 dependencies = [
1222 "pkcs8 0.11.0",
1223 "signature 3.0.0",
1085 ] 1224 ]
1086 1225
1087 [[package]] 1226 [[package]]
@@ -1090,11 +1229,27 @@ version = "2.2.0"
1090 source = "registry+https://github.com/rust-lang/crates.io-index" 1229 source = "registry+https://github.com/rust-lang/crates.io-index"
1091 checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" 1230 checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
1092 dependencies = [ 1231 dependencies = [
1093 "curve25519-dalek", 1232 "curve25519-dalek 4.1.3",
1094 "ed25519", 1233 "ed25519 2.2.3",
1095 "rand_core 0.6.4", 1234 "rand_core 0.6.4",
1096 "serde", 1235 "serde",
1097 "sha2", 1236 "sha2 0.10.9",
1237 "subtle",
1238 "zeroize",
1239 ]
1240
1241 [[package]]
1242 name = "ed25519-dalek"
1243 version = "3.0.0"
1244 source = "registry+https://github.com/rust-lang/crates.io-index"
1245 checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de"
1246 dependencies = [
1247 "curve25519-dalek 5.0.0",
1248 "ed25519 3.0.0",
1249 "rand_core 0.10.1",
1250 "serde",
1251 "sha2 0.11.0",
1252 "signature 3.0.0",
1098 "subtle", 1253 "subtle",
1099 "zeroize", 1254 "zeroize",
1100 ] 1255 ]
@@ -1107,26 +1262,39 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
1107 1262
1108 [[package]] 1263 [[package]]
1109 name = "elliptic-curve" 1264 name = "elliptic-curve"
1110 version = "0.13.8" 1265 version = "0.14.1"
1111 source = "registry+https://github.com/rust-lang/crates.io-index" 1266 source = "registry+https://github.com/rust-lang/crates.io-index"
1112 checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 1267 checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65"
1113 dependencies = [ 1268 dependencies = [
1114 "base16ct", 1269 "base16ct",
1115 "crypto-bigint", 1270 "crypto-bigint",
1116 "digest", 1271 "crypto-common 0.2.2",
1272 "digest 0.11.3",
1117 "ff", 1273 "ff",
1118 "generic-array",
1119 "group", 1274 "group",
1120 "hkdf", 1275 "hkdf",
1276 "hybrid-array",
1121 "pem-rfc7468", 1277 "pem-rfc7468",
1122 "pkcs8", 1278 "pkcs8 0.11.0",
1123 "rand_core 0.6.4", 1279 "rand_core 0.10.1",
1124 "sec1", 1280 "sec1",
1125 "subtle", 1281 "subtle",
1126 "zeroize", 1282 "zeroize",
1127 ] 1283 ]
1128 1284
1129 [[package]] 1285 [[package]]
1286 name = "enum_dispatch"
1287 version = "0.3.13"
1288 source = "registry+https://github.com/rust-lang/crates.io-index"
1289 checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd"
1290 dependencies = [
1291 "once_cell",
1292 "proc-macro2",
1293 "quote",
1294 "syn 2.0.117",
1295 ]
1296
1297 [[package]]
1130 name = "equivalent" 1298 name = "equivalent"
1131 version = "1.0.2" 1299 version = "1.0.2"
1132 source = "registry+https://github.com/rust-lang/crates.io-index" 1300 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1169,11 +1337,11 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
1169 1337
1170 [[package]] 1338 [[package]]
1171 name = "ff" 1339 name = "ff"
1172 version = "0.13.1" 1340 version = "0.14.0"
1173 source = "registry+https://github.com/rust-lang/crates.io-index" 1341 source = "registry+https://github.com/rust-lang/crates.io-index"
1174 checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" 1342 checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f"
1175 dependencies = [ 1343 dependencies = [
1176 "rand_core 0.6.4", 1344 "rand_core 0.10.1",
1177 "subtle", 1345 "subtle",
1178 ] 1346 ]
1179 1347
@@ -1184,6 +1352,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1184 checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 1352 checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
1185 1353
1186 [[package]] 1354 [[package]]
1355 name = "fiat-crypto"
1356 version = "0.3.0"
1357 source = "registry+https://github.com/rust-lang/crates.io-index"
1358 checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"
1359
1360 [[package]]
1187 name = "filedescriptor" 1361 name = "filedescriptor"
1188 version = "0.8.3" 1362 version = "0.8.3"
1189 source = "registry+https://github.com/rust-lang/crates.io-index" 1363 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1223,18 +1397,6 @@ dependencies = [
1223 ] 1397 ]
1224 1398
1225 [[package]] 1399 [[package]]
1226 name = "flurry"
1227 version = "0.5.2"
1228 source = "registry+https://github.com/rust-lang/crates.io-index"
1229 checksum = "cf5efcf77a4da27927d3ab0509dec5b0954bb3bc59da5a1de9e52642ebd4cdf9"
1230 dependencies = [
1231 "ahash",
1232 "num_cpus",
1233 "parking_lot",
1234 "seize",
1235 ]
1236
1237 [[package]]
1238 name = "fnv" 1400 name = "fnv"
1239 version = "1.0.7" 1401 version = "1.0.7"
1240 source = "registry+https://github.com/rust-lang/crates.io-index" 1402 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1262,6 +1424,12 @@ dependencies = [
1262 ] 1424 ]
1263 1425
1264 [[package]] 1426 [[package]]
1427 name = "fs_extra"
1428 version = "1.3.0"
1429 source = "registry+https://github.com/rust-lang/crates.io-index"
1430 checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
1431
1432 [[package]]
1265 name = "futf" 1433 name = "futf"
1266 version = "0.1.5" 1434 version = "0.1.5"
1267 source = "registry+https://github.com/rust-lang/crates.io-index" 1435 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1367,7 +1535,17 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
1367 dependencies = [ 1535 dependencies = [
1368 "typenum", 1536 "typenum",
1369 "version_check", 1537 "version_check",
1370 "zeroize", 1538 ]
1539
1540 [[package]]
1541 name = "generic-array"
1542 version = "1.4.4"
1543 source = "registry+https://github.com/rust-lang/crates.io-index"
1544 checksum = "ab4e5aa225bc56696909483320f0ff9b600f1a971b52e07a17d70f3d9b43254b"
1545 dependencies = [
1546 "generic-array 0.14.7",
1547 "rustversion",
1548 "typenum",
1371 ] 1549 ]
1372 1550
1373 [[package]] 1551 [[package]]
@@ -1377,10 +1555,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1377 checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 1555 checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
1378 dependencies = [ 1556 dependencies = [
1379 "cfg-if", 1557 "cfg-if",
1380 "js-sys",
1381 "libc", 1558 "libc",
1382 "wasi", 1559 "wasi",
1383 "wasm-bindgen",
1384 ] 1560 ]
1385 1561
1386 [[package]] 1562 [[package]]
@@ -1402,19 +1578,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1402 checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" 1578 checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
1403 dependencies = [ 1579 dependencies = [
1404 "cfg-if", 1580 "cfg-if",
1581 "js-sys",
1405 "libc", 1582 "libc",
1406 "r-efi 6.0.0", 1583 "r-efi 6.0.0",
1584 "rand_core 0.10.1",
1407 "wasip2", 1585 "wasip2",
1408 "wasip3", 1586 "wasip3",
1587 "wasm-bindgen",
1409 ] 1588 ]
1410 1589
1411 [[package]] 1590 [[package]]
1412 name = "ghash" 1591 name = "ghash"
1413 version = "0.5.1" 1592 version = "0.6.0"
1414 source = "registry+https://github.com/rust-lang/crates.io-index" 1593 source = "registry+https://github.com/rust-lang/crates.io-index"
1415 checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" 1594 checksum = "2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5"
1416 dependencies = [ 1595 dependencies = [
1417 "opaque-debug",
1418 "polyval", 1596 "polyval",
1419 ] 1597 ]
1420 1598
@@ -1425,7 +1603,6 @@ dependencies = [
1425 "ammonia", 1603 "ammonia",
1426 "askama", 1604 "askama",
1427 "askama_web", 1605 "askama_web",
1428 "async-trait",
1429 "axum", 1606 "axum",
1430 "base64", 1607 "base64",
1431 "chrono", 1608 "chrono",
@@ -1435,17 +1612,16 @@ dependencies = [
1435 "criterion", 1612 "criterion",
1436 "crossterm", 1613 "crossterm",
1437 "dirs", 1614 "dirs",
1438 "ed25519-dalek", 1615 "ed25519-dalek 2.2.0",
1439 "git2", 1616 "git2",
1440 "proptest", 1617 "proptest",
1441 "pulldown-cmark", 1618 "pulldown-cmark",
1442 "rand_core 0.6.4", 1619 "rand_core 0.6.4",
1443 "ratatui", 1620 "ratatui",
1444 "russh", 1621 "russh",
1445 "russh-keys",
1446 "serde", 1622 "serde",
1447 "serde_json", 1623 "serde_json",
1448 "sha2", 1624 "sha2 0.10.9",
1449 "tempfile", 1625 "tempfile",
1450 "thiserror 2.0.18", 1626 "thiserror 2.0.18",
1451 "tokio", 1627 "tokio",
@@ -1453,6 +1629,7 @@ dependencies = [
1453 "toml_edit", 1629 "toml_edit",
1454 "tracing", 1630 "tracing",
1455 "tracing-subscriber", 1631 "tracing-subscriber",
1632 "zeroize",
1456 ] 1633 ]
1457 1634
1458 [[package]] 1635 [[package]]
@@ -1472,12 +1649,12 @@ dependencies = [
1472 1649
1473 [[package]] 1650 [[package]]
1474 name = "group" 1651 name = "group"
1475 version = "0.13.0" 1652 version = "0.14.0"
1476 source = "registry+https://github.com/rust-lang/crates.io-index" 1653 source = "registry+https://github.com/rust-lang/crates.io-index"
1477 checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1654 checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4"
1478 dependencies = [ 1655 dependencies = [
1479 "ff", 1656 "ff",
1480 "rand_core 0.6.4", 1657 "rand_core 0.10.1",
1481 "subtle", 1658 "subtle",
1482 ] 1659 ]
1483 1660
@@ -1532,35 +1709,26 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
1532 1709
1533 [[package]] 1710 [[package]]
1534 name = "hex-literal" 1711 name = "hex-literal"
1535 version = "0.4.1" 1712 version = "1.1.0"
1536 source = "registry+https://github.com/rust-lang/crates.io-index" 1713 source = "registry+https://github.com/rust-lang/crates.io-index"
1537 checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" 1714 checksum = "e712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1"
1538 1715
1539 [[package]] 1716 [[package]]
1540 name = "hkdf" 1717 name = "hkdf"
1541 version = "0.12.4" 1718 version = "0.13.0"
1542 source = "registry+https://github.com/rust-lang/crates.io-index" 1719 source = "registry+https://github.com/rust-lang/crates.io-index"
1543 checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 1720 checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018"
1544 dependencies = [ 1721 dependencies = [
1545 "hmac", 1722 "hmac",
1546 ] 1723 ]
1547 1724
1548 [[package]] 1725 [[package]]
1549 name = "hmac" 1726 name = "hmac"
1550 version = "0.12.1" 1727 version = "0.13.0"
1551 source = "registry+https://github.com/rust-lang/crates.io-index"
1552 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
1553 dependencies = [
1554 "digest",
1555 ]
1556
1557 [[package]]
1558 name = "home"
1559 version = "0.5.12"
1560 source = "registry+https://github.com/rust-lang/crates.io-index" 1728 source = "registry+https://github.com/rust-lang/crates.io-index"
1561 checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" 1729 checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f"
1562 dependencies = [ 1730 dependencies = [
1563 "windows-sys 0.61.2", 1731 "digest 0.11.3",
1564 ] 1732 ]
1565 1733
1566 [[package]] 1734 [[package]]
@@ -1620,6 +1788,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1620 checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1788 checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
1621 1789
1622 [[package]] 1790 [[package]]
1791 name = "hybrid-array"
1792 version = "0.4.14"
1793 source = "registry+https://github.com/rust-lang/crates.io-index"
1794 checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b"
1795 dependencies = [
1796 "ctutils",
1797 "subtle",
1798 "typenum",
1799 "zeroize",
1800 ]
1801
1802 [[package]]
1623 name = "hyper" 1803 name = "hyper"
1624 version = "1.8.1" 1804 version = "1.8.1"
1625 source = "registry+https://github.com/rust-lang/crates.io-index" 1805 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1667,7 +1847,7 @@ dependencies = [
1667 "js-sys", 1847 "js-sys",
1668 "log", 1848 "log",
1669 "wasm-bindgen", 1849 "wasm-bindgen",
1670 "windows-core 0.62.2", 1850 "windows-core",
1671 ] 1851 ]
1672 1852
1673 [[package]] 1853 [[package]]
@@ -1816,12 +1996,12 @@ dependencies = [
1816 1996
1817 [[package]] 1997 [[package]]
1818 name = "inout" 1998 name = "inout"
1819 version = "0.1.4" 1999 version = "0.2.2"
1820 source = "registry+https://github.com/rust-lang/crates.io-index" 2000 source = "registry+https://github.com/rust-lang/crates.io-index"
1821 checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" 2001 checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7"
1822 dependencies = [ 2002 dependencies = [
1823 "block-padding", 2003 "block-padding",
1824 "generic-array", 2004 "hybrid-array",
1825 ] 2005 ]
1826 2006
1827 [[package]] 2007 [[package]]
@@ -1838,6 +2018,18 @@ dependencies = [
1838 ] 2018 ]
1839 2019
1840 [[package]] 2020 [[package]]
2021 name = "internal-russh-num-bigint"
2022 version = "0.5.0"
2023 source = "registry+https://github.com/rust-lang/crates.io-index"
2024 checksum = "ae8e22120c32fb4d19ec55fba35015f57095cd95a2e3b732e44457f5915b2ee8"
2025 dependencies = [
2026 "num-integer",
2027 "num-traits",
2028 "rand 0.10.2",
2029 "rand_core 0.10.1",
2030 ]
2031
2032 [[package]]
1841 name = "is-terminal" 2033 name = "is-terminal"
1842 version = "0.4.17" 2034 version = "0.4.17"
1843 source = "registry+https://github.com/rust-lang/crates.io-index" 2035 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1912,6 +2104,26 @@ dependencies = [
1912 ] 2104 ]
1913 2105
1914 [[package]] 2106 [[package]]
2107 name = "keccak"
2108 version = "0.2.1"
2109 source = "registry+https://github.com/rust-lang/crates.io-index"
2110 checksum = "ffd9697dc4a9a62e2da93389f34400b77a28f0287711263cabb203b3ccb9c0e4"
2111 dependencies = [
2112 "cfg-if",
2113 "cpufeatures 0.3.0",
2114 ]
2115
2116 [[package]]
2117 name = "kem"
2118 version = "0.3.0"
2119 source = "registry+https://github.com/rust-lang/crates.io-index"
2120 checksum = "01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edd"
2121 dependencies = [
2122 "crypto-common 0.2.2",
2123 "rand_core 0.10.1",
2124 ]
2125
2126 [[package]]
1915 name = "lab" 2127 name = "lab"
1916 version = "0.11.0" 2128 version = "0.11.0"
1917 source = "registry+https://github.com/rust-lang/crates.io-index" 2129 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1922,9 +2134,6 @@ name = "lazy_static"
1922 version = "1.5.0" 2134 version = "1.5.0"
1923 source = "registry+https://github.com/rust-lang/crates.io-index" 2135 source = "registry+https://github.com/rust-lang/crates.io-index"
1924 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2136 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1925 dependencies = [
1926 "spin",
1927 ]
1928 2137
1929 [[package]] 2138 [[package]]
1930 name = "leb128fmt" 2139 name = "leb128fmt"
@@ -1934,9 +2143,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
1934 2143
1935 [[package]] 2144 [[package]]
1936 name = "libc" 2145 name = "libc"
1937 version = "0.2.183" 2146 version = "0.2.189"
1938 source = "registry+https://github.com/rust-lang/crates.io-index" 2147 source = "registry+https://github.com/rust-lang/crates.io-index"
1939 checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" 2148 checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
1940 2149
1941 [[package]] 2150 [[package]]
1942 name = "libgit2-sys" 2151 name = "libgit2-sys"
@@ -1953,12 +2162,6 @@ dependencies = [
1953 ] 2162 ]
1954 2163
1955 [[package]] 2164 [[package]]
1956 name = "libm"
1957 version = "0.2.16"
1958 source = "registry+https://github.com/rust-lang/crates.io-index"
1959 checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
1960
1961 [[package]]
1962 name = "libredox" 2165 name = "libredox"
1963 version = "0.1.14" 2166 version = "0.1.14"
1964 source = "registry+https://github.com/rust-lang/crates.io-index" 2167 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2056,7 +2259,7 @@ version = "1.1.8"
2056 source = "registry+https://github.com/rust-lang/crates.io-index" 2259 source = "registry+https://github.com/rust-lang/crates.io-index"
2057 checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" 2260 checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303"
2058 dependencies = [ 2261 dependencies = [
2059 "nix", 2262 "nix 0.29.0",
2060 "winapi", 2263 "winapi",
2061 ] 2264 ]
2062 2265
@@ -2096,9 +2299,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
2096 2299
2097 [[package]] 2300 [[package]]
2098 name = "md5" 2301 name = "md5"
2099 version = "0.7.0" 2302 version = "0.8.1"
2100 source = "registry+https://github.com/rust-lang/crates.io-index" 2303 source = "registry+https://github.com/rust-lang/crates.io-index"
2101 checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 2304 checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c"
2102 2305
2103 [[package]] 2306 [[package]]
2104 name = "memchr" 2307 name = "memchr"
@@ -2156,6 +2359,31 @@ dependencies = [
2156 ] 2359 ]
2157 2360
2158 [[package]] 2361 [[package]]
2362 name = "ml-kem"
2363 version = "0.3.2"
2364 source = "registry+https://github.com/rust-lang/crates.io-index"
2365 checksum = "5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66"
2366 dependencies = [
2367 "hybrid-array",
2368 "kem",
2369 "module-lattice",
2370 "pkcs8 0.11.0",
2371 "rand_core 0.10.1",
2372 "sha3 0.11.0",
2373 ]
2374
2375 [[package]]
2376 name = "module-lattice"
2377 version = "0.2.3"
2378 source = "registry+https://github.com/rust-lang/crates.io-index"
2379 checksum = "0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febe"
2380 dependencies = [
2381 "ctutils",
2382 "hybrid-array",
2383 "num-traits",
2384 ]
2385
2386 [[package]]
2159 name = "new_debug_unreachable" 2387 name = "new_debug_unreachable"
2160 version = "1.0.6" 2388 version = "1.0.6"
2161 source = "registry+https://github.com/rust-lang/crates.io-index" 2389 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2175,6 +2403,18 @@ dependencies = [
2175 ] 2403 ]
2176 2404
2177 [[package]] 2405 [[package]]
2406 name = "nix"
2407 version = "0.31.3"
2408 source = "registry+https://github.com/rust-lang/crates.io-index"
2409 checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"
2410 dependencies = [
2411 "bitflags 2.11.0",
2412 "cfg-if",
2413 "cfg_aliases",
2414 "libc",
2415 ]
2416
2417 [[package]]
2178 name = "nom" 2418 name = "nom"
2179 version = "7.1.3" 2419 version = "7.1.3"
2180 source = "registry+https://github.com/rust-lang/crates.io-index" 2420 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2201,23 +2441,6 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
2201 dependencies = [ 2441 dependencies = [
2202 "num-integer", 2442 "num-integer",
2203 "num-traits", 2443 "num-traits",
2204 "rand 0.8.5",
2205 ]
2206
2207 [[package]]
2208 name = "num-bigint-dig"
2209 version = "0.8.6"
2210 source = "registry+https://github.com/rust-lang/crates.io-index"
2211 checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
2212 dependencies = [
2213 "lazy_static",
2214 "libm",
2215 "num-integer",
2216 "num-iter",
2217 "num-traits",
2218 "rand 0.8.5",
2219 "smallvec",
2220 "zeroize",
2221 ] 2444 ]
2222 2445
2223 [[package]] 2446 [[package]]
@@ -2247,34 +2470,12 @@ dependencies = [
2247 ] 2470 ]
2248 2471
2249 [[package]] 2472 [[package]]
2250 name = "num-iter"
2251 version = "0.1.45"
2252 source = "registry+https://github.com/rust-lang/crates.io-index"
2253 checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
2254 dependencies = [
2255 "autocfg",
2256 "num-integer",
2257 "num-traits",
2258 ]
2259
2260 [[package]]
2261 name = "num-traits" 2473 name = "num-traits"
2262 version = "0.2.19" 2474 version = "0.2.19"
2263 source = "registry+https://github.com/rust-lang/crates.io-index" 2475 source = "registry+https://github.com/rust-lang/crates.io-index"
2264 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2476 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
2265 dependencies = [ 2477 dependencies = [
2266 "autocfg", 2478 "autocfg",
2267 "libm",
2268 ]
2269
2270 [[package]]
2271 name = "num_cpus"
2272 version = "1.17.0"
2273 source = "registry+https://github.com/rust-lang/crates.io-index"
2274 checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
2275 dependencies = [
2276 "hermit-abi",
2277 "libc",
2278 ] 2479 ]
2279 2480
2280 [[package]] 2481 [[package]]
@@ -2305,12 +2506,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2305 checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" 2506 checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
2306 2507
2307 [[package]] 2508 [[package]]
2308 name = "opaque-debug"
2309 version = "0.3.1"
2310 source = "registry+https://github.com/rust-lang/crates.io-index"
2311 checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
2312
2313 [[package]]
2314 name = "openssl-probe" 2509 name = "openssl-probe"
2315 version = "0.1.6" 2510 version = "0.1.6"
2316 source = "registry+https://github.com/rust-lang/crates.io-index" 2511 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2345,55 +2540,63 @@ dependencies = [
2345 2540
2346 [[package]] 2541 [[package]]
2347 name = "p256" 2542 name = "p256"
2348 version = "0.13.2" 2543 version = "0.14.0"
2349 source = "registry+https://github.com/rust-lang/crates.io-index" 2544 source = "registry+https://github.com/rust-lang/crates.io-index"
2350 checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" 2545 checksum = "d2c9239b2dbc807adbbe147e8cf72ea7450c3a0aabe62cb8e75ff4ec22e1f72a"
2351 dependencies = [ 2546 dependencies = [
2352 "ecdsa", 2547 "ecdsa",
2353 "elliptic-curve", 2548 "elliptic-curve",
2549 "primefield",
2354 "primeorder", 2550 "primeorder",
2355 "sha2", 2551 "sha2 0.11.0",
2356 ] 2552 ]
2357 2553
2358 [[package]] 2554 [[package]]
2359 name = "p384" 2555 name = "p384"
2360 version = "0.13.1" 2556 version = "0.14.0"
2361 source = "registry+https://github.com/rust-lang/crates.io-index" 2557 source = "registry+https://github.com/rust-lang/crates.io-index"
2362 checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" 2558 checksum = "d17b851e6b3e378ab4ecb07fa2ed23f4d15f075735f8fec9fa1e7bdce5f8301f"
2363 dependencies = [ 2559 dependencies = [
2364 "ecdsa", 2560 "ecdsa",
2365 "elliptic-curve", 2561 "elliptic-curve",
2562 "fiat-crypto 0.3.0",
2563 "primefield",
2366 "primeorder", 2564 "primeorder",
2367 "sha2", 2565 "sha2 0.11.0",
2368 ] 2566 ]
2369 2567
2370 [[package]] 2568 [[package]]
2371 name = "p521" 2569 name = "p521"
2372 version = "0.13.3" 2570 version = "0.14.0"
2373 source = "registry+https://github.com/rust-lang/crates.io-index" 2571 source = "registry+https://github.com/rust-lang/crates.io-index"
2374 checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" 2572 checksum = "4ad64cc32c2dc466317c12ee5853e61f159f9eab1fe7efade0395dc2e7b43449"
2375 dependencies = [ 2573 dependencies = [
2376 "base16ct", 2574 "base16ct",
2377 "ecdsa", 2575 "ecdsa",
2378 "elliptic-curve", 2576 "elliptic-curve",
2577 "primefield",
2379 "primeorder", 2578 "primeorder",
2380 "rand_core 0.6.4", 2579 "sha2 0.11.0",
2381 "sha2",
2382 ] 2580 ]
2383 2581
2384 [[package]] 2582 [[package]]
2385 name = "pageant" 2583 name = "pageant"
2386 version = "0.0.1" 2584 version = "0.2.1"
2387 source = "registry+https://github.com/rust-lang/crates.io-index" 2585 source = "registry+https://github.com/rust-lang/crates.io-index"
2388 checksum = "032d6201d2fb765158455ae0d5a510c016bb6da7232e5040e39e9c8db12b0afc" 2586 checksum = "4f3a5ae18f65a85c67a77d18d42d3606c07948e3c17c1e5f74852b26589e88a5"
2389 dependencies = [ 2587 dependencies = [
2588 "base16ct",
2589 "byteorder",
2390 "bytes", 2590 "bytes",
2391 "delegate", 2591 "delegate",
2392 "futures", 2592 "futures",
2393 "rand 0.8.5", 2593 "log",
2394 "thiserror 1.0.69", 2594 "rand 0.10.2",
2595 "sha2 0.11.0",
2596 "thiserror 2.0.18",
2395 "tokio", 2597 "tokio",
2396 "windows", 2598 "windows",
2599 "windows-strings",
2397 ] 2600 ]
2398 2601
2399 [[package]] 2602 [[package]]
@@ -2420,20 +2623,29 @@ dependencies = [
2420 ] 2623 ]
2421 2624
2422 [[package]] 2625 [[package]]
2626 name = "password-hash"
2627 version = "0.6.1"
2628 source = "registry+https://github.com/rust-lang/crates.io-index"
2629 checksum = "aab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723b"
2630 dependencies = [
2631 "phc",
2632 ]
2633
2634 [[package]]
2423 name = "pbkdf2" 2635 name = "pbkdf2"
2424 version = "0.12.2" 2636 version = "0.13.0"
2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2637 source = "registry+https://github.com/rust-lang/crates.io-index"
2426 checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" 2638 checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629"
2427 dependencies = [ 2639 dependencies = [
2428 "digest", 2640 "digest 0.11.3",
2429 "hmac", 2641 "hmac",
2430 ] 2642 ]
2431 2643
2432 [[package]] 2644 [[package]]
2433 name = "pem-rfc7468" 2645 name = "pem-rfc7468"
2434 version = "0.7.0" 2646 version = "1.0.0"
2435 source = "registry+https://github.com/rust-lang/crates.io-index" 2647 source = "registry+https://github.com/rust-lang/crates.io-index"
2436 checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 2648 checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9"
2437 dependencies = [ 2649 dependencies = [
2438 "base64ct", 2650 "base64ct",
2439 ] 2651 ]
@@ -2484,7 +2696,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2484 checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" 2696 checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
2485 dependencies = [ 2697 dependencies = [
2486 "pest", 2698 "pest",
2487 "sha2", 2699 "sha2 0.10.9",
2700 ]
2701
2702 [[package]]
2703 name = "phc"
2704 version = "0.6.1"
2705 source = "registry+https://github.com/rust-lang/crates.io-index"
2706 checksum = "44dc769b75f93afdddd8c7fa12d685292ddeff1e66f7f0f3a234cf1818afe892"
2707 dependencies = [
2708 "base64ct",
2709 "ctutils",
2488 ] 2710 ]
2489 2711
2490 [[package]] 2712 [[package]]
@@ -2553,28 +2775,29 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
2553 2775
2554 [[package]] 2776 [[package]]
2555 name = "pkcs1" 2777 name = "pkcs1"
2556 version = "0.7.5" 2778 version = "0.8.0-rc.4"
2557 source = "registry+https://github.com/rust-lang/crates.io-index" 2779 source = "registry+https://github.com/rust-lang/crates.io-index"
2558 checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 2780 checksum = "986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088e"
2559 dependencies = [ 2781 dependencies = [
2560 "der", 2782 "der 0.8.1",
2561 "pkcs8", 2783 "spki 0.8.0",
2562 "spki",
2563 ] 2784 ]
2564 2785
2565 [[package]] 2786 [[package]]
2566 name = "pkcs5" 2787 name = "pkcs5"
2567 version = "0.7.1" 2788 version = "0.8.1"
2568 source = "registry+https://github.com/rust-lang/crates.io-index" 2789 source = "registry+https://github.com/rust-lang/crates.io-index"
2569 checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" 2790 checksum = "63d440a804ec8d6fafbb6b84471e013286658d373248927692ab3366686220ca"
2570 dependencies = [ 2791 dependencies = [
2571 "aes", 2792 "aes",
2793 "aes-gcm",
2572 "cbc", 2794 "cbc",
2573 "der", 2795 "der 0.8.1",
2574 "pbkdf2", 2796 "pbkdf2",
2797 "rand_core 0.10.1",
2575 "scrypt", 2798 "scrypt",
2576 "sha2", 2799 "sha2 0.11.0",
2577 "spki", 2800 "spki 0.8.0",
2578 ] 2801 ]
2579 2802
2580 [[package]] 2803 [[package]]
@@ -2583,10 +2806,20 @@ version = "0.10.2"
2583 source = "registry+https://github.com/rust-lang/crates.io-index" 2806 source = "registry+https://github.com/rust-lang/crates.io-index"
2584 checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 2807 checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
2585 dependencies = [ 2808 dependencies = [
2586 "der", 2809 "der 0.7.10",
2810 "spki 0.7.3",
2811 ]
2812
2813 [[package]]
2814 name = "pkcs8"
2815 version = "0.11.0"
2816 source = "registry+https://github.com/rust-lang/crates.io-index"
2817 checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7"
2818 dependencies = [
2819 "der 0.8.1",
2587 "pkcs5", 2820 "pkcs5",
2588 "rand_core 0.6.4", 2821 "rand_core 0.10.1",
2589 "spki", 2822 "spki 0.8.0",
2590 ] 2823 ]
2591 2824
2592 [[package]] 2825 [[package]]
@@ -2625,24 +2858,23 @@ dependencies = [
2625 2858
2626 [[package]] 2859 [[package]]
2627 name = "poly1305" 2860 name = "poly1305"
2628 version = "0.8.0" 2861 version = "0.9.1"
2629 source = "registry+https://github.com/rust-lang/crates.io-index" 2862 source = "registry+https://github.com/rust-lang/crates.io-index"
2630 checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" 2863 checksum = "6e2d0073b297041425c7c3df6eb4792d598a15323fe63346852b092eca02904c"
2631 dependencies = [ 2864 dependencies = [
2632 "cpufeatures", 2865 "cpufeatures 0.3.0",
2633 "opaque-debug",
2634 "universal-hash", 2866 "universal-hash",
2867 "zeroize",
2635 ] 2868 ]
2636 2869
2637 [[package]] 2870 [[package]]
2638 name = "polyval" 2871 name = "polyval"
2639 version = "0.6.2" 2872 version = "0.7.3"
2640 source = "registry+https://github.com/rust-lang/crates.io-index" 2873 source = "registry+https://github.com/rust-lang/crates.io-index"
2641 checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" 2874 checksum = "f0fa31d631f2b2cb2a544d0aa321ce847a94764d701ca2becc411138b93d49cd"
2642 dependencies = [ 2875 dependencies = [
2643 "cfg-if", 2876 "cpubits",
2644 "cpufeatures", 2877 "cpufeatures 0.3.0",
2645 "opaque-debug",
2646 "universal-hash", 2878 "universal-hash",
2647 ] 2879 ]
2648 2880
@@ -2693,12 +2925,30 @@ dependencies = [
2693 ] 2925 ]
2694 2926
2695 [[package]] 2927 [[package]]
2928 name = "primefield"
2929 version = "0.14.0"
2930 source = "registry+https://github.com/rust-lang/crates.io-index"
2931 checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4"
2932 dependencies = [
2933 "crypto-bigint",
2934 "crypto-common 0.2.2",
2935 "ff",
2936 "rand_core 0.10.1",
2937 "subtle",
2938 "zeroize",
2939 ]
2940
2941 [[package]]
2696 name = "primeorder" 2942 name = "primeorder"
2697 version = "0.13.6" 2943 version = "0.14.0"
2698 source = "registry+https://github.com/rust-lang/crates.io-index" 2944 source = "registry+https://github.com/rust-lang/crates.io-index"
2699 checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 2945 checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06"
2700 dependencies = [ 2946 dependencies = [
2701 "elliptic-curve", 2947 "elliptic-curve",
2948 "once_cell",
2949 "primefield",
2950 "serdect",
2951 "wnaf",
2702 ] 2952 ]
2703 2953
2704 [[package]] 2954 [[package]]
@@ -2721,7 +2971,7 @@ dependencies = [
2721 "bitflags 2.11.0", 2971 "bitflags 2.11.0",
2722 "num-traits", 2972 "num-traits",
2723 "rand 0.9.2", 2973 "rand 0.9.2",
2724 "rand_chacha 0.9.0", 2974 "rand_chacha",
2725 "rand_xorshift", 2975 "rand_xorshift",
2726 "regex-syntax", 2976 "regex-syntax",
2727 "rusty-fork", 2977 "rusty-fork",
@@ -2780,8 +3030,6 @@ version = "0.8.5"
2780 source = "registry+https://github.com/rust-lang/crates.io-index" 3030 source = "registry+https://github.com/rust-lang/crates.io-index"
2781 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 3031 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
2782 dependencies = [ 3032 dependencies = [
2783 "libc",
2784 "rand_chacha 0.3.1",
2785 "rand_core 0.6.4", 3033 "rand_core 0.6.4",
2786 ] 3034 ]
2787 3035
@@ -2791,18 +3039,19 @@ version = "0.9.2"
2791 source = "registry+https://github.com/rust-lang/crates.io-index" 3039 source = "registry+https://github.com/rust-lang/crates.io-index"
2792 checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 3040 checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
2793 dependencies = [ 3041 dependencies = [
2794 "rand_chacha 0.9.0", 3042 "rand_chacha",
2795 "rand_core 0.9.5", 3043 "rand_core 0.9.5",
2796 ] 3044 ]
2797 3045
2798 [[package]] 3046 [[package]]
2799 name = "rand_chacha" 3047 name = "rand"
2800 version = "0.3.1" 3048 version = "0.10.2"
2801 source = "registry+https://github.com/rust-lang/crates.io-index" 3049 source = "registry+https://github.com/rust-lang/crates.io-index"
2802 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 3050 checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
2803 dependencies = [ 3051 dependencies = [
2804 "ppv-lite86", 3052 "chacha20",
2805 "rand_core 0.6.4", 3053 "getrandom 0.4.2",
3054 "rand_core 0.10.1",
2806 ] 3055 ]
2807 3056
2808 [[package]] 3057 [[package]]
@@ -2834,6 +3083,12 @@ dependencies = [
2834 ] 3083 ]
2835 3084
2836 [[package]] 3085 [[package]]
3086 name = "rand_core"
3087 version = "0.10.1"
3088 source = "registry+https://github.com/rust-lang/crates.io-index"
3089 checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
3090
3091 [[package]]
2837 name = "rand_xorshift" 3092 name = "rand_xorshift"
2838 version = "0.4.0" 3093 version = "0.4.0"
2839 source = "registry+https://github.com/rust-lang/crates.io-index" 3094 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2998,12 +3253,12 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
2998 3253
2999 [[package]] 3254 [[package]]
3000 name = "rfc6979" 3255 name = "rfc6979"
3001 version = "0.4.0" 3256 version = "0.6.0"
3002 source = "registry+https://github.com/rust-lang/crates.io-index" 3257 source = "registry+https://github.com/rust-lang/crates.io-index"
3003 checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 3258 checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b"
3004 dependencies = [ 3259 dependencies = [
3260 "crypto-bigint",
3005 "hmac", 3261 "hmac",
3006 "subtle",
3007 ] 3262 ]
3008 3263
3009 [[package]] 3264 [[package]]
@@ -3014,107 +3269,63 @@ checksum = "dbf2048e0e979efb2ca7b91c4f1a8d77c91853e9b987c94c555668a8994915ad"
3014 3269
3015 [[package]] 3270 [[package]]
3016 name = "rsa" 3271 name = "rsa"
3017 version = "0.9.10" 3272 version = "0.10.0-rc.18"
3018 source = "registry+https://github.com/rust-lang/crates.io-index" 3273 source = "registry+https://github.com/rust-lang/crates.io-index"
3019 checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" 3274 checksum = "30b2aa4ba0d89f73d1e332df05be0eeab8840351c36ca5654341dfdb57bb3caf"
3020 dependencies = [ 3275 dependencies = [
3021 "const-oid", 3276 "const-oid 0.10.2",
3022 "digest", 3277 "crypto-bigint",
3023 "num-bigint-dig", 3278 "crypto-primes",
3024 "num-integer", 3279 "digest 0.11.3",
3025 "num-traits",
3026 "pkcs1", 3280 "pkcs1",
3027 "pkcs8", 3281 "pkcs8 0.11.0",
3028 "rand_core 0.6.4", 3282 "rand_core 0.10.1",
3029 "sha2", 3283 "sha2 0.11.0",
3030 "signature", 3284 "signature 3.0.0",
3031 "spki", 3285 "spki 0.8.0",
3032 "subtle",
3033 "zeroize", 3286 "zeroize",
3034 ] 3287 ]
3035 3288
3036 [[package]] 3289 [[package]]
3037 name = "russh" 3290 name = "russh"
3038 version = "0.46.0" 3291 version = "0.62.5"
3039 source = "registry+https://github.com/rust-lang/crates.io-index" 3292 source = "registry+https://github.com/rust-lang/crates.io-index"
3040 checksum = "c536b90d8e2468d8dedc8de2369383c101325e23fffa3a30de713032862a11d4" 3293 checksum = "da7c230e0ed9cbeb92fbad6c8848985d6df2a1464c0dc247a021abd666e9005e"
3041 dependencies = [ 3294 dependencies = [
3042 "aes", 3295 "aes",
3043 "aes-gcm", 3296 "aws-lc-rs",
3044 "async-trait",
3045 "bitflags 2.11.0", 3297 "bitflags 2.11.0",
3046 "byteorder",
3047 "cbc",
3048 "chacha20",
3049 "ctr",
3050 "curve25519-dalek",
3051 "des",
3052 "digest",
3053 "elliptic-curve",
3054 "flate2",
3055 "futures",
3056 "generic-array",
3057 "hex-literal",
3058 "hmac",
3059 "log",
3060 "num-bigint",
3061 "once_cell",
3062 "p256",
3063 "p384",
3064 "p521",
3065 "poly1305",
3066 "rand 0.8.5",
3067 "rand_core 0.6.4",
3068 "russh-cryptovec",
3069 "russh-keys",
3070 "russh-sftp",
3071 "russh-util",
3072 "sha1",
3073 "sha2",
3074 "ssh-encoding",
3075 "ssh-key",
3076 "subtle",
3077 "thiserror 1.0.69",
3078 "tokio",
3079 ]
3080
3081 [[package]]
3082 name = "russh-cryptovec"
3083 version = "0.7.3"
3084 source = "registry+https://github.com/rust-lang/crates.io-index"
3085 checksum = "fadd2c0ab350e21c66556f94ee06f766d8bdae3213857ba7610bfd8e10e51880"
3086 dependencies = [
3087 "libc",
3088 "winapi",
3089 ]
3090
3091 [[package]]
3092 name = "russh-keys"
3093 version = "0.46.0"
3094 source = "registry+https://github.com/rust-lang/crates.io-index"
3095 checksum = "6e3db166c8678c824627c2c46f619ed5ce4ae33f38a35403c62f6ab8f3985867"
3096 dependencies = [
3097 "aes",
3098 "async-trait",
3099 "bcrypt-pbkdf",
3100 "block-padding", 3298 "block-padding",
3101 "byteorder", 3299 "byteorder",
3300 "bytes",
3102 "cbc", 3301 "cbc",
3302 "cipher",
3303 "crypto-bigint",
3103 "ctr", 3304 "ctr",
3305 "curve25519-dalek 5.0.0",
3104 "data-encoding", 3306 "data-encoding",
3105 "der", 3307 "delegate",
3106 "digest", 3308 "der 0.8.1",
3309 "digest 0.11.3",
3107 "ecdsa", 3310 "ecdsa",
3108 "ed25519-dalek", 3311 "ed25519-dalek 3.0.0",
3109 "elliptic-curve", 3312 "elliptic-curve",
3313 "enum_dispatch",
3314 "flate2",
3110 "futures", 3315 "futures",
3111 "getrandom 0.2.17", 3316 "generic-array 1.4.4",
3317 "getrandom 0.4.2",
3318 "ghash",
3319 "hex-literal",
3112 "hmac", 3320 "hmac",
3113 "home",
3114 "inout", 3321 "inout",
3322 "internal-russh-num-bigint",
3323 "keccak",
3115 "log", 3324 "log",
3116 "md5", 3325 "md5",
3117 "num-integer", 3326 "ml-kem",
3327 "module-lattice",
3328 "num-bigint",
3118 "p256", 3329 "p256",
3119 "p384", 3330 "p384",
3120 "p521", 3331 "p521",
@@ -3122,48 +3333,48 @@ dependencies = [
3122 "pbkdf2", 3333 "pbkdf2",
3123 "pkcs1", 3334 "pkcs1",
3124 "pkcs5", 3335 "pkcs5",
3125 "pkcs8", 3336 "pkcs8 0.11.0",
3126 "rand 0.8.5", 3337 "polyval",
3127 "rand_core 0.6.4", 3338 "rand 0.10.2",
3339 "rand_core 0.10.1",
3128 "rsa", 3340 "rsa",
3129 "russh-cryptovec", 3341 "russh-cryptovec",
3130 "russh-util", 3342 "russh-util",
3343 "salsa20",
3344 "scrypt",
3131 "sec1", 3345 "sec1",
3132 "serde",
3133 "sha1", 3346 "sha1",
3134 "sha2", 3347 "sha2 0.11.0",
3135 "spki", 3348 "sha3 0.12.0",
3349 "signature 3.0.0",
3350 "spki 0.8.0",
3136 "ssh-encoding", 3351 "ssh-encoding",
3137 "ssh-key", 3352 "ssh-key",
3138 "thiserror 1.0.69", 3353 "subtle",
3354 "thiserror 2.0.18",
3139 "tokio", 3355 "tokio",
3140 "tokio-stream",
3141 "typenum", 3356 "typenum",
3357 "universal-hash",
3142 "zeroize", 3358 "zeroize",
3143 ] 3359 ]
3144 3360
3145 [[package]] 3361 [[package]]
3146 name = "russh-sftp" 3362 name = "russh-cryptovec"
3147 version = "2.1.1" 3363 version = "0.62.0"
3148 source = "registry+https://github.com/rust-lang/crates.io-index" 3364 source = "registry+https://github.com/rust-lang/crates.io-index"
3149 checksum = "3bb94393cafad0530145b8f626d8687f1ee1dedb93d7ba7740d6ae81868b13b5" 3365 checksum = "3aec6cb630dbe85d72ffd7bcd95f07e1bd69f9f270ee8adfa1afe443a6331438"
3150 dependencies = [ 3366 dependencies = [
3151 "bitflags 2.11.0",
3152 "bytes",
3153 "chrono",
3154 "flurry",
3155 "log", 3367 "log",
3156 "serde", 3368 "nix 0.31.3",
3157 "thiserror 2.0.18", 3369 "ssh-encoding",
3158 "tokio", 3370 "windows-sys 0.61.2",
3159 "tokio-util",
3160 ] 3371 ]
3161 3372
3162 [[package]] 3373 [[package]]
3163 name = "russh-util" 3374 name = "russh-util"
3164 version = "0.46.0" 3375 version = "0.52.0"
3165 source = "registry+https://github.com/rust-lang/crates.io-index" 3376 source = "registry+https://github.com/rust-lang/crates.io-index"
3166 checksum = "63aeb9d2b74f8f38befdc0c5172d5ffcf58f3d2ffcb423f3b6cdfe2c2d747b80" 3377 checksum = "668424a5dde0bcb45b55ba7de8476b93831b4aa2fa6947e145f3b053e22c60b6"
3167 dependencies = [ 3378 dependencies = [
3168 "chrono", 3379 "chrono",
3169 "tokio", 3380 "tokio",
@@ -3225,10 +3436,11 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
3225 3436
3226 [[package]] 3437 [[package]]
3227 name = "salsa20" 3438 name = "salsa20"
3228 version = "0.10.2" 3439 version = "0.11.0"
3229 source = "registry+https://github.com/rust-lang/crates.io-index" 3440 source = "registry+https://github.com/rust-lang/crates.io-index"
3230 checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" 3441 checksum = "2f874456e72520ff1375a06c588eaf074b0f01f9e9e1aada45bd9b7954a6e42c"
3231 dependencies = [ 3442 dependencies = [
3443 "cfg-if",
3232 "cipher", 3444 "cipher",
3233 ] 3445 ]
3234 3446
@@ -3249,36 +3461,31 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
3249 3461
3250 [[package]] 3462 [[package]]
3251 name = "scrypt" 3463 name = "scrypt"
3252 version = "0.11.0" 3464 version = "0.12.0"
3253 source = "registry+https://github.com/rust-lang/crates.io-index" 3465 source = "registry+https://github.com/rust-lang/crates.io-index"
3254 checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" 3466 checksum = "d87af57419b594aa23fa95f09f0e06d80d84ba01c26148c43844cad6ff4485f0"
3255 dependencies = [ 3467 dependencies = [
3468 "cfg-if",
3256 "pbkdf2", 3469 "pbkdf2",
3257 "salsa20", 3470 "salsa20",
3258 "sha2", 3471 "sha2 0.11.0",
3259 ] 3472 ]
3260 3473
3261 [[package]] 3474 [[package]]
3262 name = "sec1" 3475 name = "sec1"
3263 version = "0.7.3" 3476 version = "0.8.1"
3264 source = "registry+https://github.com/rust-lang/crates.io-index" 3477 source = "registry+https://github.com/rust-lang/crates.io-index"
3265 checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 3478 checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d"
3266 dependencies = [ 3479 dependencies = [
3267 "base16ct", 3480 "base16ct",
3268 "der", 3481 "ctutils",
3269 "generic-array", 3482 "der 0.8.1",
3270 "pkcs8", 3483 "hybrid-array",
3271 "subtle", 3484 "subtle",
3272 "zeroize", 3485 "zeroize",
3273 ] 3486 ]
3274 3487
3275 [[package]] 3488 [[package]]
3276 name = "seize"
3277 version = "0.3.3"
3278 source = "registry+https://github.com/rust-lang/crates.io-index"
3279 checksum = "689224d06523904ebcc9b482c6a3f4f7fb396096645c4cd10c0d2ff7371a34d3"
3280
3281 [[package]]
3282 name = "semver" 3489 name = "semver"
3283 version = "1.0.27" 3490 version = "1.0.27"
3284 source = "registry+https://github.com/rust-lang/crates.io-index" 3491 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3360,14 +3567,24 @@ dependencies = [
3360 ] 3567 ]
3361 3568
3362 [[package]] 3569 [[package]]
3570 name = "serdect"
3571 version = "0.4.3"
3572 source = "registry+https://github.com/rust-lang/crates.io-index"
3573 checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e"
3574 dependencies = [
3575 "base16ct",
3576 "serde",
3577 ]
3578
3579 [[package]]
3363 name = "sha1" 3580 name = "sha1"
3364 version = "0.10.6" 3581 version = "0.11.0"
3365 source = "registry+https://github.com/rust-lang/crates.io-index" 3582 source = "registry+https://github.com/rust-lang/crates.io-index"
3366 checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3583 checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214"
3367 dependencies = [ 3584 dependencies = [
3368 "cfg-if", 3585 "cfg-if",
3369 "cpufeatures", 3586 "cpufeatures 0.3.0",
3370 "digest", 3587 "digest 0.11.3",
3371 ] 3588 ]
3372 3589
3373 [[package]] 3590 [[package]]
@@ -3377,8 +3594,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3377 checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 3594 checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
3378 dependencies = [ 3595 dependencies = [
3379 "cfg-if", 3596 "cfg-if",
3380 "cpufeatures", 3597 "cpufeatures 0.2.17",
3381 "digest", 3598 "digest 0.10.7",
3599 ]
3600
3601 [[package]]
3602 name = "sha2"
3603 version = "0.11.0"
3604 source = "registry+https://github.com/rust-lang/crates.io-index"
3605 checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4"
3606 dependencies = [
3607 "cfg-if",
3608 "cpufeatures 0.3.0",
3609 "digest 0.11.3",
3610 ]
3611
3612 [[package]]
3613 name = "sha3"
3614 version = "0.11.0"
3615 source = "registry+https://github.com/rust-lang/crates.io-index"
3616 checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1"
3617 dependencies = [
3618 "digest 0.11.3",
3619 "keccak",
3620 ]
3621
3622 [[package]]
3623 name = "sha3"
3624 version = "0.12.0"
3625 source = "registry+https://github.com/rust-lang/crates.io-index"
3626 checksum = "bc9bad02c26382724b2d2692c6f179285e4b54eeecd7968f52a50059c3c11759"
3627 dependencies = [
3628 "digest 0.11.3",
3629 "keccak",
3630 "sponge-cursor",
3382 ] 3631 ]
3383 3632
3384 [[package]] 3633 [[package]]
@@ -3433,11 +3682,20 @@ version = "2.2.0"
3433 source = "registry+https://github.com/rust-lang/crates.io-index" 3682 source = "registry+https://github.com/rust-lang/crates.io-index"
3434 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 3683 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
3435 dependencies = [ 3684 dependencies = [
3436 "digest",
3437 "rand_core 0.6.4", 3685 "rand_core 0.6.4",
3438 ] 3686 ]
3439 3687
3440 [[package]] 3688 [[package]]
3689 name = "signature"
3690 version = "3.0.0"
3691 source = "registry+https://github.com/rust-lang/crates.io-index"
3692 checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5"
3693 dependencies = [
3694 "digest 0.11.3",
3695 "rand_core 0.10.1",
3696 ]
3697
3698 [[package]]
3441 name = "simd-adler32" 3699 name = "simd-adler32"
3442 version = "0.3.9" 3700 version = "0.3.9"
3443 source = "registry+https://github.com/rust-lang/crates.io-index" 3701 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3472,69 +3730,87 @@ dependencies = [
3472 ] 3730 ]
3473 3731
3474 [[package]] 3732 [[package]]
3475 name = "spin" 3733 name = "spki"
3476 version = "0.9.8" 3734 version = "0.7.3"
3477 source = "registry+https://github.com/rust-lang/crates.io-index" 3735 source = "registry+https://github.com/rust-lang/crates.io-index"
3478 checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3736 checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
3737 dependencies = [
3738 "base64ct",
3739 "der 0.7.10",
3740 ]
3479 3741
3480 [[package]] 3742 [[package]]
3481 name = "spki" 3743 name = "spki"
3482 version = "0.7.3" 3744 version = "0.8.0"
3483 source = "registry+https://github.com/rust-lang/crates.io-index" 3745 source = "registry+https://github.com/rust-lang/crates.io-index"
3484 checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 3746 checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f"
3485 dependencies = [ 3747 dependencies = [
3486 "base64ct", 3748 "base64ct",
3487 "der", 3749 "der 0.8.1",
3488 ] 3750 ]
3489 3751
3490 [[package]] 3752 [[package]]
3753 name = "sponge-cursor"
3754 version = "0.1.0"
3755 source = "registry+https://github.com/rust-lang/crates.io-index"
3756 checksum = "3a0219bd7d979d58245a4f41f695e1ac9f8befdffadd7f61f1bae9e39abc6620"
3757
3758 [[package]]
3491 name = "ssh-cipher" 3759 name = "ssh-cipher"
3492 version = "0.2.0" 3760 version = "0.3.0"
3493 source = "registry+https://github.com/rust-lang/crates.io-index" 3761 source = "registry+https://github.com/rust-lang/crates.io-index"
3494 checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" 3762 checksum = "d801accda99469cde6d73da741422610fdf6508a72d9a69d1b55cb241c720597"
3495 dependencies = [ 3763 dependencies = [
3764 "aead",
3496 "aes", 3765 "aes",
3497 "aes-gcm", 3766 "aes-gcm",
3498 "cbc",
3499 "chacha20", 3767 "chacha20",
3500 "cipher", 3768 "cipher",
3501 "ctr", 3769 "ctutils",
3770 "des",
3502 "poly1305", 3771 "poly1305",
3503 "ssh-encoding", 3772 "ssh-encoding",
3504 "subtle", 3773 "zeroize",
3505 ] 3774 ]
3506 3775
3507 [[package]] 3776 [[package]]
3508 name = "ssh-encoding" 3777 name = "ssh-encoding"
3509 version = "0.2.0" 3778 version = "0.3.0"
3510 source = "registry+https://github.com/rust-lang/crates.io-index" 3779 source = "registry+https://github.com/rust-lang/crates.io-index"
3511 checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" 3780 checksum = "7b54d0ed0498daf3f78d82e00e28c8eec9d75a067c4cfbcc7a0f7d0f4077749e"
3512 dependencies = [ 3781 dependencies = [
3513 "base64ct", 3782 "base64ct",
3783 "bytes",
3784 "crypto-bigint",
3785 "ctutils",
3786 "digest 0.11.3",
3514 "pem-rfc7468", 3787 "pem-rfc7468",
3515 "sha2", 3788 "zeroize",
3516 ] 3789 ]
3517 3790
3518 [[package]] 3791 [[package]]
3519 name = "ssh-key" 3792 name = "ssh-key"
3520 version = "0.6.7" 3793 version = "0.7.0-rc.11"
3521 source = "registry+https://github.com/rust-lang/crates.io-index" 3794 source = "registry+https://github.com/rust-lang/crates.io-index"
3522 checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" 3795 checksum = "f9a32fae177b74a22aa9c5b01bf7e68b33545be32d9e381e248058d2adc15ce3"
3523 dependencies = [ 3796 dependencies = [
3797 "argon2",
3524 "bcrypt-pbkdf", 3798 "bcrypt-pbkdf",
3525 "ed25519-dalek", 3799 "ctutils",
3526 "num-bigint-dig", 3800 "ed25519-dalek 3.0.0",
3801 "hex",
3802 "hmac",
3527 "p256", 3803 "p256",
3528 "p384", 3804 "p384",
3529 "p521", 3805 "p521",
3530 "rand_core 0.6.4", 3806 "rand_core 0.10.1",
3531 "rsa", 3807 "rsa",
3532 "sec1", 3808 "sec1",
3533 "sha2", 3809 "sha1",
3534 "signature", 3810 "sha2 0.11.0",
3811 "signature 3.0.0",
3535 "ssh-cipher", 3812 "ssh-cipher",
3536 "ssh-encoding", 3813 "ssh-encoding",
3537 "subtle",
3538 "zeroize", 3814 "zeroize",
3539 ] 3815 ]
3540 3816
@@ -3710,14 +3986,14 @@ dependencies = [
3710 "libc", 3986 "libc",
3711 "log", 3987 "log",
3712 "memmem", 3988 "memmem",
3713 "nix", 3989 "nix 0.29.0",
3714 "num-derive", 3990 "num-derive",
3715 "num-traits", 3991 "num-traits",
3716 "ordered-float", 3992 "ordered-float",
3717 "pest", 3993 "pest",
3718 "pest_derive", 3994 "pest_derive",
3719 "phf", 3995 "phf",
3720 "sha2", 3996 "sha2 0.10.9",
3721 "signal-hook", 3997 "signal-hook",
3722 "siphasher", 3998 "siphasher",
3723 "terminfo", 3999 "terminfo",
@@ -3805,15 +4081,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
3805 checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 4081 checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
3806 4082
3807 [[package]] 4083 [[package]]
3808 name = "tiny-keccak"
3809 version = "2.0.2"
3810 source = "registry+https://github.com/rust-lang/crates.io-index"
3811 checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
3812 dependencies = [
3813 "crunchy",
3814 ]
3815
3816 [[package]]
3817 name = "tinystr" 4084 name = "tinystr"
3818 version = "0.8.2" 4085 version = "0.8.2"
3819 source = "registry+https://github.com/rust-lang/crates.io-index" 4086 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3862,18 +4129,6 @@ dependencies = [
3862 ] 4129 ]
3863 4130
3864 [[package]] 4131 [[package]]
3865 name = "tokio-stream"
3866 version = "0.1.18"
3867 source = "registry+https://github.com/rust-lang/crates.io-index"
3868 checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
3869 dependencies = [
3870 "futures-core",
3871 "pin-project-lite",
3872 "tokio",
3873 "tokio-util",
3874 ]
3875
3876 [[package]]
3877 name = "tokio-util" 4132 name = "tokio-util"
3878 version = "0.7.18" 4133 version = "0.7.18"
3879 source = "registry+https://github.com/rust-lang/crates.io-index" 4134 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4003,9 +4258,9 @@ dependencies = [
4003 4258
4004 [[package]] 4259 [[package]]
4005 name = "typenum" 4260 name = "typenum"
4006 version = "1.19.0" 4261 version = "1.20.1"
4007 source = "registry+https://github.com/rust-lang/crates.io-index" 4262 source = "registry+https://github.com/rust-lang/crates.io-index"
4008 checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4263 checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
4009 4264
4010 [[package]] 4265 [[package]]
4011 name = "ucd-trie" 4266 name = "ucd-trie"
@@ -4062,15 +4317,21 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
4062 4317
4063 [[package]] 4318 [[package]]
4064 name = "universal-hash" 4319 name = "universal-hash"
4065 version = "0.5.1" 4320 version = "0.6.1"
4066 source = "registry+https://github.com/rust-lang/crates.io-index" 4321 source = "registry+https://github.com/rust-lang/crates.io-index"
4067 checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 4322 checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96"
4068 dependencies = [ 4323 dependencies = [
4069 "crypto-common", 4324 "crypto-common 0.2.2",
4070 "subtle", 4325 "ctutils",
4071 ] 4326 ]
4072 4327
4073 [[package]] 4328 [[package]]
4329 name = "untrusted"
4330 version = "0.7.1"
4331 source = "registry+https://github.com/rust-lang/crates.io-index"
4332 checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
4333
4334 [[package]]
4074 name = "url" 4335 name = "url"
4075 version = "2.5.8" 4336 version = "2.5.8"
4076 source = "registry+https://github.com/rust-lang/crates.io-index" 4337 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4311,7 +4572,7 @@ checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7"
4311 dependencies = [ 4572 dependencies = [
4312 "getrandom 0.3.4", 4573 "getrandom 0.3.4",
4313 "mac_address", 4574 "mac_address",
4314 "sha2", 4575 "sha2 0.10.9",
4315 "thiserror 1.0.69", 4576 "thiserror 1.0.69",
4316 "uuid", 4577 "uuid",
4317 ] 4578 ]
@@ -4398,25 +4659,23 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
4398 4659
4399 [[package]] 4660 [[package]]
4400 name = "windows" 4661 name = "windows"
4401 version = "0.58.0" 4662 version = "0.62.2"
4402 source = "registry+https://github.com/rust-lang/crates.io-index" 4663 source = "registry+https://github.com/rust-lang/crates.io-index"
4403 checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 4664 checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
4404 dependencies = [ 4665 dependencies = [
4405 "windows-core 0.58.0", 4666 "windows-collections",
4406 "windows-targets 0.52.6", 4667 "windows-core",
4668 "windows-future",
4669 "windows-numerics",
4407 ] 4670 ]
4408 4671
4409 [[package]] 4672 [[package]]
4410 name = "windows-core" 4673 name = "windows-collections"
4411 version = "0.58.0" 4674 version = "0.3.2"
4412 source = "registry+https://github.com/rust-lang/crates.io-index" 4675 source = "registry+https://github.com/rust-lang/crates.io-index"
4413 checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 4676 checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
4414 dependencies = [ 4677 dependencies = [
4415 "windows-implement 0.58.0", 4678 "windows-core",
4416 "windows-interface 0.58.0",
4417 "windows-result 0.2.0",
4418 "windows-strings 0.1.0",
4419 "windows-targets 0.52.6",
4420 ] 4679 ]
4421 4680
4422 [[package]] 4681 [[package]]
@@ -4425,22 +4684,22 @@ version = "0.62.2"
4425 source = "registry+https://github.com/rust-lang/crates.io-index" 4684 source = "registry+https://github.com/rust-lang/crates.io-index"
4426 checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 4685 checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
4427 dependencies = [ 4686 dependencies = [
4428 "windows-implement 0.60.2", 4687 "windows-implement",
4429 "windows-interface 0.59.3", 4688 "windows-interface",
4430 "windows-link", 4689 "windows-link",
4431 "windows-result 0.4.1", 4690 "windows-result",
4432 "windows-strings 0.5.1", 4691 "windows-strings",
4433 ] 4692 ]
4434 4693
4435 [[package]] 4694 [[package]]
4436 name = "windows-implement" 4695 name = "windows-future"
4437 version = "0.58.0" 4696 version = "0.3.2"
4438 source = "registry+https://github.com/rust-lang/crates.io-index" 4697 source = "registry+https://github.com/rust-lang/crates.io-index"
4439 checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 4698 checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
4440 dependencies = [ 4699 dependencies = [
4441 "proc-macro2", 4700 "windows-core",
4442 "quote", 4701 "windows-link",
4443 "syn 2.0.117", 4702 "windows-threading",
4444 ] 4703 ]
4445 4704
4446 [[package]] 4705 [[package]]
@@ -4456,17 +4715,6 @@ dependencies = [
4456 4715
4457 [[package]] 4716 [[package]]
4458 name = "windows-interface" 4717 name = "windows-interface"
4459 version = "0.58.0"
4460 source = "registry+https://github.com/rust-lang/crates.io-index"
4461 checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
4462 dependencies = [
4463 "proc-macro2",
4464 "quote",
4465 "syn 2.0.117",
4466 ]
4467
4468 [[package]]
4469 name = "windows-interface"
4470 version = "0.59.3" 4718 version = "0.59.3"
4471 source = "registry+https://github.com/rust-lang/crates.io-index" 4719 source = "registry+https://github.com/rust-lang/crates.io-index"
4472 checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 4720 checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
@@ -4483,12 +4731,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4483 checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 4731 checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
4484 4732
4485 [[package]] 4733 [[package]]
4486 name = "windows-result" 4734 name = "windows-numerics"
4487 version = "0.2.0" 4735 version = "0.3.1"
4488 source = "registry+https://github.com/rust-lang/crates.io-index" 4736 source = "registry+https://github.com/rust-lang/crates.io-index"
4489 checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 4737 checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
4490 dependencies = [ 4738 dependencies = [
4491 "windows-targets 0.52.6", 4739 "windows-core",
4740 "windows-link",
4492 ] 4741 ]
4493 4742
4494 [[package]] 4743 [[package]]
@@ -4502,16 +4751,6 @@ dependencies = [
4502 4751
4503 [[package]] 4752 [[package]]
4504 name = "windows-strings" 4753 name = "windows-strings"
4505 version = "0.1.0"
4506 source = "registry+https://github.com/rust-lang/crates.io-index"
4507 checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
4508 dependencies = [
4509 "windows-result 0.2.0",
4510 "windows-targets 0.52.6",
4511 ]
4512
4513 [[package]]
4514 name = "windows-strings"
4515 version = "0.5.1" 4754 version = "0.5.1"
4516 source = "registry+https://github.com/rust-lang/crates.io-index" 4755 source = "registry+https://github.com/rust-lang/crates.io-index"
4517 checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 4756 checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
@@ -4525,7 +4764,7 @@ version = "0.48.0"
4525 source = "registry+https://github.com/rust-lang/crates.io-index" 4764 source = "registry+https://github.com/rust-lang/crates.io-index"
4526 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 4765 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
4527 dependencies = [ 4766 dependencies = [
4528 "windows-targets 0.48.5", 4767 "windows-targets",
4529 ] 4768 ]
4530 4769
4531 [[package]] 4770 [[package]]
@@ -4543,29 +4782,22 @@ version = "0.48.5"
4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4782 source = "registry+https://github.com/rust-lang/crates.io-index"
4544 checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 4783 checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
4545 dependencies = [ 4784 dependencies = [
4546 "windows_aarch64_gnullvm 0.48.5", 4785 "windows_aarch64_gnullvm",
4547 "windows_aarch64_msvc 0.48.5", 4786 "windows_aarch64_msvc",
4548 "windows_i686_gnu 0.48.5", 4787 "windows_i686_gnu",
4549 "windows_i686_msvc 0.48.5", 4788 "windows_i686_msvc",
4550 "windows_x86_64_gnu 0.48.5", 4789 "windows_x86_64_gnu",
4551 "windows_x86_64_gnullvm 0.48.5", 4790 "windows_x86_64_gnullvm",
4552 "windows_x86_64_msvc 0.48.5", 4791 "windows_x86_64_msvc",
4553 ] 4792 ]
4554 4793
4555 [[package]] 4794 [[package]]
4556 name = "windows-targets" 4795 name = "windows-threading"
4557 version = "0.52.6" 4796 version = "0.2.1"
4558 source = "registry+https://github.com/rust-lang/crates.io-index" 4797 source = "registry+https://github.com/rust-lang/crates.io-index"
4559 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 4798 checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
4560 dependencies = [ 4799 dependencies = [
4561 "windows_aarch64_gnullvm 0.52.6", 4800 "windows-link",
4562 "windows_aarch64_msvc 0.52.6",
4563 "windows_i686_gnu 0.52.6",
4564 "windows_i686_gnullvm",
4565 "windows_i686_msvc 0.52.6",
4566 "windows_x86_64_gnu 0.52.6",
4567 "windows_x86_64_gnullvm 0.52.6",
4568 "windows_x86_64_msvc 0.52.6",
4569 ] 4801 ]
4570 4802
4571 [[package]] 4803 [[package]]
@@ -4575,90 +4807,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4575 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 4807 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
4576 4808
4577 [[package]] 4809 [[package]]
4578 name = "windows_aarch64_gnullvm"
4579 version = "0.52.6"
4580 source = "registry+https://github.com/rust-lang/crates.io-index"
4581 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
4582
4583 [[package]]
4584 name = "windows_aarch64_msvc" 4810 name = "windows_aarch64_msvc"
4585 version = "0.48.5" 4811 version = "0.48.5"
4586 source = "registry+https://github.com/rust-lang/crates.io-index" 4812 source = "registry+https://github.com/rust-lang/crates.io-index"
4587 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 4813 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
4588 4814
4589 [[package]] 4815 [[package]]
4590 name = "windows_aarch64_msvc"
4591 version = "0.52.6"
4592 source = "registry+https://github.com/rust-lang/crates.io-index"
4593 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
4594
4595 [[package]]
4596 name = "windows_i686_gnu" 4816 name = "windows_i686_gnu"
4597 version = "0.48.5" 4817 version = "0.48.5"
4598 source = "registry+https://github.com/rust-lang/crates.io-index" 4818 source = "registry+https://github.com/rust-lang/crates.io-index"
4599 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4819 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
4600 4820
4601 [[package]] 4821 [[package]]
4602 name = "windows_i686_gnu"
4603 version = "0.52.6"
4604 source = "registry+https://github.com/rust-lang/crates.io-index"
4605 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
4606
4607 [[package]]
4608 name = "windows_i686_gnullvm"
4609 version = "0.52.6"
4610 source = "registry+https://github.com/rust-lang/crates.io-index"
4611 checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
4612
4613 [[package]]
4614 name = "windows_i686_msvc" 4822 name = "windows_i686_msvc"
4615 version = "0.48.5" 4823 version = "0.48.5"
4616 source = "registry+https://github.com/rust-lang/crates.io-index" 4824 source = "registry+https://github.com/rust-lang/crates.io-index"
4617 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4825 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
4618 4826
4619 [[package]] 4827 [[package]]
4620 name = "windows_i686_msvc"
4621 version = "0.52.6"
4622 source = "registry+https://github.com/rust-lang/crates.io-index"
4623 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
4624
4625 [[package]]
4626 name = "windows_x86_64_gnu" 4828 name = "windows_x86_64_gnu"
4627 version = "0.48.5" 4829 version = "0.48.5"
4628 source = "registry+https://github.com/rust-lang/crates.io-index" 4830 source = "registry+https://github.com/rust-lang/crates.io-index"
4629 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4831 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
4630 4832
4631 [[package]] 4833 [[package]]
4632 name = "windows_x86_64_gnu"
4633 version = "0.52.6"
4634 source = "registry+https://github.com/rust-lang/crates.io-index"
4635 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
4636
4637 [[package]]
4638 name = "windows_x86_64_gnullvm" 4834 name = "windows_x86_64_gnullvm"
4639 version = "0.48.5" 4835 version = "0.48.5"
4640 source = "registry+https://github.com/rust-lang/crates.io-index" 4836 source = "registry+https://github.com/rust-lang/crates.io-index"
4641 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4837 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
4642 4838
4643 [[package]] 4839 [[package]]
4644 name = "windows_x86_64_gnullvm"
4645 version = "0.52.6"
4646 source = "registry+https://github.com/rust-lang/crates.io-index"
4647 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
4648
4649 [[package]]
4650 name = "windows_x86_64_msvc" 4840 name = "windows_x86_64_msvc"
4651 version = "0.48.5" 4841 version = "0.48.5"
4652 source = "registry+https://github.com/rust-lang/crates.io-index" 4842 source = "registry+https://github.com/rust-lang/crates.io-index"
4653 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4843 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
4654 4844
4655 [[package]] 4845 [[package]]
4656 name = "windows_x86_64_msvc"
4657 version = "0.52.6"
4658 source = "registry+https://github.com/rust-lang/crates.io-index"
4659 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
4660
4661 [[package]]
4662 name = "winnow" 4846 name = "winnow"
4663 version = "0.7.15" 4847 version = "0.7.15"
4664 source = "registry+https://github.com/rust-lang/crates.io-index" 4848 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4765,6 +4949,17 @@ dependencies = [
4765 ] 4949 ]
4766 4950
4767 [[package]] 4951 [[package]]
4952 name = "wnaf"
4953 version = "0.14.0"
4954 source = "registry+https://github.com/rust-lang/crates.io-index"
4955 checksum = "ab12e7090f27e2ffd9322651492942d50c2926094af30601e1964337db39daf1"
4956 dependencies = [
4957 "ff",
4958 "group",
4959 "hybrid-array",
4960 ]
4961
4962 [[package]]
4768 name = "writeable" 4963 name = "writeable"
4769 version = "0.6.2" 4964 version = "0.6.2"
4770 source = "registry+https://github.com/rust-lang/crates.io-index" 4965 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4836,9 +5031,9 @@ dependencies = [
4836 5031
4837 [[package]] 5032 [[package]]
4838 name = "zeroize" 5033 name = "zeroize"
4839 version = "1.8.2" 5034 version = "1.9.0"
4840 source = "registry+https://github.com/rust-lang/crates.io-index" 5035 source = "registry+https://github.com/rust-lang/crates.io-index"
4841 checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 5036 checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
4842 5037
4843 [[package]] 5038 [[package]]
4844 name = "zerotrie" 5039 name = "zerotrie"
Cargo.toml
Old New
@@ -2,6 +2,12 @@
2 name = "git-collab" 2 name = "git-collab"
3 version = "0.1.0" 3 version = "0.1.0"
4 edition = "2021" 4 edition = "2021"
5 # Matches the Dockerfile's `rust:1.88-bookworm` pin. The tree's true ceiling is
6 # exactly 1.88.0 (from time, darling, askama and instability — all already at
7 # these versions before the russh upgrade, whose own crates need only 1.85), so
8 # there is no headroom: without this, a dependency bump that requires 1.89 would
9 # pass `cargo test` on a newer local toolchain and only fail in the deploy build.
10 rust-version = "1.88"
5 11
6 [[bin]] 12 [[bin]]
7 name = "git-collab" 13 name = "git-collab"
@@ -23,6 +29,7 @@ ratatui = "0.30.0"
23 crossterm = "0.29.0" 29 crossterm = "0.29.0"
24 ed25519-dalek = { version = "2", features = ["rand_core"] } 30 ed25519-dalek = { version = "2", features = ["rand_core"] }
25 rand_core = { version = "0.6", features = ["getrandom"] } 31 rand_core = { version = "0.6", features = ["getrandom"] }
32 zeroize = "1"
26 base64 = "0.22" 33 base64 = "0.22"
27 dirs = "5" 34 dirs = "5"
28 axum = "0.8" 35 axum = "0.8"
@@ -31,12 +38,10 @@ askama = "0.15"
31 askama_web = { version = "0.15", features = ["axum-0.8"] } 38 askama_web = { version = "0.15", features = ["axum-0.8"] }
32 pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] } 39 pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] }
33 ammonia = "4" 40 ammonia = "4"
34 russh = "0.46" 41 russh = "0.62"
35 russh-keys = "0.46"
36 toml_edit = { version = "0.22", features = ["serde"] } 42 toml_edit = { version = "0.22", features = ["serde"] }
37 tracing = "0.1" 43 tracing = "0.1"
38 tracing-subscriber = "0.3" 44 tracing-subscriber = "0.3"
39 async-trait = "0.1"
40 sha2 = "0.10" 45 sha2 = "0.10"
41 tempfile = "3" 46 tempfile = "3"
42 tokio-util = { version = "0.7", features = ["io"] } 47 tokio-util = { version = "0.7", features = ["io"] }
src/server/main.rs
Old New
@@ -44,19 +44,16 @@ async fn main() {
44 } 44 }
45 }; 45 };
46 46
47 let fingerprint = match host_key.clone_public_key() { 47 // Displays as `SHA256:<base64>` on its own.
48 Ok(pub_key) => pub_key.fingerprint(), 48 let fingerprint = host_key
49 Err(e) => { 49 .public_key()
50 eprintln!("Failed to get host key fingerprint: {}", e); 50 .fingerprint(russh::keys::HashAlg::Sha256);
51 std::process::exit(1);
52 }
53 };
54 51
55 info!("HTTP listening on {}", config.http_bind); 52 info!("HTTP listening on {}", config.http_bind);
56 info!("SSH listening on {}", config.ssh_bind); 53 info!("SSH listening on {}", config.ssh_bind);
57 info!("Repos dir: {:?}", config.repos_dir); 54 info!("Repos dir: {:?}", config.repos_dir);
58 info!("Site title: {}", config.site_title); 55 info!("Site title: {}", config.site_title);
59 info!("SSH host key fingerprint: SHA256:{}", fingerprint); 56 info!("SSH host key fingerprint: {}", fingerprint);
60 57
61 let app_state = http::AppState { 58 let app_state = http::AppState {
62 repos_dir: config.repos_dir.clone(), 59 repos_dir: config.repos_dir.clone(),
src/server/ssh/auth.rs
Old New
@@ -89,12 +89,30 @@ mod tests {
89 assert!(!is_authorized(&keys, "ssh-rsa", "AAAA1111")); 89 assert!(!is_authorized(&keys, "ssh-rsa", "AAAA1111"));
90 } 90 }
91 91
92 /// The RSA leniency exists because an authorized_keys entry and the
93 /// `key_type` the server derives from an offered key need not spell the
94 /// same algorithm. Which side needs the leniency depends on the ssh
95 /// library: russh 0.62 reports the *key's* algorithm, so an offered RSA
96 /// key always arrives as `ssh-rsa` and it is the `rsa-sha2-*` entries that
97 /// now match through the leniency (russh 0.46 reported the signature
98 /// algorithm, so it was the other way round). Both directions are covered
99 /// here so this keeps holding whichever way that reporting goes.
92 #[test] 100 #[test]
93 fn rsa_key_type_variants_match() { 101 fn rsa_key_type_variants_match() {
94 let keys = parse_authorized_keys("ssh-rsa AAAARSA user\n"); 102 // What the server actually produces today (`ssh-rsa`), against
95 assert!(is_authorized(&keys, "ssh-rsa", "AAAARSA")); 103 // entries written either way.
96 assert!(is_authorized(&keys, "rsa-sha2-256", "AAAARSA")); 104 let modern_entry = parse_authorized_keys("rsa-sha2-256 AAAARSA user\n");
97 assert!(is_authorized(&keys, "rsa-sha2-512", "AAAARSA")); 105 assert!(is_authorized(&modern_entry, "ssh-rsa", "AAAARSA"));
98 assert!(!is_authorized(&keys, "rsa-sha2-256", "WRONG")); 106 let legacy_entry = parse_authorized_keys("ssh-rsa AAAARSA user\n");
107 assert!(is_authorized(&legacy_entry, "ssh-rsa", "AAAARSA"));
108
109 // The reverse direction, which russh 0.46 exercised.
110 assert!(is_authorized(&legacy_entry, "rsa-sha2-256", "AAAARSA"));
111 assert!(is_authorized(&legacy_entry, "rsa-sha2-512", "AAAARSA"));
112
113 // Leniency is over the algorithm name only — never the key material.
114 assert!(!is_authorized(&legacy_entry, "rsa-sha2-256", "WRONG"));
115 assert!(!is_authorized(&modern_entry, "ssh-rsa", "WRONG"));
116 assert!(!is_authorized(&legacy_entry, "ssh-ed25519", "AAAARSA"));
99 } 117 }
100 } 118 }
src/server/ssh/mod.rs
Old New
@@ -5,22 +5,47 @@ use std::net::SocketAddr;
5 use std::path::Path; 5 use std::path::Path;
6 use std::sync::Arc; 6 use std::sync::Arc;
7 7
8 use async_trait::async_trait; 8 use russh::keys::ssh_key::private::{Ed25519Keypair, KeypairData};
9 use russh::keys::PrivateKey;
9 use russh::server::Server as _; 10 use russh::server::Server as _;
10 use russh_keys::key::KeyPair;
11 use tracing::{error, info}; 11 use tracing::{error, info};
12 use zeroize::Zeroizing;
12 13
13 use session::{SshHandler, SshServerConfig}; 14 use session::{SshHandler, SshServerConfig};
14 15
16 /// Generate an ed25519 host key.
17 ///
18 /// Seeded from the OS RNG via this crate's `rand_core`, rather than
19 /// `PrivateKey::random`, which wants a `rand_core` 0.10 generator that nothing
20 /// else here depends on. An ed25519 private key *is* its 32-byte seed, so this
21 /// builds the same key the library would from the same entropy.
22 ///
23 /// `try_fill_bytes` rather than `fill_bytes`: a failing OS RNG should surface
24 /// as a startup error, not a panic. The seed is held in `Zeroizing` because
25 /// `ssh-key` wipes its own copy on drop, and leaving ours on the stack would
26 /// defeat that.
27 fn generate_ed25519_key() -> Result<PrivateKey, Box<dyn std::error::Error>> {
28 use rand_core::RngCore;
29
30 let mut seed = Zeroizing::new([0u8; 32]);
31 rand_core::OsRng
32 .try_fill_bytes(seed.as_mut())
33 .map_err(|e| format!("failed to read {} bytes from the OS RNG: {e}", seed.len()))?;
34 let keypair = Ed25519Keypair::from_seed(&seed);
35 Ok(PrivateKey::new(KeypairData::from(keypair), "git-collab")?)
36 }
37
15 /// Load an ed25519 host key from disk, or generate a new one if not found. 38 /// Load an ed25519 host key from disk, or generate a new one if not found.
16 pub fn load_or_generate_host_key(key_path: &Path) -> Result<KeyPair, Box<dyn std::error::Error>> { 39 pub fn load_or_generate_host_key(
40 key_path: &Path,
41 ) -> Result<PrivateKey, Box<dyn std::error::Error>> {
17 if key_path.exists() { 42 if key_path.exists() {
18 info!("Loading SSH host key from {:?}", key_path); 43 info!("Loading SSH host key from {:?}", key_path);
19 let key = russh_keys::load_secret_key(key_path, None)?; 44 let key = russh::keys::load_secret_key(key_path, None)?;
20 Ok(key) 45 Ok(key)
21 } else { 46 } else {
22 info!("Generating new SSH host key at {:?}", key_path); 47 info!("Generating new SSH host key at {:?}", key_path);
23 let key = KeyPair::generate_ed25519(); 48 let key = generate_ed25519_key()?;
24 // Ensure parent directory exists 49 // Ensure parent directory exists
25 if let Some(parent) = key_path.parent() { 50 if let Some(parent) = key_path.parent() {
26 std::fs::create_dir_all(parent)?; 51 std::fs::create_dir_all(parent)?;
@@ -32,7 +57,7 @@ pub fn load_or_generate_host_key(key_path: &Path) -> Result<KeyPair, Box<dyn std
32 use std::os::unix::fs::PermissionsExt; 57 use std::os::unix::fs::PermissionsExt;
33 std::fs::set_permissions(key_path, std::fs::Permissions::from_mode(0o600))?; 58 std::fs::set_permissions(key_path, std::fs::Permissions::from_mode(0o600))?;
34 } 59 }
35 russh_keys::encode_pkcs8_pem(&key, file)?; 60 russh::keys::encode_pkcs8_pem(&key, file)?;
36 Ok(key) 61 Ok(key)
37 } 62 }
38 } 63 }
@@ -42,7 +67,6 @@ struct CollabSshServer {
42 config: Arc<SshServerConfig>, 67 config: Arc<SshServerConfig>,
43 } 68 }
44 69
45 #[async_trait]
46 impl russh::server::Server for CollabSshServer { 70 impl russh::server::Server for CollabSshServer {
47 type Handler = SshHandler; 71 type Handler = SshHandler;
48 72
@@ -55,12 +79,16 @@ impl russh::server::Server for CollabSshServer {
55 /// Start the SSH server on the given bind address. 79 /// Start the SSH server on the given bind address.
56 pub async fn serve( 80 pub async fn serve(
57 bind_addr: SocketAddr, 81 bind_addr: SocketAddr,
58 host_key: KeyPair, 82 host_key: PrivateKey,
59 ssh_config: SshServerConfig, 83 ssh_config: SshServerConfig,
60 ) -> Result<(), std::io::Error> { 84 ) -> Result<(), std::io::Error> {
85 // Kex is left at russh's default `Preferred`, whose order already starts
86 // with the post-quantum `mlkem768x25519-sha256` and keeps curve25519 and
87 // the DH groups behind it for older clients. Naming the list explicitly
88 // here would only freeze it at today's algorithms.
61 let russh_config = russh::server::Config { 89 let russh_config = russh::server::Config {
62 keys: vec![host_key], 90 keys: vec![host_key],
63 methods: russh::MethodSet::PUBLICKEY, 91 methods: russh::MethodSet::from(&[russh::MethodKind::PublicKey][..]),
64 ..Default::default() 92 ..Default::default()
65 }; 93 };
66 94
src/server/ssh/session.rs
Old New
@@ -1,11 +1,9 @@
1 use std::path::{Path, PathBuf}; 1 use std::path::{Path, PathBuf};
2 use std::sync::Arc; 2 use std::sync::Arc;
3 3
4 use async_trait::async_trait; 4 use russh::keys::{HashAlg, PublicKey, PublicKeyBase64};
5 use russh::server::{Auth, Handler, Msg, Session}; 5 use russh::server::{Auth, ChannelOpenHandle, Handler, Msg, Session};
6 use russh::{Channel, ChannelId, CryptoVec}; 6 use russh::{Channel, ChannelId};
7 use russh_keys::key::PublicKey;
8 use russh_keys::PublicKeyBase64;
9 use tokio::process::Command; 7 use tokio::process::Command;
10 use tokio::sync::mpsc; 8 use tokio::sync::mpsc;
11 use tracing::{debug, error, info, warn}; 9 use tracing::{debug, error, info, warn};
@@ -77,7 +75,7 @@ impl SshHandler {
77 rel: ReleaseCmd, 75 rel: ReleaseCmd,
78 resolved_path: &Path, 76 resolved_path: &Path,
79 principal: &str, 77 principal: &str,
80 ) { 78 ) -> Result<(), russh::Error> {
81 // Unknown repo and unauthorized repo get the SAME reply, so the error 79 // Unknown repo and unauthorized repo get the SAME reply, so the error
82 // can't be used to probe which private repos exist. This mirrors the 80 // can't be used to probe which private repos exist. This mirrors the
83 // deliberate 404-collapsing in the HTTP layer (see git_http.rs). 81 // deliberate 404-collapsing in the HTTP layer (see git_http.rs).
@@ -88,8 +86,7 @@ impl SshHandler {
88 Some(entry) => entry, 86 Some(entry) => entry,
89 None => { 87 None => {
90 warn!("Rejected release command: unknown repo {:?}", resolved_path); 88 warn!("Rejected release command: unknown repo {:?}", resolved_path);
91 reply_and_close(session, channel, NOT_FOUND, 1); 89 return reply_and_close(session, channel, NOT_FOUND, 1);
92 return;
93 } 90 }
94 }; 91 };
95 92
@@ -104,8 +101,7 @@ impl SshHandler {
104 "Rejected release command: principal {} not authorized on {:?}", 101 "Rejected release command: principal {} not authorized on {:?}",
105 principal, resolved_path 102 principal, resolved_path
106 ); 103 );
107 reply_and_close(session, channel, NOT_FOUND, 1); 104 return reply_and_close(session, channel, NOT_FOUND, 1);
108 return;
109 } 105 }
110 106
111 let dir = crate::releases::releases_dir(&entry); 107 let dir = crate::releases::releases_dir(&entry);
@@ -121,13 +117,12 @@ impl SshHandler {
121 // channel waiting for a reply that never comes. 117 // channel waiting for a reply that never comes.
122 if self.active_upload.is_some() { 118 if self.active_upload.is_some() {
123 warn!("Rejected release upload: another upload is already in progress"); 119 warn!("Rejected release upload: another upload is already in progress");
124 reply_and_close( 120 return reply_and_close(
125 session, 121 session,
126 channel, 122 channel,
127 "error: another upload is already in progress on this connection\n", 123 "error: another upload is already in progress on this connection\n",
128 1, 124 1,
129 ); 125 );
130 return;
131 } 126 }
132 match crate::releases::ReleaseUpload::begin( 127 match crate::releases::ReleaseUpload::begin(
133 &dir, 128 &dir,
@@ -142,10 +137,9 @@ impl SshHandler {
142 state: UploadState::Active(Box::new(upload)), 137 state: UploadState::Active(Box::new(upload)),
143 }); 138 });
144 // Reply comes on channel EOF, once all bytes arrive. 139 // Reply comes on channel EOF, once all bytes arrive.
140 Ok(())
145 } 141 }
146 Err(e) => { 142 Err(e) => reply_and_close(session, channel, &format!("error: {}\n", e), 1),
147 reply_and_close(session, channel, &format!("error: {}\n", e), 1);
148 }
149 } 143 }
150 } 144 }
151 ReleaseCmd::List { .. } => match crate::releases::list_releases(&dir) { 145 ReleaseCmd::List { .. } => match crate::releases::list_releases(&dir) {
@@ -155,29 +149,27 @@ impl SshHandler {
155 // Never answer a list with a silent empty index: that 149 // Never answer a list with a silent empty index: that
156 // would look like "no releases" to the client. 150 // would look like "no releases" to the client.
157 error!("Failed to serialize release index for {:?}: {}", dir, e); 151 error!("Failed to serialize release index for {:?}: {}", dir, e);
158 reply_and_close(session, channel, "error: failed to encode index\n", 1); 152 reply_and_close(session, channel, "error: failed to encode index\n", 1)
159 } 153 }
160 }, 154 },
161 Err(e) => { 155 Err(e) => reply_and_close(session, channel, &format!("error: {}\n", e), 1),
162 reply_and_close(session, channel, &format!("error: {}\n", e), 1);
163 }
164 }, 156 },
165 ReleaseCmd::Delete { 157 ReleaseCmd::Delete {
166 version, filename, .. 158 version, filename, ..
167 } => match crate::releases::delete_release(&dir, &version, filename.as_deref()) { 159 } => match crate::releases::delete_release(&dir, &version, filename.as_deref()) {
168 Ok(()) => { 160 Ok(()) => reply_and_close(session, channel, "deleted\n", 0),
169 reply_and_close(session, channel, "deleted\n", 0); 161 Err(e) => reply_and_close(session, channel, &format!("error: {}\n", e), 1),
170 }
171 Err(e) => {
172 reply_and_close(session, channel, &format!("error: {}\n", e), 1);
173 }
174 }, 162 },
175 } 163 }
176 } 164 }
177 } 165 }
178 166
167 /// The principal string recorded in repo policies, e.g.
168 /// `key:SHA256:<unpadded-base64>`. `Fingerprint`'s `Display` supplies the
169 /// `SHA256:` prefix itself, so this must not add one — the format is persisted
170 /// in existing repo configs and has to keep matching them byte for byte.
179 fn ssh_key_principal(public_key: &PublicKey) -> String { 171 fn ssh_key_principal(public_key: &PublicKey) -> String {
180 format!("key:SHA256:{}", public_key.fingerprint()) 172 format!("key:{}", public_key.fingerprint(HashAlg::Sha256))
181 } 173 }
182 174
183 /// Parse a git command string like `git-upload-pack '/path/to/repo.git'`. 175 /// Parse a git command string like `git-upload-pack '/path/to/repo.git'`.
@@ -413,7 +405,6 @@ fn ensure_repo_exists_for_command(git_cmd: GitCmd, repo_path: &Path) -> Result<b
413 Ok(true) 405 Ok(true)
414 } 406 }
415 407
416 #[async_trait]
417 impl Handler for SshHandler { 408 impl Handler for SshHandler {
418 type Error = russh::Error; 409 type Error = russh::Error;
419 410
@@ -427,13 +418,12 @@ impl Handler for SshHandler {
427 Ok(keys) => keys, 418 Ok(keys) => keys,
428 Err(e) => { 419 Err(e) => {
429 warn!("Failed to load authorized keys: {}", e); 420 warn!("Failed to load authorized keys: {}", e);
430 return Ok(Auth::Reject { 421 return Ok(Auth::reject());
431 proceed_with_methods: None,
432 });
433 } 422 }
434 }; 423 };
435 424
436 let key_type = public_key.name(); 425 let algorithm = public_key.algorithm();
426 let key_type = algorithm.as_str();
437 let key_data = public_key.public_key_base64(); 427 let key_data = public_key.public_key_base64();
438 let principal = ssh_key_principal(public_key); 428 let principal = ssh_key_principal(public_key);
439 429
@@ -446,24 +436,26 @@ impl Handler for SshHandler {
446 Ok(Auth::Accept) 436 Ok(Auth::Accept)
447 } else { 437 } else {
448 debug!("Public key auth rejected for key type {}", key_type); 438 debug!("Public key auth rejected for key type {}", key_type);
449 Ok(Auth::Reject { 439 Ok(Auth::reject())
450 proceed_with_methods: None,
451 })
452 } 440 }
453 } 441 }
454 442
455 async fn channel_open_session( 443 async fn channel_open_session(
456 &mut self, 444 &mut self,
457 channel: Channel<Msg>, 445 channel: Channel<Msg>,
446 reply: ChannelOpenHandle,
458 _session: &mut Session, 447 _session: &mut Session,
459 ) -> Result<bool, Self::Error> { 448 ) -> Result<(), Self::Error> {
460 if self.authenticated_principal.is_some() { 449 if self.authenticated_principal.is_some() {
461 debug!("Session channel opened: {:?}", channel.id()); 450 debug!("Session channel opened: {:?}", channel.id());
462 Ok(true) 451 reply.accept().await;
463 } else { 452 } else {
464 warn!("Rejected channel open: not authenticated"); 453 warn!("Rejected channel open: not authenticated");
465 Ok(false) 454 reply
455 .reject(russh::ChannelOpenFailure::AdministrativelyProhibited)
456 .await;
466 } 457 }
458 Ok(())
467 } 459 }
468 460
469 async fn exec_request( 461 async fn exec_request(
@@ -472,11 +464,23 @@ impl Handler for SshHandler {
472 data: &[u8], 464 data: &[u8],
473 session: &mut Session, 465 session: &mut Session,
474 ) -> Result<(), Self::Error> { 466 ) -> Result<(), Self::Error> {
467 // russh never answers an exec request for us — not in 0.62, and not in
468 // 0.46 either, where this call was simply missing. We reply SUCCESS
469 // unconditionally, as sshd does: what the reply reports is whether the
470 // *request* was accepted, not whether the command succeeded. The real
471 // outcome rides on exit-status, so replying `channel_failure` on a
472 // rejected command would make ssh exit 255 with "exec request failed"
473 // and hide those exit codes.
474 //
475 // russh drops the packet when the client set `want_reply = false` (it
476 // gates on `channel.wants_reply`), so this is safe to call blindly.
477 session.channel_success(channel)?;
478
475 let command_str = match std::str::from_utf8(data) { 479 let command_str = match std::str::from_utf8(data) {
476 Ok(s) => s, 480 Ok(s) => s,
477 Err(_) => { 481 Err(_) => {
478 warn!("Received non-UTF8 exec request"); 482 warn!("Received non-UTF8 exec request");
479 session.close(channel); 483 session.close(channel)?;
480 return Ok(()); 484 return Ok(());
481 } 485 }
482 }; 486 };
@@ -487,8 +491,7 @@ impl Handler for SshHandler {
487 Some(c) => c, 491 Some(c) => c,
488 None => { 492 None => {
489 warn!("Rejected exec request: not an allowed command"); 493 warn!("Rejected exec request: not an allowed command");
490 reply_and_close(session, channel, "", 1); 494 return reply_and_close(session, channel, "", 1);
491 return Ok(());
492 } 495 }
493 }; 496 };
494 497
@@ -496,8 +499,7 @@ impl Handler for SshHandler {
496 Some(principal) => principal, 499 Some(principal) => principal,
497 None => { 500 None => {
498 warn!("Rejected exec request: not authenticated"); 501 warn!("Rejected exec request: not authenticated");
499 reply_and_close(session, channel, "", 1); 502 return reply_and_close(session, channel, "", 1);
500 return Ok(());
501 } 503 }
502 }; 504 };
503 505
@@ -505,16 +507,20 @@ impl Handler for SshHandler {
505 Some(p) => p, 507 Some(p) => p,
506 None => { 508 None => {
507 warn!("Rejected exec request: path traversal detected"); 509 warn!("Rejected exec request: path traversal detected");
508 reply_and_close(session, channel, "error: invalid repo path\n", 1); 510 return reply_and_close(session, channel, "error: invalid repo path\n", 1);
509 return Ok(());
510 } 511 }
511 }; 512 };
512 513
513 let git_cmd = match exec_cmd { 514 let git_cmd = match exec_cmd {
514 ExecCommand::Git { cmd, .. } => cmd, 515 ExecCommand::Git { cmd, .. } => cmd,
515 ExecCommand::Release(rel) => { 516 ExecCommand::Release(rel) => {
516 self.handle_release_command(channel, session, rel, &resolved_path, &principal); 517 return self.handle_release_command(
517 return Ok(()); 518 channel,
519 session,
520 rel,
521 &resolved_path,
522 &principal,
523 );
518 } 524 }
519 }; 525 };
520 526
@@ -526,8 +532,7 @@ impl Handler for SshHandler {
526 "Rejected exec request: path is not a git repo: {:?}", 532 "Rejected exec request: path is not a git repo: {:?}",
527 resolved_path 533 resolved_path
528 ); 534 );
529 reply_and_close(session, channel, "", 1); 535 return reply_and_close(session, channel, "", 1);
530 return Ok(());
531 } 536 }
532 }; 537 };
533 538
@@ -543,8 +548,7 @@ impl Handler for SshHandler {
543 git_cmd.as_str(), 548 git_cmd.as_str(),
544 resolved_path 549 resolved_path
545 ); 550 );
546 reply_and_close(session, channel, "", 1); 551 return reply_and_close(session, channel, "", 1);
547 return Ok(());
548 } 552 }
549 } else { 553 } else {
550 match ensure_repo_exists_for_command(git_cmd, &resolved_path) { 554 match ensure_repo_exists_for_command(git_cmd, &resolved_path) {
@@ -556,13 +560,11 @@ impl Handler for SshHandler {
556 "Rejected exec request: repo path does not exist: {:?}", 560 "Rejected exec request: repo path does not exist: {:?}",
557 resolved_path 561 resolved_path
558 ); 562 );
559 reply_and_close(session, channel, "", 1); 563 return reply_and_close(session, channel, "", 1);
560 return Ok(());
561 } 564 }
562 Err(e) => { 565 Err(e) => {
563 error!("Failed to create repo {:?}: {}", resolved_path, e); 566 error!("Failed to create repo {:?}: {}", resolved_path, e);
564 reply_and_close(session, channel, "", 1); 567 return reply_and_close(session, channel, "", 1);
565 return Ok(());
566 } 568 }
567 } 569 }
568 } 570 }
@@ -610,7 +612,7 @@ impl Handler for SshHandler {
610 if let UploadState::Failed(msg) = &upload.state { 612 if let UploadState::Failed(msg) = &upload.state {
611 let msg = format!("error: {}\n", msg); 613 let msg = format!("error: {}\n", msg);
612 self.active_upload = None; 614 self.active_upload = None;
613 reply_and_close(session, channel, &msg, 1); 615 reply_and_close(session, channel, &msg, 1)?;
614 } 616 }
615 return Ok(()); 617 return Ok(());
616 } 618 }
@@ -643,11 +645,11 @@ impl Handler for SshHandler {
643 } 645 }
644 match upload.state { 646 match upload.state {
645 UploadState::Active(active) => match active.finish() { 647 UploadState::Active(active) => match active.finish() {
646 Ok(sha) => reply_and_close(session, channel, &format!("ok {}\n", sha), 0), 648 Ok(sha) => reply_and_close(session, channel, &format!("ok {}\n", sha), 0)?,
647 Err(e) => reply_and_close(session, channel, &format!("error: {}\n", e), 1), 649 Err(e) => reply_and_close(session, channel, &format!("error: {}\n", e), 1)?,
648 }, 650 },
649 UploadState::Failed(msg) => { 651 UploadState::Failed(msg) => {
650 reply_and_close(session, channel, &format!("error: {}\n", msg), 1) 652 reply_and_close(session, channel, &format!("error: {}\n", msg), 1)?
651 } 653 }
652 } 654 }
653 } 655 }
@@ -679,13 +681,19 @@ impl Handler for SshHandler {
679 } 681 }
680 682
681 /// Send a final message (if any), an exit status, and close the channel. 683 /// Send a final message (if any), an exit status, and close the channel.
682 fn reply_and_close(session: &mut Session, channel: ChannelId, message: &str, exit_code: u32) { 684 fn reply_and_close(
685 session: &mut Session,
686 channel: ChannelId,
687 message: &str,
688 exit_code: u32,
689 ) -> Result<(), russh::Error> {
683 if !message.is_empty() { 690 if !message.is_empty() {
684 session.data(channel, CryptoVec::from_slice(message.as_bytes())); 691 session.data(channel, message.as_bytes().to_vec())?;
685 } 692 }
686 session.exit_status_request(channel, exit_code); 693 session.exit_status_request(channel, exit_code)?;
687 session.eof(channel); 694 session.eof(channel)?;
688 session.close(channel); 695 session.close(channel)?;
696 Ok(())
689 } 697 }
690 698
691 async fn run_git_command( 699 async fn run_git_command(
@@ -725,8 +733,7 @@ async fn run_git_command(
725 if n == 0 { 733 if n == 0 {
726 break; 734 break;
727 } 735 }
728 let data = CryptoVec::from_slice(&buf[..n]); 736 if handle.data(channel, buf[..n].to_vec()).await.is_err() {
729 if handle.data(channel, data).await.is_err() {
730 warn!("Failed to send data to SSH channel"); 737 warn!("Failed to send data to SSH channel");
731 break; 738 break;
732 } 739 }
@@ -747,6 +754,38 @@ mod tests {
747 use super::*; 754 use super::*;
748 use tempfile::TempDir; 755 use tempfile::TempDir;
749 756
757 /// The principal string is a COMPATIBILITY CONTRACT, not an implementation
758 /// detail: it is persisted verbatim in repo access lists, so a change to
759 /// its format silently stops matching every entry ever written — with no
760 /// other test failing, because nothing else asserts on the literal text.
761 ///
762 /// The expected value is deliberately NOT computed the way the code
763 /// computes it. It is OpenSSH's own answer, obtained out-of-band with:
764 ///
765 /// ssh-keygen -lf <the .pub file below>
766 /// 256 SHA256:Gzb/mmBlyDmoWq3hMyPjb3SRWklPJ/yDAoD1K+ATvJA ... (ED25519)
767 ///
768 /// so this asserts agreement with an external oracle rather than
769 /// self-consistency — a literal blessed by the code it polices would only
770 /// prove the value stopped changing, not that it was ever right. It is
771 /// also the same command operators run to produce the strings they paste
772 /// into those access lists.
773 ///
774 /// The key below is a throwaway PUBLIC key generated solely for this test.
775 /// It guards nothing and has no matching private key in the repo.
776 #[test]
777 fn principal_format_matches_ssh_keygen() {
778 let pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEAGmBs3Zjby+ykw7iJg0ZoAWunNKoMYMOPcUOk+qAjM principal-format-test@git-collab";
779 let key = PublicKey::from_openssh(pubkey).unwrap();
780
781 assert_eq!(
782 ssh_key_principal(&key),
783 "key:SHA256:Gzb/mmBlyDmoWq3hMyPjb3SRWklPJ/yDAoD1K+ATvJA",
784 "principal format changed — this string is persisted in repo \
785 access lists, so changing it invalidates every existing entry"
786 );
787 }
788
750 #[test] 789 #[test]
751 fn parse_upload_pack() { 790 fn parse_upload_pack() {
752 let result = parse_git_command("git-upload-pack '/srv/git/repo.git'"); 791 let result = parse_git_command("git-upload-pack '/srv/git/repo.git'");