From 792dd38d7c0be5319db1eef625c142a6490cd12b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 25 Feb 2010 15:58:38 +0100 Subject: lib/util: add generate_random_password() metze --- lib/util/genrand.c | 42 ++++++++++++++++++++++++++++++++++++++++++ lib/util/util.h | 5 +++++ 2 files changed, 47 insertions(+) diff --git a/lib/util/genrand.c b/lib/util/genrand.c index f0544023f1..02b8d8b478 100644 --- a/lib/util/genrand.c +++ b/lib/util/genrand.c @@ -361,6 +361,48 @@ again: return retstr; } +/** + * Generate a random text password. + */ + +_PUBLIC_ char *generate_random_password(TALLOC_CTX *mem_ctx, size_t min, size_t max) +{ + char *retstr; + const char *c_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_-#.,@$%&!?:;<=>(){}[]~"; + size_t len = max; + size_t diff; + + if (min > max) { + errno = EINVAL; + return NULL; + } + + diff = max - min; + + if (diff > 0 ) { + size_t tmp; + + generate_random_buffer((uint8_t *)&tmp, sizeof(tmp)); + + tmp %= diff; + + len = min + tmp; + } + +again: + retstr = generate_random_str_list(mem_ctx, len, c_list); + if (!retstr) return NULL; + + /* we need to make sure the random string passes basic quality tests + or it might be rejected by windows as a password */ + if (len >= 7 && !check_password_quality(retstr)) { + talloc_free(retstr); + goto again; + } + + return retstr; +} + /** * Generate an array of unique text strings all of the same length. * The returned string will be allocated. diff --git a/lib/util/util.h b/lib/util/util.h index e1608a8ac4..264396efe6 100644 --- a/lib/util/util.h +++ b/lib/util/util.h @@ -177,6 +177,11 @@ _PUBLIC_ uint32_t generate_random(void); **/ _PUBLIC_ bool check_password_quality(const char *s); +/** + * Generate a random text password. + */ +_PUBLIC_ char *generate_random_password(TALLOC_CTX *mem_ctx, size_t min, size_t max); + /** Use the random number generator to generate a random string. **/ -- cgit