/* ipaccess nanoBTS proprietary telnet authentication, * written by Dieter Spaar */ #include #include #include #include #include #include #include #include #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); } }