-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathotp_dec.c
154 lines (120 loc) · 4.51 KB
/
otp_dec.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <netdb.h>
#define BUFSIZE 200000
void error(const char *msg) { fprintf(stderr, "Error: %s\n", msg); } // Error function used for reporting issues
char buffer[ BUFSIZE ];
char msgbuffer[ BUFSIZE ];
char keybuffer[ BUFSIZE ];
int main ( int argc, char ** argv ) {
if (argc < 4) { printf("usage: %s [plaintext] [key] [port]\n", argv[ 0 ]); exit( 0 ); }
int i, targetFd, socketFd, keyFd, textFd;
struct sockaddr_in server, client;
struct hostent *serverHostInfo;
size_t address_size;
char * key = NULL;
int key_len;
char partmsg[ 1024 ];
char * header = "DEC@@";
int r, charsRead, total;
if( (keyFd = open( argv[ 2 ], O_RDONLY )) < 0) { error("cannot open key for input"); exit( 1 ); }
if( (textFd = open( argv[ 1 ], O_RDONLY )) < 0) { error("cannot open textfile for input"); exit( 1 ); }
memset( keybuffer, '\0', sizeof( keybuffer ));
ssize_t keylen = read( keyFd, keybuffer, sizeof( keybuffer ));
memset( msgbuffer, '\0', sizeof( msgbuffer ));
ssize_t msglen = read( textFd, msgbuffer, sizeof( msgbuffer ));
close(keyFd); close(textFd);
if ( keylen < msglen ) {
error("key is too short"); exit( 1 );
}
/* If the key is too short, exit 1 */
i = 0;
while( keybuffer[ i ] != '\n' ) {
if( keybuffer[ i ] != 32 && (keybuffer[ i ] < 65 || keybuffer[ i ] > 90)) {
error("key has invalid character"); exit( 1 );
}
i++;
}
i = 0;
while (msgbuffer[ i ] != '\n') {
if( msgbuffer[ i ] != 32 && (msgbuffer[ i ] < 65 || msgbuffer[ i ] > 90)) {
error("message has invalid character"); exit( 1 );
}
i++;
}
/* Get host entity */
memset(buffer, '\0', BUFSIZE );
serverHostInfo = gethostbyname("localhost");
if (serverHostInfo == NULL) { error( "no such host exists" ); exit( 1 ); }
/* Set up server sockaddr struct */
memset((char *) &server, '\0', sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons( atoi(argv[ 3 ]) );
memcpy( (char *) &server.sin_addr.s_addr, (char *) serverHostInfo->h_addr, serverHostInfo->h_length );
/* Create socket */
socketFd = socket( AF_INET, SOCK_STREAM, 0 );
if( socketFd < 0 ) { error("opening socket"); exit( 1 ); }
if( connect( socketFd, ( struct sockaddr * ) &server, sizeof( server )) < 0 ) {
fprintf(stderr, "Error: could not contact otp_dec_d on port %d\n", server.sin_port);
exit( 2 );
}
/* To get started - Send header */
memset(buffer, '\0', BUFSIZE );
strcpy( buffer, header );
total = 0;
while( total < strlen( buffer )) {
total += r = send( socketFd, buffer + total, sizeof( partmsg ), 0 );
if( r == 0 ) { break; }
if( r < 0 ) { error( "writing to socket" ); break; }
}
/* Response from server */
memset( buffer , '\0', sizeof(buffer));
while( strstr( buffer, "@@") == NULL ) {
memset( partmsg , '\0', sizeof( partmsg ));
charsRead = recv( socketFd, partmsg, sizeof( partmsg ) - 1, 0);
strcat(buffer, partmsg);
if (charsRead == -1) { error("CLIENT: receiving data (1)"); exit( 0 ); }
if (charsRead == 0) { error("CLIENT: rejected by server(1)"); exit( 0 ); }
}
int terminal = strstr(buffer, "@@") - buffer;
buffer[ terminal ] = '\0';
/* Extra Precaution - Exit if message from server is not what we expected */
if( strcmp (buffer, "DEC_D") != 0 ) {
error( "Unexpected header"); exit( 0 );
}
/* Process was not rejected by server, continue sending message */
/* Add the Key and Msg file to buffer with correct formating - '|' b/t Key and Msg and '@@' terminating buffer */
memset( buffer, '\0', BUFSIZE );
strcpy( buffer, keybuffer );
buffer[ strcspn( buffer, "\n") ] = '|';
strcat( buffer, msgbuffer );
buffer[ strcspn( buffer, "\n") ] = '\0';
strcat( buffer, "@@" );
/* Else, fire message */
total = 0;
while( total < strlen( buffer )) {
total += r = send( socketFd, buffer + total, sizeof( partmsg ), 0 );
if( r == 0 ) { break; }
if( r < 0 ) { error( "writing to socket" ); break; }
}
/* Receive Decrypted Message */
memset( buffer , '\0', sizeof(buffer));
while( strstr( buffer, "@@") == NULL ) {
memset( partmsg , '\0', sizeof( partmsg ));
charsRead = recv( socketFd, partmsg, sizeof( partmsg ) - 1, 0);
strcat(buffer, partmsg);
if (charsRead == -1) { error("CLIENT: receiving data (2)"); exit( 0 ); }
if (charsRead == 0) { error("CLIENT: rejected by server (2)"); exit( 0 ); }
}
terminal = strstr(buffer, "@@") - buffer;
buffer[ terminal ] = '\0';
printf("%s\n", buffer );
close( socketFd );
return 0;
}