summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pica-registrar/PICA_registrar.cpp136
1 files changed, 98 insertions, 38 deletions
diff --git a/pica-registrar/PICA_registrar.cpp b/pica-registrar/PICA_registrar.cpp
index 608708e..aea4e90 100644
--- a/pica-registrar/PICA_registrar.cpp
+++ b/pica-registrar/PICA_registrar.cpp
@@ -9,10 +9,14 @@
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/errno.h>
+#include <sys/stat.h>
+
#include <cstring>
#include <cstdlib>
+#include <cstdio>
#include <map>
+#include <string>
using namespace std;
@@ -25,11 +29,11 @@ char read_buf[READ_BUF_SIZE];
char write_buf[WRITE_BUF_SIZE];
-unsigned int current_id = 30 000;
+unsigned int current_id = 30000;
int read_CSR(int client_socket, int *bytes_read)
{
-int pos = 0;
+int pos = 0, ret;
int disconnect_flag = 0;
do
{
@@ -52,11 +56,12 @@ int disconnect_flag = 0;
return disconnect_flag;
}
-int store_CSR(std::string csr_filename, int csr_size)
+int store_CSR(string csr_filename, int csr_size)
{
FILE *csr_temp;
+int ret;
-csr_temp = fopen(csr_filename.c_str, "w");
+csr_temp = fopen(csr_filename.c_str(), "w");
if (!csr_temp)
{
@@ -70,7 +75,7 @@ if (ret != 1)
{
perror("fwrite");
fclose(csr_temp);
- remove(csr_filename.c_str);
+ remove(csr_filename.c_str());
return 1;
}
@@ -79,13 +84,64 @@ fclose(csr_temp);
return 0;
}
+int send_cert(int client_socket, string cert_filename)
+{
+int cert_size, ret, bs;
+FILE *cert;
+
+ //get file size
+struct stat st;
+if (stat(cert_filename.c_str(), &st))
+ return 1;
+
+cert_size = st.st_size;
+
+
+cert = fopen(cert_filename.c_str(), "r");
+
+if (!cert)
+ {
+ perror("fopen");
+ return 1;
+ }
+
+//read
+ret = fread(write_buf, cert_size, 1, cert);
+
+if (ret !=1)
+ {
+ perror("fread");
+ fclose(cert);
+ return 1;
+ }
+
+//send
+
+bs = 0;
+do
+{
+ ret = send(client_socket, write_buf + bs, cert_size - bs, MSG_NOSIGNAL);
+
+ if (ret <=0)
+ break;
+
+ bs += ret;
+
+} while (bs < cert_size);
+
+if (bs < cert_size)
+ return 1;
+
+return 0;
+}
+
int main(int argc, char *argv[])
{
-int socket, client_socket, ret, pos, disconnect_flag, bytes_read, cert_size;
+int s, client_socket, ret, pos, disconnect_flag, bytes_read, cert_size;
struct sockaddr_in sd, sc;
-socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&sd,0,sizeof(sd));
@@ -93,15 +149,17 @@ sd.sin_family = AF_INET;
sd.sin_addr.s_addr = INADDR_ANY;
sd.sin_port = htons(PICA_REGISTRAR_PORT);
-ret = bind(socket,(struct sockaddr*)&sd,sizeof(sd));
+ret = bind(s,(struct sockaddr*)&sd,sizeof(sd));
-ret = listen(socket, 60);
+ret = listen(s, 60);
while (1)
{
+ socklen_t sockaddr_size = sizeof(sc);
+
memset(&sc, 0, sizeof(sc));
- client_socket = accept(socket, (struct sockaddr*)&sc, sizeof(sc) );
+ client_socket = accept(s, (struct sockaddr*)&sc, &sockaddr_size);
if (client_socket >= 0)
{
@@ -109,50 +167,52 @@ while (1)
disconnect_flag = read_CSR(client_socket, &bytes_read);
if (disconnect_flag)
- continue;
+ {
+ shutdown(client_socket, SHUT_RDWR);
+ close(client_socket);
+ continue;
+ }
+
+
- {
- FILE *cert;
std::string filename = (string("/tmp/CSR-") + inet_ntoa(sc.sin_addr) );
if (store_CSR(filename, bytes_read))
- continue;
-
- std::string cert_filename = atoi(current_id) + ".pem";
+ {
+ shutdown(client_socket, SHUT_RDWR);
+ close(client_socket);
+ continue;
+ }
- std::string sign_command = "openssl ca -config ca_config.txt -utf8 -subj /CN=" + atoi(current_id) + "\\#tester -batch -notext -out " + cert_filename + " -in " + csr_temp;
+ char current_id_str[256];
- puts(sign_command.c_str);//debug
+ sprintf(current_id_str, "%u", current_id);
- system(sign_command.c_str);
+ std::string cert_filename = (string)(current_id_str) + ".pem";
- //get file size
- {
- struct stat st;
- if (stat(cert_filename.c_str(), &st))
- continue;
-
- cert_size = st.st_size;
- }
+ std::string sign_command = (string)"openssl ca -config ca_config.txt -utf8 -subj /CN=" + current_id_str + "\\#tester -batch -notext -out " + cert_filename + " -in " + filename;
- cert = fopen(cert_filename, "r");
+ puts(sign_command.c_str());//debug
- if (!cert)
- {
- perror("fopen");
- remove(filename.c_str);
- remove(cert_filename);
- continue;
- }
+ system(sign_command.c_str());
- //send
+ if (send_cert(client_socket, cert_filename))
+ goto freeres_1;
current_id++;
- remove(filename.c_str);
- }
+ freeres_1:
+ remove(cert_filename.c_str());
+
+ freeres_2:
+ remove(filename.c_str());
+
+ freeres_3:
+ shutdown(client_socket, SHUT_RDWR);
+ close(client_socket);
+
}
else