diff options
Diffstat (limited to 'contrib/opie/libopie/passwd.c')
-rw-r--r-- | contrib/opie/libopie/passwd.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/contrib/opie/libopie/passwd.c b/contrib/opie/libopie/passwd.c new file mode 100644 index 0000000..e50bf17 --- /dev/null +++ b/contrib/opie/libopie/passwd.c @@ -0,0 +1,74 @@ +/* passwd.c: The opiepasswd() library function. + +%%% copyright-cmetz +This software is Copyright 1996 by Craig Metz, All Rights Reserved. +The Inner Net License Version 2 applies to this software. +You should have received a copy of the license with this software. If +you didn't get a copy, you may request one from <license@inner.net>. + + History: + + Modified by cmetz for OPIE 2.3. Split most of the function off + and turned this into a front-end for the new __opiewriterec(). + Added code to compute the key from the secret. Use the opie_ + prefix. Use new opieatob8() and opiebtoa8() return values. + Created by cmetz for OPIE 2.22. +*/ + +#include "opie_cfg.h" +#include "opie.h" + +int opiepasswd FUNCTION((old, mode, principal, n, seed, ks), struct opie *old AND int mode AND char *principal AND int n AND char *seed AND char *ks) +{ + int i; + struct opie opie; + + if ((mode & 1) && opieinsecure()) + return -1; + + memset(&opie, 0, sizeof(struct opie)); + + if (old) { + opie.opie_flags = old->opie_flags; + opie.opie_recstart = old->opie_recstart; + opie.opie_extrecstart = old->opie_extrecstart; + } + + opie.opie_principal = principal; + opie.opie_n = n; + opie.opie_seed = seed; + + if (ks) { + char key[8]; + + if (mode & 1) { + if (opiekeycrunch(MDX, key, seed, ks)) + return -1; + for (i = n; i; i--) + opiehash(key, MDX); + if (!(opie.opie_val = opiebtoa8(opie.opie_buf, key))) + return -1; + + if (opiekeycrunch(MDX | 0x10, key, seed, ks)) + return -1; + + if (!(opie.opie_reinitkey = opiebtoa8(opie.opie_extbuf, key))) + return -1; + } else { + if ((opieetob(key, ks) != 1) && !opieatob8(key, ks)) + return 1; + if (!(opie.opie_val = opiebtoa8(opie.opie_buf, key))) + return 1; + } + } + + if (opielock(principal)) + return -1; + + i = __opiewriterec(&opie); + + if (opieunlock()) + return -1; + + return i; +} |