Skip to content

fix(agent/agentssh): ensure RSA key generation always produces valid keys #16694

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

ThomasK33
Copy link
Member

@ThomasK33 ThomasK33 commented Feb 25, 2025

Modify the RSA key generation algorithm to check that GCD(e, p-1) = 1 and
GCD(e, q-1) = 1 when selecting prime numbers, ensuring that e and φ(n)
are coprime. This prevents ModInverse from returning nil, which would
cause private key generation to fail and result in a panic when Precompute is called.

Change-Id: I0a453e1e1f8c638e40e7a4b87a6d0d7299e1cb5d
Signed-off-by: Thomas Kosiewski tk@coder.com

Copy link
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@ThomasK33 ThomasK33 marked this pull request as ready for review February 25, 2025 08:48
@ThomasK33 ThomasK33 changed the title fix(agentssh): ensure RSA key generation always produces valid keys fix(agent/agentssh): ensure RSA key generation always produces valid keys Feb 25, 2025
@ThomasK33 ThomasK33 requested a review from johnstcn February 25, 2025 08:51
Copy link
Member

@johnstcn johnstcn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIL about big.ProbablyPrime() and the source code is interesting reading!
Approving to unblock, but a couple of things:

  1. Might be good to have this in its own package
  2. Might also be good to add a benchmark (not for benchmarking purposes, but for proving non-panicky purposes).

Copy link
Member Author

I don't believe I need to get unblocked here. It’s a somewhat rare and random occurrence for this panic to be triggered, so I think it's reasonable to take the time to clean this up.

@ThomasK33 ThomasK33 force-pushed the thomask33/02-25-fix_agentssh_ensure_rsa_key_generation_always_produces_valid_keys branch from 2914761 to 77d1812 Compare February 25, 2025 12:25
@ThomasK33 ThomasK33 requested a review from johnstcn February 25, 2025 12:26
Copy link
Member Author

ThomasK33 commented Feb 25, 2025

So, I've added a benchmark for benchmarking, and a fuzz test for making sure that the function won't randomly panic given some funny seed value.

I let it run/marinate for some time and no panics were found

