LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/test - srptest.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 70 82 85.4 %
Date: 2014-08-02 Functions: 3 3 100.0 %
Branches: 8 14 57.1 %

           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

Generated by: LCOV version 1.9