summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-28 23:56:41 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-28 23:56:41 +0000
commit71eadd53afc4d1e194946aaa18b28586830e2c81 (patch)
tree761dab2d5d3555548523354f535f2dc3baba995a
parent1884db4297278d86fd6d0aeb34e1784a542556f1 (diff)
downloadpica-pica-71eadd53afc4d1e194946aaa18b28586830e2c81.tar.gz
pica-pica-71eadd53afc4d1e194946aaa18b28586830e2c81.zip
reading,checking and setting name from CSR;does not work with UTF8 names yet
git-svn-id: svn://localhost/project_picapica/trunk@155 fb96df88-216d-11de-830c-f3023f12d8ac
-rw-r--r--pica-registrar/PICA_registrar.cpp93
1 files changed, 92 insertions, 1 deletions
diff --git a/pica-registrar/PICA_registrar.cpp b/pica-registrar/PICA_registrar.cpp
index f39480d..885964e 100644
--- a/pica-registrar/PICA_registrar.cpp
+++ b/pica-registrar/PICA_registrar.cpp
@@ -177,11 +177,92 @@ void baninfo_update(struct sockaddr_in *a)
banmap[a->sin_addr.s_addr].last_reg = time_now;
}
+int readCSRname(string csr_filename, char *namebuf)
+{
+char pbuf[512];
+unsigned int bytes_read;
+FILE *p;
+int ret = 1;
+char *ptr1, *ptr2;
+
+p = popen(("openssl req -subject -nameopt oneline,-esc_msb,utf8 -noout -in " + csr_filename) .c_str(), "r");
+if (!p)
+ return 1;
+
+bytes_read = fread(pbuf, 1, 511, p);
+
+if (bytes_read < 15)
+ goto retn;
+
+pbuf[bytes_read] = '\0';
+
+puts(pbuf);//debug
+
+ptr1 = strstr(pbuf, "CN = ");
+
+if (!ptr1)
+ goto retn;
+
+puts("1");//debug
+
+ptr2 = ptr1+ 5;//skip "CN = "
+
+ptr1 = strchr(ptr2, '\n');
+
+if (!ptr1)
+ goto retn;
+
+puts("3");//debug
+
+*ptr1 = '\0';
+
+
+ptr1 = ptr2;
+
+while(*ptr1)
+{
+ switch(*ptr1)
+ {
+ case '#':
+ case '$':
+ case '&':
+ case '\"':
+ case '\'':
+ case '=':
+ case '(':
+ case ')':
+ case '\\':
+ case '/':
+ case '|':
+ case '`':
+ case '!':
+ case '<':
+ case '>':
+ case '{':
+ case '}':
+ case '[':
+ case ']':
+ goto retn;
+ }
+ ptr1++;
+}
+
+strncpy(namebuf, ptr2, 52);
+
+printf("name is %s\n", namebuf);//debug
+
+ret = 0;
+
+retn:
+pclose(p);
+return ret;
+}
int main(int argc, char *argv[])
{
int s, client_socket, ret, pos, disconnect_flag, bytes_read, cert_size;
struct sockaddr_in sd, sc;
+char namebuf[64];
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
@@ -254,6 +335,16 @@ while (1)
exit(1);
}
+ //get name from CSR
+ memset(namebuf, 0, 64);
+
+ if (readCSRname(filename, namebuf))
+ {
+ printf("invalid name!!!");
+ close(client_socket);
+ exit(1);
+ }
+
//prepare ca environment
std::string ca_dir;
{
@@ -313,7 +404,7 @@ while (1)
std::string cert_filename = (string)(current_id_str) + ".pem";
- std::string sign_command = (string)"openssl ca -config /home/root_jr/temp/catest/ca_config.txt -utf8 -subj /CN=" + current_id_str + "\\#tester -batch -notext -out " + cert_filename + " -in " + filename;
+ std::string sign_command = (string)"openssl ca -config /home/root_jr/temp/catest/ca_config.txt -subj \"/CN=" + current_id_str + "#" + namebuf + "\" -utf8 -batch -notext -out " + cert_filename + " -in " + filename;
puts(sign_command.c_str());//debug