| /* ipaccess nanoBTS proprietary telnet authentication, |
| * written by Dieter Spaar <spaar@mirider.augusta.de> */ |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| #include <errno.h> |
| #include <string.h> |
| |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| |
| #include <openssl/md5.h> |
| |
| #define CLI_USER "CLICLIENT\n" |
| #define KEY "Sh1n30nY0uCra2yD1am0nd" |
| |
| static void compute_response(unsigned char *ubChallenge, unsigned char *ubResponse) |
| { |
| MD5_CTX md5; |
| int i; |
| |
| MD5_Init(&md5); |
| |
| for(i = 0; i < 4; i++) { |
| MD5_Update(&md5, (unsigned char *)KEY, strlen(KEY)); |
| MD5_Update(&md5, ubChallenge, 16); |
| } |
| MD5_Final(ubResponse, &md5); |
| } |
| |
| // nanoBTS Challenge/Response |
| int ipaccess_telnet_auth(int sock) |
| { |
| char buffer[512]; |
| int rs; |
| unsigned char ubResponse[18]; |
| |
| // send client name |
| |
| if ((rs = send(sock, CLI_USER, strlen(CLI_USER), 0)) == -1) { |
| fprintf(stderr, "send() failed: %s\n", strerror(errno)); |
| exit(1); |
| } else if (rs == 0) { |
| fprintf(stderr, "send() unexpectedly returned 0\n"); |
| exit(1); |
| } |
| |
| // receive challenge |
| |
| if ((rs = recv(sock, buffer, sizeof(buffer), 0)) > 0) { |
| if(rs != 18 || buffer[0] != '<' || buffer[17] != '>') { |
| fprintf(stderr, "unexpected response\n"); |
| exit(1); |
| } |
| } else if (rs == 0) { |
| fprintf(stderr, "recv(client) unexpectedly returned 0\n"); |
| exit(1); |
| } else { |
| fprintf(stderr, "recv(client) failed: %s\n", |
| strerror(errno)); |
| exit(1); |
| } |
| |
| // calculate response |
| |
| memset(&ubResponse, 0, sizeof(ubResponse)); |
| compute_response(buffer + 1, ubResponse + 1); |
| ubResponse[0] = '<'; |
| ubResponse[17] = '>'; |
| |
| // send response |
| if ((rs = send(sock, ubResponse, sizeof(ubResponse), 0)) == -1) { |
| fprintf(stderr, "send() failed: %s\n", strerror(errno)); |
| exit(1); |
| } else if (rs == 0) { |
| fprintf(stderr, "send() unexpectedly returned 0\n"); |
| exit(1); |
| } |
| } |