diff options
author | Bjørn Mork <bjorn@mork.no> | 2015-05-15 10:20:47 +0200 |
---|---|---|
committer | Bjørn Mork <bjorn@mork.no> | 2015-05-15 10:20:47 +0200 |
commit | 73b16af8feec390afbabd9356d6e5e83c0390838 (patch) | |
tree | 3730020ba2f9caeb9d7815a975af51830b51ce11 /libbb/pw_encrypt.c |
busybox: imported from http://www.busybox.net/downloads/busybox-1.13.3.tar.bz2busybox-1.13.3
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Diffstat (limited to 'libbb/pw_encrypt.c')
-rw-r--r-- | libbb/pw_encrypt.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/libbb/pw_encrypt.c b/libbb/pw_encrypt.c new file mode 100644 index 0000000..0b826f4 --- /dev/null +++ b/libbb/pw_encrypt.c @@ -0,0 +1,77 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routine. + * + * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include "libbb.h" + +#if ENABLE_USE_BB_CRYPT + +/* + * DES and MD5 crypt implementations are taken from uclibc. + * They were modified to not use static buffers. + */ +/* Common for them */ +static const uint8_t ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; +#include "pw_encrypt_des.c" +#include "pw_encrypt_md5.c" + +/* Other advanced crypt ids: */ +/* $2$ or $2a$: Blowfish */ +/* $5$: SHA-256 */ +/* $6$: SHA-512 */ +/* TODO: implement SHA - http://people.redhat.com/drepper/SHA-crypt.txt */ + +static struct const_des_ctx *des_cctx; +static struct des_ctx *des_ctx; + +/* my_crypt returns malloc'ed data */ +static char *my_crypt(const char *key, const char *salt) +{ + /* First, check if we are supposed to be using the MD5 replacement + * instead of DES... */ + if (salt[0] == '$' && salt[1] == '1' && salt[2] == '$') { + return md5_crypt(xzalloc(MD5_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); + } + + { + if (!des_cctx) + des_cctx = const_des_init(); + des_ctx = des_init(des_ctx, des_cctx); + return des_crypt(des_ctx, xzalloc(DES_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); + } +} + +/* So far nobody wants to have it public */ +static void my_crypt_cleanup(void) +{ + free(des_cctx); + free(des_ctx); + des_cctx = NULL; + des_ctx = NULL; +} + +char* FAST_FUNC pw_encrypt(const char *clear, const char *salt, int cleanup) +{ + char *encrypted; + + encrypted = my_crypt(clear, salt); + + if (cleanup) + my_crypt_cleanup(); + + return encrypted; +} + +#else /* if !ENABLE_USE_BB_CRYPT */ + +char* FAST_FUNC pw_encrypt(const char *clear, const char *salt, int cleanup) +{ + return xstrdup(crypt(clear, salt)); +} + +#endif |