summaryrefslogtreecommitdiffstats
path: root/sysif.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysif.c')
-rw-r--r--sysif.c81
1 files changed, 12 insertions, 69 deletions
diff --git a/sysif.c b/sysif.c
index 339d9962..2043354d 100644
--- a/sysif.c
+++ b/sysif.c
@@ -2064,82 +2064,25 @@ static val getgrnam_wrap(val wname)
#if HAVE_CRYPT || HAVE_CRYPT_R
-static int salt_char_p(wchar_t ch)
-{
- return ((ch >= 'a' && ch <= 'z') ||
- (ch >= 'A' && ch <= 'Z') ||
- (ch >= '0' && ch <= '9') ||
- (ch == '.') || (ch == '/'));
-}
-
-static const wchar_t *validate_salt(const wchar_t *salt)
-{
- const wchar_t *s = salt;
-
- if (salt_char_p(*s)) {
- if (salt_char_p(*++s))
- return salt;
- else
- goto badsalt;
- }
-
- if (*s++ != '$')
- goto badsalt;
-
- switch (*s++) {
- case '1': case '5': case '6':
- break;
- case '2':
- if (*s >= 'a' && *s++ <= 'z')
- break;
- /* fallthrough */
- default:
- goto badsalt;
- }
-
- if (*s++ != '$')
- goto badsalt;
-
- if (wcsncmp(s, L"rounds=", 7) == 0) {
- size_t ispn = wcsspn(s += 7, L"0123456789");
- s += ispn;
- if (*s++ != '$')
- goto badsalt;
- }
-
- while (salt_char_p(*s))
- s++;
-
- if (*s && *s != '$')
- goto badsalt;
-
- return salt;
-
-badsalt:
- errno = EINVAL;
- return 0;
-}
-
static val crypt_wrap(val wkey, val wsalt)
{
val self = lit("crypt");
const wchar_t *cwkey = c_str(wkey, self);
- const wchar_t *cwsalt = validate_salt(c_str(wsalt, self));
-
- if (cwsalt != 0) {
- char *key = utf8_dup_to(cwkey);
- char *salt = utf8_dup_to(cwsalt);
+ const wchar_t *cwsalt = c_str(wsalt, self);
+ char *key = utf8_dup_to(cwkey);
+ char *salt = utf8_dup_to(cwsalt);
#if HAVE_CRYPT_R
- struct crypt_data cd;
- char *hash = (cd.initialized = 0, crypt_r(key, salt, &cd));
+ struct crypt_data cd;
+ char *hash = (cd.initialized = 0, crypt_r(key, salt, &cd));
#else
- char *hash = crypt(key, salt);
+ char *hash = crypt(key, salt);
#endif
- free(key);
- free(salt);
- if (hash != 0)
- return string_utf8(hash);
- }
+
+ free(key);
+ free(salt);
+
+ if (hash != 0)
+ return string_utf8(hash);
uw_ethrowf(error_s, lit("crypt failed: ~d/~s"), num(errno),
errno_to_str(errno), nao);