]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
added support for Tom Wu's srp library tpasswd and tpasswd.conf files.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 12 May 2001 23:37:30 +0000 (23:37 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 12 May 2001 23:37:30 +0000 (23:37 +0000)
13 files changed:
configure.in
lib/Makefile.am
lib/auth_srp.c
lib/auth_srp.h
lib/auth_srp_passwd.c
lib/cert_b64.c
lib/cert_b64.h
lib/debug.c
lib/gnutls.h
lib/gnutls_int.h
lib/gnutls_srp.c
src/port.h
src/serv.c

index 6ea4a4e0b17bf34cb529dc7aeb6dba939260d3d0..7364e6fcf2b7e43fca88d568abda2ad7f2be93e4 100644 (file)
@@ -109,13 +109,14 @@ if test $ac_cv_prog_gcc != no; then
 
        if test $opt_profiler_mode = yes; then
          CFLAGS="${CFLAGS} -O0 -fprofile-arcs -ftest-coverage -pg"
-       else
-         CFLAGS="${CFLAGS} -O2 -ffast-math"
        fi
-               
+
        if test $opt_maintainer_mode = yes; then
-         CFLAGS="${CFLAGS} -ggdb3 -Wall -Wpointer-arith"
+         CFLAGS="${CFLAGS} -O0 -ggdb3 -Wall -Wpointer-arith"
+       else
+         CFLAGS="${CFLAGS} -O2"
        fi
+
        if test $opt_dmalloc_mode = yes; then
          AC_CHECK_LIB( dmalloc, main)
          AC_DEFINE(USE_DMALLOC)
index 5e6f6ed319d8e66ddcefeaf7819b27651b94d0f4..f07f40a1ccb1bbde9556add8684a53b172b11b1c 100644 (file)
@@ -15,5 +15,5 @@ libgnutls_la_SOURCES = gnutls.c gnutls_compress.c debug.c gnutls_plaintext.c \
        gnutls_compress_int.c gnutls_session.c gnutls_db.c cert_b64.c \
        auth_anon.c auth_dhe_dss.c gnutls_extensions.c ext_srp.c gnutls_auth.c \
        crypt_bcrypt.c crypt.c gnutls_random.c crypt_srpsha1.c gnutls_srp.c \
-       auth_srp.c auth_srp_passwd.c gnutls_v2_compat.c
+       auth_srp.c auth_srp_passwd.c gnutls_v2_compat.c cert_sb64.c
 libgnutls_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
index ca65f1504c4fc474ddd3852883e373b2fd843843..a150e76cfc784355957dd72782bb10fa2269465d 100644 (file)
@@ -331,7 +331,7 @@ int proc_srp_server_kx(GNUTLS_KEY key, opaque * data, int data_size)
        }
 
        gnutls_free(hd);
-       
+
        return 0;
 }
 
