/* * Copyright (C) 2005 Computer Smiths Pty Ltd. * * This library implementes the triple rot13 encryption algorithm * as devised by Brendan Gregg. * * This library is for demosatration purposes only, and should not be used * in security related uses. It is known to have been broken. * * WARNING *** This algorithm is known to be decryptable *** WARNING * * 12-Mar-2005 Rex di Bona Created this. */ #include #include #include #include #if 0 int _lib_version = 1; void _init() { } void _fini() { } #endif static void rot13str(char *str, int len) { for (; len--; str++) { char c = *str; /* this should be a table lookup for speed */ if (c >= 'a' && c <= 'm') { c += 13; } else if (c >= 'n' && c <= 'z') { c -= 13; } else if (c >= 'A' && c <= 'M') { c += 13; } else if (c >= 'N' && c <= 'Z') { c -= 13; } else { ; /* nothing - don't change c */ } *str = c; } } char * crypt_genhash_impl(char *ctbuffer, size_t ctbuflen, const char *plaintext, const char *salt, const char **params) { int hlen; int rounds = 3; int debug = 0; char *s = "$3rot13$"; if (params != NULL) { const char *p; while (p = *params++) { if (strcasecmp(p, "debug") == 0) { debug++; } else if (strncasecmp(p, "rounds=", 7) == 0) { rounds = atoi(p+7); } else { fprintf(stderr, "Arg is '%s'\n", p); } } } hlen = strlen(s); if (plaintext == NULL) { errno = EFAULT; return NULL; } if (ctbuflen <= hlen + strlen(plaintext)) { errno = ENOMEM; return NULL; } strncpy(ctbuffer, s, hlen); strncpy(ctbuffer + hlen, plaintext, ctbuflen); while (rounds-- > 0) { rot13str(ctbuffer + hlen, ctbuflen); if (debug) { fprintf(stderr, "buffer: '%s'\n", ctbuffer); } } return ctbuffer; } char * crypt_gensalt_impl(char *csbuffer, size_t csbuflen, const char *oldsalt, const char *userinfo, const char **params) { strncpy(csbuffer, "$3rot13$XXXX$", csbuflen); return csbuffer; }