Branch data Line data Source code
1 : : #include <openssl/opensslconf.h>
2 : : #ifdef OPENSSL_NO_SRP
3 : :
4 : : #include <stdio.h>
5 : :
6 : : int main(int argc, char *argv[])
7 : : {
8 : : printf("No SRP support\n");
9 : : return(0);
10 : : }
11 : :
12 : : #else
13 : :
14 : : #include <openssl/srp.h>
15 : : #include <openssl/rand.h>
16 : : #include <openssl/err.h>
17 : :
18 : 20 : static void showbn(const char *name, const BIGNUM *bn)
19 : : {
20 : 20 : fputs(name, stdout);
21 : 20 : fputs(" = ", stdout);
22 : 20 : BN_print_fp(stdout, bn);
23 : 20 : putc('\n', stdout);
24 : 20 : }
25 : :
26 : : #define RANDOM_SIZE 32 /* use 256 bits on each side */
27 : :
28 : 2 : static int run_srp(const char *username, const char *client_pass, const char *server_pass)
29 : : {
30 : 2 : int ret=-1;
31 : 2 : BIGNUM *s = NULL;
32 : 2 : BIGNUM *v = NULL;
33 : 2 : BIGNUM *a = NULL;
34 : 2 : BIGNUM *b = NULL;
35 : 2 : BIGNUM *u = NULL;
36 : 2 : BIGNUM *x = NULL;
37 : 2 : BIGNUM *Apub = NULL;
38 : 2 : BIGNUM *Bpub = NULL;
39 : 2 : BIGNUM *Kclient = NULL;
40 : 2 : BIGNUM *Kserver = NULL;
41 : : unsigned char rand_tmp[RANDOM_SIZE];
42 : : /* use builtin 1024-bit params */
43 : 2 : const SRP_gN *GN = SRP_get_default_gN("1024");
44 : :
45 [ - + ]: 2 : if(GN == NULL)
46 : : {
47 : 0 : fprintf(stderr, "Failed to get SRP parameters\n");
48 : 0 : return -1;
49 : : }
50 : : /* Set up server's password entry */
51 [ - + ]: 2 : if(!SRP_create_verifier_BN(username, server_pass, &s, &v, GN->N, GN->g))
52 : : {
53 : 0 : fprintf(stderr, "Failed to create SRP verifier\n");
54 : 0 : return -1;
55 : : }
56 : :
57 : 2 : showbn("N", GN->N);
58 : 2 : showbn("g", GN->g);
59 : 2 : showbn("Salt", s);
60 : 2 : showbn("Verifier", v);
61 : :
62 : : /* Server random */
63 : 2 : RAND_pseudo_bytes(rand_tmp, sizeof(rand_tmp));
64 : 2 : b = BN_bin2bn(rand_tmp, sizeof(rand_tmp), NULL);
65 : : /* TODO - check b != 0 */
66 : 2 : showbn("b", b);
67 : :
68 : : /* Server's first message */
69 : 2 : Bpub = SRP_Calc_B(b, GN->N, GN->g, v);
70 : 2 : showbn("B", Bpub);
71 : :
72 [ - + ]: 2 : if(!SRP_Verify_B_mod_N(Bpub, GN->N))
73 : : {
74 : 0 : fprintf(stderr, "Invalid B\n");
75 : 0 : return -1;
76 : : }
77 : :
78 : : /* Client random */
79 : 2 : RAND_pseudo_bytes(rand_tmp, sizeof(rand_tmp));
80 : 2 : a = BN_bin2bn(rand_tmp, sizeof(rand_tmp), NULL);
81 : : /* TODO - check a != 0 */
82 : 2 : showbn("a", a);
83 : :
84 : : /* Client's response */
85 : 2 : Apub = SRP_Calc_A(a, GN->N, GN->g);
86 : 2 : showbn("A", Apub);
87 : :
88 [ - + ]: 2 : if(!SRP_Verify_A_mod_N(Apub, GN->N))
89 : : {
90 : 0 : fprintf(stderr, "Invalid A\n");
91 : 0 : return -1;
92 : : }
93 : :
94 : : /* Both sides calculate u */
95 : 2 : u = SRP_Calc_u(Apub, Bpub, GN->N);
96 : :
97 : : /* Client's key */
98 : 2 : x = SRP_Calc_x(s, username, client_pass);
99 : 2 : Kclient = SRP_Calc_client_key(GN->N, Bpub, GN->g, x, a, u);
100 : 2 : showbn("Client's key", Kclient);
101 : :
102 : : /* Server's key */
103 : 2 : Kserver = SRP_Calc_server_key(Apub, v, u, b, GN->N);
104 : 2 : showbn("Server's key", Kserver);
105 : :
106 [ + + ]: 2 : if(BN_cmp(Kclient, Kserver) == 0)
107 : : {
108 : : ret = 0;
109 : : }
110 : : else
111 : : {
112 : 1 : fprintf(stderr, "Keys mismatch\n");
113 : 1 : ret = 1;
114 : : }
115 : :
116 : 2 : BN_clear_free(Kclient);
117 : 2 : BN_clear_free(Kserver);
118 : 2 : BN_clear_free(x);
119 : 2 : BN_free(u);
120 : 2 : BN_free(Apub);
121 : 2 : BN_clear_free(a);
122 : 2 : BN_free(Bpub);
123 : 2 : BN_clear_free(b);
124 : 2 : BN_free(s);
125 : 2 : BN_clear_free(v);
126 : :
127 : 2 : return ret;
128 : : }
129 : :
130 : 1 : int main(int argc, char **argv)
131 : : {
132 : : BIO *bio_err;
133 : 1 : bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
134 : :
135 : 1 : CRYPTO_malloc_debug_init();
136 : 1 : CRYPTO_dbg_set_options(V_CRYPTO_MDEBUG_ALL);
137 : 1 : CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
138 : :
139 : 1 : ERR_load_crypto_strings();
140 : :
141 : : /* "Negative" test, expect a mismatch */
142 [ - + ]: 1 : if(run_srp("alice", "password1", "password2") == 0)
143 : : {
144 : 0 : fprintf(stderr, "Mismatched SRP run failed\n");
145 : 0 : return 1;
146 : : }
147 : :
148 : : /* "Positive" test, should pass */
149 [ - + ]: 1 : if(run_srp("alice", "password", "password") != 0)
150 : : {
151 : 0 : fprintf(stderr, "Plain SRP run failed\n");
152 : 0 : return 1;
153 : : }
154 : :
155 : 1 : CRYPTO_cleanup_all_ex_data();
156 : 1 : ERR_remove_thread_state(NULL);
157 : 1 : ERR_free_strings();
158 : 1 : CRYPTO_mem_leaks(bio_err);
159 : :
160 : 1 : return 0;
161 : : }
162 : : #endif
|