static int build_subject(X509_REQ *req, char *subject, unsigned long chtype)
	{
	X509_NAME *n = NULL;

	int i, nid, ne_num=0;

	char *ne_name = NULL;
	char *ne_value = NULL;

	char *tmp = NULL;
	char *p[2];

	char *str_list[256];
       
	p[0] = ",/";
        p[1] = "=";

	n = X509_NAME_new();

	tmp = strtok(subject, p[0]);
	while((tmp != NULL) && (ne_num < (sizeof str_list/sizeof *str_list)))
		{
		char *token = tmp;

		while (token[0] == ' ')
			token++;
		str_list[ne_num] = token;

		tmp = strtok(NULL, p[0]);
		ne_num++;
		}

	for(i = 0; i < ne_num; i++)
		{
		ne_name  = strtok(str_list[i], p[1]);
		ne_value = strtok(NULL, p[1]);

		if ((nid=OBJ_txt2nid(ne_name)) == NID_undef)
			{
			BIO_printf(bio_err, "Subject Attribute %s has no known NID, skipped\n", ne_name);
			continue;
			}

		if (ne_value == NULL)
			{
			BIO_printf(bio_err, "No value provided for Subject Attribute %s, skipped\n", ne_name);
			continue;
			}

		if (!X509_NAME_add_entry_by_NID(n, nid, chtype, (unsigned char*)ne_value, -1,-1,0))
			{
			X509_NAME_free(n);
			return 0;
			}
		}

	if (!X509_REQ_set_subject_name(req, n))
		return 0;
	X509_NAME_free(n);
	return 1;
}