index 4e6dd7b2de3625b66f3ec1ebcbf6ad3cdf034d16..99f73aff1b80e30eca08f3dfb41832133410e551 100644 (file)
@@ -8,4 +8,5 @@ typedef struct {
 
 typedef struct {
        char* password_file;
+       char* password_conf_file;
 } SRP_SERVER_CREDENTIALS;
index 06573a9b63069c891fff5060d528e326414ff774..119cde8b49e31698f0a4ed22d8add022d8b01a09 100644 (file)
 #include "gnutls_random.h"
 #include "debug.h"
 
+/* this function parses tpasswd.conf file. Format is:
+ * string(username):base64(v):base64(salt):int(index)
+ */
 static int pwd_put_values( GNUTLS_SRP_PWD_ENTRY *entry, char *str, int str_size) {
 char * p;
 int len;
 opaque *verifier;
 int verifier_size;
-opaque * tmp;
-int tmp_size;
+int index;
 
-       p = rindex( str, '$'); /* we have n */
-       if (p==NULL) return -1;
+       entry->algorithm = SRPSHA1_CRYPT;
+       
+       p = rindex( str, ':'); /* we have index */
+       if (p==NULL) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
        
        *p='\0';
        p++;
-       
+
        len = strlen(p);
-       tmp_size = _gnutls_base64_decode( p, len, &tmp);
-       if (tmp_size < 0) {
-               gnutls_free(tmp);
-               return GNUTLS_E_PARSING_ERROR;
-       }
-       if (gcry_mpi_scan(&entry->n, GCRYMPI_FMT_USG, tmp, &tmp_size)) {
+       index = atoi(p);
+       if (index==0) {
                gnutls_assert();
-               gnutls_free(tmp);
-               return GNUTLS_E_MPI_SCAN_FAILED;
+               return GNUTLS_E_PARSING_ERROR;
        }
-       gnutls_free(tmp);
-
-       /* now go for g */
-       p = rindex( str, '$'); /* we have g */
+       
+       /* now go for salt */
+       p = rindex( str, ':'); /* we have salt */
        if (p==NULL) {
-               mpi_release(entry->n);
                gnutls_assert();
                return GNUTLS_E_PARSING_ERROR;
        }
@@ -70,28 +70,17 @@ int tmp_size;
        p++;
        
        len = strlen(p);
-       tmp_size = _gnutls_base64_decode( p, len, &tmp);
+       entry->salt_size = _gnutls_sbase64_decode( p, len, &entry->salt);
 
-       if (tmp_size < 0) {
+       if (entry->salt_size <= 0) {
                gnutls_assert();
-               mpi_release(entry->n);
-               gnutls_free(tmp);
                return GNUTLS_E_PARSING_ERROR;
        }
-       if (gcry_mpi_scan(&entry->g, GCRYMPI_FMT_USG, tmp, &tmp_size)) {
-               gnutls_assert();
-               gnutls_free(tmp);
-               mpi_release(entry->n);
-               return GNUTLS_E_MPI_SCAN_FAILED;
-       }
-
-       gnutls_free(tmp);
 
        /* now go for verifier */
-       p = rindex( str, '$'); /* we have verifier */
+       p = rindex( str, ':'); /* we have verifier */
        if (p==NULL) {
-               mpi_release(entry->n);
-               mpi_release(entry->g);
+               gnutls_free(entry->salt);
                return GNUTLS_E_PARSING_ERROR;
        }
        
@@ -99,80 +88,141 @@ int tmp_size;
        p++;
        
        len = strlen(p);
-       verifier_size = _gnutls_base64_decode( p, len, &verifier);
-       if (verifier_size < 0) {
+       verifier_size = _gnutls_sbase64_decode( p, len, &verifier);
+       if (verifier_size <= 0) {
                gnutls_assert();
-               mpi_release(entry->n);
-               mpi_release(entry->g);
+               gnutls_free(entry->salt);
                return GNUTLS_E_PARSING_ERROR;
        }
 
        if (gcry_mpi_scan(&entry->v, GCRYMPI_FMT_USG, verifier, &verifier_size)) {
                gnutls_assert();
-               mpi_release(entry->n);
-               mpi_release(entry->g);
+               gnutls_free(entry->salt);
                return GNUTLS_E_MPI_SCAN_FAILED;
        }
 
 
-       /* now go for salt */
-       p = rindex( str, '$'); /* we have salt */
+       /* now go for username */
+       *p='\0';
+
+       entry->username = strdup(str);
+
+       return index;
+}
+
+
+/* this function parses tpasswd.conf file. Format is:
+ * int(index):base64(n):int(g)
+ */
+static int pwd_put_values2( GNUTLS_SRP_PWD_ENTRY *entry, char *str, int str_size) {
+char * p;
+int len;
+opaque * tmp;
+int tmp_size;
+
+       p = rindex( str, ':'); /* we have g */
        if (p==NULL) {
-               mpi_release(entry->n);
-               mpi_release(entry->g);
-               mpi_release(entry->v);
-               return -1;
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
        }
        
        *p='\0';
        p++;
-
+       
+       /* read the generator */
        len = strlen(p);
-       entry->salt_size = _gnutls_base64_decode( p, len, &entry->salt);
-       if (entry->salt_size < 0) {
+       tmp_size = _gnutls_sbase64_decode( p, len, &tmp);
+
+       if (tmp_size < 0) {
                gnutls_assert();
-               mpi_release(entry->n);
-               mpi_release(entry->v);
-               mpi_release(entry->g);
+               gnutls_free(tmp);
+               return GNUTLS_E_PARSING_ERROR;
+       }
+       if (gcry_mpi_scan(&entry->g, GCRYMPI_FMT_USG, tmp, &tmp_size)) {
+               gnutls_assert();
+               gnutls_free(tmp);
+               return GNUTLS_E_MPI_SCAN_FAILED;
        }
 
-       /* now go for algorithm */
-       p = rindex( str, '$'); /* we have algorithm */
+       gnutls_free(tmp);
+
+
+       /* now go for n - modulo */
+       p = rindex( str, ':'); /* we have n */
        if (p==NULL) {
-               mpi_release(entry->n);
                mpi_release(entry->g);
-               mpi_release(entry->v);
-               gnutls_free(entry->salt);
-               return -1;
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
        }
        
        *p='\0';
        p++;
+       
+       len = strlen(p);
+       tmp_size = _gnutls_sbase64_decode( p, len, &tmp);
 
-       entry->algorithm = atoi(p);
-
-       /* now go for username */
-       p = index( str, ':'); /* we have algorithm */
-       if (p==NULL) {
-               mpi_release(entry->n);
+       if (tmp_size < 0) {
+               gnutls_assert();
                mpi_release(entry->g);
-               mpi_release(entry->v);
-               gnutls_free(entry->salt);
+               gnutls_free(tmp);
                return GNUTLS_E_PARSING_ERROR;
        }
-       *p='\0';
+       if (gcry_mpi_scan(&entry->n, GCRYMPI_FMT_USG, tmp, &tmp_size)) {
+               gnutls_assert();
+               gnutls_free(tmp);
+               mpi_release(entry->g);
+               return GNUTLS_E_MPI_SCAN_FAILED;
+       }
 
-       entry->username = strdup(p);
+       gnutls_free(tmp);
 
        return 0;
 }
 
+
+/* this function opens the tpasswd.conf file
+ */
+static int pwd_read_conf( SRP_SERVER_CREDENTIALS* cred, GNUTLS_SRP_PWD_ENTRY* entry, int index) {
+       FILE * fd;
+       char line[5*1024];
+       int i;
+       char indexstr[10];
+
+       sprintf( indexstr, "%d", index);
+
+       fd = fopen( cred->password_conf_file, "r");
+       if (fd==NULL) {
+               gnutls_assert();
+               gnutls_free(entry);
+               return GNUTLS_E_PWD_ERROR;
+       }
+
+       while( fgets( line, sizeof(line), fd) != NULL) {
+    /* move to first ':' */
+           i=0;
+           while( (line[i]!=':') && (line[i]!='\0') && (i < sizeof(line)) ) {
+                   i++;
+           }
+           if (strncmp( indexstr, line, i) == 0) {
+                       if ((index = pwd_put_values2( entry, line, strlen(line))) >= 0)
+                               return 0;
+                       else {
+                               return GNUTLS_E_PWD_ERROR;
+                       }
+           }
+    }
+    return GNUTLS_E_PWD_ERROR;
+       
+}
+
+
 GNUTLS_SRP_PWD_ENTRY *_gnutls_srp_pwd_read_entry( GNUTLS_KEY key, char* username) {
        SRP_SERVER_CREDENTIALS* cred;
        FILE * fd;
        char line[5*1024];
        int i;
        GNUTLS_SRP_PWD_ENTRY * entry = gnutls_malloc(sizeof(GNUTLS_SRP_PWD_ENTRY));
+       int index;
 
        cred = _gnutls_get_kx_cred( key, GNUTLS_KX_SRP, NULL);
        if (cred==NULL) {
@@ -195,8 +245,13 @@ GNUTLS_SRP_PWD_ENTRY *_gnutls_srp_pwd_read_entry( GNUTLS_KEY key, char* username
                    i++;
            }
            if (strncmp( username, line, i) == 0) {
-                       if (pwd_put_values( entry, line, strlen(line))==0)
-                               return entry;
+                       if ((index = pwd_put_values( entry, line, strlen(line))) >= 0)
+                               if (pwd_read_conf( cred, entry, index)==0) {
+                                       return entry;
+                               } else {
+                                       gnutls_free(entry);
+                                       return NULL;
+                               }
                        else {
                                gnutls_free(entry);
                                return NULL;
index d905954a71ed14bd5978cc28ff14f6f571d5ac21..f9a80b88fae6bcf6aeddb2f7903cb51426c8427a 100644 (file)
@@ -20,7 +20,6 @@
 
 #include "defines.h"
 #include "gnutls_int.h"
-#define gnutls_free free
 
 const static uint8 b64table[64] =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
index 58d4353044d2f5f489f66824dd8dd87c16ada48c..d69b6f273c142ec9473907a1fadff7a7cb9a32b9 100644 (file)
@@ -4,3 +4,5 @@ int _gnutls_fbase64_encode(char *msg, uint8 * data, int data_size,
 int _gnutls_base64_decode(uint8 * data, int data_size, uint8 ** result);
 int _gnutls_fbase64_decode(char *msg, uint8 * data, int data_size,
                           uint8 ** result);
+int _gnutls_sbase64_encode(uint8 * data, int data_size, uint8 ** result);
+int _gnutls_sbase64_decode(uint8 * data, int data_size, uint8 ** result);
index c5b0e1674a8b90815041b8e3b5f1dc80b1e25fe2..ffc1eb6756a14e957ae73b90d9703585bfbbc9f7 100644 (file)
@@ -30,10 +30,10 @@ void _gnutls_dump_mpi(char* prefix, MPI a)
 {
        char buf[400];
        size_t n = sizeof buf;
-
+       
        if (gcry_mpi_print(GCRYMPI_FMT_HEX, buf, &n, a))
                strcpy(buf, "[can't print value]");
-       fprintf(stderr, "MPI: %s%s\n", prefix, buf);
+       fprintf(stderr, "MPI: length: %d\n\t%s%s\n", (n-1)/2, prefix, buf);
 }
 
 
index 568fcc59b4ee6c5b2ab2efdb82938db1e6512d6d..b40301c0683e6deb712cef99c55bb89ea9409ece 100644 (file)
@@ -114,6 +114,7 @@ typedef struct {
 
 typedef struct {
        char* password_file;
+       char* password_conf_file;
 } SRP_SERVER_CREDENTIALS;
 
 
index 7cd7cd20f229c4dd6cb4d9a05b3f95d017c4b440..6320925dab4a45c2ed9b8614daa70316e6e434b0 100644 (file)
@@ -28,8 +28,8 @@
 #define BUFFERS_DEBUG
 #define HANDSHAKE_DEBUG
 #define HARD_DEBUG
-#define DEBUG
 */
+#define DEBUG
 
 #define MAX32 4294967295
 #define MAX24 16777215
index 35fbb0f5f5f079a9df259aaff83c02f5c6f5f0c2..c0a87b2aa143c1488c4f2b0cb5bcc7779443118d 100644 (file)
@@ -63,13 +63,13 @@ int _gnutls_srp_gx(opaque *text, int textsize, opaque** result, opaque** ret_g,
        if (gcry_mpi_scan(&prime, GCRYMPI_FMT_USG,
                          diffie_hellman_group1_prime, &n)) {
                gnutls_assert();
-               return -1;
+               return GNUTLS_E_MPI_SCAN_FAILED;
        }
        if (gcry_mpi_scan(&x, GCRYMPI_FMT_USG,
                          text, &textsize)) {
                gnutls_assert();
                gcry_mpi_release(prime);
-               return -1;
+               return GNUTLS_E_MPI_SCAN_FAILED;
        }
 
        g = gcry_mpi_set_ui(NULL, SRP_G);
@@ -80,6 +80,7 @@ int _gnutls_srp_gx(opaque *text, int textsize, opaque** result, opaque** ret_g,
        gcry_mpi_powm(e, g, x, prime);
        gcry_mpi_release(x);
 
+       
        gcry_mpi_print(GCRYMPI_FMT_USG, NULL, &result_size, e);
        if (result!=NULL) {
                *result = gnutls_malloc(result_size);
@@ -227,22 +228,20 @@ int bits;
  */
 void* _gnutls_calc_srp_sha( char* username, char* password, opaque* salt, int salt_size) {
 GNUTLS_MAC_HANDLE td;
-opaque* hd;
+opaque* res;
 
        td = gnutls_hash_init(GNUTLS_MAC_SHA);
        gnutls_hash(td, username, strlen(username));
        gnutls_hash(td, ":", 1);
        gnutls_hash(td, password, strlen(password));
-       hd = gnutls_hash_deinit(td);
+       res = gnutls_hash_deinit(td);
 
        td = gnutls_hash_init(GNUTLS_MAC_SHA);
        gnutls_hash(td, salt, salt_size);
-       gnutls_hash(td, hd, 20);
-       gnutls_free(hd);
+       gnutls_hash(td, res, 20); /* 20 bytes is the output of sha1 */
+       gnutls_free(res);
 
-       hd = gnutls_hash_deinit(td);
-
-       return hd;      
+       return gnutls_hash_deinit(td);
 }
 
 void* _gnutls_calc_srp_x( char* username, char* password, opaque* salt, int salt_size, uint8 crypt_algo) {
@@ -269,6 +268,7 @@ MPI S, tmp1, tmp2, tmp4;
        tmp2 = gcry_mpi_alloc_like(n);
 
        gcry_mpi_powm(tmp1, g, x, n);
+
        gcry_mpi_subm(tmp2, B, tmp1, n);
 
        tmp4 = gcry_mpi_alloc_like(n);
index 003fa6f42e52d9f9f8ee299c7caef94afbd8a805..696b48cb7dd25dca762ce217e7cc0ce5b4d90562 100644 (file)
@@ -1,2 +1,2 @@
-#define PORT 5555
+#define PORT 5556
 #define SERVER "127.0.0.1"
index a025cf1801a8964307604823a31d181e8cf0b1b6..0d4bef9285a7b1bf9a26198228eb47b987f8a3d7 100644 (file)
@@ -48,7 +48,8 @@ int main()
     
     /* this is a password file (created with the included crypt utility) 
      */
-    cred.password_file="/tmp/pwd";
+    cred.password_file="/etc/tpasswd";
+    cred.password_conf_file="/etc/tpasswd.conf";
     
     listen_sd = socket(AF_INET, SOCK_STREAM, 0);
     ERR(listen_sd, "socket");