-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathotp_enc.c
156 lines (124 loc) · 4.73 KB
/
otp_enc.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
155
156
#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 ];
char errormsg[ 256 ];
int main ( int argc, char ** argv ) {
if (argc < 4) { fprintf(stderr, "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[ 2048 ];
char * header = "ENC@@";
int charsWritten, charsRead;
ssize_t r, total;
memset( errormsg, '\0', sizeof( errormsg ));
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)) {
fprintf( stderr, "%s error: input contains bad characters\n", argv[ 0 ] ); exit( 1 );
}
i++;
}
i = 0;
while (msgbuffer[ i ] != '\n') {
if( msgbuffer[ i ] != 32 && (msgbuffer[ i ] < 65 || msgbuffer[ i ] > 90)) {
fprintf( stderr, "%s error: input contains bad characters\n", argv[ 0 ] ); 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_enc_d on port %d\n", server.sin_port);
exit( 2 );
}
/* To get started - Send header */
memset(buffer, '\0', sizeof( buffer ));
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, "ENC_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, "@@" );
/* Fire message to be encrypted */
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 Encrypted Message */
memset( buffer , '\0', sizeof(buffer));
while( strstr( buffer, "@@") == NULL ) {
memset( partmsg , '\0', sizeof( partmsg ));
charsRead = recv( socketFd, partmsg, sizeof( partmsg ) - 1, 0);
printf("charsRead = %d\n", charsRead);
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;
}