diff options
| -rw-r--r-- | pica-registrar/PICA_registrar.cpp | 136 |
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 |
