summaryrefslogtreecommitdiffstats
path: root/lib/libc/crypt/bcrypt.c
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2014-12-30 10:27:24 +0000
committertedu <tedu@openbsd.org>2014-12-30 10:27:24 +0000
commite08a42f854de4914aeb357f2b6cd9c7274f05e75 (patch)
tree222b45b541c74e946ea138eb39d86a05a50eaafb /lib/libc/crypt/bcrypt.c
parentlet the "make groff" maintainer target show groff warnings (diff)
downloadwireguard-openbsd-e08a42f854de4914aeb357f2b6cd9c7274f05e75.tar.xz
wireguard-openbsd-e08a42f854de4914aeb357f2b6cd9c7274f05e75.zip
copy bcrypt autotune from encrypt(1) and expose via crypt_newhash
ok deraadt miod
Diffstat (limited to 'lib/libc/crypt/bcrypt.c')
-rw-r--r--lib/libc/crypt/bcrypt.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/lib/libc/crypt/bcrypt.c b/lib/libc/crypt/bcrypt.c
index 94758ca40bd..abcbe138ca3 100644
--- a/lib/libc/crypt/bcrypt.c
+++ b/lib/libc/crypt/bcrypt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bcrypt.c,v 1.46 2014/11/24 22:47:01 tedu Exp $ */
+/* $OpenBSD: bcrypt.c,v 1.47 2014/12/30 10:27:24 tedu Exp $ */
/*
* Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>
@@ -225,6 +225,38 @@ bcrypt_checkpass(const char *pass, const char *goodhash)
}
/*
+ * Measure this system's performance by measuring the time for 8 rounds.
+ * We are aiming for something that takes between 0.25 and 0.5 seconds.
+ */
+int
+bcrypt_autorounds(void)
+{
+ clock_t before, after;
+ int r = 8;
+ char buf[_PASSWORD_LEN];
+ int duration;
+
+ before = clock();
+ bcrypt_newhash("testpassword", r, buf, sizeof(buf));
+ after = clock();
+
+ duration = after - before;
+
+ /* too quick? slow it down. */
+ while (r < 16 && duration <= CLOCKS_PER_SEC / 4) {
+ r += 1;
+ duration *= 2;
+ }
+ /* too slow? speed it up. */
+ while (r > 4 && duration > CLOCKS_PER_SEC / 2) {
+ r -= 1;
+ duration /= 2;
+ }
+
+ return r;
+}
+
+/*
* internal utilities
*/
static const u_int8_t Base64Code[] =