static void read_dh_parameters(int fd, const char *fname) { gnutls_datum dbits, prime, generator; int ret, bits; if ((ret = gnutls_dh_params_init(&dh_params)) < 0) { i_fatal("gnutls_dh_params_init() failed: %s", gnutls_strerror(ret)); } /* read until bits field is 0 */ for (;;) { read_next_field(fd, &dbits, fname, "DH bits"); if (dbits.size != sizeof(int)) { (void)unlink(fname); i_fatal("Corrupted SSL parameter file %s: " "Field 'DH bits' has invalid size %u", fname, dbits.size); } bits = *((int *) dbits.data); if (bits == 0) break; read_next_field(fd, &prime, fname, "DH prime"); read_next_field(fd, &generator, fname, "DH generator"); ret = gnutls_dh_params_set(dh_params, prime, generator, bits); if (ret < 0) { i_fatal("gnutls_dh_params_set() failed: %s", gnutls_strerror(ret)); } } }
int next_string_field( input_string_def *is, char *buf, int nbuf ) { int length; char *start; int sts; sts = read_next_field( is, &start, &length ); if( sts != OK ) return sts; if( length >= nbuf ) length = nbuf-1; memcpy( buf, start, length ); buf[length] = 0; return OK; }
int test_next_string_field( input_string_def *is, const char *test ) { int length; char *start; double loc; int sts; loc = get_string_loc(is); sts = read_next_field( is, &start, &length ); if( sts != OK ) return 0; if( (int) strlen(test) == length && _strnicmp(test,start,length)==0 ) return 1; set_string_loc(is,loc); return 0; }
int replace_next_field( input_string_def *is, const char *replacement ) { char *s, *e, *c; char *start; int length; int sts; int len=strlen(replacement); s = is->ptr; sts=read_next_field( is, &start, &length ); if( sts != OK ) return NO_MORE_DATA; e = is->ptr; if( e-s < len ) return TOO_MUCH_DATA; strncpy(s,replacement,len); for( c=s+len; c < e; c++ ) *c=' '; is->ptr = s; return OK; }
static int parse_number( input_string_def *is, const char *fmt, void *value ) { int length, nfld, sts; char *fld, save, garbage; sts = read_next_field( is, &fld, &length ); if( sts != OK ) return sts; /* Put a NULL terminator at the end of the string */ save = fld[length]; fld[length] = 0; nfld = sscanf( fld, fmt, value, &garbage ); fld[length] = save; /* Determine the return status */ return nfld == 1 ? OK : INVALID_DATA; }
static void read_rsa_parameters(int fd, const char *fname) { gnutls_datum m, e, d, p, q, u; int ret; read_next_field(fd, &m, fname, "RSA m"); read_next_field(fd, &e, fname, "RSA e"); read_next_field(fd, &d, fname, "RSA d"); read_next_field(fd, &p, fname, "RSA p"); read_next_field(fd, &q, fname, "RSA q"); read_next_field(fd, &u, fname, "RSA u"); if ((ret = gnutls_rsa_params_init(&rsa_params)) < 0) { i_fatal("gnutls_rsa_params_init() failed: %s", gnutls_strerror(ret)); } /* only 512bit is allowed */ ret = gnutls_rsa_params_set(rsa_params, m, e, d, p, q, u, 512); if (ret < 0) { i_fatal("gnutls_rsa_params_set() failed: %s", gnutls_strerror(ret)); } }
int skip_string_field( input_string_def *is ) { char *start; int length; return read_next_field( is, &start, &length ); }