Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
1) # SPDX-FileCopyrightText: 2024 Marco Ricci <m@the13thletter.info>
2) #
3) # SPDX-License-Identifier: MIT
4)
5) """Test OpenSSH key loading and signing."""
6)
7) import pytest
8)
9) import derivepassphrase
10) import ssh_agent_client
11)
12) import base64
13) import os
14) import socket
15) import subprocess
16)
17) SUPPORTED = {
18) 'ed25519': {
19) 'private_key': rb'''-----BEGIN OPENSSH PRIVATE KEY-----
20) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
21) QyNTUxOQAAACCBeIFoJtYCSF8P/zJIb+TBMIncHGpFBgnpCQ/7whJpdgAAAKDweO7H8Hju
22) xwAAAAtzc2gtZWQyNTUxOQAAACCBeIFoJtYCSF8P/zJIb+TBMIncHGpFBgnpCQ/7whJpdg
23) AAAEAbM/A869nkWZbe2tp3Dm/L6gitvmpH/aRZt8sBII3ExYF4gWgm1gJIXw//Mkhv5MEw
24) idwcakUGCekJD/vCEml2AAAAG3Rlc3Qga2V5IHdpdGhvdXQgcGFzc3BocmFzZQEC
25) -----END OPENSSH PRIVATE KEY-----
26) ''',
27) 'public_key': rb'''ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIF4gWgm1gJIXw//Mkhv5MEwidwcakUGCekJD/vCEml2 test key without passphrase
28) ''',
29) 'public_key_data': bytes.fromhex('''
30) 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
31) 00 00 00 20
32) 81 78 81 68 26 d6 02 48 5f 0f ff 32 48 6f e4 c1
33) 30 89 dc 1c 6a 45 06 09 e9 09 0f fb c2 12 69 76
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
34) '''),
35) 'expected_signature': bytes.fromhex('''
36) 00 00 00 0b 73 73 68 2d 65 64 32 35 35 31 39
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
37) 00 00 00 40
38) f0 98 19 80 6c 1a 97 d5 26 03 6e cc e3 65 8f 86
39) 66 07 13 19 13 09 21 33 33 f9 e4 36 53 1d af fd
40) 0d 08 1f ec f8 73 9b 8c 5f 55 39 16 7c 53 54 2c
41) 1e 52 bb 30 ed 7f 89 e2 2f 69 51 55 d8 9e a6 02
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
42) '''),
|
Fix passphrase-from-SSH-sig...
Marco Ricci authored 2 months ago
|
43) 'derived_passphrase': rb'8JgZgGwal9UmA27M42WPhmYHExkTCSEzM/nkNlMdr/0NCB/s+HObjF9VORZ8U1QsHlK7MO1/ieIvaVFV2J6mAg==',
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
44) },
45) # Currently only supported by PuTTY (which is deficient in other
46) # niceties of the SSH agent and the agent's client).
47) 'ed448': {
48) 'private_key': rb'''-----BEGIN OPENSSH PRIVATE KEY-----
49) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAASgAAAAlz
50) c2gtZWQ0NDgAAAA54vZy009Wu8wExjvEb3hqtLz1GO/+d5vmGUbErWQ4AUO9mYLT
51) zHJHc2m4s+yWzP29Cc3EcxizLG8AAAAA8BdhfCcXYXwnAAAACXNzaC1lZDQ0OAAA
52) ADni9nLTT1a7zATGO8RveGq0vPUY7/53m+YZRsStZDgBQ72ZgtPMckdzabiz7JbM
53) /b0JzcRzGLMsbwAAAAByM7GIMRvWJB3YD6SIpAF2uudX4ozZe0X917wPwiBrs373
54) 9TM1n94Nib6hrxGNmCk2iBQDe2KALPgA4vZy009Wu8wExjvEb3hqtLz1GO/+d5vm
55) GUbErWQ4AUO9mYLTzHJHc2m4s+yWzP29Cc3EcxizLG8AAAAAG3Rlc3Qga2V5IHdp
56) dGhvdXQgcGFzc3BocmFzZQECAwQFBgcICQ==
57) -----END OPENSSH PRIVATE KEY-----
58) ''',
59) 'public_key': rb'''ssh-ed448 AAAACXNzaC1lZDQ0OAAAADni9nLTT1a7zATGO8RveGq0vPUY7/53m+YZRsStZDgBQ72ZgtPMckdzabiz7JbM/b0JzcRzGLMsbwA= test key without passphrase
60) ''',
61) 'public_key_data': bytes.fromhex('''
62) 00 00 00 09 73 73 68 2d 65 64 34 34 38
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
63) 00 00 00 39
64) e2 f6 72 d3 4f 56 bb cc 04 c6 3b c4 6f 78 6a b4
65) bc f5 18 ef fe 77 9b e6 19 46 c4 ad 64 38 01 43
66) bd 99 82 d3 cc 72 47 73 69 b8 b3 ec 96 cc fd bd
67) 09 cd c4 73 18 b3 2c 6f 00
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
68) '''),
69)
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
70) 'expected_signature': bytes.fromhex('''
71) 00 00 00 09 73 73 68 2d 65 64 34 34 38
72) 00 00 00 72 06 86
73) f4 64 a4 a6 ba d9 c3 22 c4 93 49 99 fc 11 de 67
74) 97 08 f2 d8 b7 3c 2c 13 e7 c5 1c 1e 92 a6 0e d8
75) 2f 6d 81 03 82 00 e3 72 e4 32 6d 72 d2 6d 32 84
76) 3f cc a9 1e 57 2c 00 9a b3 99 de 45 da ce 2e d1
77) db e5 89 f3 35 be 24 58 90 c6 ca 04 f0 db 88 80
78) db bd 77 7c 80 20 7f 3a 48 61 f6 1f ae a9 5e 53
79) 7b e0 9d 93 1e ea dc eb b5 cd 56 4c ea 8f 08 00
80) '''),
|
Fix passphrase-from-SSH-sig...
Marco Ricci authored 2 months ago
|
81) 'derived_passphrase': rb'Bob0ZKSmutnDIsSTSZn8Ed5nlwjy2Lc8LBPnxRwekqYO2C9tgQOCAONy5DJtctJtMoQ/zKkeVywAmrOZ3kXazi7R2+WJ8zW+JFiQxsoE8NuIgNu9d3yAIH86SGH2H66pXlN74J2THurc67XNVkzqjwgA',
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
82) },
83) 'rsa': {
84) 'private_key': rb'''-----BEGIN OPENSSH PRIVATE KEY-----
85) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
86) NhAAAAAwEAAQAAAYEAsaHu6Xs4cVsuDSNJlMCqoPVgmDgEviI8TfXmHKqX3JkIqI3LsvV7
87) Ijf8WCdTveEq7CkuZhImtsR52AOEVAoU8mDXDNr+nJ5wUPzf1UIaRjDe0lcXW4SlF01hQs
88) G4wYDuqxshwelraB/L3e0zhD7fjYHF8IbFsqGlFHWEwOtlfhhfbxJsTGguLm4A8/gdEJD5
89) 2rkqDcZpIXCHtJbCzW9aQpWcs/PDw5ylwl/3dB7jfxyfrGz4O3QrzsqhWEsip97mOmwl6q
90) CHbq8V8x9zu89D/H+bG5ijqxhijbjcVUW3lZfw/97gy9J6rG31HNar5H8GycLTFwuCFepD
91) mTEpNgQLKoe8ePIEPq4WHhFUovBdwlrOByUKKqxreyvWt5gkpTARz+9Lt8OjBO3rpqK8sZ
92) VKH3sE3de2RJM3V9PJdmZSs2b8EFK3PsUGdlMPM9pn1uk4uIItKWBmooOynuD8Ll6aPwuW
93) AFn3l8nLLyWdrmmEYzHWXiRjQJxy1Bi5AbHMOWiPAAAFkDPkuBkz5LgZAAAAB3NzaC1yc2
94) EAAAGBALGh7ul7OHFbLg0jSZTAqqD1YJg4BL4iPE315hyql9yZCKiNy7L1eyI3/FgnU73h
95) KuwpLmYSJrbEedgDhFQKFPJg1wza/pyecFD839VCGkYw3tJXF1uEpRdNYULBuMGA7qsbIc
96) Hpa2gfy93tM4Q+342BxfCGxbKhpRR1hMDrZX4YX28SbExoLi5uAPP4HRCQ+dq5Kg3GaSFw
97) h7SWws1vWkKVnLPzw8OcpcJf93Qe438cn6xs+Dt0K87KoVhLIqfe5jpsJeqgh26vFfMfc7
98) vPQ/x/mxuYo6sYYo243FVFt5WX8P/e4MvSeqxt9RzWq+R/BsnC0xcLghXqQ5kxKTYECyqH
99) vHjyBD6uFh4RVKLwXcJazgclCiqsa3sr1reYJKUwEc/vS7fDowTt66aivLGVSh97BN3Xtk
100) STN1fTyXZmUrNm/BBStz7FBnZTDzPaZ9bpOLiCLSlgZqKDsp7g/C5emj8LlgBZ95fJyy8l
101) na5phGMx1l4kY0CcctQYuQGxzDlojwAAAAMBAAEAAAF/cNVYT+Om4x9+SItcz5bOByGIOj
102) yWUH8f9rRjnr5ILuwabIDgvFaVG+xM1O1hWADqzMnSEcknHRkTYEsqYPykAtxFvjOFEh70
103) 6qRUJ+fVZkqRGEaI3oWyWKTOhcCIYImtONvb0LOv/HQ2H2AXCoeqjST1qr/xSuljBtcB8u
104) wxs3EqaO1yU7QoZpDcMX9plH7Rmc9nNfZcgrnktPk2deX2+Y/A5tzdVgG1IeqYp6CBMLNM
105) uhL0OPdDehgBoDujx+rhkZ1gpo1wcULIM94NL7VSHBPX0Lgh9T+3j1HVP+YnMAvhfOvfct
106) LlbJ06+TYGRAMuF2LPCAZM/m0FEyAurRgWxAjLXm+4kp2GAJXlw82deDkQ+P8cHNT6s9ZH
107) R5YSy3lpZ35594ZMOLR8KqVvhgJGF6i9019BiF91SDxjE+sp6dNGfN8W+64tHdDv2a0Mso
108) +8Qjyx7sTpi++EjLU8Iy73/e4B8qbXMyheyA/UUfgMtNKShh6sLlrD9h2Sm9RFTuEAAADA
109) Jh3u7WfnjhhKZYbAW4TsPNXDMrB0/t7xyAQgFmko7JfESyrJSLg1cO+QMOiDgD7zuQ9RSp
110) NIKdPsnIna5peh979mVjb2HgnikjyJECmBpLdwZKhX7MnIvgKw5lnQXHboEtWCa1N58l7f
111) srzwbi9pFUuUp9dShXNffmlUCjDRsVLbK5C6+iaIQyCWFYK8mc6dpNkIoPKf+Xg+EJCIFQ
112) oITqeu30Gc1+M+fdZc2ghq0b6XLthh/uHEry8b68M5KglMAAAAwQDw1i+IdcvPV/3u/q9O
113) /kzLpKO3tbT89sc1zhjZsDNjDAGluNr6n38iq/XYRZu7UTL9BG+EgFVfIUV7XsYT5e+BPf
114) 13VS94rzZ7maCsOlULX+VdMO2zBucHIoec9RUlRZrfB21B2W7YGMhbpoa5lN3lKJQ7afHo
115) dXZUMp0cTFbOmbzJgSzO2/NE7BhVwmvcUzTDJGMMKuxBO6w99YKDKRKm0PNLFDz26rWm9L
116) dNS2MVfVuPMTpzT26HQG4pFageq9cAAADBALzRBXdZF8kbSBa5MTUBVTTzgKQm1C772gJ8
117) T01DJEXZsVtOv7mUC1/m/by6Hk4tPyvDBuGj9hHq4N7dPqGutHb1q5n0ADuoQjRW7BXw5Q
118) vC2EAD91xexdorIA5BgXU+qltBqzzBVzVtF7+jOZOjfzOlaTX9I5I5veyeTaTxZj1XXUzi
119) btBNdMEJJp7ifucYmoYAAwE7K+VlWagDEK2y8Mte9y9E+N0uO2j+h85sQt/UIb2iE/vhcg
120) Bgp6142WnSCQAAABt0ZXN0IGtleSB3aXRob3V0IHBhc3NwaHJhc2UB
121) -----END OPENSSH PRIVATE KEY-----
122) ''',
123) 'public_key': rb'''ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCxoe7pezhxWy4NI0mUwKqg9WCYOAS+IjxN9eYcqpfcmQiojcuy9XsiN/xYJ1O94SrsKS5mEia2xHnYA4RUChTyYNcM2v6cnnBQ/N/VQhpGMN7SVxdbhKUXTWFCwbjBgO6rGyHB6WtoH8vd7TOEPt+NgcXwhsWyoaUUdYTA62V+GF9vEmxMaC4ubgDz+B0QkPnauSoNxmkhcIe0lsLNb1pClZyz88PDnKXCX/d0HuN/HJ+sbPg7dCvOyqFYSyKn3uY6bCXqoIdurxXzH3O7z0P8f5sbmKOrGGKNuNxVRbeVl/D/3uDL0nqsbfUc1qvkfwbJwtMXC4IV6kOZMSk2BAsqh7x48gQ+rhYeEVSi8F3CWs4HJQoqrGt7K9a3mCSlMBHP70u3w6ME7eumoryxlUofewTd17ZEkzdX08l2ZlKzZvwQUrc+xQZ2Uw8z2mfW6Ti4gi0pYGaig7Ke4PwuXpo/C5YAWfeXycsvJZ2uaYRjMdZeJGNAnHLUGLkBscw5aI8= test key without passphrase
124) ''',
125) 'public_key_data': bytes.fromhex('''
126) 00 00 00 07 73 73 68 2d 72 73 61
127) 00 00 00 03 01 00 01
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
128) 00 00 01 81 00
129) b1 a1 ee e9 7b 38 71 5b 2e 0d 23 49 94 c0 aa a0
130) f5 60 98 38 04 be 22 3c 4d f5 e6 1c aa 97 dc 99
131) 08 a8 8d cb b2 f5 7b 22 37 fc 58 27 53 bd e1 2a
132) ec 29 2e 66 12 26 b6 c4 79 d8 03 84 54 0a 14 f2
133) 60 d7 0c da fe 9c 9e 70 50 fc df d5 42 1a 46 30
134) de d2 57 17 5b 84 a5 17 4d 61 42 c1 b8 c1 80 ee
135) ab 1b 21 c1 e9 6b 68 1f cb dd ed 33 84 3e df 8d
136) 81 c5 f0 86 c5 b2 a1 a5 14 75 84 c0 eb 65 7e 18
137) 5f 6f 12 6c 4c 68 2e 2e 6e 00 f3 f8 1d 10 90 f9
138) da b9 2a 0d c6 69 21 70 87 b4 96 c2 cd 6f 5a 42
139) 95 9c b3 f3 c3 c3 9c a5 c2 5f f7 74 1e e3 7f 1c
140) 9f ac 6c f8 3b 74 2b ce ca a1 58 4b 22 a7 de e6
141) 3a 6c 25 ea a0 87 6e af 15 f3 1f 73 bb cf 43 fc
142) 7f 9b 1b 98 a3 ab 18 62 8d b8 dc 55 45 b7 95 97
143) f0 ff de e0 cb d2 7a ac 6d f5 1c d6 ab e4 7f 06
144) c9 c2 d3 17 0b 82 15 ea 43 99 31 29 36 04 0b 2a
145) 87 bc 78 f2 04 3e ae 16 1e 11 54 a2 f0 5d c2 5a
146) ce 07 25 0a 2a ac 6b 7b 2b d6 b7 98 24 a5 30 11
147) cf ef 4b b7 c3 a3 04 ed eb a6 a2 bc b1 95 4a 1f
148) 7b 04 dd d7 b6 44 93 37 57 d3 c9 76 66 52 b3 66
149) fc 10 52 b7 3e c5 06 76 53 0f 33 da 67 d6 e9 38
150) b8 82 2d 29 60 66 a2 83 b2 9e e0 fc 2e 5e 9a 3f
151) 0b 96 00 59 f7 97 c9 cb 2f 25 9d ae 69 84 63 31
152) d6 5e 24 63 40 9c 72 d4 18 b9 01 b1 cc 39 68 8f
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
153) '''),
154) 'expected_signature': bytes.fromhex('''
155) 00 00 00 07 73 73 68 2d 72 73 61
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
156) 00 00 01 80
157) a2 10 7c 2e f6 bb 53 a8 74 2a a1 19 99 ad 81 be
158) 79 9c ed d6 9d 09 4e 6e c5 18 48 33 90 77 99 68
159) f7 9e 03 5a cd 4e 18 eb 89 7d 85 a2 ee ae 4a 92
160) f6 6f ce b9 fe 86 7f 2a 6b 31 da 6e 1a fe a2 a5
161) 88 b8 44 7f a1 76 73 b3 ec 75 b5 d0 a6 b9 15 97
162) 65 09 13 7d 94 21 d1 fb 5d 0f 8b 23 04 77 c2 c3
163) 55 22 b1 a0 09 8a f5 38 2a d6 7f 1b 87 29 a0 25
164) d3 25 6f cb 64 61 07 98 dc 14 c5 84 f8 92 24 5e
165) 50 11 6b 49 e5 f0 cc 29 cb 29 a9 19 d8 a7 71 1f
166) 91 0b 05 b1 01 4b c2 5f 00 a5 b6 21 bf f8 2c 9d
167) 67 9b 47 3b 0a 49 6b 79 2d fc 1d ec 0c b0 e5 27
168) 22 d5 a9 f8 d3 c3 f9 df 48 68 e9 fb ef 3c dc 26
169) bf cf ea 29 43 01 a6 e3 c5 51 95 f4 66 6d 8a 55
170) e2 47 ec e8 30 45 4c ae 47 e7 c9 a4 21 8b 64 ba
171) b6 88 f6 21 f8 73 b9 cb 11 a1 78 75 92 c6 5a e5
172) 64 fe ed 42 d9 95 99 e6 2b 6f 3c 16 3c 28 74 a4
173) 72 2f 0d 3f 2c 33 67 aa 35 19 8e e7 b5 11 2f b3
174) f7 6a c5 02 e2 6f a3 42 e3 62 19 99 03 ea a5 20
175) e7 a1 e3 bc c8 06 a3 b5 7c d6 76 5d df 6f 60 46
176) 83 2a 08 00 d6 d3 d9 a4 c1 41 8c f8 60 56 45 81
177) da 3b a2 16 1f 9e 4e 75 83 17 da c3 53 c3 3e 19
178) a4 1b bc d2 29 b8 78 61 2b 78 e6 b1 52 b0 d5 ec
179) de 69 2c 48 62 d9 fd d1 9b 6b b0 49 db d3 ff 38
180) e7 10 d9 2d ce 9f 0d 5e 09 7b 37 d2 7b c3 bf ce
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
181) '''),
|
Fix passphrase-from-SSH-sig...
Marco Ricci authored 2 months ago
|
182) 'derived_passphrase': rb'ohB8Lva7U6h0KqEZma2Bvnmc7dadCU5uxRhIM5B3mWj3ngNazU4Y64l9haLurkqS9m/Ouf6GfyprMdpuGv6ipYi4RH+hdnOz7HW10Ka5FZdlCRN9lCHR+10PiyMEd8LDVSKxoAmK9Tgq1n8bhymgJdMlb8tkYQeY3BTFhPiSJF5QEWtJ5fDMKcspqRnYp3EfkQsFsQFLwl8ApbYhv/gsnWebRzsKSWt5Lfwd7Ayw5Sci1an408P530ho6fvvPNwmv8/qKUMBpuPFUZX0Zm2KVeJH7OgwRUyuR+fJpCGLZLq2iPYh+HO5yxGheHWSxlrlZP7tQtmVmeYrbzwWPCh0pHIvDT8sM2eqNRmO57URL7P3asUC4m+jQuNiGZkD6qUg56HjvMgGo7V81nZd329gRoMqCADW09mkwUGM+GBWRYHaO6IWH55OdYMX2sNTwz4ZpBu80im4eGEreOaxUrDV7N5pLEhi2f3Rm2uwSdvT/zjnENktzp8NXgl7N9J7w7/O',
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
183) },
184) }
185)
186) UNSUITABLE = {
187) 'dsa1024': {
188) 'private_key': rb'''-----BEGIN OPENSSH PRIVATE KEY-----
189) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABsQAAAAdzc2gtZH
190) NzAAAAgQC7KAZXqBGNVLBQPrcMYAoNW54BhD8aIhe7BDWYzJcsaMt72VKSkguZ8+XR7nRa
191) 0C/ZsBi+uJp0dpxy9ZMTOWX4u5YPMeQcXEdGExZIfimGqSOAsy6fCld2IfJZJZExcCmhe9
192) Ssjsd3YSAPJRluOXFQc95MZoR5hMwlIDD8QzrE7QAAABUA99nOZOgd7aHMVGoXpUEBcn7H
193) ossAAACALr2Ag3hxM3rKdxzVUw8fX0VVPXO+3+Kr8hGe0Kc/7NwVaBVL1GQ8fenBuWynpA
194) UbH0wo3h1wkB/8hX6p+S8cnu5rIBlUuVNwLw/bIYohK98LfqTYK/V+g6KD+8m34wvEiXZm
195) qywY54n2bksch1Nqvj/tNpLzExSx/XS0kSM1aigAAACAbQNRPcVEuGDrEcf+xg5tgAejPX
196) BPXr/Jss+Chk64km3mirMYjAWyWYtVcgT+7hOYxtYRin8LyMLqKRmqa0Q5UrvDfChgLhvs
197) G9YSb/Mpw5qm8PiHSafwhkaz/te3+8hKogqoe7sd+tCF06IpJr5k70ACiNtRGqssNF8Elr
198) l1efYAAAH4swlfVrMJX1YAAAAHc3NoLWRzcwAAAIEAuygGV6gRjVSwUD63DGAKDVueAYQ/
199) GiIXuwQ1mMyXLGjLe9lSkpILmfPl0e50WtAv2bAYvriadHaccvWTEzll+LuWDzHkHFxHRh
200) MWSH4phqkjgLMunwpXdiHyWSWRMXApoXvUrI7Hd2EgDyUZbjlxUHPeTGaEeYTMJSAw/EM6
201) xO0AAAAVAPfZzmToHe2hzFRqF6VBAXJ+x6LLAAAAgC69gIN4cTN6yncc1VMPH19FVT1zvt
202) /iq/IRntCnP+zcFWgVS9RkPH3pwblsp6QFGx9MKN4dcJAf/IV+qfkvHJ7uayAZVLlTcC8P
203) 2yGKISvfC36k2Cv1foOig/vJt+MLxIl2ZqssGOeJ9m5LHIdTar4/7TaS8xMUsf10tJEjNW
204) ooAAAAgG0DUT3FRLhg6xHH/sYObYAHoz1wT16/ybLPgoZOuJJt5oqzGIwFslmLVXIE/u4T
205) mMbWEYp/C8jC6ikZqmtEOVK7w3woYC4b7BvWEm/zKcOapvD4h0mn8IZGs/7Xt/vISqIKqH
206) u7HfrQhdOiKSa+ZO9AAojbURqrLDRfBJa5dXn2AAAAFQDJHfenj4EJ9WkehpdJatPBlqCW
207) 0gAAABt0ZXN0IGtleSB3aXRob3V0IHBhc3NwaHJhc2UBAgMEBQYH
208) -----END OPENSSH PRIVATE KEY-----
209) ''',
210) 'public_key': rb'''ssh-dss AAAAB3NzaC1kc3MAAACBALsoBleoEY1UsFA+twxgCg1bngGEPxoiF7sENZjMlyxoy3vZUpKSC5nz5dHudFrQL9mwGL64mnR2nHL1kxM5Zfi7lg8x5BxcR0YTFkh+KYapI4CzLp8KV3Yh8lklkTFwKaF71KyOx3dhIA8lGW45cVBz3kxmhHmEzCUgMPxDOsTtAAAAFQD32c5k6B3tocxUahelQQFyfseiywAAAIAuvYCDeHEzesp3HNVTDx9fRVU9c77f4qvyEZ7Qpz/s3BVoFUvUZDx96cG5bKekBRsfTCjeHXCQH/yFfqn5Lxye7msgGVS5U3AvD9shiiEr3wt+pNgr9X6DooP7ybfjC8SJdmarLBjnifZuSxyHU2q+P+02kvMTFLH9dLSRIzVqKAAAAIBtA1E9xUS4YOsRx/7GDm2AB6M9cE9ev8myz4KGTriSbeaKsxiMBbJZi1VyBP7uE5jG1hGKfwvIwuopGaprRDlSu8N8KGAuG+wb1hJv8ynDmqbw+IdJp/CGRrP+17f7yEqiCqh7ux360IXToikmvmTvQAKI21Eaqyw0XwSWuXV59g== test key without passphrase
211) ''',
212) 'public_key_data': bytes.fromhex('''
213) 00 00 00 07 73 73 68 2d 64 73 73
214) 00 00 00 81 00
215) bb 28 06 57 a8 11 8d 54 b0 50 3e b7 0c 60 0a 0d
216) 5b 9e 01 84 3f 1a 22 17 bb 04 35 98 cc 97 2c 68
217) cb 7b d9 52 92 92 0b 99 f3 e5 d1 ee 74 5a d0 2f
218) d9 b0 18 be b8 9a 74 76 9c 72 f5 93 13 39 65 f8
219) bb 96 0f 31 e4 1c 5c 47 46 13 16 48 7e 29 86 a9
220) 23 80 b3 2e 9f 0a 57 76 21 f2 59 25 91 31 70 29
221) a1 7b d4 ac 8e c7 77 61 20 0f 25 19 6e 39 71 50
222) 73 de 4c 66 84 79 84 cc 25 20 30 fc 43 3a c4 ed
|
Reformat binary test data t...
Marco Ricci authored 3 months ago
|
223) 00 00 00 15 00 f7 d9 ce 64
224) e8 1d ed a1 cc 54 6a 17 a5 41 01 72 7e c7 a2 cb
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
225) 00 00 00 80
226) 2e bd 80 83 78 71 33 7a ca 77 1c d5 53 0f 1f 5f
227) 45 55 3d 73 be df e2 ab f2 11 9e d0 a7 3f ec dc
228) 15 68 15 4b d4 64 3c 7d e9 c1 b9 6c a7 a4 05 1b
229) 1f 4c 28 de 1d 70 90 1f fc 85 7e a9 f9 2f 1c 9e
230) ee 6b 20 19 54 b9 53 70 2f 0f db 21 8a 21 2b df
231) 0b 7e a4 d8 2b f5 7e 83 a2 83 fb c9 b7 e3 0b c4
232) 89 76 66 ab 2c 18 e7 89 f6 6e 4b 1c 87 53 6a be
233) 3f ed 36 92 f3 13 14 b1 fd 74 b4 91 23 35 6a 28
234) 00 00 00 80
235) 6d 03 51 3d c5 44 b8 60 eb 11 c7 fe c6 0e 6d 80
236) 07 a3 3d 70 4f 5e bf c9 b2 cf 82 86 4e b8 92 6d
237) e6 8a b3 18 8c 05 b2 59 8b 55 72 04 fe ee 13 98
238) c6 d6 11 8a 7f 0b c8 c2 ea 29 19 aa 6b 44 39 52
239) bb c3 7c 28 60 2e 1b ec 1b d6 12 6f f3 29 c3 9a
240) a6 f0 f8 87 49 a7 f0 86 46 b3 fe d7 b7 fb c8 4a
241) a2 0a a8 7b bb 1d fa d0 85 d3 a2 29 26 be 64 ef
242) 40 02 88 db 51 1a ab 2c 34 5f 04 96 b9 75 79 f6
243) '''),
244) 'expected_signature': None,
|
Fix passphrase-from-SSH-sig...
Marco Ricci authored 2 months ago
|
245) 'derived_passphrase': None,
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
246) },
247) 'ecdsa256': {
248) 'private_key': rb'''-----BEGIN OPENSSH PRIVATE KEY-----
249) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS
250) 1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTLbU0zDwsk2Dvp+VYIrsNVf5gWwz2S
251) 3SZ8TbxiQRkpnGSVqyIoHJOJc+NQItAa7xlJ/8Z6gfz57Z3apUkaMJm6AAAAuKeY+YinmP
252) mIAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMttTTMPCyTYO+n5
253) Vgiuw1V/mBbDPZLdJnxNvGJBGSmcZJWrIigck4lz41Ai0BrvGUn/xnqB/PntndqlSRowmb
254) oAAAAhAKIl/3n0pKVIxpZkXTGtii782Qr4yIcvHdpxjO/QsIqKAAAAG3Rlc3Qga2V5IHdp
255) dGhvdXQgcGFzc3BocmFzZQECAwQ=
256) -----END OPENSSH PRIVATE KEY-----
257) ''',
258) 'public_key': rb'''ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMttTTMPCyTYO+n5Vgiuw1V/mBbDPZLdJnxNvGJBGSmcZJWrIigck4lz41Ai0BrvGUn/xnqB/PntndqlSRowmbo= test key without passphrase
259) ''',
260) 'public_key_data': bytes.fromhex('''
261) 00 00 00 13 65 63 64 73 61 2d 73 68 61 32 2d 6e
262) 69 73 74 70 32 35 36
263) 00 00 00 08 6e 69 73 74 70 32 35 36
264) 00 00 00 41 04
265) cb 6d 4d 33 0f 0b 24 d8 3b e9 f9 56 08 ae c3 55
266) 7f 98 16 c3 3d 92 dd 26 7c 4d bc 62 41 19 29 9c
267) 64 95 ab 22 28 1c 93 89 73 e3 50 22 d0 1a ef 19
268) 49 ff c6 7a 81 fc f9 ed 9d da a5 49 1a 30 99 ba
269) '''),
270) 'expected_signature': None,
|
Fix passphrase-from-SSH-sig...
Marco Ricci authored 2 months ago
|
271) 'derived_passphrase': None,
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
272) },
273) 'ecdsa384': {
274) 'private_key': rb'''-----BEGIN OPENSSH PRIVATE KEY-----
275) b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAiAAAABNlY2RzYS
276) 1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQSgkOjkAvq7v5vHuj3KBL4/EAWcn5hZ
277) DyKcbyV0eBMGFq7hKXQlZqIahLVqeMR0QqmkxNJ2rly2VHcXneq3vZ+9fIsWCOdYk5WP3N
278) ZPzv911Xn7wbEkC7QndD5zKlm4pBUAAADomhj+IZoY/iEAAAATZWNkc2Etc2hhMi1uaXN0
279) cDM4NAAAAAhuaXN0cDM4NAAAAGEEoJDo5AL6u7+bx7o9ygS+PxAFnJ+YWQ8inG8ldHgTBh
280) au4Sl0JWaiGoS1anjEdEKppMTSdq5ctlR3F53qt72fvXyLFgjnWJOVj9zWT87/ddV5+8Gx
281) JAu0J3Q+cypZuKQVAAAAMQD5sTy8p+B1cn/DhOmXquui1BcxvASqzzevkBlbQoBa73y04B
282) 2OdqVOVRkwZWRROz0AAAAbdGVzdCBrZXkgd2l0aG91dCBwYXNzcGhyYXNlAQIDBA==
283) -----END OPENSSH PRIVATE KEY-----
284) ''',
285) 'public_key': rb'''ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBKCQ6OQC+ru/m8e6PcoEvj8QBZyfmFkPIpxvJXR4EwYWruEpdCVmohqEtWp4xHRCqaTE0nauXLZUdxed6re9n718ixYI51iTlY/c1k/O/3XVefvBsSQLtCd0PnMqWbikFQ== test key without passphrase
286) ''',
287) 'public_key_data': bytes.fromhex('''
288) 00 00 00 13
289) 65 63 64 73 61 2d 73 68 61 32 2d 6e 69 73 74 70
290) 33 38 34
291) 00 00 00 08 6e 69 73 74 70 33 38 34
292) 00 00 00 61 04
293) a0 90 e8 e4 02 fa bb bf 9b c7 ba 3d ca 04 be 3f
294) 10 05 9c 9f 98 59 0f 22 9c 6f 25 74 78 13 06 16
295) ae e1 29 74 25 66 a2 1a 84 b5 6a 78 c4 74 42 a9
296) a4 c4 d2 76 ae 5c b6 54 77 17 9d ea b7 bd 9f bd
297) 7c 8b 16 08 e7 58 93 95 8f dc d6 4f ce ff 75 d5
298) 79 fb c1 b1 24 0b b4 27 74 3e 73 2a 59 b8 a4 15
299) '''),
300) 'expected_signature': None,
|
Fix passphrase-from-SSH-sig...
Marco Ricci authored 2 months ago
|
301) 'derived_passphrase': None,
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
302) },
303) }
304)
305) def test_client_uint32():
306) uint32 = ssh_agent_client.SSHAgentClient.uint32
307) assert uint32(16777216) == b'\x01\x00\x00\x00'
308)
309) @pytest.mark.parametrize(['value', 'exc_type', 'exc_pattern'], [
310) (10000000000000000, OverflowError, 'int too big to convert'),
311) (-1, OverflowError, "can't convert negative int to unsigned"),
312) ])
313) def test_client_uint32_exceptions(value, exc_type, exc_pattern):
314) uint32 = ssh_agent_client.SSHAgentClient.uint32
315) with pytest.raises(exc_type, match=exc_pattern):
316) uint32(value)
317)
318) @pytest.mark.parametrize(['input', 'expected'], [
319) (b'ssh-rsa', b'\x00\x00\x00\x07ssh-rsa'),
320) (b'ssh-ed25519', b'\x00\x00\x00\x0bssh-ed25519'),
321) (
322) ssh_agent_client.SSHAgentClient.string(b'ssh-ed25519'),
323) b'\x00\x00\x00\x0f\x00\x00\x00\x0bssh-ed25519',
324) ),
325) ])
326) def test_client_string(input, expected):
327) string = ssh_agent_client.SSHAgentClient.string
328) assert bytes(string(input)) == expected
329)
330) @pytest.mark.parametrize(['input', 'expected'], [
331) (b'\x00\x00\x00\x07ssh-rsa', b'ssh-rsa'),
332) (
333) ssh_agent_client.SSHAgentClient.string(b'ssh-ed25519'),
334) b'ssh-ed25519',
335) ),
336) ])
337) def test_client_unstring(input, expected):
338) unstring = ssh_agent_client.SSHAgentClient.unstring
|
Add function for SSH framed...
Marco Ricci authored 2 months ago
|
339) unstring_prefix = ssh_agent_client.SSHAgentClient.unstring_prefix
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
340) assert bytes(unstring(input)) == expected
|
Add function for SSH framed...
Marco Ricci authored 2 months ago
|
341) assert tuple(bytes(x) for x in unstring_prefix(input)) == (expected, b'')
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
342)
|
Add function for SSH framed...
Marco Ricci authored 2 months ago
|
343) @pytest.mark.parametrize(
344) ['input', 'exc_type', 'exc_pattern', 'has_trailer', 'parts'], [
345) (b'ssh', ValueError, 'malformed SSH byte string', False, None),
346) (
347) b'\x00\x00\x00\x08ssh-rsa',
348) ValueError, 'malformed SSH byte string',
349) False, None,
350) ),
351) (
352) b'\x00\x00\x00\x04XXX trailing text',
353) ValueError, 'malformed SSH byte string',
354) True, (b'XXX ', b'trailing text'),
355) ),
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
356) ])
|
Add function for SSH framed...
Marco Ricci authored 2 months ago
|
357) def test_client_unstring_exceptions(input, exc_type, exc_pattern,
358) has_trailer, parts):
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
359) unstring = ssh_agent_client.SSHAgentClient.unstring
|
Add function for SSH framed...
Marco Ricci authored 2 months ago
|
360) unstring_prefix = ssh_agent_client.SSHAgentClient.unstring_prefix
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
361) with pytest.raises(exc_type, match=exc_pattern):
362) unstring(input)
|
Add function for SSH framed...
Marco Ricci authored 2 months ago
|
363) if has_trailer:
364) assert tuple(bytes(x) for x in unstring_prefix(input)) == parts
365) else:
366) with pytest.raises(exc_type, match=exc_pattern):
367) unstring_prefix(input)
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
368)
369) def test_key_decoding():
370) public_key = SUPPORTED['ed25519']['public_key']
371) public_key_data = SUPPORTED['ed25519']['public_key_data']
372) keydata = base64.b64decode(public_key.split(None, 2)[1])
373) assert (
374) keydata == public_key_data
375) ), "recorded public key data doesn't match"
376)
377) @pytest.mark.parametrize(['keytype', 'data_dict'], list(SUPPORTED.items()))
378) def test_sign_data_via_agent(keytype, data_dict):
379) private_key = data_dict['private_key']
380) try:
381) result = subprocess.run(['ssh-add', '-t', '30', '-q', '-'],
382) input=private_key, check=True,
383) capture_output=True)
384) except subprocess.CalledProcessError as e:
385) pytest.skip(
386) f"uploading test key: {e!r}, stdout={e.stdout!r}, "
387) f"stderr={e.stderr!r}"
388) )
389) else:
390) try:
391) client = ssh_agent_client.SSHAgentClient()
|
Exclude known "emergency ex...
Marco Ricci authored 3 months ago
|
392) except OSError: # pragma: no cover
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
393) pytest.skip('communication error with the SSH agent')
394) with client:
395) key_comment_pairs = {bytes(k): bytes(c)
396) for k, c in client.list_keys()}
397) public_key_data = data_dict['public_key_data']
398) expected_signature = data_dict['expected_signature']
|
Exclude known "emergency ex...
Marco Ricci authored 3 months ago
|
399) if public_key_data not in key_comment_pairs: # pragma: no cover
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
400) pytest.skip('prerequisite SSH key not loaded')
401) signature = bytes(client.sign(
402) payload=derivepassphrase.Vault._UUID, key=public_key_data))
403) assert signature == expected_signature, 'SSH signature mismatch'
404) signature2 = bytes(client.sign(
405) payload=derivepassphrase.Vault._UUID, key=public_key_data))
406) assert signature2 == expected_signature, 'SSH signature mismatch'
407) assert (
408) derivepassphrase.Vault.phrase_from_signature(public_key_data) ==
409) expected_signature
410) ), 'SSH signature mismatch'
411)
412) @pytest.mark.parametrize(['keytype', 'data_dict'], list(UNSUITABLE.items()))
413) def test_sign_data_via_agent_unsupported(keytype, data_dict):
414) private_key = data_dict['private_key']
415) try:
416) result = subprocess.run(['ssh-add', '-t', '30', '-q', '-'],
417) input=private_key, check=True,
418) capture_output=True)
|
Exclude known "emergency ex...
Marco Ricci authored 3 months ago
|
419) except subprocess.CalledProcessError as e: # pragma: no cover
420) pytest.skip(
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
421) f"uploading test key: {e!r}, stdout={e.stdout!r}, "
422) f"stderr={e.stderr!r}"
423) )
424) else:
425) try:
426) client = ssh_agent_client.SSHAgentClient()
|
Exclude known "emergency ex...
Marco Ricci authored 3 months ago
|
427) except OSError: # pragma: no cover
|
Add unit tests, both new an...
Marco Ricci authored 3 months ago
|
428) pytest.skip('communication error with the SSH agent')
429) with client:
430) key_comment_pairs = {bytes(k): bytes(c)
431) for k, c in client.list_keys()}
432) public_key_data = data_dict['public_key_data']
433) expected_signature = data_dict['expected_signature']
|
Exclude known "emergency ex...
Marco Ricci authored 3 months ago
|
434) if public_key_data not in key_comment_pairs: # pragma: no cover
|