❯ go test -fuzz=FuzzGenerateDeterministicKey ./agent/agentrsa
fuzz: elapsed: 0s, gathering baseline coverage: 0/3 completed
fuzz: elapsed: 0s, gathering baseline coverage: 3/3 completed, now fuzzing with 11 workers
fuzz: elapsed: 3s, execs: 61 (20/sec), new interesting: 55 (total: 58)
fuzz: elapsed: 6s, execs: 123 (21/sec), new interesting: 105 (total: 108)
fuzz: elapsed: 9s, execs: 185 (21/sec), new interesting: 139 (total: 142)
fuzz: elapsed: 12s, execs: 252 (22/sec), new interesting: 172 (total: 175)
fuzz: elapsed: 15s, execs: 316 (21/sec), new interesting: 185 (total: 188)
fuzz: elapsed: 18s, execs: 382 (22/sec), new interesting: 199 (total: 202)
fuzz: elapsed: 21s, execs: 439 (19/sec), new interesting: 209 (total: 212)
fuzz: elapsed: 24s, execs: 501 (21/sec), new interesting: 219 (total: 222)
fuzz: elapsed: 27s, execs: 560 (20/sec), new interesting: 227 (total: 230)
fuzz: elapsed: 30s, execs: 620 (20/sec), new interesting: 231 (total: 234)
fuzz: elapsed: 33s, execs: 693 (24/sec), new interesting: 235 (total: 238)
fuzz: elapsed: 36s, execs: 761 (23/sec), new interesting: 240 (total: 243)
fuzz: elapsed: 39s, execs: 822 (20/sec), new interesting: 241 (total: 244)
fuzz: elapsed: 42s, execs: 890 (23/sec), new interesting: 243 (total: 246)
fuzz: elapsed: 45s, execs: 949 (20/sec), new interesting: 245 (total: 248)
fuzz: elapsed: 48s, execs: 1007 (19/sec), new interesting: 246 (total: 249)
fuzz: elapsed: 51s, execs: 1063 (19/sec), new interesting: 247 (total: 250)
fuzz: elapsed: 54s, execs: 1116 (18/sec), new interesting: 247 (total: 250)
fuzz: elapsed: 57s, execs: 1186 (23/sec), new interesting: 248 (total: 251)
fuzz: elapsed: 1m0s, execs: 1259 (24/sec), new interesting: 249 (total: 252)
fuzz: elapsed: 1m3s, execs: 1335 (25/sec), new interesting: 251 (total: 254)
fuzz: elapsed: 1m6s, execs: 1411 (25/sec), new interesting: 251 (total: 254)
fuzz: elapsed: 1m9s, execs: 1478 (22/sec), new interesting: 252 (total: 255)
fuzz: elapsed: 1m12s, execs: 1556 (26/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m15s, execs: 1632 (25/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m18s, execs: 1709 (26/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m21s, execs: 1782 (24/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m24s, execs: 1857 (25/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m27s, execs: 1912 (18/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m30s, execs: 1992 (27/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m33s, execs: 2068 (25/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m36s, execs: 2136 (23/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m39s, execs: 2205 (23/sec), new interesting: 253 (total: 256)
fuzz: elapsed: 1m42s, execs: 2274 (23/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 1m45s, execs: 2349 (25/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 1m48s, execs: 2417 (23/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 1m51s, execs: 2485 (23/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 1m54s, execs: 2550 (22/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 1m57s, execs: 2624 (25/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m0s, execs: 2694 (23/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m3s, execs: 2773 (26/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m6s, execs: 2838 (22/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m9s, execs: 2918 (27/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m12s, execs: 2989 (24/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m15s, execs: 3066 (26/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m18s, execs: 3138 (24/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m21s, execs: 3212 (25/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m24s, execs: 3244 (11/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m27s, execs: 3280 (12/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m30s, execs: 3327 (16/sec), new interesting: 254 (total: 257)
fuzz: elapsed: 2m33s, execs: 3375 (16/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m36s, execs: 3432 (19/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m39s, execs: 3504 (24/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m42s, execs: 3575 (24/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m45s, execs: 3637 (21/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m48s, execs: 3697 (20/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m51s, execs: 3748 (17/sec), new interesting: 255 (total: 258)
fuzz: elapsed: 2m54s, execs: 3787 (13/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 2m57s, execs: 3843 (19/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m0s, execs: 3904 (20/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m3s, execs: 3963 (20/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m6s, execs: 4033 (23/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m9s, execs: 4099 (22/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m12s, execs: 4164 (22/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m15s, execs: 4232 (23/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m18s, execs: 4304 (24/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m21s, execs: 4373 (23/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m24s, execs: 4447 (25/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m27s, execs: 4520 (24/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m30s, execs: 4593 (24/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m33s, execs: 4670 (26/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m36s, execs: 4737 (22/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m39s, execs: 4817 (27/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m42s, execs: 4891 (25/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m45s, execs: 4967 (25/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m48s, execs: 5042 (25/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m51s, execs: 5119 (26/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m54s, execs: 5199 (27/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 3m57s, execs: 5267 (23/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 4m0s, execs: 5338 (24/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 4m3s, execs: 5409 (24/sec), new interesting: 256 (total: 259)
fuzz: elapsed: 4m6s, execs: 5472 (21/sec), new interesting: 256 (total: 259)
^Cfuzz: elapsed: 4m9s, execs: 5519 (18/sec), new interesting: 256 (total: 259)
PASS
ok      github.com/coder/coder/v2/agent/agentssh/agentsshrsa    249.082s

@ThomasK33 ThomasK33 force-pushed the thomask33/02-25-fix_agentssh_ensure_rsa_key_generation_always_produces_valid_keys branch 2 times, most recently from a2eafe3 to f0fe6cd Compare February 25, 2025 12:36
@ThomasK33 ThomasK33 force-pushed the thomask33/02-25-fix_agentssh_ensure_rsa_key_generation_always_produces_valid_keys branch from f0fe6cd to d95abcd Compare February 25, 2025 13:06
Change-Id: I0a453e1e1f8c638e40e7a4b87a6d0d7299e1cb5d
Signed-off-by: Thomas Kosiewski <tk@coder.com>
@ThomasK33 ThomasK33 force-pushed the thomask33/02-25-fix_agentssh_ensure_rsa_key_generation_always_produces_valid_keys branch from d95abcd to cd3a104 Compare February 25, 2025 13:28
@ThomasK33 ThomasK33 merged commit 38c0e8a into main Feb 26, 2025
31 checks passed
@ThomasK33 ThomasK33 deleted the thomask33/02-25-fix_agentssh_ensure_rsa_key_generation_always_produces_valid_keys branch February 26, 2025 10:45
@github-actions github-actions bot locked and limited conversation to collaborators Feb 26, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants