From c7a5aa489ffd7155871977290f14165bf9059bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= Date: Thu, 11 Dec 2014 13:58:15 +0000 Subject: [PATCH] Add an oath_mode(3) function which translates from mode names to numbers. git-svn-id: svn+ssh://svn.openpam.org/svn/openpam/trunk@846 185d5e19-27fe-0310-9dcf-9bff6b9f3609 --- doc/man/Makefile.am | 1 + include/security/oath.h | 2 ++ lib/liboath/Makefile.am | 1 + lib/liboath/oath_mode.c | 72 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 lib/liboath/oath_mode.c diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am index a7af640..1c98860 100644 --- a/doc/man/Makefile.am +++ b/doc/man/Makefile.am @@ -70,6 +70,7 @@ OATH_MAN = \ oath_key_free.3 \ oath_key_from_file.3 \ oath_key_from_uri.3 \ + oath_mode.3 \ oath_uri_decode.3 \ $(NULL) endif diff --git a/include/security/oath.h b/include/security/oath.h index b3441d0..13ed0bd 100644 --- a/include/security/oath.h +++ b/include/security/oath.h @@ -48,6 +48,8 @@ char *oath_key_to_uri(const struct oath_key *); struct oath_key *oath_key_dummy(enum oath_mode, enum oath_hash, unsigned int); +enum oath_mode oath_mode(const char *); + unsigned int oath_hotp(const uint8_t *, size_t, uint64_t, unsigned int); unsigned int oath_hotp_current(struct oath_key *); int oath_hotp_match(struct oath_key *, unsigned int, int); diff --git a/lib/liboath/Makefile.am b/lib/liboath/Makefile.am index 7bcf656..f4d637c 100644 --- a/lib/liboath/Makefile.am +++ b/lib/liboath/Makefile.am @@ -18,6 +18,7 @@ liboath_la_SOURCES = \ oath_key_from_uri.c \ oath_key_free.c \ oath_key.c \ + oath_mode.c \ oath_uri_decode.c liboath_la_LDFLAGS = -no-undefined -version-info $(LIB_MAJ) diff --git a/lib/liboath/oath_mode.c b/lib/liboath/oath_mode.c new file mode 100644 index 0000000..d536fb0 --- /dev/null +++ b/lib/liboath/oath_mode.c @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2014 The University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +static const char *oath_mode_names[om_max] = { + [om_hotp] = "hotp", + [om_totp] = "totp", +}; + +/* + * OATH + * + * Converts a mode name to the corresponding enum value + */ + +enum oath_mode +oath_mode(const char *str) +{ + enum oath_mode om; + + for (om = 0; om < om_max; ++om) { + if (oath_mode_names[om] != NULL && + strcasecmp(oath_mode_names[om], str) == 0) { + return (om); + } + } + return (om_undef); +} + +/** + * The =oath_mode function returns the =enum oath_mode value that + * corresponds to the specified string. + * + * AUTHOR UIO + */