+int auth_get_salt(const char *username, char *salt) {
+ char filename[512];
+ int fd, len;
+
+ if (!valid_name(username))
+ return 0;
+
+ sprintf(filename, "%s/%s/password_salt", DATA_PATH, username);
+ fd = open(filename, O_RDONLY);
+ if (fd == -1)
+ return 0;
+ len = read(fd, salt, SCRYPT_SALT_SIZE);
+ close(fd);
+
+ return 1;
+}
+
+int auth_check_password_v0(const char *username, const char *password) {
+ char epw[MD5_DIGEST_SIZE + 1];
+ unsigned char givenpw[MD5_DIGEST_SIZE];
+ struct MD5Context ctx;
+
+ if (auth_get_password(username, epw) == 0)
+ return 0;
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, username, strlen(username));
+ MD5Update(&ctx, password, strlen(password));
+ MD5Final(givenpw, &ctx);
+
+ if (strncmp(givenpw, epw, MD5_DIGEST_SIZE) == 0)
+ return 1;
+ else
+ return 0;
+}
+
+int auth_check_password_v1(const char *username, const char *password) {
+ unsigned char epw[SCRYPT_OUTPUT_SIZE];
+ unsigned char esalt[SCRYPT_SALT_SIZE];
+ unsigned char givenpw[SCRYPT_OUTPUT_SIZE];
+ int r;