#include #include #include #include #include #include #include #include "md5.h" int main(int argc, char **argv) { if (argc != 5) { printf("wrong number of arguments, requires dynid, shared secret, server ip, server port\n"); return 1; } const char *dynid = argv[1]; const char *sharedSecret = argv[2]; const char *serverIp = argv[3]; int serverPort = atoi(argv[4]); if (strlen(dynid) > 64 || strlen(sharedSecret) > 64) { printf("dynid or shared secret too long, max 64 chars each\n"); return 2; } if (strlen(serverIp) < 7 || strlen(serverIp) > 15) { printf("server ip too short or too long\n"); return 3; } int t = (int) time(NULL); char buf[256]; sprintf(buf, "%s %s %d", dynid, sharedSecret, t); md5_state_t state; md5_init(&state); md5_append(&state, buf, strlen(buf)); char c[16]; md5_finish(&state, c); sprintf(buf, "%s %d %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", dynid, t, (c[0] & 0xff), (c[1] & 0xff), (c[2] & 0xff), (c[3] & 0xff), (c[4] & 0xff), (c[5] & 0xff), (c[6] & 0xff), (c[7] & 0xff), (c[8] & 0xff), (c[9] & 0xff), (c[10] & 0xff), (c[11] & 0xff), (c[12] & 0xff), (c[13] & 0xff), (c[14] & 0xff), (c[15] & 0xff)); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(serverPort); inet_pton(AF_INET, serverIp, &servaddr.sin_addr); int sockfd = socket(AF_INET, SOCK_DGRAM, 0); sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*) &servaddr, sizeof(servaddr)); close(sockfd); return 0; }