diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
commit | f7548d6d28c313cf80e6f3ef89aed16a19815df1 (patch) | |
tree | a3f6f2a3f247293bee59ecd28e8cd8ceb6ca064a /src/lib-otp | |
parent | Initial commit. (diff) | |
download | dovecot-upstream.tar.xz dovecot-upstream.zip |
Adding upstream version 1:2.3.19.1+dfsg1.upstream/1%2.3.19.1+dfsg1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/lib-otp/Makefile.am | 17 | ||||
-rw-r--r-- | src/lib-otp/Makefile.in | 771 | ||||
-rw-r--r-- | src/lib-otp/otp-dictionary.c | 589 | ||||
-rw-r--r-- | src/lib-otp/otp-dictionary.h | 6 | ||||
-rw-r--r-- | src/lib-otp/otp-hash.c | 165 | ||||
-rw-r--r-- | src/lib-otp/otp-hash.h | 26 | ||||
-rw-r--r-- | src/lib-otp/otp-parity.c | 29 | ||||
-rw-r--r-- | src/lib-otp/otp-parity.h | 16 | ||||
-rw-r--r-- | src/lib-otp/otp-parse.c | 253 | ||||
-rw-r--r-- | src/lib-otp/otp-parse.h | 16 | ||||
-rw-r--r-- | src/lib-otp/otp.h | 22 |
11 files changed, 1910 insertions, 0 deletions
diff --git a/src/lib-otp/Makefile.am b/src/lib-otp/Makefile.am new file mode 100644 index 0000000..5b34fba --- /dev/null +++ b/src/lib-otp/Makefile.am @@ -0,0 +1,17 @@ +noinst_LTLIBRARIES = libotp.la + +AM_CPPFLAGS = \ + -I$(top_srcdir)/src/lib + +libotp_la_SOURCES = \ + otp-dictionary.c \ + otp-hash.c \ + otp-parity.c \ + otp-parse.c + +noinst_HEADERS = \ + otp.h \ + otp-dictionary.h \ + otp-hash.h \ + otp-parity.h \ + otp-parse.h diff --git a/src/lib-otp/Makefile.in b/src/lib-otp/Makefile.in new file mode 100644 index 0000000..7f80c7a --- /dev/null +++ b/src/lib-otp/Makefile.in @@ -0,0 +1,771 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib-otp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_checktype2.m4 \ + $(top_srcdir)/m4/ac_typeof.m4 $(top_srcdir)/m4/arc4random.m4 \ + $(top_srcdir)/m4/blockdev.m4 $(top_srcdir)/m4/c99_vsnprintf.m4 \ + $(top_srcdir)/m4/clock_gettime.m4 $(top_srcdir)/m4/crypt.m4 \ + $(top_srcdir)/m4/crypt_xpg6.m4 $(top_srcdir)/m4/dbqlk.m4 \ + $(top_srcdir)/m4/dirent_dtype.m4 $(top_srcdir)/m4/dovecot.m4 \ + $(top_srcdir)/m4/fd_passing.m4 $(top_srcdir)/m4/fdatasync.m4 \ + $(top_srcdir)/m4/flexible_array_member.m4 \ + $(top_srcdir)/m4/glibc.m4 $(top_srcdir)/m4/gmtime_max.m4 \ + $(top_srcdir)/m4/gmtime_tm_gmtoff.m4 \ + $(top_srcdir)/m4/ioloop.m4 $(top_srcdir)/m4/iovec.m4 \ + $(top_srcdir)/m4/ipv6.m4 $(top_srcdir)/m4/libcap.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/libwrap.m4 \ + $(top_srcdir)/m4/linux_mremap.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mmap_write.m4 \ + $(top_srcdir)/m4/mntctl.m4 $(top_srcdir)/m4/modules.m4 \ + $(top_srcdir)/m4/notify.m4 $(top_srcdir)/m4/nsl.m4 \ + $(top_srcdir)/m4/off_t_max.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/m4/pr_set_dumpable.m4 \ + $(top_srcdir)/m4/q_quotactl.m4 $(top_srcdir)/m4/quota.m4 \ + $(top_srcdir)/m4/random.m4 $(top_srcdir)/m4/rlimit.m4 \ + $(top_srcdir)/m4/sendfile.m4 $(top_srcdir)/m4/size_t_signed.m4 \ + $(top_srcdir)/m4/sockpeercred.m4 $(top_srcdir)/m4/sql.m4 \ + $(top_srcdir)/m4/ssl.m4 $(top_srcdir)/m4/st_tim.m4 \ + $(top_srcdir)/m4/static_array.m4 $(top_srcdir)/m4/test_with.m4 \ + $(top_srcdir)/m4/time_t.m4 $(top_srcdir)/m4/typeof.m4 \ + $(top_srcdir)/m4/typeof_dev_t.m4 \ + $(top_srcdir)/m4/uoff_t_max.m4 $(top_srcdir)/m4/vararg.m4 \ + $(top_srcdir)/m4/want_apparmor.m4 \ + $(top_srcdir)/m4/want_bsdauth.m4 \ + $(top_srcdir)/m4/want_bzlib.m4 \ + $(top_srcdir)/m4/want_cassandra.m4 \ + $(top_srcdir)/m4/want_cdb.m4 \ + $(top_srcdir)/m4/want_checkpassword.m4 \ + $(top_srcdir)/m4/want_clucene.m4 $(top_srcdir)/m4/want_db.m4 \ + $(top_srcdir)/m4/want_gssapi.m4 $(top_srcdir)/m4/want_icu.m4 \ + $(top_srcdir)/m4/want_ldap.m4 $(top_srcdir)/m4/want_lua.m4 \ + $(top_srcdir)/m4/want_lz4.m4 $(top_srcdir)/m4/want_lzma.m4 \ + $(top_srcdir)/m4/want_mysql.m4 $(top_srcdir)/m4/want_pam.m4 \ + $(top_srcdir)/m4/want_passwd.m4 $(top_srcdir)/m4/want_pgsql.m4 \ + $(top_srcdir)/m4/want_prefetch.m4 \ + $(top_srcdir)/m4/want_shadow.m4 \ + $(top_srcdir)/m4/want_sodium.m4 $(top_srcdir)/m4/want_solr.m4 \ + $(top_srcdir)/m4/want_sqlite.m4 \ + $(top_srcdir)/m4/want_stemmer.m4 \ + $(top_srcdir)/m4/want_systemd.m4 \ + $(top_srcdir)/m4/want_textcat.m4 \ + $(top_srcdir)/m4/want_unwind.m4 $(top_srcdir)/m4/want_zlib.m4 \ + $(top_srcdir)/m4/want_zstd.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libotp_la_LIBADD = +am_libotp_la_OBJECTS = otp-dictionary.lo otp-hash.lo otp-parity.lo \ + otp-parse.lo +libotp_la_OBJECTS = $(am_libotp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/otp-dictionary.Plo \ + ./$(DEPDIR)/otp-hash.Plo ./$(DEPDIR)/otp-parity.Plo \ + ./$(DEPDIR)/otp-parse.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libotp_la_SOURCES) +DIST_SOURCES = $(libotp_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPARMOR_LIBS = @APPARMOR_LIBS@ +AR = @AR@ +AUTH_CFLAGS = @AUTH_CFLAGS@ +AUTH_LIBS = @AUTH_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BINARY_CFLAGS = @BINARY_CFLAGS@ +BINARY_LDFLAGS = @BINARY_LDFLAGS@ +BISON = @BISON@ +CASSANDRA_CFLAGS = @CASSANDRA_CFLAGS@ +CASSANDRA_LIBS = @CASSANDRA_LIBS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CDB_LIBS = @CDB_LIBS@ +CFLAGS = @CFLAGS@ +CLUCENE_CFLAGS = @CLUCENE_CFLAGS@ +CLUCENE_LIBS = @CLUCENE_LIBS@ +COMPRESS_LIBS = @COMPRESS_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPT_LIBS = @CRYPT_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DICT_LIBS = @DICT_LIBS@ +DLLIB = @DLLIB@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FLEX = @FLEX@ +FUZZER_CPPFLAGS = @FUZZER_CPPFLAGS@ +FUZZER_LDFLAGS = @FUZZER_LDFLAGS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KRB5CONFIG = @KRB5CONFIG@ +KRB5_CFLAGS = @KRB5_CFLAGS@ +KRB5_LIBS = @KRB5_LIBS@ +LD = @LD@ +LDAP_LIBS = @LDAP_LIBS@ +LDFLAGS = @LDFLAGS@ +LD_NO_WHOLE_ARCHIVE = @LD_NO_WHOLE_ARCHIVE@ +LD_WHOLE_ARCHIVE = @LD_WHOLE_ARCHIVE@ +LIBCAP = @LIBCAP@ +LIBDOVECOT = @LIBDOVECOT@ +LIBDOVECOT_COMPRESS = @LIBDOVECOT_COMPRESS@ +LIBDOVECOT_DEPS = @LIBDOVECOT_DEPS@ +LIBDOVECOT_DSYNC = @LIBDOVECOT_DSYNC@ +LIBDOVECOT_LA_LIBS = @LIBDOVECOT_LA_LIBS@ +LIBDOVECOT_LDA = @LIBDOVECOT_LDA@ +LIBDOVECOT_LDAP = @LIBDOVECOT_LDAP@ +LIBDOVECOT_LIBFTS = @LIBDOVECOT_LIBFTS@ +LIBDOVECOT_LIBFTS_DEPS = @LIBDOVECOT_LIBFTS_DEPS@ +LIBDOVECOT_LOGIN = @LIBDOVECOT_LOGIN@ +LIBDOVECOT_LUA = @LIBDOVECOT_LUA@ +LIBDOVECOT_LUA_DEPS = @LIBDOVECOT_LUA_DEPS@ +LIBDOVECOT_SQL = @LIBDOVECOT_SQL@ +LIBDOVECOT_STORAGE = @LIBDOVECOT_STORAGE@ +LIBDOVECOT_STORAGE_DEPS = @LIBDOVECOT_STORAGE_DEPS@ +LIBEXTTEXTCAT_CFLAGS = @LIBEXTTEXTCAT_CFLAGS@ +LIBEXTTEXTCAT_LIBS = @LIBEXTTEXTCAT_LIBS@ +LIBICONV = @LIBICONV@ +LIBICU_CFLAGS = @LIBICU_CFLAGS@ +LIBICU_LIBS = @LIBICU_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSODIUM_CFLAGS = @LIBSODIUM_CFLAGS@ +LIBSODIUM_LIBS = @LIBSODIUM_LIBS@ +LIBTIRPC_CFLAGS = @LIBTIRPC_CFLAGS@ +LIBTIRPC_LIBS = @LIBTIRPC_LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@ +LIBUNWIND_LIBS = @LIBUNWIND_LIBS@ +LIBWRAP_LIBS = @LIBWRAP_LIBS@ +LINKED_STORAGE_LDADD = @LINKED_STORAGE_LDADD@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LUA_CFLAGS = @LUA_CFLAGS@ +LUA_LIBS = @LUA_LIBS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MODULE_LIBS = @MODULE_LIBS@ +MODULE_SUFFIX = @MODULE_SUFFIX@ +MYSQL_CFLAGS = @MYSQL_CFLAGS@ +MYSQL_CONFIG = @MYSQL_CONFIG@ +MYSQL_LIBS = @MYSQL_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NOPLUGIN_LDFLAGS = @NOPLUGIN_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PANDOC = @PANDOC@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PGSQL_CFLAGS = @PGSQL_CFLAGS@ +PGSQL_LIBS = @PGSQL_LIBS@ +PG_CONFIG = @PG_CONFIG@ +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +QUOTA_LIBS = @QUOTA_LIBS@ +RANLIB = @RANLIB@ +RELRO_LDFLAGS = @RELRO_LDFLAGS@ +RPCGEN = @RPCGEN@ +RUN_TEST = @RUN_TEST@ +SED = @SED@ +SETTING_FILES = @SETTING_FILES@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SQLITE_CFLAGS = @SQLITE_CFLAGS@ +SQLITE_LIBS = @SQLITE_LIBS@ +SQL_CFLAGS = @SQL_CFLAGS@ +SQL_LIBS = @SQL_LIBS@ +SSL_CFLAGS = @SSL_CFLAGS@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +ZSTD_CFLAGS = @ZSTD_CFLAGS@ +ZSTD_LIBS = @ZSTD_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dict_drivers = @dict_drivers@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +moduledir = @moduledir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +rundir = @rundir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sql_drivers = @sql_drivers@ +srcdir = @srcdir@ +ssldir = @ssldir@ +statedir = @statedir@ +sysconfdir = @sysconfdir@ +systemdservicetype = @systemdservicetype@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LTLIBRARIES = libotp.la +AM_CPPFLAGS = \ + -I$(top_srcdir)/src/lib + +libotp_la_SOURCES = \ + otp-dictionary.c \ + otp-hash.c \ + otp-parity.c \ + otp-parse.c + +noinst_HEADERS = \ + otp.h \ + otp-dictionary.h \ + otp-hash.h \ + otp-parity.h \ + otp-parse.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/lib-otp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/lib-otp/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libotp.la: $(libotp_la_OBJECTS) $(libotp_la_DEPENDENCIES) $(EXTRA_libotp_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libotp_la_OBJECTS) $(libotp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp-dictionary.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp-hash.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp-parity.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp-parse.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/otp-dictionary.Plo + -rm -f ./$(DEPDIR)/otp-hash.Plo + -rm -f ./$(DEPDIR)/otp-parity.Plo + -rm -f ./$(DEPDIR)/otp-parse.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/otp-dictionary.Plo + -rm -f ./$(DEPDIR)/otp-hash.Plo + -rm -f ./$(DEPDIR)/otp-parity.Plo + -rm -f ./$(DEPDIR)/otp-parse.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/lib-otp/otp-dictionary.c b/src/lib-otp/otp-dictionary.c new file mode 100644 index 0000000..5a13157 --- /dev/null +++ b/src/lib-otp/otp-dictionary.c @@ -0,0 +1,589 @@ +/* + * OTP standard dictionary. + * + * Copyright (c) 2006 Andrey Panin <pazke@donpac.ru> + * + * This software is released under the MIT license. + */ + +#include "lib.h" +#include "otp.h" + +#include <string.h> + +struct hint { + const short l, u; +}; + +static const struct hint hints[] = { + { 0, 114 }, /* A */ + { 114, 292 }, /* B */ + { 292, 415 }, /* C */ + { 415, 528 }, /* D */ + { 528, 575 }, /* E */ + { 575, 687 }, /* F */ + { 687, 792 }, /* G */ + { 792, 922 }, /* H */ + { 922, 958 }, /* I */ + { 958, 1014 }, /* J */ + { 1014, 1055 }, /* K */ + { 1055, 1189 }, /* L */ + { 1189, 1315 }, /* M */ + { 1315, 1383 }, /* N */ + { 1383, 1446 }, /* O */ + { 1446, 1482 }, /* P */ + { 1482, 1486 }, /* Q */ + { 1486, 1597 }, /* R */ + { 1597, 1777 }, /* S */ + { 1777, 1900 }, /* T */ + { 1900, 1911 }, /* U */ + { 1911, 1937 }, /* V */ + { 1937, 2028 }, /* W */ + { 0, 0 }, /* X */ + { 2028, 2048 }, /* Y */ +}; + +struct word { + const short value; + const char word[4]; +}; + +static const struct word dictionary[2048] = { + { 0, "A" }, { 1, "ABE" }, { 571, "ABED" }, { 572, "ABEL" }, + { 573, "ABET" }, { 574, "ABLE" }, { 575, "ABUT" }, { 2, "ACE" }, + { 576, "ACHE" }, { 577, "ACID" }, { 578, "ACME" }, { 579, "ACRE" }, + { 3, "ACT" }, { 580, "ACTA" }, { 581, "ACTS" }, { 4, "AD" }, + { 5, "ADA" }, { 582, "ADAM" }, { 6, "ADD" }, { 583, "ADDS" }, + { 584, "ADEN" }, { 585, "AFAR" }, { 586, "AFRO" }, { 587, "AGEE" }, + { 7, "AGO" }, { 588, "AHEM" }, { 589, "AHOY" }, { 8, "AID" }, + { 590, "AIDA" }, { 591, "AIDE" }, { 592, "AIDS" }, { 9, "AIM" }, + { 10, "AIR" }, { 593, "AIRY" }, { 594, "AJAR" }, { 595, "AKIN" }, + { 596, "ALAN" }, { 597, "ALEC" }, { 598, "ALGA" }, { 599, "ALIA" }, + { 11, "ALL" }, { 600, "ALLY" }, { 601, "ALMA" }, { 602, "ALOE" }, + { 12, "ALP" }, { 603, "ALSO" }, { 604, "ALTO" }, { 605, "ALUM" }, + { 606, "ALVA" }, { 13, "AM" }, { 607, "AMEN" }, { 608, "AMES" }, + { 609, "AMID" }, { 610, "AMMO" }, { 611, "AMOK" }, { 612, "AMOS" }, + { 613, "AMRA" }, { 14, "AMY" }, { 15, "AN" }, { 16, "ANA" }, + { 17, "AND" }, { 614, "ANDY" }, { 615, "ANEW" }, { 18, "ANN" }, + { 616, "ANNA" }, { 617, "ANNE" }, { 19, "ANT" }, { 618, "ANTE" }, + { 619, "ANTI" }, { 20, "ANY" }, { 21, "APE" }, { 22, "APS" }, + { 23, "APT" }, { 620, "AQUA" }, { 621, "ARAB" }, { 24, "ARC" }, + { 622, "ARCH" }, { 25, "ARE" }, { 623, "AREA" }, { 624, "ARGO" }, + { 625, "ARID" }, { 26, "ARK" }, { 27, "ARM" }, { 626, "ARMY" }, + { 28, "ART" }, { 627, "ARTS" }, { 628, "ARTY" }, { 29, "AS" }, + { 30, "ASH" }, { 629, "ASIA" }, { 31, "ASK" }, { 630, "ASKS" }, + { 32, "AT" }, { 33, "ATE" }, { 631, "ATOM" }, { 34, "AUG" }, + { 35, "AUK" }, { 632, "AUNT" }, { 633, "AURA" }, { 634, "AUTO" }, + { 36, "AVE" }, { 635, "AVER" }, { 636, "AVID" }, { 637, "AVIS" }, + { 638, "AVON" }, { 639, "AVOW" }, { 640, "AWAY" }, { 37, "AWE" }, + { 38, "AWK" }, { 39, "AWL" }, { 40, "AWN" }, { 641, "AWRY" }, + { 41, "AX" }, { 42, "AYE" }, { 642, "BABE" }, { 643, "BABY" }, + { 644, "BACH" }, { 645, "BACK" }, { 43, "BAD" }, { 646, "BADE" }, + { 44, "BAG" }, { 45, "BAH" }, { 647, "BAIL" }, { 648, "BAIT" }, + { 649, "BAKE" }, { 650, "BALD" }, { 651, "BALE" }, { 652, "BALI" }, + { 653, "BALK" }, { 654, "BALL" }, { 655, "BALM" }, { 46, "BAM" }, + { 47, "BAN" }, { 656, "BAND" }, { 657, "BANE" }, { 658, "BANG" }, + { 659, "BANK" }, { 48, "BAR" }, { 660, "BARB" }, { 661, "BARD" }, + { 662, "BARE" }, { 663, "BARK" }, { 664, "BARN" }, { 665, "BARR" }, + { 666, "BASE" }, { 667, "BASH" }, { 668, "BASK" }, { 669, "BASS" }, + { 49, "BAT" }, { 670, "BATE" }, { 671, "BATH" }, { 672, "BAWD" }, + { 673, "BAWL" }, { 50, "BAY" }, { 51, "BE" }, { 674, "BEAD" }, + { 675, "BEAK" }, { 676, "BEAM" }, { 677, "BEAN" }, { 678, "BEAR" }, + { 679, "BEAT" }, { 680, "BEAU" }, { 681, "BECK" }, { 52, "BED" }, + { 53, "BEE" }, { 682, "BEEF" }, { 683, "BEEN" }, { 684, "BEER" }, + { 685, "BEET" }, { 54, "BEG" }, { 686, "BELA" }, { 687, "BELL" }, + { 688, "BELT" }, { 55, "BEN" }, { 689, "BEND" }, { 690, "BENT" }, + { 691, "BERG" }, { 692, "BERN" }, { 693, "BERT" }, { 694, "BESS" }, + { 695, "BEST" }, { 56, "BET" }, { 696, "BETA" }, { 697, "BETH" }, + { 57, "BEY" }, { 698, "BHOY" }, { 699, "BIAS" }, { 58, "BIB" }, + { 59, "BID" }, { 700, "BIDE" }, { 701, "BIEN" }, { 60, "BIG" }, + { 702, "BILE" }, { 703, "BILK" }, { 704, "BILL" }, { 61, "BIN" }, + { 705, "BIND" }, { 706, "BING" }, { 707, "BIRD" }, { 62, "BIT" }, + { 708, "BITE" }, { 709, "BITS" }, { 710, "BLAB" }, { 711, "BLAT" }, + { 712, "BLED" }, { 713, "BLEW" }, { 714, "BLOB" }, { 715, "BLOC" }, + { 716, "BLOT" }, { 717, "BLOW" }, { 718, "BLUE" }, { 719, "BLUM" }, + { 720, "BLUR" }, { 721, "BOAR" }, { 722, "BOAT" }, { 63, "BOB" }, + { 723, "BOCA" }, { 724, "BOCK" }, { 725, "BODE" }, { 726, "BODY" }, + { 64, "BOG" }, { 727, "BOGY" }, { 728, "BOHR" }, { 729, "BOIL" }, + { 730, "BOLD" }, { 731, "BOLO" }, { 732, "BOLT" }, { 733, "BOMB" }, + { 65, "BON" }, { 734, "BONA" }, { 735, "BOND" }, { 736, "BONE" }, + { 737, "BONG" }, { 738, "BONN" }, { 739, "BONY" }, { 66, "BOO" }, + { 740, "BOOK" }, { 741, "BOOM" }, { 742, "BOON" }, { 743, "BOOT" }, + { 67, "BOP" }, { 744, "BORE" }, { 745, "BORG" }, { 746, "BORN" }, + { 747, "BOSE" }, { 748, "BOSS" }, { 749, "BOTH" }, { 750, "BOUT" }, + { 68, "BOW" }, { 751, "BOWL" }, { 69, "BOY" }, { 752, "BOYD" }, + { 753, "BRAD" }, { 754, "BRAE" }, { 755, "BRAG" }, { 756, "BRAN" }, + { 757, "BRAY" }, { 758, "BRED" }, { 759, "BREW" }, { 760, "BRIG" }, + { 761, "BRIM" }, { 762, "BROW" }, { 70, "BUB" }, { 763, "BUCK" }, + { 71, "BUD" }, { 764, "BUDD" }, { 765, "BUFF" }, { 72, "BUG" }, + { 766, "BULB" }, { 767, "BULK" }, { 768, "BULL" }, { 73, "BUM" }, + { 74, "BUN" }, { 769, "BUNK" }, { 770, "BUNT" }, { 771, "BUOY" }, + { 772, "BURG" }, { 773, "BURL" }, { 774, "BURN" }, { 775, "BURR" }, + { 776, "BURT" }, { 777, "BURY" }, { 75, "BUS" }, { 778, "BUSH" }, + { 779, "BUSS" }, { 780, "BUST" }, { 781, "BUSY" }, { 76, "BUT" }, + { 77, "BUY" }, { 78, "BY" }, { 79, "BYE" }, { 782, "BYTE" }, + { 80, "CAB" }, { 783, "CADY" }, { 784, "CAFE" }, { 785, "CAGE" }, + { 786, "CAIN" }, { 787, "CAKE" }, { 81, "CAL" }, { 788, "CALF" }, + { 789, "CALL" }, { 790, "CALM" }, { 82, "CAM" }, { 791, "CAME" }, + { 83, "CAN" }, { 792, "CANE" }, { 793, "CANT" }, { 84, "CAP" }, + { 85, "CAR" }, { 794, "CARD" }, { 795, "CARE" }, { 796, "CARL" }, + { 797, "CARR" }, { 798, "CART" }, { 799, "CASE" }, { 800, "CASH" }, + { 801, "CASK" }, { 802, "CAST" }, { 86, "CAT" }, { 803, "CAVE" }, + { 87, "CAW" }, { 804, "CEIL" }, { 805, "CELL" }, { 806, "CENT" }, + { 807, "CERN" }, { 808, "CHAD" }, { 809, "CHAR" }, { 810, "CHAT" }, + { 811, "CHAW" }, { 812, "CHEF" }, { 813, "CHEN" }, { 814, "CHEW" }, + { 815, "CHIC" }, { 816, "CHIN" }, { 817, "CHOU" }, { 818, "CHOW" }, + { 819, "CHUB" }, { 820, "CHUG" }, { 821, "CHUM" }, { 822, "CITE" }, + { 823, "CITY" }, { 824, "CLAD" }, { 825, "CLAM" }, { 826, "CLAN" }, + { 827, "CLAW" }, { 828, "CLAY" }, { 829, "CLOD" }, { 830, "CLOG" }, + { 831, "CLOT" }, { 832, "CLUB" }, { 833, "CLUE" }, { 834, "COAL" }, + { 835, "COAT" }, { 836, "COCA" }, { 837, "COCK" }, { 838, "COCO" }, + { 88, "COD" }, { 839, "CODA" }, { 840, "CODE" }, { 841, "CODY" }, + { 842, "COED" }, { 89, "COG" }, { 843, "COIL" }, { 844, "COIN" }, + { 845, "COKE" }, { 90, "COL" }, { 846, "COLA" }, { 847, "COLD" }, + { 848, "COLT" }, { 849, "COMA" }, { 850, "COMB" }, { 851, "COME" }, + { 91, "CON" }, { 92, "COO" }, { 852, "COOK" }, { 853, "COOL" }, + { 854, "COON" }, { 855, "COOT" }, { 93, "COP" }, { 856, "CORD" }, + { 857, "CORE" }, { 858, "CORK" }, { 859, "CORN" }, { 860, "COST" }, + { 94, "COT" }, { 861, "COVE" }, { 95, "COW" }, { 862, "COWL" }, + { 96, "COY" }, { 863, "CRAB" }, { 864, "CRAG" }, { 865, "CRAM" }, + { 866, "CRAY" }, { 867, "CREW" }, { 868, "CRIB" }, { 869, "CROW" }, + { 870, "CRUD" }, { 97, "CRY" }, { 98, "CUB" }, { 871, "CUBA" }, + { 872, "CUBE" }, { 99, "CUE" }, { 873, "CUFF" }, { 874, "CULL" }, + { 875, "CULT" }, { 876, "CUNY" }, { 100, "CUP" }, { 101, "CUR" }, + { 877, "CURB" }, { 878, "CURD" }, { 879, "CURE" }, { 880, "CURL" }, + { 881, "CURT" }, { 102, "CUT" }, { 882, "CUTS" }, { 103, "DAB" }, + { 104, "DAD" }, { 883, "DADE" }, { 884, "DALE" }, { 105, "DAM" }, + { 885, "DAME" }, { 106, "DAN" }, { 886, "DANA" }, { 887, "DANE" }, + { 888, "DANG" }, { 889, "DANK" }, { 107, "DAR" }, { 890, "DARE" }, + { 891, "DARK" }, { 892, "DARN" }, { 893, "DART" }, { 894, "DASH" }, + { 895, "DATA" }, { 896, "DATE" }, { 897, "DAVE" }, { 898, "DAVY" }, + { 899, "DAWN" }, { 108, "DAY" }, { 900, "DAYS" }, { 901, "DEAD" }, + { 902, "DEAF" }, { 903, "DEAL" }, { 904, "DEAN" }, { 905, "DEAR" }, + { 906, "DEBT" }, { 907, "DECK" }, { 109, "DEE" }, { 908, "DEED" }, + { 909, "DEEM" }, { 910, "DEER" }, { 911, "DEFT" }, { 912, "DEFY" }, + { 110, "DEL" }, { 913, "DELL" }, { 111, "DEN" }, { 914, "DENT" }, + { 915, "DENY" }, { 112, "DES" }, { 916, "DESK" }, { 113, "DEW" }, + { 917, "DIAL" }, { 918, "DICE" }, { 114, "DID" }, { 115, "DIE" }, + { 919, "DIED" }, { 920, "DIET" }, { 116, "DIG" }, { 921, "DIME" }, + { 117, "DIN" }, { 922, "DINE" }, { 923, "DING" }, { 924, "DINT" }, + { 118, "DIP" }, { 925, "DIRE" }, { 926, "DIRT" }, { 927, "DISC" }, + { 928, "DISH" }, { 929, "DISK" }, { 930, "DIVE" }, { 119, "DO" }, + { 931, "DOCK" }, { 120, "DOE" }, { 932, "DOES" }, { 121, "DOG" }, + { 933, "DOLE" }, { 934, "DOLL" }, { 935, "DOLT" }, { 936, "DOME" }, + { 122, "DON" }, { 937, "DONE" }, { 938, "DOOM" }, { 939, "DOOR" }, + { 940, "DORA" }, { 941, "DOSE" }, { 123, "DOT" }, { 942, "DOTE" }, + { 943, "DOUG" }, { 944, "DOUR" }, { 945, "DOVE" }, { 124, "DOW" }, + { 946, "DOWN" }, { 947, "DRAB" }, { 948, "DRAG" }, { 949, "DRAM" }, + { 950, "DRAW" }, { 951, "DREW" }, { 952, "DRUB" }, { 953, "DRUG" }, + { 954, "DRUM" }, { 125, "DRY" }, { 955, "DUAL" }, { 126, "DUB" }, + { 956, "DUCK" }, { 957, "DUCT" }, { 127, "DUD" }, { 128, "DUE" }, + { 958, "DUEL" }, { 959, "DUET" }, { 129, "DUG" }, { 960, "DUKE" }, + { 961, "DULL" }, { 962, "DUMB" }, { 130, "DUN" }, { 963, "DUNE" }, + { 964, "DUNK" }, { 965, "DUSK" }, { 966, "DUST" }, { 967, "DUTY" }, + { 968, "EACH" }, { 131, "EAR" }, { 969, "EARL" }, { 970, "EARN" }, + { 971, "EASE" }, { 972, "EAST" }, { 973, "EASY" }, { 132, "EAT" }, + { 974, "EBEN" }, { 975, "ECHO" }, { 133, "ED" }, { 976, "EDDY" }, + { 977, "EDEN" }, { 978, "EDGE" }, { 979, "EDGY" }, { 980, "EDIT" }, + { 981, "EDNA" }, { 134, "EEL" }, { 982, "EGAN" }, { 135, "EGG" }, + { 136, "EGO" }, { 983, "ELAN" }, { 984, "ELBA" }, { 137, "ELI" }, + { 138, "ELK" }, { 985, "ELLA" }, { 139, "ELM" }, { 986, "ELSE" }, + { 140, "ELY" }, { 141, "EM" }, { 987, "EMIL" }, { 988, "EMIT" }, + { 989, "EMMA" }, { 142, "END" }, { 990, "ENDS" }, { 991, "ERIC" }, + { 992, "EROS" }, { 143, "EST" }, { 144, "ETC" }, { 145, "EVA" }, + { 146, "EVE" }, { 993, "EVEN" }, { 994, "EVER" }, { 995, "EVIL" }, + { 147, "EWE" }, { 148, "EYE" }, { 996, "EYED" }, { 997, "FACE" }, + { 998, "FACT" }, { 149, "FAD" }, { 999, "FADE" }, { 1000, "FAIL" }, + { 1001, "FAIN" }, { 1002, "FAIR" }, { 1003, "FAKE" }, { 1004, "FALL" }, + { 1005, "FAME" }, { 150, "FAN" }, { 1006, "FANG" }, { 151, "FAR" }, + { 1007, "FARM" }, { 1008, "FAST" }, { 152, "FAT" }, { 1009, "FATE" }, + { 1010, "FAWN" }, { 153, "FAY" }, { 1011, "FEAR" }, { 1012, "FEAT" }, + { 154, "FED" }, { 155, "FEE" }, { 1013, "FEED" }, { 1014, "FEEL" }, + { 1015, "FEET" }, { 1016, "FELL" }, { 1017, "FELT" }, { 1018, "FEND" }, + { 1019, "FERN" }, { 1020, "FEST" }, { 1021, "FEUD" }, { 156, "FEW" }, + { 157, "FIB" }, { 1022, "FIEF" }, { 158, "FIG" }, { 1023, "FIGS" }, + { 1024, "FILE" }, { 1025, "FILL" }, { 1026, "FILM" }, { 159, "FIN" }, + { 1027, "FIND" }, { 1028, "FINE" }, { 1029, "FINK" }, { 160, "FIR" }, + { 1030, "FIRE" }, { 1031, "FIRM" }, { 1032, "FISH" }, { 1033, "FISK" }, + { 1034, "FIST" }, { 161, "FIT" }, { 1035, "FITS" }, { 1036, "FIVE" }, + { 1037, "FLAG" }, { 1038, "FLAK" }, { 1039, "FLAM" }, { 1040, "FLAT" }, + { 1041, "FLAW" }, { 1042, "FLEA" }, { 1043, "FLED" }, { 1044, "FLEW" }, + { 1045, "FLIT" }, { 162, "FLO" }, { 1046, "FLOC" }, { 1047, "FLOG" }, + { 1048, "FLOW" }, { 1049, "FLUB" }, { 1050, "FLUE" }, { 163, "FLY" }, + { 1051, "FOAL" }, { 1052, "FOAM" }, { 164, "FOE" }, { 165, "FOG" }, + { 1053, "FOGY" }, { 1054, "FOIL" }, { 1055, "FOLD" }, { 1056, "FOLK" }, + { 1057, "FOND" }, { 1058, "FONT" }, { 1059, "FOOD" }, { 1060, "FOOL" }, + { 1061, "FOOT" }, { 166, "FOR" }, { 1062, "FORD" }, { 1063, "FORE" }, + { 1064, "FORK" }, { 1065, "FORM" }, { 1066, "FORT" }, { 1067, "FOSS" }, + { 1068, "FOUL" }, { 1069, "FOUR" }, { 1070, "FOWL" }, { 1071, "FRAU" }, + { 1072, "FRAY" }, { 1073, "FRED" }, { 1074, "FREE" }, { 1075, "FRET" }, + { 1076, "FREY" }, { 1077, "FROG" }, { 1078, "FROM" }, { 167, "FRY" }, + { 1079, "FUEL" }, { 1080, "FULL" }, { 168, "FUM" }, { 1081, "FUME" }, + { 169, "FUN" }, { 1082, "FUND" }, { 1083, "FUNK" }, { 170, "FUR" }, + { 1084, "FURY" }, { 1085, "FUSE" }, { 1086, "FUSS" }, { 171, "GAB" }, + { 172, "GAD" }, { 1087, "GAFF" }, { 173, "GAG" }, { 1088, "GAGE" }, + { 1089, "GAIL" }, { 1090, "GAIN" }, { 1091, "GAIT" }, { 174, "GAL" }, + { 1092, "GALA" }, { 1093, "GALE" }, { 1094, "GALL" }, { 1095, "GALT" }, + { 175, "GAM" }, { 1096, "GAME" }, { 1097, "GANG" }, { 176, "GAP" }, + { 1098, "GARB" }, { 1099, "GARY" }, { 177, "GAS" }, { 1100, "GASH" }, + { 1101, "GATE" }, { 1102, "GAUL" }, { 1103, "GAUR" }, { 1104, "GAVE" }, + { 1105, "GAWK" }, { 178, "GAY" }, { 1106, "GEAR" }, { 179, "GEE" }, + { 180, "GEL" }, { 1107, "GELD" }, { 181, "GEM" }, { 1108, "GENE" }, + { 1109, "GENT" }, { 1110, "GERM" }, { 182, "GET" }, { 1111, "GETS" }, + { 1112, "GIBE" }, { 1113, "GIFT" }, { 183, "GIG" }, { 184, "GIL" }, + { 1114, "GILD" }, { 1115, "GILL" }, { 1116, "GILT" }, { 185, "GIN" }, + { 1117, "GINA" }, { 1118, "GIRD" }, { 1119, "GIRL" }, { 1120, "GIST" }, + { 1121, "GIVE" }, { 1122, "GLAD" }, { 1123, "GLEE" }, { 1124, "GLEN" }, + { 1125, "GLIB" }, { 1126, "GLOB" }, { 1127, "GLOM" }, { 1128, "GLOW" }, + { 1129, "GLUE" }, { 1130, "GLUM" }, { 1131, "GLUT" }, { 186, "GO" }, + { 1132, "GOAD" }, { 1133, "GOAL" }, { 1134, "GOAT" }, { 1135, "GOER" }, + { 1136, "GOES" }, { 1137, "GOLD" }, { 1138, "GOLF" }, { 1139, "GONE" }, + { 1140, "GONG" }, { 1141, "GOOD" }, { 1142, "GOOF" }, { 1143, "GORE" }, + { 1144, "GORY" }, { 1145, "GOSH" }, { 187, "GOT" }, { 1146, "GOUT" }, + { 1147, "GOWN" }, { 1148, "GRAB" }, { 1149, "GRAD" }, { 1150, "GRAY" }, + { 1151, "GREG" }, { 1152, "GREW" }, { 1153, "GREY" }, { 1154, "GRID" }, + { 1155, "GRIM" }, { 1156, "GRIN" }, { 1157, "GRIT" }, { 1158, "GROW" }, + { 1159, "GRUB" }, { 1160, "GULF" }, { 1161, "GULL" }, { 188, "GUM" }, + { 189, "GUN" }, { 1162, "GUNK" }, { 1163, "GURU" }, { 190, "GUS" }, + { 1164, "GUSH" }, { 1165, "GUST" }, { 191, "GUT" }, { 192, "GUY" }, + { 1166, "GWEN" }, { 1167, "GWYN" }, { 193, "GYM" }, { 194, "GYP" }, + { 195, "HA" }, { 1168, "HAAG" }, { 1169, "HAAS" }, { 1170, "HACK" }, + { 196, "HAD" }, { 1171, "HAIL" }, { 1172, "HAIR" }, { 197, "HAL" }, + { 1173, "HALE" }, { 1174, "HALF" }, { 1175, "HALL" }, { 1176, "HALO" }, + { 1177, "HALT" }, { 198, "HAM" }, { 199, "HAN" }, { 1178, "HAND" }, + { 1179, "HANG" }, { 1180, "HANK" }, { 1181, "HANS" }, { 200, "HAP" }, + { 1182, "HARD" }, { 1183, "HARK" }, { 1184, "HARM" }, { 1185, "HART" }, + { 201, "HAS" }, { 1186, "HASH" }, { 1187, "HAST" }, { 202, "HAT" }, + { 1188, "HATE" }, { 1189, "HATH" }, { 1190, "HAUL" }, { 1191, "HAVE" }, + { 203, "HAW" }, { 1192, "HAWK" }, { 204, "HAY" }, { 1193, "HAYS" }, + { 205, "HE" }, { 1194, "HEAD" }, { 1195, "HEAL" }, { 1196, "HEAR" }, + { 1197, "HEAT" }, { 1198, "HEBE" }, { 1199, "HECK" }, { 1200, "HEED" }, + { 1201, "HEEL" }, { 1202, "HEFT" }, { 1203, "HELD" }, { 1204, "HELL" }, + { 1205, "HELM" }, { 206, "HEM" }, { 207, "HEN" }, { 208, "HER" }, + { 1206, "HERB" }, { 1207, "HERD" }, { 1208, "HERE" }, { 1209, "HERO" }, + { 1210, "HERS" }, { 1211, "HESS" }, { 209, "HEW" }, { 1212, "HEWN" }, + { 210, "HEY" }, { 211, "HI" }, { 1213, "HICK" }, { 212, "HID" }, + { 1214, "HIDE" }, { 1215, "HIGH" }, { 1216, "HIKE" }, { 1217, "HILL" }, + { 1218, "HILT" }, { 213, "HIM" }, { 1219, "HIND" }, { 1220, "HINT" }, + { 214, "HIP" }, { 1221, "HIRE" }, { 215, "HIS" }, { 1222, "HISS" }, + { 216, "HIT" }, { 1223, "HIVE" }, { 217, "HO" }, { 218, "HOB" }, + { 1224, "HOBO" }, { 219, "HOC" }, { 1225, "HOCK" }, { 220, "HOE" }, + { 1226, "HOFF" }, { 221, "HOG" }, { 1227, "HOLD" }, { 1228, "HOLE" }, + { 1229, "HOLM" }, { 1230, "HOLT" }, { 1231, "HOME" }, { 1232, "HONE" }, + { 1233, "HONK" }, { 1234, "HOOD" }, { 1235, "HOOF" }, { 1236, "HOOK" }, + { 1237, "HOOT" }, { 222, "HOP" }, { 1238, "HORN" }, { 1239, "HOSE" }, + { 1240, "HOST" }, { 223, "HOT" }, { 1241, "HOUR" }, { 1242, "HOVE" }, + { 224, "HOW" }, { 1243, "HOWE" }, { 1244, "HOWL" }, { 1245, "HOYT" }, + { 225, "HUB" }, { 1246, "HUCK" }, { 226, "HUE" }, { 1247, "HUED" }, + { 1248, "HUFF" }, { 227, "HUG" }, { 1249, "HUGE" }, { 1250, "HUGH" }, + { 1251, "HUGO" }, { 228, "HUH" }, { 1252, "HULK" }, { 1253, "HULL" }, + { 229, "HUM" }, { 1254, "HUNK" }, { 1255, "HUNT" }, { 1256, "HURD" }, + { 1257, "HURL" }, { 1258, "HURT" }, { 1259, "HUSH" }, { 230, "HUT" }, + { 1260, "HYDE" }, { 1261, "HYMN" }, { 231, "I" }, { 1262, "IBIS" }, + { 1263, "ICON" }, { 232, "ICY" }, { 233, "IDA" }, { 1264, "IDEA" }, + { 1265, "IDLE" }, { 234, "IF" }, { 1266, "IFFY" }, { 235, "IKE" }, + { 236, "ILL" }, { 1267, "INCA" }, { 1268, "INCH" }, { 237, "INK" }, + { 238, "INN" }, { 1269, "INTO" }, { 239, "IO" }, { 240, "ION" }, + { 1270, "IONS" }, { 1271, "IOTA" }, { 1272, "IOWA" }, { 241, "IQ" }, + { 242, "IRA" }, { 243, "IRE" }, { 1273, "IRIS" }, { 244, "IRK" }, + { 1274, "IRMA" }, { 1275, "IRON" }, { 245, "IS" }, { 1276, "ISLE" }, + { 246, "IT" }, { 1277, "ITCH" }, { 1278, "ITEM" }, { 247, "ITS" }, + { 1279, "IVAN" }, { 248, "IVY" }, { 249, "JAB" }, { 1280, "JACK" }, + { 1281, "JADE" }, { 250, "JAG" }, { 1282, "JAIL" }, { 1283, "JAKE" }, + { 251, "JAM" }, { 252, "JAN" }, { 1284, "JANE" }, { 253, "JAR" }, + { 1285, "JAVA" }, { 254, "JAW" }, { 255, "JAY" }, { 1286, "JEAN" }, + { 1287, "JEFF" }, { 1288, "JERK" }, { 1289, "JESS" }, { 1290, "JEST" }, + { 256, "JET" }, { 1291, "JIBE" }, { 257, "JIG" }, { 1292, "JILL" }, + { 1293, "JILT" }, { 258, "JIM" }, { 1294, "JIVE" }, { 259, "JO" }, + { 1295, "JOAN" }, { 260, "JOB" }, { 1296, "JOBS" }, { 1297, "JOCK" }, + { 261, "JOE" }, { 1298, "JOEL" }, { 1299, "JOEY" }, { 262, "JOG" }, + { 1300, "JOHN" }, { 1301, "JOIN" }, { 1302, "JOKE" }, { 1303, "JOLT" }, + { 263, "JOT" }, { 1304, "JOVE" }, { 264, "JOY" }, { 1305, "JUDD" }, + { 1306, "JUDE" }, { 1307, "JUDO" }, { 1308, "JUDY" }, { 265, "JUG" }, + { 1309, "JUJU" }, { 1310, "JUKE" }, { 1311, "JULY" }, { 1312, "JUNE" }, + { 1313, "JUNK" }, { 1314, "JUNO" }, { 1315, "JURY" }, { 1316, "JUST" }, + { 266, "JUT" }, { 1317, "JUTE" }, { 1318, "KAHN" }, { 1319, "KALE" }, + { 1320, "KANE" }, { 1321, "KANT" }, { 1322, "KARL" }, { 1323, "KATE" }, + { 267, "KAY" }, { 1324, "KEEL" }, { 1325, "KEEN" }, { 268, "KEG" }, + { 269, "KEN" }, { 1326, "KENO" }, { 1327, "KENT" }, { 1328, "KERN" }, + { 1329, "KERR" }, { 270, "KEY" }, { 1330, "KEYS" }, { 1331, "KICK" }, + { 271, "KID" }, { 1332, "KILL" }, { 272, "KIM" }, { 273, "KIN" }, + { 1333, "KIND" }, { 1334, "KING" }, { 1335, "KIRK" }, { 1336, "KISS" }, + { 274, "KIT" }, { 1337, "KITE" }, { 1338, "KLAN" }, { 1339, "KNEE" }, + { 1340, "KNEW" }, { 1341, "KNIT" }, { 1342, "KNOB" }, { 1343, "KNOT" }, + { 1344, "KNOW" }, { 1345, "KOCH" }, { 1346, "KONG" }, { 1347, "KUDO" }, + { 1348, "KURD" }, { 1349, "KURT" }, { 1350, "KYLE" }, { 275, "LA" }, + { 276, "LAB" }, { 277, "LAC" }, { 1351, "LACE" }, { 1352, "LACK" }, + { 1353, "LACY" }, { 278, "LAD" }, { 1354, "LADY" }, { 279, "LAG" }, + { 1355, "LAID" }, { 1356, "LAIN" }, { 1357, "LAIR" }, { 1358, "LAKE" }, + { 280, "LAM" }, { 1359, "LAMB" }, { 1360, "LAME" }, { 1361, "LAND" }, + { 1362, "LANE" }, { 1363, "LANG" }, { 281, "LAP" }, { 1364, "LARD" }, + { 1365, "LARK" }, { 1366, "LASS" }, { 1367, "LAST" }, { 1368, "LATE" }, + { 1369, "LAUD" }, { 1370, "LAVA" }, { 282, "LAW" }, { 1371, "LAWN" }, + { 1372, "LAWS" }, { 283, "LAY" }, { 1373, "LAYS" }, { 284, "LEA" }, + { 1374, "LEAD" }, { 1375, "LEAF" }, { 1376, "LEAK" }, { 1377, "LEAN" }, + { 1378, "LEAR" }, { 285, "LED" }, { 286, "LEE" }, { 1379, "LEEK" }, + { 1380, "LEER" }, { 1381, "LEFT" }, { 287, "LEG" }, { 288, "LEN" }, + { 1382, "LEND" }, { 1383, "LENS" }, { 1384, "LENT" }, { 289, "LEO" }, + { 1385, "LEON" }, { 1386, "LESK" }, { 1387, "LESS" }, { 1388, "LEST" }, + { 290, "LET" }, { 1389, "LETS" }, { 291, "LEW" }, { 1390, "LIAR" }, + { 1391, "LICE" }, { 1392, "LICK" }, { 292, "LID" }, { 293, "LIE" }, + { 1393, "LIED" }, { 1394, "LIEN" }, { 1395, "LIES" }, { 1396, "LIEU" }, + { 1397, "LIFE" }, { 1398, "LIFT" }, { 1399, "LIKE" }, { 1400, "LILA" }, + { 1401, "LILT" }, { 1402, "LILY" }, { 1403, "LIMA" }, { 1404, "LIMB" }, + { 1405, "LIME" }, { 294, "LIN" }, { 1406, "LIND" }, { 1407, "LINE" }, + { 1408, "LINK" }, { 1409, "LINT" }, { 1410, "LION" }, { 295, "LIP" }, + { 1411, "LISA" }, { 1412, "LIST" }, { 296, "LIT" }, { 1413, "LIVE" }, + { 297, "LO" }, { 1414, "LOAD" }, { 1415, "LOAF" }, { 1416, "LOAM" }, + { 1417, "LOAN" }, { 298, "LOB" }, { 1418, "LOCK" }, { 1419, "LOFT" }, + { 299, "LOG" }, { 1420, "LOGE" }, { 1421, "LOIS" }, { 1422, "LOLA" }, + { 1423, "LONE" }, { 1424, "LONG" }, { 1425, "LOOK" }, { 1426, "LOON" }, + { 1427, "LOOT" }, { 300, "LOP" }, { 1428, "LORD" }, { 1429, "LORE" }, + { 301, "LOS" }, { 1430, "LOSE" }, { 1431, "LOSS" }, { 1432, "LOST" }, + { 302, "LOT" }, { 303, "LOU" }, { 1433, "LOUD" }, { 1434, "LOVE" }, + { 304, "LOW" }, { 1435, "LOWE" }, { 305, "LOY" }, { 1436, "LUCK" }, + { 1437, "LUCY" }, { 306, "LUG" }, { 1438, "LUGE" }, { 1439, "LUKE" }, + { 1440, "LULU" }, { 1441, "LUND" }, { 1442, "LUNG" }, { 1443, "LURA" }, + { 1444, "LURE" }, { 1445, "LURK" }, { 1446, "LUSH" }, { 1447, "LUST" }, + { 307, "LYE" }, { 1448, "LYLE" }, { 1449, "LYNN" }, { 1450, "LYON" }, + { 1451, "LYRA" }, { 308, "MA" }, { 309, "MAC" }, { 1452, "MACE" }, + { 310, "MAD" }, { 1453, "MADE" }, { 311, "MAE" }, { 1454, "MAGI" }, + { 1455, "MAID" }, { 1456, "MAIL" }, { 1457, "MAIN" }, { 1458, "MAKE" }, + { 1459, "MALE" }, { 1460, "MALI" }, { 1461, "MALL" }, { 1462, "MALT" }, + { 312, "MAN" }, { 1463, "MANA" }, { 1464, "MANN" }, { 1465, "MANY" }, + { 313, "MAO" }, { 314, "MAP" }, { 1466, "MARC" }, { 1467, "MARE" }, + { 1468, "MARK" }, { 1469, "MARS" }, { 1470, "MART" }, { 1471, "MARY" }, + { 1472, "MASH" }, { 1473, "MASK" }, { 1474, "MASS" }, { 1475, "MAST" }, + { 315, "MAT" }, { 1476, "MATE" }, { 1477, "MATH" }, { 1478, "MAUL" }, + { 316, "MAW" }, { 317, "MAY" }, { 1479, "MAYO" }, { 318, "ME" }, + { 1480, "MEAD" }, { 1481, "MEAL" }, { 1482, "MEAN" }, { 1483, "MEAT" }, + { 1484, "MEEK" }, { 1485, "MEET" }, { 319, "MEG" }, { 320, "MEL" }, + { 1486, "MELD" }, { 1487, "MELT" }, { 1488, "MEMO" }, { 321, "MEN" }, + { 1489, "MEND" }, { 1490, "MENU" }, { 1491, "MERT" }, { 1492, "MESH" }, + { 1493, "MESS" }, { 322, "MET" }, { 323, "MEW" }, { 1494, "MICE" }, + { 324, "MID" }, { 1495, "MIKE" }, { 1496, "MILD" }, { 1497, "MILE" }, + { 1498, "MILK" }, { 1499, "MILL" }, { 1500, "MILT" }, { 1501, "MIMI" }, + { 325, "MIN" }, { 1502, "MIND" }, { 1503, "MINE" }, { 1504, "MINI" }, + { 1505, "MINK" }, { 1506, "MINT" }, { 1507, "MIRE" }, { 1508, "MISS" }, + { 1509, "MIST" }, { 326, "MIT" }, { 1510, "MITE" }, { 1511, "MITT" }, + { 1512, "MOAN" }, { 1513, "MOAT" }, { 327, "MOB" }, { 1514, "MOCK" }, + { 328, "MOD" }, { 1515, "MODE" }, { 329, "MOE" }, { 1516, "MOLD" }, + { 1517, "MOLE" }, { 1518, "MOLL" }, { 1519, "MOLT" }, { 1520, "MONA" }, + { 1521, "MONK" }, { 1522, "MONT" }, { 330, "MOO" }, { 1523, "MOOD" }, + { 1524, "MOON" }, { 1525, "MOOR" }, { 1526, "MOOT" }, { 331, "MOP" }, + { 1527, "MORE" }, { 1528, "MORN" }, { 1529, "MORT" }, { 332, "MOS" }, + { 1530, "MOSS" }, { 1531, "MOST" }, { 333, "MOT" }, { 1532, "MOTH" }, + { 1533, "MOVE" }, { 334, "MOW" }, { 1534, "MUCH" }, { 1535, "MUCK" }, + { 335, "MUD" }, { 1536, "MUDD" }, { 1537, "MUFF" }, { 336, "MUG" }, + { 1538, "MULE" }, { 1539, "MULL" }, { 337, "MUM" }, { 1540, "MURK" }, + { 1541, "MUSH" }, { 1542, "MUST" }, { 1543, "MUTE" }, { 1544, "MUTT" }, + { 338, "MY" }, { 1545, "MYRA" }, { 1546, "MYTH" }, { 339, "NAB" }, + { 340, "NAG" }, { 1547, "NAGY" }, { 1548, "NAIL" }, { 1549, "NAIR" }, + { 1550, "NAME" }, { 341, "NAN" }, { 342, "NAP" }, { 1551, "NARY" }, + { 1552, "NASH" }, { 343, "NAT" }, { 1553, "NAVE" }, { 1554, "NAVY" }, + { 344, "NAY" }, { 345, "NE" }, { 1555, "NEAL" }, { 1556, "NEAR" }, + { 1557, "NEAT" }, { 1558, "NECK" }, { 346, "NED" }, { 347, "NEE" }, + { 1559, "NEED" }, { 1560, "NEIL" }, { 1561, "NELL" }, { 1562, "NEON" }, + { 1563, "NERO" }, { 1564, "NESS" }, { 1565, "NEST" }, { 348, "NET" }, + { 349, "NEW" }, { 1566, "NEWS" }, { 1567, "NEWT" }, { 350, "NIB" }, + { 1568, "NIBS" }, { 1569, "NICE" }, { 1570, "NICK" }, { 351, "NIL" }, + { 1571, "NILE" }, { 1572, "NINA" }, { 1573, "NINE" }, { 352, "NIP" }, + { 353, "NIT" }, { 354, "NO" }, { 1574, "NOAH" }, { 355, "NOB" }, + { 356, "NOD" }, { 1575, "NODE" }, { 1576, "NOEL" }, { 1577, "NOLL" }, + { 357, "NON" }, { 1578, "NONE" }, { 1579, "NOOK" }, { 1580, "NOON" }, + { 358, "NOR" }, { 1581, "NORM" }, { 1582, "NOSE" }, { 359, "NOT" }, + { 1583, "NOTE" }, { 1584, "NOUN" }, { 360, "NOV" }, { 1585, "NOVA" }, + { 361, "NOW" }, { 362, "NU" }, { 1586, "NUDE" }, { 1587, "NULL" }, + { 1588, "NUMB" }, { 363, "NUN" }, { 364, "NUT" }, { 365, "O" }, + { 366, "OAF" }, { 367, "OAK" }, { 368, "OAR" }, { 369, "OAT" }, + { 1589, "OATH" }, { 1590, "OBEY" }, { 1591, "OBOE" }, { 370, "ODD" }, + { 371, "ODE" }, { 1592, "ODIN" }, { 372, "OF" }, { 373, "OFF" }, + { 374, "OFT" }, { 375, "OH" }, { 1593, "OHIO" }, { 376, "OIL" }, + { 1594, "OILY" }, { 1595, "OINT" }, { 377, "OK" }, { 1596, "OKAY" }, + { 1597, "OLAF" }, { 378, "OLD" }, { 1598, "OLDY" }, { 1599, "OLGA" }, + { 1600, "OLIN" }, { 1601, "OMAN" }, { 1602, "OMEN" }, { 1603, "OMIT" }, + { 379, "ON" }, { 1604, "ONCE" }, { 380, "ONE" }, { 1605, "ONES" }, + { 1606, "ONLY" }, { 1607, "ONTO" }, { 1608, "ONUS" }, { 381, "OR" }, + { 1609, "ORAL" }, { 382, "ORB" }, { 383, "ORE" }, { 1610, "ORGY" }, + { 384, "ORR" }, { 385, "OS" }, { 1611, "OSLO" }, { 1612, "OTIS" }, + { 386, "OTT" }, { 1613, "OTTO" }, { 1614, "OUCH" }, { 387, "OUR" }, + { 1615, "OUST" }, { 388, "OUT" }, { 1616, "OUTS" }, { 389, "OVA" }, + { 1617, "OVAL" }, { 1618, "OVEN" }, { 1619, "OVER" }, { 390, "OW" }, + { 391, "OWE" }, { 392, "OWL" }, { 1620, "OWLY" }, { 393, "OWN" }, + { 1621, "OWNS" }, { 394, "OX" }, { 395, "PA" }, { 396, "PAD" }, + { 397, "PAL" }, { 398, "PAM" }, { 399, "PAN" }, { 400, "PAP" }, + { 401, "PAR" }, { 402, "PAT" }, { 403, "PAW" }, { 404, "PAY" }, + { 405, "PEA" }, { 406, "PEG" }, { 407, "PEN" }, { 408, "PEP" }, + { 409, "PER" }, { 410, "PET" }, { 411, "PEW" }, { 412, "PHI" }, + { 413, "PI" }, { 414, "PIE" }, { 415, "PIN" }, { 416, "PIT" }, + { 417, "PLY" }, { 418, "PO" }, { 419, "POD" }, { 420, "POE" }, + { 421, "POP" }, { 422, "POT" }, { 423, "POW" }, { 424, "PRO" }, + { 425, "PRY" }, { 426, "PUB" }, { 427, "PUG" }, { 428, "PUN" }, + { 429, "PUP" }, { 430, "PUT" }, { 1622, "QUAD" }, { 1623, "QUIT" }, + { 431, "QUO" }, { 1624, "QUOD" }, { 1625, "RACE" }, { 1626, "RACK" }, + { 1627, "RACY" }, { 1628, "RAFT" }, { 432, "RAG" }, { 1629, "RAGE" }, + { 1630, "RAID" }, { 1631, "RAIL" }, { 1632, "RAIN" }, { 1633, "RAKE" }, + { 433, "RAM" }, { 434, "RAN" }, { 1634, "RANK" }, { 1635, "RANT" }, + { 435, "RAP" }, { 1636, "RARE" }, { 1637, "RASH" }, { 436, "RAT" }, + { 1638, "RATE" }, { 1639, "RAVE" }, { 437, "RAW" }, { 438, "RAY" }, + { 1640, "RAYS" }, { 1641, "READ" }, { 1642, "REAL" }, { 1643, "REAM" }, + { 1644, "REAR" }, { 439, "REB" }, { 1645, "RECK" }, { 440, "RED" }, + { 1646, "REED" }, { 1647, "REEF" }, { 1648, "REEK" }, { 1649, "REEL" }, + { 1650, "REID" }, { 1651, "REIN" }, { 1652, "RENA" }, { 1653, "REND" }, + { 1654, "RENT" }, { 441, "REP" }, { 1655, "REST" }, { 442, "RET" }, + { 443, "RIB" }, { 1656, "RICE" }, { 1657, "RICH" }, { 1658, "RICK" }, + { 444, "RID" }, { 1659, "RIDE" }, { 1660, "RIFT" }, { 445, "RIG" }, + { 1661, "RILL" }, { 446, "RIM" }, { 1662, "RIME" }, { 1663, "RING" }, + { 1664, "RINK" }, { 447, "RIO" }, { 448, "RIP" }, { 1665, "RISE" }, + { 1666, "RISK" }, { 1667, "RITE" }, { 1668, "ROAD" }, { 1669, "ROAM" }, + { 1670, "ROAR" }, { 449, "ROB" }, { 1671, "ROBE" }, { 1672, "ROCK" }, + { 450, "ROD" }, { 1673, "RODE" }, { 451, "ROE" }, { 1674, "ROIL" }, + { 1675, "ROLL" }, { 1676, "ROME" }, { 452, "RON" }, { 1677, "ROOD" }, + { 1678, "ROOF" }, { 1679, "ROOK" }, { 1680, "ROOM" }, { 1681, "ROOT" }, + { 1682, "ROSA" }, { 1683, "ROSE" }, { 1684, "ROSS" }, { 1685, "ROSY" }, + { 453, "ROT" }, { 1686, "ROTH" }, { 1687, "ROUT" }, { 1688, "ROVE" }, + { 454, "ROW" }, { 1689, "ROWE" }, { 1690, "ROWS" }, { 455, "ROY" }, + { 456, "RUB" }, { 1691, "RUBE" }, { 1692, "RUBY" }, { 1693, "RUDE" }, + { 1694, "RUDY" }, { 457, "RUE" }, { 458, "RUG" }, { 1695, "RUIN" }, + { 1696, "RULE" }, { 459, "RUM" }, { 460, "RUN" }, { 1697, "RUNG" }, + { 1698, "RUNS" }, { 1699, "RUNT" }, { 1700, "RUSE" }, { 1701, "RUSH" }, + { 1702, "RUSK" }, { 1703, "RUSS" }, { 1704, "RUST" }, { 1705, "RUTH" }, + { 461, "RYE" }, { 462, "SAC" }, { 1706, "SACK" }, { 463, "SAD" }, + { 1707, "SAFE" }, { 464, "SAG" }, { 1708, "SAGE" }, { 1709, "SAID" }, + { 1710, "SAIL" }, { 465, "SAL" }, { 1711, "SALE" }, { 1712, "SALK" }, + { 1713, "SALT" }, { 466, "SAM" }, { 1714, "SAME" }, { 467, "SAN" }, + { 1715, "SAND" }, { 1716, "SANE" }, { 1717, "SANG" }, { 1718, "SANK" }, + { 468, "SAP" }, { 1719, "SARA" }, { 469, "SAT" }, { 1720, "SAUL" }, + { 1721, "SAVE" }, { 470, "SAW" }, { 471, "SAY" }, { 1722, "SAYS" }, + { 1723, "SCAN" }, { 1724, "SCAR" }, { 1725, "SCAT" }, { 1726, "SCOT" }, + { 472, "SEA" }, { 1727, "SEAL" }, { 1728, "SEAM" }, { 1729, "SEAR" }, + { 1730, "SEAT" }, { 473, "SEC" }, { 474, "SEE" }, { 1731, "SEED" }, + { 1732, "SEEK" }, { 1733, "SEEM" }, { 1734, "SEEN" }, { 1735, "SEES" }, + { 1736, "SELF" }, { 1737, "SELL" }, { 475, "SEN" }, { 1738, "SEND" }, + { 1739, "SENT" }, { 476, "SET" }, { 1740, "SETS" }, { 477, "SEW" }, + { 1741, "SEWN" }, { 1742, "SHAG" }, { 1743, "SHAM" }, { 1744, "SHAW" }, + { 1745, "SHAY" }, { 478, "SHE" }, { 1746, "SHED" }, { 1747, "SHIM" }, + { 1748, "SHIN" }, { 1749, "SHOD" }, { 1750, "SHOE" }, { 1751, "SHOT" }, + { 1752, "SHOW" }, { 1753, "SHUN" }, { 1754, "SHUT" }, { 479, "SHY" }, + { 1755, "SICK" }, { 1756, "SIDE" }, { 1757, "SIFT" }, { 1758, "SIGH" }, + { 1759, "SIGN" }, { 1760, "SILK" }, { 1761, "SILL" }, { 1762, "SILO" }, + { 1763, "SILT" }, { 480, "SIN" }, { 1764, "SINE" }, { 1765, "SING" }, + { 1766, "SINK" }, { 481, "SIP" }, { 482, "SIR" }, { 1767, "SIRE" }, + { 483, "SIS" }, { 484, "SIT" }, { 1768, "SITE" }, { 1769, "SITS" }, + { 1770, "SITU" }, { 1771, "SKAT" }, { 1772, "SKEW" }, { 485, "SKI" }, + { 1773, "SKID" }, { 1774, "SKIM" }, { 1775, "SKIN" }, { 1776, "SKIT" }, + { 486, "SKY" }, { 1777, "SLAB" }, { 1778, "SLAM" }, { 1779, "SLAT" }, + { 1780, "SLAY" }, { 1781, "SLED" }, { 1782, "SLEW" }, { 1783, "SLID" }, + { 1784, "SLIM" }, { 1785, "SLIT" }, { 1786, "SLOB" }, { 1787, "SLOG" }, + { 1788, "SLOT" }, { 1789, "SLOW" }, { 1790, "SLUG" }, { 1791, "SLUM" }, + { 1792, "SLUR" }, { 487, "SLY" }, { 1793, "SMOG" }, { 1794, "SMUG" }, + { 1795, "SNAG" }, { 1796, "SNOB" }, { 1797, "SNOW" }, { 1798, "SNUB" }, + { 1799, "SNUG" }, { 488, "SO" }, { 1800, "SOAK" }, { 1801, "SOAR" }, + { 489, "SOB" }, { 1802, "SOCK" }, { 490, "SOD" }, { 1803, "SODA" }, + { 1804, "SOFA" }, { 1805, "SOFT" }, { 1806, "SOIL" }, { 1807, "SOLD" }, + { 1808, "SOME" }, { 491, "SON" }, { 1809, "SONG" }, { 1810, "SOON" }, + { 1811, "SOOT" }, { 492, "SOP" }, { 1812, "SORE" }, { 1813, "SORT" }, + { 1814, "SOUL" }, { 1815, "SOUR" }, { 493, "SOW" }, { 1816, "SOWN" }, + { 494, "SOY" }, { 495, "SPA" }, { 496, "SPY" }, { 1817, "STAB" }, + { 1818, "STAG" }, { 1819, "STAN" }, { 1820, "STAR" }, { 1821, "STAY" }, + { 1822, "STEM" }, { 1823, "STEW" }, { 1824, "STIR" }, { 1825, "STOW" }, + { 1826, "STUB" }, { 1827, "STUN" }, { 497, "SUB" }, { 1828, "SUCH" }, + { 498, "SUD" }, { 1829, "SUDS" }, { 499, "SUE" }, { 1830, "SUIT" }, + { 1831, "SULK" }, { 500, "SUM" }, { 1832, "SUMS" }, { 501, "SUN" }, + { 1833, "SUNG" }, { 1834, "SUNK" }, { 502, "SUP" }, { 1835, "SURE" }, + { 1836, "SURF" }, { 1837, "SWAB" }, { 1838, "SWAG" }, { 1839, "SWAM" }, + { 1840, "SWAN" }, { 1841, "SWAT" }, { 1842, "SWAY" }, { 1843, "SWIM" }, + { 1844, "SWUM" }, { 503, "TAB" }, { 1845, "TACK" }, { 1846, "TACT" }, + { 504, "TAD" }, { 505, "TAG" }, { 1847, "TAIL" }, { 1848, "TAKE" }, + { 1849, "TALE" }, { 1850, "TALK" }, { 1851, "TALL" }, { 506, "TAN" }, + { 1852, "TANK" }, { 507, "TAP" }, { 508, "TAR" }, { 1853, "TASK" }, + { 1854, "TATE" }, { 1855, "TAUT" }, { 509, "TEA" }, { 1856, "TEAL" }, + { 1857, "TEAM" }, { 1858, "TEAR" }, { 1859, "TECH" }, { 510, "TED" }, + { 511, "TEE" }, { 1860, "TEEM" }, { 1861, "TEEN" }, { 1862, "TEET" }, + { 1863, "TELL" }, { 512, "TEN" }, { 1864, "TEND" }, { 1865, "TENT" }, + { 1866, "TERM" }, { 1867, "TERN" }, { 1868, "TESS" }, { 1869, "TEST" }, + { 1870, "THAN" }, { 1871, "THAT" }, { 513, "THE" }, { 1872, "THEE" }, + { 1873, "THEM" }, { 1874, "THEN" }, { 1875, "THEY" }, { 1876, "THIN" }, + { 1877, "THIS" }, { 1878, "THUD" }, { 1879, "THUG" }, { 514, "THY" }, + { 515, "TIC" }, { 1880, "TICK" }, { 1881, "TIDE" }, { 1882, "TIDY" }, + { 516, "TIE" }, { 1883, "TIED" }, { 1884, "TIER" }, { 1885, "TILE" }, + { 1886, "TILL" }, { 1887, "TILT" }, { 517, "TIM" }, { 1888, "TIME" }, + { 518, "TIN" }, { 1889, "TINA" }, { 1890, "TINE" }, { 1891, "TINT" }, + { 1892, "TINY" }, { 519, "TIP" }, { 1893, "TIRE" }, { 520, "TO" }, + { 1894, "TOAD" }, { 521, "TOE" }, { 522, "TOG" }, { 1895, "TOGO" }, + { 1896, "TOIL" }, { 1897, "TOLD" }, { 1898, "TOLL" }, { 523, "TOM" }, + { 524, "TON" }, { 1899, "TONE" }, { 1900, "TONG" }, { 1901, "TONY" }, + { 525, "TOO" }, { 1902, "TOOK" }, { 1903, "TOOL" }, { 1904, "TOOT" }, + { 526, "TOP" }, { 1905, "TORE" }, { 1906, "TORN" }, { 1907, "TOTE" }, + { 1908, "TOUR" }, { 1909, "TOUT" }, { 527, "TOW" }, { 1910, "TOWN" }, + { 528, "TOY" }, { 1911, "TRAG" }, { 1912, "TRAM" }, { 1913, "TRAY" }, + { 1914, "TREE" }, { 1915, "TREK" }, { 1916, "TRIG" }, { 1917, "TRIM" }, + { 1918, "TRIO" }, { 1919, "TROD" }, { 1920, "TROT" }, { 1921, "TROY" }, + { 1922, "TRUE" }, { 529, "TRY" }, { 530, "TUB" }, { 1923, "TUBA" }, + { 1924, "TUBE" }, { 1925, "TUCK" }, { 1926, "TUFT" }, { 531, "TUG" }, + { 532, "TUM" }, { 533, "TUN" }, { 1927, "TUNA" }, { 1928, "TUNE" }, + { 1929, "TUNG" }, { 1930, "TURF" }, { 1931, "TURN" }, { 1932, "TUSK" }, + { 1933, "TWIG" }, { 1934, "TWIN" }, { 1935, "TWIT" }, { 534, "TWO" }, + { 1936, "ULAN" }, { 535, "UN" }, { 1937, "UNIT" }, { 536, "UP" }, + { 1938, "URGE" }, { 537, "US" }, { 538, "USE" }, { 1939, "USED" }, + { 1940, "USER" }, { 1941, "USES" }, { 1942, "UTAH" }, { 1943, "VAIL" }, + { 1944, "VAIN" }, { 1945, "VALE" }, { 539, "VAN" }, { 1946, "VARY" }, + { 1947, "VASE" }, { 1948, "VAST" }, { 540, "VAT" }, { 1949, "VEAL" }, + { 1950, "VEDA" }, { 1951, "VEIL" }, { 1952, "VEIN" }, { 1953, "VEND" }, + { 1954, "VENT" }, { 1955, "VERB" }, { 1956, "VERY" }, { 541, "VET" }, + { 1957, "VETO" }, { 1958, "VICE" }, { 542, "VIE" }, { 1959, "VIEW" }, + { 1960, "VINE" }, { 1961, "VISE" }, { 1962, "VOID" }, { 1963, "VOLT" }, + { 1964, "VOTE" }, { 1965, "WACK" }, { 543, "WAD" }, { 1966, "WADE" }, + { 544, "WAG" }, { 1967, "WAGE" }, { 1968, "WAIL" }, { 1969, "WAIT" }, + { 1970, "WAKE" }, { 1971, "WALE" }, { 1972, "WALK" }, { 1973, "WALL" }, + { 1974, "WALT" }, { 1975, "WAND" }, { 1976, "WANE" }, { 1977, "WANG" }, + { 1978, "WANT" }, { 545, "WAR" }, { 1979, "WARD" }, { 1980, "WARM" }, + { 1981, "WARN" }, { 1982, "WART" }, { 546, "WAS" }, { 1983, "WASH" }, + { 1984, "WAST" }, { 1985, "WATS" }, { 1986, "WATT" }, { 1987, "WAVE" }, + { 1988, "WAVY" }, { 547, "WAY" }, { 1989, "WAYS" }, { 548, "WE" }, + { 1990, "WEAK" }, { 1991, "WEAL" }, { 1992, "WEAN" }, { 1993, "WEAR" }, + { 549, "WEB" }, { 550, "WED" }, { 551, "WEE" }, { 1994, "WEED" }, + { 1995, "WEEK" }, { 1996, "WEIR" }, { 1997, "WELD" }, { 1998, "WELL" }, + { 1999, "WELT" }, { 2000, "WENT" }, { 2001, "WERE" }, { 2002, "WERT" }, + { 2003, "WEST" }, { 552, "WET" }, { 2004, "WHAM" }, { 2005, "WHAT" }, + { 2006, "WHEE" }, { 2007, "WHEN" }, { 2008, "WHET" }, { 553, "WHO" }, + { 2009, "WHOA" }, { 2010, "WHOM" }, { 554, "WHY" }, { 2011, "WICK" }, + { 2012, "WIFE" }, { 2013, "WILD" }, { 2014, "WILL" }, { 555, "WIN" }, + { 2015, "WIND" }, { 2016, "WINE" }, { 2017, "WING" }, { 2018, "WINK" }, + { 2019, "WINO" }, { 2020, "WIRE" }, { 2021, "WISE" }, { 2022, "WISH" }, + { 556, "WIT" }, { 2023, "WITH" }, { 557, "WOK" }, { 2024, "WOLF" }, + { 558, "WON" }, { 2025, "WONT" }, { 559, "WOO" }, { 2026, "WOOD" }, + { 2027, "WOOL" }, { 2028, "WORD" }, { 2029, "WORE" }, { 2030, "WORK" }, + { 2031, "WORM" }, { 2032, "WORN" }, { 2033, "WOVE" }, { 560, "WOW" }, + { 2034, "WRIT" }, { 561, "WRY" }, { 562, "WU" }, { 2035, "WYNN" }, + { 2036, "YALE" }, { 563, "YAM" }, { 2037, "YANG" }, { 2038, "YANK" }, + { 564, "YAP" }, { 2039, "YARD" }, { 2040, "YARN" }, { 565, "YAW" }, + { 2041, "YAWL" }, { 2042, "YAWN" }, { 566, "YE" }, { 567, "YEA" }, + { 2043, "YEAH" }, { 2044, "YEAR" }, { 2045, "YELL" }, { 568, "YES" }, + { 569, "YET" }, { 2046, "YOGA" }, { 2047, "YOKE" }, { 570, "YOU" }, +}; + +int otp_lookup_word(const char *word) +{ + int l, u, idx, c; + int first = *word - 'A'; + + if ((first < 0) || (first > 'Y' - 'A')) + return -1; + + l = hints[first].l; + u = hints[first].u; + while (l < u) { + idx = (l + u) / 2; + c = strncmp(word, dictionary[idx].word, 4); + + if (c < 0) + u = idx; + else if (c > 0) + l = idx + 1; + else + return dictionary[idx].value; + } + + return -1; +} diff --git a/src/lib-otp/otp-dictionary.h b/src/lib-otp/otp-dictionary.h new file mode 100644 index 0000000..18e9310 --- /dev/null +++ b/src/lib-otp/otp-dictionary.h @@ -0,0 +1,6 @@ +#ifndef OTP_DICTIONARY_H +#define OTP_DICTIONARY_H + +int otp_lookup_word(const char *word); + +#endif diff --git a/src/lib-otp/otp-hash.c b/src/lib-otp/otp-hash.c new file mode 100644 index 0000000..c1b6f72 --- /dev/null +++ b/src/lib-otp/otp-hash.c @@ -0,0 +1,165 @@ +/* + * OTP hash generation. + * + * Copyright (c) 2006 Andrey Panin <pazke@donpac.ru> + * + * This software is released under the MIT license. + */ + +#include "lib.h" +#include "md4.h" +#include "md5.h" +#include "sha1.h" + +#include "otp.h" + +struct digest { + const char *name; + void (*init)(void *ctx); + void (*update)(void *ctx, const void *data, const size_t size); + void (*final)(void *ctx, void *res); + void (*otp_final)(void *ctx, void *res); +}; + +struct digest_context { + const struct digest *digest; + union { + struct md4_context md4_ctx; + struct md5_context md5_ctx; + struct sha1_ctxt sha1_ctx; + } ctx; +}; + +static void md4_fold(struct md4_context *ctx, void *res) +{ + uint32_t tmp[4], *p = res; + + md4_final(ctx, (unsigned char *) tmp); + + *p++ = tmp[0] ^ tmp[2]; + *p = tmp[1] ^ tmp[3]; +} + +static void md5_fold(struct md5_context *ctx, void *res) +{ + uint32_t tmp[4], *p = res; + + md5_final(ctx, (unsigned char *) tmp); + + *p++ = tmp[0] ^ tmp[2]; + *p = tmp[1] ^ tmp[3]; +} + +/* + * Sometimes I simply can't look at code generated by gcc. + */ +static inline uint32_t swab_uint32(uint32_t val) +{ +#if defined(__GNUC__) && defined(__i386__) + asm("xchgb %b0, %h0\n" + "rorl $16, %0\n" + "xchgb %b0, %h0\n" + :"=q" (val) + : "0" (val)); +#else + val = ((val & 0xff) << 24) | ((val & 0xff00) << 8) | + ((val & 0xff0000) >> 8) | ((val >> 24) & 0xff); +#endif + return val; +} + +static void sha1_fold(struct sha1_ctxt *ctx, void *res) +{ + uint32_t tmp[5], *p = res; + + sha1_result(ctx, tmp); + + *p++ = swab_uint32(tmp[0] ^ tmp[2] ^ tmp[4]); + *p = swab_uint32(tmp[1] ^ tmp[3]); +} + + +#define F_INIT(name) ((void (*)(void *)) (name)) +#define F_UPDATE(name) ((void (*)(void *, const void *, size_t)) (name)) +#define F_FINAL(name) ((void (*)(void *, void *)) (name)) +#define F_FOLD(name) ((void (*)(void *, void *)) (name)) + +static const struct digest digests[] = { + { "md4", F_INIT(md4_init), F_UPDATE(md4_update), F_FINAL(md4_final), F_FOLD(md4_fold) }, + { "md5", F_INIT(md5_init), F_UPDATE(md5_update), F_FINAL(md5_final), F_FOLD(md5_fold) }, + { "sha1", F_INIT(sha1_init), F_UPDATE(sha1_loop), F_FINAL(sha1_result), F_FOLD(sha1_fold) }, +}; + +#undef F_INIT +#undef F_UPDATE +#undef F_FINAL +#undef F_FOLD + +const char *digest_name(unsigned int algo) +{ + i_assert(algo < N_ELEMENTS(digests)); + + return digests[algo].name; +} + +int digest_find(const char *name) +{ + unsigned int i; + + for (i = 0; i < N_ELEMENTS(digests); i++) + if (strcmp(name, digests[i].name) == 0) + return i; + + return -1; +} + +void digest_init(struct digest_context *ctx, const unsigned int algo) +{ + i_assert(algo < N_ELEMENTS(digests)); + + ctx->digest = digests + algo; + ctx->digest->init(&ctx->ctx); +} + +void digest_update(struct digest_context *ctx, const void *data, + const size_t size) +{ + ctx->digest->update(&ctx->ctx, data, size); +} + +void digest_final(struct digest_context *ctx, unsigned char *result) +{ + ctx->digest->final(&ctx->ctx, result); +} + +void digest_otp_final(struct digest_context *ctx, unsigned char *result) +{ + ctx->digest->otp_final(&ctx->ctx, result); +} + +void otp_hash(unsigned int algo, const char *seed, const char *passphrase, + unsigned int step, unsigned char *result) +{ + struct digest_context ctx; + + digest_init(&ctx, algo); + digest_update(&ctx, seed, strlen(seed)); + digest_update(&ctx, passphrase, strlen(passphrase)); + digest_otp_final(&ctx, result); + + for (unsigned int i = 0; i < step; i++) { + digest_init(&ctx, algo); + digest_update(&ctx, result, OTP_HASH_SIZE); + digest_otp_final(&ctx, result); + } +} + +void otp_next_hash(unsigned int algo, const unsigned char *prev, + unsigned char *result) +{ + struct digest_context ctx; + + digest_init(&ctx, algo); + digest_update(&ctx, prev, OTP_HASH_SIZE); + digest_otp_final(&ctx, result); +} diff --git a/src/lib-otp/otp-hash.h b/src/lib-otp/otp-hash.h new file mode 100644 index 0000000..152f28e --- /dev/null +++ b/src/lib-otp/otp-hash.h @@ -0,0 +1,26 @@ +#ifndef OTP_HASH_H +#define OTP_HASH_H + +struct digest_context; + +enum { + OTP_HASH_MD4, + OTP_HASH_MD5, + OTP_HASH_SHA1, +}; + +int digest_find(const char *name); +void digest_init(struct digest_context *ctx, const unsigned int algo); +void digest_update(struct digest_context *ctx, const void *data, + const size_t size); +void digest_final(struct digest_context *ctx, unsigned char *result); +void digest_otp_final(struct digest_context *ctx, unsigned char *result); +const char *digest_name(unsigned int algo); + +void otp_hash(unsigned int algo, const char *seed, const char *passphrase, + unsigned int step, unsigned char *result); + +void otp_next_hash(unsigned int algo, const unsigned char *prev, + unsigned char *result); + +#endif diff --git a/src/lib-otp/otp-parity.c b/src/lib-otp/otp-parity.c new file mode 100644 index 0000000..d1ef038 --- /dev/null +++ b/src/lib-otp/otp-parity.c @@ -0,0 +1,29 @@ +/* + * OTP parity table. + * + * Copyright (c) 2006 Andrey Panin <pazke@donpac.ru> + * + * This software is released under the MIT license. + */ + +#include "lib.h" +#include "otp.h" + +const unsigned char parity_table[256] = { + 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, + 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, + 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, + 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, + 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, + 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, + 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, + 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, + 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, + 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, + 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, + 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, + 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, + 0, 1, 2, 3, 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, + 1, 2, 3, 0, 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, + 2, 3, 0, 1, 3, 0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 0, +}; diff --git a/src/lib-otp/otp-parity.h b/src/lib-otp/otp-parity.h new file mode 100644 index 0000000..86ea18f --- /dev/null +++ b/src/lib-otp/otp-parity.h @@ -0,0 +1,16 @@ +#ifndef OTP_PARITY_H +#define OTP_PARITY_H + +extern const unsigned char parity_table[256]; + +static inline unsigned int otp_parity(unsigned char *data) +{ + unsigned int i, parity = 0; + + for (i = 0; i < OTP_HASH_SIZE; i++) + parity += parity_table[*data++]; + + return parity & 3; +} + +#endif diff --git a/src/lib-otp/otp-parse.c b/src/lib-otp/otp-parse.c new file mode 100644 index 0000000..70b6940 --- /dev/null +++ b/src/lib-otp/otp-parse.c @@ -0,0 +1,253 @@ +/* + * OTP extended response parser. + * + * Copyright (c) 2006 Andrey Panin <pazke@donpac.ru> + * + * This software is released under the MIT license. + */ + +#include "lib.h" +#include "buffer.h" +#include "str.h" +#include "strfuncs.h" +#include "hex-binary.h" + +#include "otp.h" + +#include <ctype.h> + +#define IS_LWS(c) ((c) == ' ' || (c) == '\t') + +static inline const char *otp_skip_lws(const char *data) +{ + while (*data != '\0' && IS_LWS(*data)) + data++; + return data; +} + +static inline bool otp_check_tail(const char *data) +{ + data = otp_skip_lws(data); + + return *data != 0; +} + +int otp_read_hex(const char *data, const char **endptr, unsigned char *hash) +{ + string_t *str; + buffer_t buf; + unsigned int i = 0; + + if (data == NULL) + return -1; + + str = t_str_new(18); + buffer_create_from_data(&buf, hash, OTP_HASH_SIZE); + + while (*data != '\0') { + char c = *data; + + if (i_isxdigit(c)) { + str_append_c(str, c); + if (++i == OTP_HASH_SIZE * 2) { + data++; + break; + } + } else if (!IS_LWS(c)) { + *endptr = data; + return -1; + } + data++; + } + + *endptr = data; + + if (i < OTP_HASH_SIZE * 2) + return -1; + + return hex_to_binary(str_c(str), &buf); +} + +#define add_word() do { \ + tmp = otp_lookup_word(str_c(word)); \ + buffer_append(&buf, &tmp, sizeof(tmp)); \ + count++; \ +} while (0) + +int ATTR_NO_SANITIZE_INTEGER +otp_read_words(const char *data, const char **endptr, unsigned char *hash) +{ + bool space = FALSE; + unsigned int len = 0, count = 0; + unsigned int parity = 0, bits[OTP_WORDS_NUMBER], tmp; + string_t *word; + buffer_t buf; + + if (data == NULL) + return -1; + + word = t_str_new(8); + + data = otp_skip_lws(data); + + buffer_create_from_data(&buf, bits, sizeof(bits)); + + for (; *data != '\0' && (count < OTP_WORDS_NUMBER); data++) { + char c = *data; + + if (space) { + if (IS_LWS(c)) + continue; + else if (i_isalpha(c)) { + str_append_c(word, c); + space = FALSE; + len = 1; + continue; + } + } else { + if (i_isalpha(c)) { + if (++len > OTP_MAX_WORD_LEN) { + count = 0; + break; + } + str_append_c(word, c); + continue; + } else if (IS_LWS(c)) { + add_word(); + str_truncate(word, 0); + space = TRUE; + continue; + } + } + break; + } + + if ((str_len(word) > 0) && (count == OTP_WORDS_NUMBER - 1)) + add_word(); + + if (endptr != NULL) + *endptr = data; + + if (count < OTP_WORDS_NUMBER) + return -1; + + hash[0] = bits[0] >> 3; + hash[1] = ((bits[0] & 7) << 5) | (bits[1] >> 6); + hash[2] = ((bits[1] & 0x3f) << 2) | (bits[2] >> 9); + hash[3] = (bits[2] >> 1) & 0xff; + hash[4] = ((bits[2] & 3) << 7) | (bits[3] >> 4); + hash[5] = ((bits[3] & 15) << 4) | (bits[4] >> 7); + hash[6] = ((bits[4] & 0x7f) << 1) | (bits[5] >> 10); + hash[7] = (bits[5] >> 2) & 0xff; + parity = bits[5] & 3; + + return otp_parity(hash) != parity ? 1 : 0; +} + +int otp_read_new_params(const char *data, const char **endptr, + struct otp_state *state) +{ + const char *p, *s; + unsigned int i = 0; + int algo; + + s = p = data; + + while ((*p != 0) && !IS_LWS(*p)) p++; + if (*p == 0) + return -1; + + algo = digest_find(t_strdup_until(s, p++)); + if (algo < 0) + return -2; + state->algo = algo; + + s = p; + if (str_parse_int(s, &state->seq, &p) < 0 || !IS_LWS(*p)) + return -3; + p++; + + while (i_isalnum(*p) && (i < OTP_MAX_SEED_LEN)) + state->seed[i++] = i_tolower(*p++); + state->seed[i] = 0; + + *endptr = p; + return 0; +} + +int otp_parse_response(const char *data, unsigned char *hash, bool hex) +{ + const char *end; + int ret = hex ? otp_read_hex(data, &end, hash) : + otp_read_words(data, &end, hash); + if (ret < 0) + return ret; + + return otp_check_tail(end) ? 1 : 0; +} + +int otp_parse_init_response(const char *data, struct otp_state *new_state, + unsigned char *hash, bool hex, const char **error) +{ + const char *end; + int ret = hex ? otp_read_hex(data, &end, hash) : + otp_read_words(data, &end, hash); + if (ret < 0) { + *error = "invalid current OTP"; + return ret; + } + + end = otp_skip_lws(end); + if (*end++ != ':') { + *error = "missing colon"; + return -1; + } + + ret = otp_read_new_params(end, &end, new_state); + if (ret < 0) { + *error = "invalid OTP parameters"; + return -1; + } + + end = otp_skip_lws(end); + if (*end++ != ':') { + *error = "missing colon"; + return -1; + } + + ret = hex ? otp_read_hex(end, &end, new_state->hash) : + otp_read_words(end, &end, new_state->hash); + if (ret < 0) { + *error = "invalid new OTP"; + return -1; + } + + if (otp_check_tail(end)) { + *error = "trailing garbage found"; + return -1; + } + + return 0; +} + +int otp_parse_dbentry(const char *text, struct otp_state *state) +{ + const char *end; + int ret; + + ret = otp_read_new_params(text, &end, state); + if (ret != 0) + return ret; + + if (*end++ != ' ') + return -1; + + return otp_read_hex(end, &end, state->hash); +} + +const char *otp_print_dbentry(const struct otp_state *state) +{ + return t_strdup_printf("%s %d %s %s", digest_name(state->algo), + state->seq, state->seed, + binary_to_hex(state->hash, 8)); +} diff --git a/src/lib-otp/otp-parse.h b/src/lib-otp/otp-parse.h new file mode 100644 index 0000000..527c676 --- /dev/null +++ b/src/lib-otp/otp-parse.h @@ -0,0 +1,16 @@ +#ifndef OTP_PARSE_H +#define OTP_PARSE_H + +int otp_read_hex(const char *data, const char **endptr, unsigned char *hash); +int otp_read_words(const char *data, const char **endptr, unsigned char *hash); +int otp_read_new_params(const char *data, const char **endptr, + struct otp_state *state); + +int otp_parse_response(const char *data, unsigned char *hash, bool hex); +int otp_parse_init_response(const char *data, struct otp_state *new_state, + unsigned char *hash, bool hex, const char **error); + +int otp_parse_dbentry(const char *text, struct otp_state *state); +const char *otp_print_dbentry(const struct otp_state *state); + +#endif diff --git a/src/lib-otp/otp.h b/src/lib-otp/otp.h new file mode 100644 index 0000000..9cd3dfb --- /dev/null +++ b/src/lib-otp/otp.h @@ -0,0 +1,22 @@ +#ifndef OTP_H +#define OTP_H + +#define OTP_MAX_SEED_LEN 16 +#define OTP_MAX_WORD_LEN 4 +#define OTP_WORDS_NUMBER 6 + +#define OTP_HASH_SIZE 8 + +struct otp_state { + unsigned int algo; + int seq; + unsigned char hash[OTP_HASH_SIZE]; + char seed[OTP_MAX_SEED_LEN + 1]; +}; + +#include "otp-hash.h" +#include "otp-dictionary.h" +#include "otp-parity.h" +#include "otp-parse.h" + +#endif |