use srp6::prelude::*;
pub fn lookup_user_details(username: UsernameRef) -> UserSecrets {
UserSecrets {
username: username.to_owned(),
salt: Salt::from_hex_str_be(
"2A27E3AF 30443FCA 7A9D8C0A 3D6423A4 3AC28B82 C119E240 E7499F1F
EAA4D9E4 DE18C0BF 8BF689FA E799AA40 FA51437A DB39F206 AB92F62D
253F3D22 B7D2E500 6DECB7FE 88EAA821 657450ED 7A020EA9 9A947409
9F504091 1D934DFA D96CCD5C D0FA543E 73892408 E9AD3830 D764ECC1
E1B452C1 569C79E7 D0343C6E EFD88494 6FC75C61 8BCC4C6C 2E2B8A56
88E5AF31 0B3E171C E50F4211 0C4E523E D25B5C4B 9AD1A876 694A1C7B
1BC4AB08 6B2A7ADE 81EC1611 5DDD00AB 21E2B0DF 542B2820 C2C9FB59
D14B2792 16FA7A36 1D25A32B 2F0BBC94 0E49F45F 2D5CBF7F 785A7FD4
3F76009B EB690EFD 6588A570 CF51870E 80ACDEB1 5BEC193C A5B5FC58
870E5EA1 AE4040FC C7604B03 AF3295A8 5AAB47E6 5857A770 4900F9C7
CA8E2C22 11AD51F2 B69F7732 17DDE937 D766A205 2F53A040 12C9FADA
50AA98BC 6BF49E17 DCB4B24C 798DDD62 D88F11FE CCA4A19C C219661C
F125BBB0 191A1A24 F2020A25 8BD9DF97 7B7CAB27 04B59908 F568C69B
845E35F4 BAE68C02 BF810902 19589BEC F12079DA 6FCEE0AC 7EBB223E
B05DDA4C 1766FE34 DB661139 FE894C5D 9D6F0192 2BDECCBE E889F69F
054A34EA A74D9B7C C9873F2A C3CD8395 D42410AE 3E51409F B7A0B797
8D93CCDF DA8401C5 3524575B 84B970C2 1EF44BC1 69E6D2CA 95D0C7D3
1A67B4F9 A88D4A9D F1BCF8C6 F8A5512A F1DBFE6B 9C52FCA1 A00BA79C
0D60978C 8C313D6A",
)
.unwrap(),
verifier: PasswordVerifier::from_hex_str_be(
"BF86D308 FDA5D535 D8D99516 B6A6045E D3455ED4 222D0BD5 1C513400
75278047 9490FC91 D6A53AC4 AFC7FD72 D2534EEB F6D8CB3B C375847A
F1C8D739 46424401 08B24C8A A4F07FE2 9AFA39BA A8CC1625 E6F7CBA7
B9DF924E 033B48E8 FA7A0329 F78F8C10 6DB728E0 49A74AE2 8F2C2EEA
32A4B124 C499350F C7914C24 13647633 5E9757E3 1892DAA6 0009B2BE
D4DA9043 4C267D60 F302FA22 F7EC376D 93B40003 2EADCD10 74735371
D0949256 E64441DC 0710A20A CD22C22C 99928742 5E901EA3 C45992DB
AFF180B5 1C8B0B77 2C75FC3B 4794CEBB D5BD25E4 6BC90855 3CD4E051
CA0AA7F2 D2298A62 C4B84F2D AB8D90CB 140EE9BC 5388F106 51EA2729
634BFF03 06101731 BB802E41 89520E1E 8F2129D7 8C8747DC 604969CA
C56E634F 68F38BA6 360B0265 0A48DAC3 42206512 107966DA 436C71DE
F471E9F0 99FBC02F 7258B1B4 4F19BBA5 62115458 83540B8B 88D76544
ABDE2B8E 8326E770 0373A395 20B38CD0 C23C1E1C 42BB988F FCE1C96B
79D57753 23297AAB 077F5410 525D9428 D3CA4E1B 44AA97A9 667E8171
80CD8927 C3035DCF 178117FC 472FD5BA 6BA72AD2 1D3DE2E9 C2D9DE8A
262525E7 0E595581 7AA770F9 D10FD939 E0A0C363 FA579925 ACC9891B
1BF38BE1 60A4FAD9 C60F7BC4 BCE2C0CF 0555F3C6 9255A63D EC9B7E55
2DDF03C9 838C3B7B 7C2AB69C FF9390D4 DD9B4409 7FCB9E73 3574B937
1CB0A045 6B7E0A61",
)
.unwrap(),
}
}
pub fn handshake_from_the_server(
username: UsernameRef,
) -> Handshake<{ Srp6_4096::KEY_LEN }, { Srp6_4096::SALT_LEN }> {
let user = lookup_user_details(username);
let srp = Srp6_4096::default();
Handshake {
s: user.salt,
N: srp.N,
g: srp.g,
B: PublicKey::from_hex_str_be(
"305A710C 399CE43C 56D38BEE 8504193E 91242E95 CF16D0C8 4D377C6C
6A1484EC 70732FFC F469C9D4 612C8F95 1FB478F7 16BE3B18 1E9C1ABE
8B03B83E 542D3B92 F5C23DDA AEE847BE 7618427B 258882EE E7F99974
BDE2DB8C 5E102129 79212BDC 4A3E49D2 99952839 E02A150E A9B08B24
6CDBB24B C8DA2CE4 2A742B9D 22FA95E6 A8A5A1EE D0071455 B863ED1B
68C94F40 88C1B0BA ACF58646 5B045D5B A1F75852 32321E08 D277D91F
FBC24944 98C02249 534BCBB9 40C589D1 EC81F6EE B5F5C1E8 ACFB4B6B
A046B99C 1098AF51 D617DC5A 45B6663E D7AE0FE9 AF2ACD8C E4F87D86
0F408B1C 42FD3318 6E4D2B52 E081794C 9932992E 74AB89B4 9E67AC8F
AB7A64D1 D5B71813 9AD3F9A5 93C109D9 AC355CCE EE6FE7B2 279DA92F
C6CE1AAF 65C75893 66EDCB34 1AB0ECE1 4C5E811A 2F1677B7 93D59172
2CFD2CB5 2F495A53 8637AA80 869D49D3 2E52D48F BF354822 6FD4A879
059887D5 A0AFCFB3 5A44A136 D44994A9 31BEB9CE 977BB29A 67DCB80B
A9E66CEE 6E5B18BC 5A4091C4 B48FA653 3311A05A BEF706BD 03660BD7
786DC748 19FE16E9 9EC6C7CB 932DFD37 D714766E D81FF3B1 402797EB
A0E7071C B86A9D7D 704625AB CA1AF488 A8B8C720 DD69F418 398BB1D1
43D477AA 2FC608F8 49346A75 B84627DC 99D7E45F C45F8300 DBD3D1FA
D74D8378 4D881F3A 1FEBBA47 ACFD4785 1CFF7BBC 367410DB D302B6A5
C1BB4F43 FA89B674",
)
.unwrap(),
k: srp.k,
}
}
#[allow(non_snake_case)]
pub fn stored_proof_verifier_from_step_2(username: UsernameRef) -> HandshakeProofVerifier {
let user = lookup_user_details(username);
let srp = Srp6_4096::default();
let B = PublicKey::from_hex_str_be(
"305A710C 399CE43C 56D38BEE 8504193E 91242E95 CF16D0C8 4D377C6C
6A1484EC 70732FFC F469C9D4 612C8F95 1FB478F7 16BE3B18 1E9C1ABE
8B03B83E 542D3B92 F5C23DDA AEE847BE 7618427B 258882EE E7F99974
BDE2DB8C 5E102129 79212BDC 4A3E49D2 99952839 E02A150E A9B08B24
6CDBB24B C8DA2CE4 2A742B9D 22FA95E6 A8A5A1EE D0071455 B863ED1B
68C94F40 88C1B0BA ACF58646 5B045D5B A1F75852 32321E08 D277D91F
FBC24944 98C02249 534BCBB9 40C589D1 EC81F6EE B5F5C1E8 ACFB4B6B
A046B99C 1098AF51 D617DC5A 45B6663E D7AE0FE9 AF2ACD8C E4F87D86
0F408B1C 42FD3318 6E4D2B52 E081794C 9932992E 74AB89B4 9E67AC8F
AB7A64D1 D5B71813 9AD3F9A5 93C109D9 AC355CCE EE6FE7B2 279DA92F
C6CE1AAF 65C75893 66EDCB34 1AB0ECE1 4C5E811A 2F1677B7 93D59172
2CFD2CB5 2F495A53 8637AA80 869D49D3 2E52D48F BF354822 6FD4A879
059887D5 A0AFCFB3 5A44A136 D44994A9 31BEB9CE 977BB29A 67DCB80B
A9E66CEE 6E5B18BC 5A4091C4 B48FA653 3311A05A BEF706BD 03660BD7
786DC748 19FE16E9 9EC6C7CB 932DFD37 D714766E D81FF3B1 402797EB
A0E7071C B86A9D7D 704625AB CA1AF488 A8B8C720 DD69F418 398BB1D1
43D477AA 2FC608F8 49346A75 B84627DC 99D7E45F C45F8300 DBD3D1FA
D74D8378 4D881F3A 1FEBBA47 ACFD4785 1CFF7BBC 367410DB D302B6A5
C1BB4F43 FA89B674",
)
.unwrap();
let b = PrivateKey::from_hex_str_be(
"AF36B579 309478E8 F550F937 5D8EAB43 07FC6E97 5717E872 218748E5
5DF1380E A04F975A 2F8E612D 81AA461D 2B162E52 48A8204B 7317268C
B2CCD303 8BD03EED DB9A4728 6E99BC02 3EAD64CA D9CC0B51 0EE696E8
66D300C1 DC8C13C2 20CBFC6C 683C3E86 2BD30E31 E6C97AA3 371DDECD
DBF36414 5A7749A2 E5CDF6ED B90EA14C B60BE165 AC2CA2E5 CDE4D5CE
8180A13A 7DC3D066 FA00EDE8 F5C4C601 83C664AB 67C026A6 03147B29
82B6405B D32900D5 C563B034 AFFE3761 B2638F00 411B8827 B6CE88C9
E1F4109D 0DB479B8 642B2A9B FA03024A E8425C0B B6687A11 792DB92C
B5C82920 03F3E45E EE7E52A4 FC499833 F3F35516 C42B97AA B86FA2B3
823852AA D2E5B24A A6839CEE 8D1C3F0C 82DBA198 9729A7BB 0FBD60D6
DB067881 2E6AF5BE 735312BD C3D9B954 CD5BB490 3BB3DA56 433C32C4
492FA536 0419FB49 0189CDBC 422D69B8 695D9689 9A41D921 B476E59F
DD7E0288 C524009E 001444DD 95825379 821811B5 3575587C B70D2C76
27A90570 E1BA3A57 061C0586 C7A504EF 63FA0A75 7C130B6E C29C2513
D5065890 796CFAA3 A58FCE11 BE5D2825 AF27D72C 1617EB49 6A06655A
DE69A6CD B8A8BD93 40E6E4B8 2BE898E2 4CCE4153 10C879B3 782C5A9B
C8134FA4 3C91FE57 8696F6B4 E0D43BE4 78DBA7EE 7EF19C70 A4FE9B23
5940722E C75C2E32 5F17AE8E D00A773F 8A45CF06 37A05057 8E6BCC43
428DADDA D9658C5E",
)
.unwrap();
HandshakeProofVerifier {
server_keys: (B, b),
user,
g: srp.g,
N: srp.N,
}
}
pub fn alice_proof() -> HandshakeProof<{ Srp6_4096::KEY_LEN }, { Srp6_4096::SALT_LEN }> {
HandshakeProof {
A: PublicKey::from_hex_str_be(
"5F1B7060 47346324 30A8A030 18CD56FE 9F837360 52F4D079 D8625A58
3E490541 4282F002 C3CB2883 765A7FD8 8B5C37D9 7D74554C B0A580FA
77F834E7 3D89DB9D B7AF622C F2E232B5 D6E4FE96 E7C0754D 6D7B4376
36250E22 168FBCE8 098ABAD8 21CF0248 3031A312 622B5998 CE2CC179
1A07DA7A 0E34AFB0 922BA1B6 CB4AE38F 77F08627 077DC11B A495FC56
BC1E43DE A0F3360D 1FEE7299 C4753EF3 68B2D6AC 1EECBB90 42471CB6
18C22D1C 2EBCEA18 4054E485 4FBDC049 EBA62829 64222744 44A465BB
B797B99A BFAF96B0 653B26CD 65A3E7C7 6E24BB2A E9083546 384B3444
34A1FC79 3488D4CC A6453B87 F840A42D BFFE37C6 F62CD694 63274D87
EE4807A2 31EA65AA 326A2C3C 4B8EBC90 6255D274 A3B80C6B 126CB078
B4C9CB5E 50E24A4D B2805F5F B1CECB14 8D717910 0B2E24CA 0511565E
5BC68C7A FA1660C8 6F7C70E1 0BEC8012 393297F9 5882B8A4 16FCDD47
B3B42E65 EA6DFD74 0FCC09D6 FEA8970F 36227A9E 007CA4D2 1C71729D
7FB1797E 226694A6 99B03F11 2C80EAF8 C0DE37FC 9482C3DE 7104D3AC
88818D56 AC16A9B0 55B60CE9 CD7834AE 1A555C7D 90F06825 E5005A27
8CF005A0 CEFB7556 6C53B083 8EF09D2E AC8BAAE5 357EA99B 3D7432E8
6058852A C8E1B3B1 D20DFD42 3DFA1EB3 E2AFFC14 A9352871 D7F68439
8C9D1563 37266C6D BD496BC1 BC1978BC 7E9A6E8D 6D0A5CB7 812A7B4D
FDA0DC79 C48FFC12",
)
.unwrap(),
M1: Proof::from_hex_str_be(
"EA8614A8 EE5C4B79 938C4E50 A3031376 1069895C 3EE1B66E 7E35D679
F9258E74 3C530738 DBB5B3DF 221E73CE 1385B20E 2B85FD36 B90F73D4
AB809D95 E3678C12",
)
.unwrap(),
}
}
pub fn strong_proof_verifier_from_step_3() -> StrongProofVerifier<{ Srp6_4096::KEY_LEN }> {
let alice_proof = alice_proof();
StrongProofVerifier {
A: alice_proof.A,
K: SessionKey::from_hex_str_be(
"DC5923B7 43FC8512 8AEE0096 D5EB3756 E4FB7EB0 405CEC8A AB4D3AA7
5F7CDDA8 344D0132 FC87F10D 3495C867 E10898AE CBD6C343 5F2A3221
3228BF96 72FACBBD DD042649 C4C037DE F5FDB3E3 B55EA3FA 92BE9ED9
0F8B29A5 7308130F B541BA79 A286223F 70DCA470 EC7E00C3 3F958DDF
9C4AA12B 66A35E53 85840EBC 6B6BA448",
)
.unwrap(),
M1: alice_proof.M1,
}
}
pub fn strong_proof_from_the_server() -> StrongProof {
let proof_verifier = stored_proof_verifier_from_step_2("alice");
let proof_from_alice = alice_proof();
let strong_proof = proof_verifier.verify_proof(&proof_from_alice);
let (strong_proof, _session_key_server) = strong_proof.unwrap();
strong_proof
}