/* Copyright (C) 2021 Gentoo-libre Install This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include void decodeEmail(char encoded[]) { int len = strlen(encoded); char temp[3]; char email[len/2];//the encoded string/2 gives the length of the result email+1 memcpy(temp, encoded, 2); temp[2] = '\0'; char xorKey = strtol(temp, NULL, 16);//the value of the xorKey is the first two bytes in hex, encoded in UTF-8 int j = 0; for (int i = 2; i < len; i += 2, ++j)//decode the rest of the two bytes { memcpy(temp, encoded+i,2); temp[2] = '\0'; email[j] = strtol(temp, NULL, 16) ^ xorKey;//xor two bytes with the xorkey to get a UTF-8 character } email[j] = '\0';//terminate the string printf("Decoded email: %s\n", email); } int main(int argc, char *argv[]) { if (!argv[1]) { char input[512+1];//as the maximun length of an email should be 255 chars, we allocate 255*2+2 chars for the longest valid input (+1 for the newline) fprintf(stderr,"Input email to decode (string within data-cfemail=\"\"): "); ssize_t length = read(0, input, 512); if (length < 5){fprintf(stderr,"Invalid input.\n"); exit(1);} input[length-1] = '\0';//overwrite newline with null char decodeEmail(input); } else { if (strlen(argv[1]) < 4 || strlen(argv[1]) > 512){fprintf(stderr,"Invalid input.\n"); exit(1);} decodeEmail(argv[1]); } //test string: e4908d9497a4908b9696818a90829681858fca878b89 }