/* this function parses passwd.psk file. Format is: * string(username):hex(passwd) */ static int pwd_put_values(gnutls_datum_t * psk, char *str) { char *p; int len, ret; gnutls_datum_t tmp; p = strchr(str, ':'); if (p == NULL) { gnutls_assert(); return GNUTLS_E_SRP_PWD_PARSING_ERROR; } *p = '\0'; p++; /* skip username */ /* read the key */ len = strlen(p); if (p[len - 1] == '\n' || p[len - 1] == ' ') len--; tmp.data = (void*)p; tmp.size = len; ret = gnutls_hex_decode2(&tmp, psk); if (ret < 0) { gnutls_assert(); return ret; } return 0; }
static int dn_attr_crt_set(set_dn_func f, void *crt, const gnutls_datum_t * name, const gnutls_datum_t * val, unsigned is_raw) { char _oid[MAX_OID_SIZE]; gnutls_datum_t tmp; const char *oid; int ret; unsigned i,j; if (name->size == 0 || val->size == 0) return gnutls_assert_val(GNUTLS_E_PARSING_ERROR); if (c_isdigit(name->data[0]) != 0) { if (name->size >= sizeof(_oid)) return gnutls_assert_val(GNUTLS_E_PARSING_ERROR); memcpy(_oid, name->data, name->size); _oid[name->size] = 0; oid = _oid; if (gnutls_x509_dn_oid_known(oid) == 0 && !is_raw) { _gnutls_debug_log("Unknown OID: '%s'\n", oid); return gnutls_assert_val(GNUTLS_E_PARSING_ERROR); } } else { oid = _gnutls_ldap_string_to_oid((char *) name->data, name->size); } if (oid == NULL) { _gnutls_debug_log("Unknown DN attribute: '%.*s'\n", (int) name->size, name->data); return gnutls_assert_val(GNUTLS_E_PARSING_ERROR); } if (is_raw) { gnutls_datum_t hex = {val->data+1, val->size-1}; ret = gnutls_hex_decode2(&hex, &tmp); if (ret < 0) return gnutls_assert_val(GNUTLS_E_PARSING_ERROR); } else { tmp.size = val->size; tmp.data = gnutls_malloc(tmp.size+1); if (tmp.data == NULL) { return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); } /* unescape */ for (j=i=0;i<tmp.size;i++) { if (1+j!=val->size && val->data[j] == '\\') { if (val->data[j+1] == ',' || val->data[j+1] == '#' || val->data[j+1] == ' ' || val->data[j+1] == '+' || val->data[j+1] == '"' || val->data[j+1] == '<' || val->data[j+1] == '>' || val->data[j+1] == ';' || val->data[j+1] == '\\' || val->data[j+1] == '=') { tmp.data[i] = val->data[j+1]; j+=2; tmp.size--; } else { ret = gnutls_assert_val(GNUTLS_E_PARSING_ERROR); goto fail; } } else { tmp.data[i] = val->data[j++]; } } tmp.data[tmp.size] = 0; } ret = f(crt, oid, is_raw, tmp.data, tmp.size); if (ret < 0) { gnutls_assert(); goto fail; } ret = 0; fail: gnutls_free(tmp.data); return ret; }