mirror of https://gerrit.osmocom.org/libtelnet
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
/* 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
|
|
void 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);
|
|
}
|
|
}
|