Beispiel #1
0
		inline buffer rsa_key::public_decrypt(const buffer& buf, int padding) const
		{
			buffer result(size());

			result.data().resize(public_decrypt(buffer_cast<uint8_t>(result), buffer_size(result), buffer_cast<uint8_t>(buf), buffer_size(buf), padding));

			return result;
		}
int main() {
    char sendline[_MAX_BUFF] = "";
    string return_value;
    int pid;
    string user_name, item_price;

    /* Create a TCP socket */
    char *ptr_price, *ptr_dprice, *ptr_de1, *ptr_en, *ptr_de2;
    char recvline[_MAX_BUFF];
    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    /* Initialize server's address and well-known port */
    bzero(&servaddr, sizeof (servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(1200); /* daytime server */

    /* Bind server’s address and port to the socket */
    bind(listenfd, (struct sockaddr *) &servaddr, sizeof (servaddr));

    /* Convert socket to a listening socket – max 100 pending clients*/
    listen(listenfd, 100);
    cout << "bank hello" << endl;

    /* Wait for client connections and accept them */

    while (true) {
        clilen = sizeof (cliaddr);
        connfd = accept(listenfd, (struct sockaddr *) &cliaddr, (socklen_t*) & clilen);

        if (connfd < 0) {
            perror("ERROR on accept");
            exit(5);
        }

        if ((pid = fork()) == 0) {
            close(listenfd); //Child server;

            bzero(recvline, sizeof (recvline)); //read card number from psystem

            if (read(connfd, recvline, sizeof (recvline)) > 0) {
                ptr_en = recvline;
                ptr_de1 = public_decrypt(ptr_en, PSYS_PUB_K);
                if (ptr_de1 != NULL) {
                    cout << "Verfiy the psystem digital signature" << endl;
                }
                ptr_de2 = private_decrypt(ptr_de1, BANK_PRI_K);
                bzero(recvline, sizeof (recvline));
            }
            if (read(connfd, recvline, sizeof (recvline)) > 0) {

                ptr_price = recvline;
                ptr_dprice = public_decrypt(ptr_price, PSYS_PUB_K);
                item_price = ptr_dprice;
                return_value = renew_account(ptr_de2, ptr_dprice);
                strncat(sendline, return_value.c_str(), return_value.size());
                write(connfd, sendline, strlen(sendline));
                bzero(recvline, sizeof (recvline));
            }

            if (read(connfd, recvline, sizeof (recvline)) > 0) {
                cout << "Customer:" << recvline << endl;
                user_name = recvline;
                if (return_value == str_success) {
                    renew_activity(user_name, item_price);
                }
                bzero(recvline, sizeof (recvline));
            }
            close(connfd);
            exit(0);
        }
        close(connfd); //Parent server;
    }
    return 0;
}