diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..34302b2 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +T.v. Dein diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..5b6e7c6 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..a64875c --- /dev/null +++ b/ChangeLog @@ -0,0 +1,57 @@ +1.8: + - configure didn't take existing $LDFLAGS, $CPPFLAGS + into account. +1.7: + - applied freebsd port patches + - applied openpkg source patches + - made default_db a const char + - fixed configure.in variable bug + +1.6: + - applied patch by Thierry Thomas which + makes the code gcc 3.2 compliant (with some additional changes + made by me). + - changed the header of all sourcefiles. + +1.5: + - added using namespace std to enable gcc 3.0 to work + - renamed Engine::stdin() to Engine::from_stdin() because + stdin is a symbol used by C (the *FILE handle for STDIN). + - added -g and -O compilerflags to configure.in +1.4: + - added encryption support (which was planned since a long time) + using rijndael cipher. The rijndael code was not written by me, + see rijndael.h for more details. + - added digest.h + digest.cc from the common-c++ library. I + modified it a little bit to suite my needs. Using the whole + library was too much overhead IMHO. + - the cipher class is just a wrapper around the rijndael+digest + classes. + - source code re-organised. Every .cc file has it's corresponding + .h file. The Config class is now in config.h, the Engine + class has it's own engine.h header. dbtool.h contains now + only global stuff, no class definitions. main.cc has been + renamed to dbtool.cc. + - fixed bug in configure.in (which I found in the FreeBSD + port of dbtool. It contains a patch to fix this) + - added -R feature to -S, -s and -D too + - added sample shell scripts showing the capabilities of dbtool (locate) + - manpage updated and usage string too + +1.3: + - moved the pcre_compile calls outa the + while() loops, be more efficient, thanks to Robert :-) + - fixed a bug in the pcre_exec call, there was "key.length() + 1" which + caused pcre to search through the whole C-string including the terminating \0 + , in fact if a key ended with the character "B" then the following expression + did not match: ".*B$" because the last character in the string was the \0, not the "B". + - files are now only opened readonly if one use -s, -S or -D + +1.2: + - added regexp support and dump mode + +1.1: + - moved to autoconf/automake + +1.0: + - initial version diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..6e90e07 --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..7c100b2 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,9 @@ +ACLOCAL_AMFLAGS = -I config +bin_PROGRAMS = dbtool +dbtool_SOURCES = cipher.cc config.cc dbtool.cc digest.cc engine.cc rijndael.cc +man_MANS = dbtool.1 +EXTRA_DIST = $(man_MANS) + +clean: + rm -rf autom4te.cache dbtool *.o *~ config.log config.status Makefile .deps + diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..c9361d8 --- /dev/null +++ b/README @@ -0,0 +1,80 @@ +README for dbtool 1.8 (13/04/2015) +============================================================ + +dbtool can be used to store and retrieve data in a key/value +format in a hash database. Perl compatible regular expressions +are supported both for storing and retrieving of data. It's +main advantages are the ability to maintain huge amounts of +data and speed. + + + + +Requirements +============================================================ + +You need either the GNU gdbm library or the Berkeley database +system. You can find gdbm at: + http://www.gnu.org/software/gdbm/gdbm.html +And the berkeley library at: http://www.sleepycat.com. + + + +Installation +============================================================ + +For installation run: + +% ./configure +% make +% su +# make install + +You can supply some additional parameters to configure, +type ./configure --help for details. + + + + +Documentation +============================================================ + +After successfully installation read the installed man- +page: + +% man dbtool + + + + +License and Disclaimer +============================================================ + +dbtool is Copyright (c) 2001-2015 by T.v. Dein. dbtool may be +used and distributed under the terms of the GNU General Public +License. All other brand and product names are trademarks, +registered trademarks or service marks of their respective +holders. + +These programs are distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied +warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this distribution; if not, write to the + Free Software Foundation, Inc. + 59 Temple Place + Suite 330 + Boston, MA 02111 + USA + + + + + +============================================================ + +T.v. Dein +http://www.daemon.de/dbtool + diff --git a/README.md b/README.md deleted file mode 100644 index 9bf263e..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# dbtool -A command line tool to manage a key/value database (gdbm or berkeley-db) diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..4684374 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.8 \ No newline at end of file diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..f1fd5cf --- /dev/null +++ b/autogen.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +case $1 in + clean) + rm -rf .deps *~ config.cache config.status *.o \ + dbtool Makefile Makefile.in autom4te.cache .libs depcomp install-sh libtool \ + dbtool.1 missing mkinstalldirs platform.h stamp* \ + config/[cdilm]* config.cache aclocal.m4 configure + ;; + *) + pod2man dbtool.pod \ + | sed -e 's#\.TH DBTOOL 1 "....-..-.." "perl v.\..\.." "User Contributed Perl Documentation"#\.TH DBTOOL 1#g' > dbtool.1 + mkdir -p config + autoreconf --install --force --verbose -I config + ;; +esac diff --git a/cipher.cc b/cipher.cc new file mode 100644 index 0000000..cef1bca --- /dev/null +++ b/cipher.cc @@ -0,0 +1,146 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + +#include "cipher.h" + +void cipher::init(const string& phrase) { + /* + * 1st create a MD5 checksum of the passphrase and + * use this instead of the phrase itself for encryption + */ + char *__key; + dig.initDigest(); + dig.putDigest( (unsigned char *)phrase.c_str(), phrase.length() ); + __key = dig.stringDigest(); // this is a 32 byte long string, as Rijndael:: expects + + /* convert the key to unsigned char[] */ + for(int i=0; i<32; i++) { + key[i] = __key[i]; + } +} + + + +string cipher::encrypt(const string& source) { + size_t size = source.length(); + + /* convert the source to unsigned char[] */ + unsigned char* plainText; + plainText = new unsigned char[size]; + for(int a=0; a= 0) { + return string(outText, res); + } + else { + cerr << "Failed to encrypt: " << error(res) << "!" << endl; + exit(1); + } +} + + +string cipher::decrypt(const string& source) { + size_t size = source.length(); + + /* convert the source to unsigned char[] */ + unsigned char* cryptedText; + cryptedText = new unsigned char[size]; + for(int a=0; a= 0) + return string(outText, res); + else { + cerr << "Failed to decrypt: " << error(res) << " (passphrase invalid?) !" << endl; + exit(1); + } +} + +const char* cipher::error(int num) { + switch(num) { + case 0: return "RIJNDAEL_SUCCESS"; break; + case -1: return "RIJNDAEL_UNSUPPORTED_MODE"; break; + case -2: return "RIJNDAEL_UNSUPPORTED_DIRECTION"; break; + case -3: return "RIJNDAEL_UNSUPPORTED_KEY_LENGTH"; break; + case -4: return "RIJNDAEL_BAD_KEY"; break; + case -5: return "RIJNDAEL_NOT_INITIALIZED"; break; + case -6: return "RIJNDAEL_BAD_DIRECTION"; break; + case -7: return "RIJNDAEL_CORRUPTED_DATA"; break; + default: return "UNKNOWN"; break; + } +} diff --git a/cipher.h b/cipher.h new file mode 100644 index 0000000..e8da86b --- /dev/null +++ b/cipher.h @@ -0,0 +1,77 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + +#ifndef CIPHER_H +#define CIPHER_H + +#include +#include +#include +#include "rijndael.h" +#include "digest.h" + +using namespace std; + +class cipher { + private: + Rijndael rijn; + MD5Digest dig; + unsigned char key[32]; + string blah; + const char* error(int num); + + public: + cipher() {}; + ~cipher() {}; + void init(const string & phrase); + string encrypt(const string& source); + string decrypt(const string& source); +}; + +string get_my_phrase(); + +#endif diff --git a/config.cc b/config.cc new file mode 100644 index 0000000..84a748a --- /dev/null +++ b/config.cc @@ -0,0 +1,218 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + + + +#include "dbtool.h" +#include "config.h" +#include "platform.h" + + +Config::Config() { + /* konstructor */ + pkg = PACKAGE; + default_db = DB_VARNAME; + + usage = + "\nUsage: " + pkg + " -d database [DirusSfwVhtRFpP] [-k key] [-v value]\n" + + " -d database Specify the filename of the database\n" + + " -i Insert data, -k and -v is required (*)\n" + + " -r Remove data, -k is required\n" + + " -u Update data, -k and -v is required\n" + + " -s Search for a key, -k is required\n" + + " -S Search for all entrys which match a regular\n" + + " expression, the regexp must be specified with\n" + + " the -k parameter, i.e.: " + pkg + " -d file -S -k \"^[a-z]+\\d{3}.*$\"\n" + + " -D Dump all keys/values of the specified gdbm file\n" + + " -w Print out keys too, only possible with -S and -s\n" + + " -f Force mode (overwrite file and data!)\n" + + " -k key the key for an entry\n" + + " -v value the value for the corresponding key, -k is required\n" + + " -F separator field separator, optional used together with\n" + + " -i if no -k and -v is specified, and with -D as\n" + + " output separator\n" + + " -t expression Use expression to decide which part of an input line\n" + + " is to be used as the key and which one as the value, i.e.:\n" + + " " + pkg + " -i -d file -t \"^(.*)(\\/.*)$\";\n" + + " only possible with -i and without -k and -v(read from stdin)\n" + + " -R Reverse meaning of token -t, the first match will be the\n" + + " value and the second one the key, if used with -s, -S or -D then\n" + + " first the value and then the key will be printed\n" + + " -p Use encrypted database. " + pkg + " will ask you for the passphrase,\n" + + " unless the environment variable DB_PASSPHRASE is set.\n" + + " -P passphrase Use encrypted database. Specify the passphrase on the commandline\n" + + " -V Print the version of dbtool\n" + + " -h Print this usage message\n" + + "\n" + + "If you insert data and omit -k and -v then " + pkg + " will read\n" + + "the key/value pair from STDIN, key and value will be\n" + + "separated by the parameter of the -F option or, if -F\n" + + "is omited, by whitespace, the record separator is the\n" + + "newline, thus one line stands for one key/value pair.\n" + + "\n" + + "If no database filename is specified (-d) but the\n" + + "environment variable DB_DATABASE exists, " + pkg + " will\n" + + "use the file specified in DB_DATABASE.\n" + + "\n" + + "" + pkg + " is free software under the terms of the GPL.\n" + + "Report bugs to T.v. Dein .\n"; +} + + +void Config::args(int argc, char *argv[]) { + _argc = argc; + _argv = argv; +} + +int Config::parse() { + /* parse commandline parameters */ + + int option; + int cmd_insert = 0; + + separator = ' '; /* default field separator, used by -S and -D and -i */ + command = 'X'; /* this should get something else */ + with = 0; /* do not print keys, used by -S and -s */ + reverse = 0; /* first key, then value (not reverse is the default) */ + + char *fname; + fname = getenv(default_db); + if(fname != NULL) { + filename = fname; /* will be overwritten by -d */ + } + + while (1) { + option = getopt(_argc, _argv, "F:DSRft:wuirsd:k:v:VhpP:"); + if(option == -1) break; + + switch(option) { + case 'f': + force = 1; + break; + case 'i': + command = 'i'; + break; + case 'r': + command = 'r'; + break; + case 's': + command = 's'; + readonly = 1; + break; + case 'S': + command = 'S'; + readonly = 1; + break; + case 'u': + command = 'u'; + break; + case 'd': + filename = optarg; + break; + case 'k': + key = optarg; + cmd_insert = 1; + break; + case 'v': + value = optarg; + cmd_insert = 1; + break; + case 'F': + separator = optarg[0]; + break; + case 'R': + reverse = 1; + break; + case 'D': + command = 'd'; + readonly = 1; + break; + case 't': + token = optarg; + break; + case 'w': + with = 1; + break; + case 'V': + command = 'v'; + break; + case 'h': + command = 'h'; + break; + case 'p': + encrypted = 1; + phrase = ""; + break; + case 'P': + encrypted = 1; + phrase = optarg; + break; + case '?': + return -1; + } + } + + /* check the sence of some options */ + if(token != "" && command != 'i') { + cerr << pkg << ": -t only suitable with -i!\n"; + exit(1); + } + if(command == 'i' && cmd_insert != 1) { + command = 'I'; /* read from stdin! */ + } + else if(command == 'X') { + command = 'h'; /* no command mode specified, so print out the usage message and exit */ + } + if(with == 1 && command != 'S' && command != 's') { + cerr << pkg << ": -w only suitable with -S or -s!\n"; + exit(1); + } + + + return 0; +} + diff --git a/config.h b/config.h new file mode 100644 index 0000000..60e2fa1 --- /dev/null +++ b/config.h @@ -0,0 +1,82 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include + +extern "C" { +#include +#include +} + + +/* + * The Config class will hold all flags, modes and other + * parameters we need for running. + * methods defined in cmd.cc + */ +class Config { + private: + int _argc; + char **_argv; + string pkg; + const char *default_db; + + public: + Config(); + void args(int argc, char *argv[]); + int parse(); + int force, command, with, reverse, readonly, encrypted; + string filename, key, value, usage, token, phrase; + char separator; +}; + + +#endif // CONFIG_H diff --git a/config/ax_berkeley_db_cxx.m4 b/config/ax_berkeley_db_cxx.m4 new file mode 100644 index 0000000..78a2ce8 --- /dev/null +++ b/config/ax_berkeley_db_cxx.m4 @@ -0,0 +1,152 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_berkeley_db_cxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BERKELEY_DB_CXX([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +# +# DESCRIPTION +# +# This macro tries to find Berkeley DB C++ support. It honors +# MINIMUM-VERSION if given. +# +# If libdb_cxx is found, DB_CXX_HEADER and DB_CXX_LIBS variables are set +# and ACTION-IF-FOUND shell code is executed if specified. DB_CXX_HEADER +# is set to location of db.h header in quotes (e.g. "db3/db_cxx.h") and +# AC_DEFINE_UNQUOTED is called on it, so that you can type +# +# #include DB_CXX_HEADER +# +# in your C/C++ code. DB_CXX_LIBS is set to linker flags needed to link +# against the library (e.g. -ldb3.1_cxx) and AC_SUBST is called on it. +# +# when specified user-selected spot (via --with-libdb) also sets +# +# DB_CXX_CPPFLAGS to the include directives required +# DB_CXX_LDFLAGS to the -L flags required +# +# LICENSE +# +# Copyright (c) 2008 Vaclav Slavik +# Copyright (c) 2011 Stephan Suerken +# Copyright (c) 2014 Kirill A. Korinskiy +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 4 + +AC_DEFUN([AX_BERKELEY_DB_CXX], +[ + AC_LANG_ASSERT(C++) + + old_LIBS="$LIBS" + old_LDFLAGS="$LDFLAGS" + old_CPPFLAGS="$CPPFLAGS" + + libdbdir="" + AC_ARG_WITH(libdb, + AS_HELP_STRING([--with-libdb=DIR], + [root of the Berkeley DB directory]), + [ + case "$withval" in + "" | y | ye | yes | n | no) + AC_MSG_ERROR([Invalid --with-libdb value]) + ;; + *) libdbdir="$withval" + ;; + esac + ], []) + + minversion=ifelse([$1], ,,$1) + + DB_CXX_HEADER="" + DB_CXX_LIBS="" + DB_CXX_LDFLAGS="" + DB_CXX_CPPFLAGS="" + + if test -z $minversion ; then + minvermajor=0 + minverminor=0 + minverpatch=0 + AC_MSG_CHECKING([for Berkeley DB (C++)]) + else + minvermajor=`echo $minversion | cut -d. -f1` + minverminor=`echo $minversion | cut -d. -f2` + minverpatch=`echo $minversion | cut -d. -f3` + minvermajor=${minvermajor:-0} + minverminor=${minverminor:-0} + minverpatch=${minverpatch:-0} + AC_MSG_CHECKING([for Berkeley DB (C++) >= $minvermajor.$minverminor.$minverpatch]) + fi + + if test x$libdbdir != x""; then + DB_CXX_CPPFLAGS="-I${libdbdir}/include" + DB_CXX_LDFLAGS="-L${libdbdir}/lib" + LDFLAGS="$DB_CXX_LDFLAGS $old_LDFLAGS" + CPPFLAGS="$DB_CXX_CPPFLAGS $old_CPPFLAGS" + fi + + for major in 4; do + for minor in 0 1 2 3 4 5 6 7 8 9; do + for version in "${major}.${minor}" "${major}${minor}"; do + + try_libs="-ldb_cxx-${version}%-ldb-${version} -ldb${version}_cxx%-ldb${version}" + try_headers="db$version/db_cxx.h db`echo $version | sed -e 's,\..*,,g'`/db_cxx.h" + + for db_cxx_hdr in $try_headers ; do + for db_cxx_lib in $try_libs; do + db_cxx_lib="$libdbdir `echo "$db_cxx_lib" | sed 's/%/ /g'`" + LIBS="$old_LIBS $db_cxx_lib" + if test -z $DB_CXX_HEADER ; then + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [ + #include <${db_cxx_hdr}> + ], + [ + #if !((DB_VERSION_MAJOR > (${minvermajor}) || \ + (DB_VERSION_MAJOR == (${minvermajor}) && \ + DB_VERSION_MINOR > (${minverminor})) || \ + (DB_VERSION_MAJOR == (${minvermajor}) && \ + DB_VERSION_MINOR == (${minverminor}) && \ + DB_VERSION_PATCH >= (${minverpatch})))) + #error "too old version" + #endif + + DB *db; + db_create(&db, NULL, 0); + ])], + [ + AC_MSG_RESULT([header $db_cxx_hdr, library $db_cxx_lib]) + DB_CXX_HEADER="$db_cxx_hdr" + DB_CXX_LIBS="$db_cxx_lib" + ], + ) + fi + done + done + done + done + done + + LIBS="$old_LIBS" + LDFLAGS="$old_LDFLAGS" + CPPFLAGS="$old_CPPFLAGS" + + if test -z $DB_CXX_HEADER ; then + AC_MSG_RESULT([not found]) + DB_CXX_LDFLAGS="" + DB_CXX_CPPFLAGS="" + ifelse([$3], , :, [$3]) + else + AC_DEFINE_UNQUOTED(DB_CXX_HEADER, ["$DB_CXX_HEADER"], ["Berkeley DB C++ Header File"]) + AC_SUBST(DB_CXX_LIBS) + AC_SUBST(DB_CXX_LDFLAGS) + AC_SUBST(DB_CXX_CPPFLAGS) + ifelse([$2], , :, [$2]) + fi +]) diff --git a/config/ax_compare_version.m4 b/config/ax_compare_version.m4 new file mode 100644 index 0000000..74dc0fd --- /dev/null +++ b/config/ax_compare_version.m4 @@ -0,0 +1,177 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_compare_version.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# +# DESCRIPTION +# +# This macro compares two version strings. Due to the various number of +# minor-version numbers that can exist, and the fact that string +# comparisons are not compatible with numeric comparisons, this is not +# necessarily trivial to do in a autoconf script. This macro makes doing +# these comparisons easy. +# +# The six basic comparisons are available, as well as checking equality +# limited to a certain number of minor-version levels. +# +# The operator OP determines what type of comparison to do, and can be one +# of: +# +# eq - equal (test A == B) +# ne - not equal (test A != B) +# le - less than or equal (test A <= B) +# ge - greater than or equal (test A >= B) +# lt - less than (test A < B) +# gt - greater than (test A > B) +# +# Additionally, the eq and ne operator can have a number after it to limit +# the test to that number of minor versions. +# +# eq0 - equal up to the length of the shorter version +# ne0 - not equal up to the length of the shorter version +# eqN - equal up to N sub-version levels +# neN - not equal up to N sub-version levels +# +# When the condition is true, shell commands ACTION-IF-TRUE are run, +# otherwise shell commands ACTION-IF-FALSE are run. The environment +# variable 'ax_compare_version' is always set to either 'true' or 'false' +# as well. +# +# Examples: +# +# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) +# AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) +# +# would both be true. +# +# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) +# AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) +# +# would both be false. +# +# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) +# +# would be true because it is only comparing two minor versions. +# +# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) +# +# would be true because it is only comparing the lesser number of minor +# versions of the two values. +# +# Note: The characters that separate the version numbers do not matter. An +# empty string is the same as version 0. OP is evaluated by autoconf, not +# configure, so must be a string, not a variable. +# +# The author would like to acknowledge Guido Draheim whose advice about +# the m4_case and m4_ifvaln functions make this macro only include the +# portions necessary to perform the specific comparison specified by the +# OP argument in the final configure script. +# +# LICENSE +# +# Copyright (c) 2008 Tim Toolan +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 11 + +dnl ######################################################################### +AC_DEFUN([AX_COMPARE_VERSION], [ + AC_REQUIRE([AC_PROG_AWK]) + + # Used to indicate true or false condition + ax_compare_version=false + + # Convert the two version strings to be compared into a format that + # allows a simple string comparison. The end result is that a version + # string of the form 1.12.5-r617 will be converted to the form + # 0001001200050617. In other words, each number is zero padded to four + # digits, and non digits are removed. + AS_VAR_PUSHDEF([A],[ax_compare_version_A]) + A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ + -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/[[^0-9]]//g'` + + AS_VAR_PUSHDEF([B],[ax_compare_version_B]) + B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ + -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/[[^0-9]]//g'` + + dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary + dnl # then the first line is used to determine if the condition is true. + dnl # The sed right after the echo is to remove any indented white space. + m4_case(m4_tolower($2), + [lt],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` + ], + [gt],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` + ], + [le],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` + ], + [ge],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` + ],[ + dnl Split the operator from the subversion count if present. + m4_bmatch(m4_substr($2,2), + [0],[ + # A count of zero means use the length of the shorter version. + # Determine the number of characters in A and B. + ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` + ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` + + # Set A to no more than B's length and B to no more than A's length. + A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` + B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` + ], + [[0-9]+],[ + # A count greater than zero means use only that many subversions + A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` + B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` + ], + [.+],[ + AC_WARNING( + [illegal OP numeric parameter: $2]) + ],[]) + + # Pad zeros at end of numbers to make same length. + ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" + B="$B`echo $A | sed 's/./0/g'`" + A="$ax_compare_version_tmp_A" + + # Check for equality or inequality as necessary. + m4_case(m4_tolower(m4_substr($2,0,2)), + [eq],[ + test "x$A" = "x$B" && ax_compare_version=true + ], + [ne],[ + test "x$A" != "x$B" && ax_compare_version=true + ],[ + AC_WARNING([illegal OP parameter: $2]) + ]) + ]) + + AS_VAR_POPDEF([A])dnl + AS_VAR_POPDEF([B])dnl + + dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. + if test "$ax_compare_version" = "true" ; then + m4_ifvaln([$4],[$4],[:])dnl + m4_ifvaln([$5],[else $5])dnl + fi +]) dnl AX_COMPARE_VERSION diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..4f4fb21 --- /dev/null +++ b/configure.ac @@ -0,0 +1,287 @@ +# -*-sh-*- + +AC_PREREQ(2.61) + +define([dbtoolversion], esyscmd([sh -c "cat VERSION|head -1"])) + +# what we are compiling +AC_INIT([dbtool], [dbtoolversion], [tlinden@cpan.org]) + +AC_CONFIG_AUX_DIR(config) +AC_CONFIG_MACRO_DIR(config) +AC_CONFIG_HEADER(platform.h) + +AM_INIT_AUTOMAKE() +LT_INIT + +# default values, dynamically linking and stripped binary +STATIC="no" + + +# provide flag --enable-static +AC_ARG_ENABLE([static-binary], + AS_HELP_STRING([--enable-static-binary], [create a statically linked binary]), + [ + if test "x$enableval" = "xyes"; then + STATIC="yes" + LDFLAGS="$LDFLAGS -static" + fi +]) + +AC_ARG_ENABLE([debug], + AS_HELP_STRING([--disable-debug], [Disable debugging])) +AS_IF([test "x$enable_debug" != "xno"], [ + CXXFLAGS="$CFLAGS -g -DDEBUG" + enable_debug="yes" +]) + + +AC_CANONICAL_HOST + + +# look for the existence of install +AC_PROG_INSTALL + +# look if c++ compiler exists +AC_PROG_CXX + +# look for libc +AC_HEADER_STDC + +# additional headers which are required +AC_CHECK_HEADERS(unistd.h stdio.h stdlib.h) + + +# Check for some target-specific stuff +case "$host" in + *aix*) + # libm is required as well + CXXFLAGS="$CFLAGS -D_AIX_SOURCE=1" + LDFLAGS="$LDFLAGS -lm" + ;; + *-*-android*) ;; + *-*-cygwin*) ;; + *-*-dgux*) ;; + *-*-darwin*) ;; + *-*-dragonfly*) ;; + *-*-haiku*) ;; + *-*-hpux*) ;; + *-*-irix5*) ;; + *-*-irix6*) ;; + *-*-k*bsd*-gnu | *-*-kopensolaris*-gnu) ;; + *-*-linux*) ;; + *-*-netbsd*) ;; + *-*-freebsd*) + # ports install to /usr/local by default, check + if test -d "/usr/local/lib" -a -d "/usr/local/include"; then + CXXFLAGS="$CFLAGS -I/usr/local/include" + LDFLAGS="$LDFLAGS -L/usr/local/lib" + fi + ;; + *-*-bsdi*) ;; + *-next-*) ;; + *-*-openbsd*) ;; + *-*-solaris*) ;; + *-*-sunos4*) ;; + *-ncr-sysv*) ;; + *-sni-sysv*) ;; + *-*-sysv4.2*) ;; + *-*-sysv5*) ;; + *-*-sysv*) ;; + *-*-sco*) ;; + *-*-unicos*) ;; + *-dec-osf*) ;; + *-*-nto-qnx*) ;; + *-*-ultrix*) ;; + *-*-lynxos) ;; +esac + + +# look for libs +GDBM="yes" +BERKELEY="no" +PCRE="no" + + +# configure args +AC_ARG_WITH([gdbm], + [AS_HELP_STRING([--with-gdbm=DIR], + [Use GNU gdbm library in DIR])], + [ + AC_MSG_CHECKING([checking $with_gdbm_dir/include/gdbm.h presence]) + if test -r "$with_gdbm_dir/include/gdbm.h" ; then + CXXFLAGS="-I$with_gdbm_dir/include $CXXFLAGS" + CFLAGS="$CXXFLAGS" + LDFLAGS="-L$with_gdbm_dir/lib $LDFLAGS" + LIBS="-lgdbm" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ]) + +AC_ARG_WITH([pcre], + [AS_HELP_STRING([--with-pcre=DIR], + [Use GNU pcre library in DIR])], + [ + AC_MSG_CHECKING([checking $with_pcre_dir/include/pcre.h presence]) + if test -r "$with_pcre_dir/include/pcre.h" ; then + CXXFLAGS="-I$with_pcre_dir/include $CXXFLAGS" + CFLAGS="$CXXFLAGS" + LDFLAGS="-L$with_pcre_dir/lib $LDFLAGS" + LIBS="-lpcre" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ]) + +AC_ARG_WITH([bdb-include-dir], + [AS_HELP_STRING([--with-bdb-include-dir], + [Specify bdb include prefix])], + [ + GDBM="no" + BERKELEY="yes" + CXXFLAGS="-I${with_bdb_include_dir} ${CXXFLAGS}" + CFLAGS="$CXXFLAGS" + ], + []) + +AC_ARG_WITH([bdb_lib_dir], + [AS_HELP_STRING([--with-bdb-lib-dir], + [Specify bdb library prefix])], + [ + # dont check presence since lib file name unpredictable + GDBM="no" + BERKELEY="yes" + LDFLAGS="-L${with_bdb_lib_dir} ${LDFLAGS}" + ]) + + +# first, check for gdbm, which is the default +if test "$GDBM" = "yes"; then + # search for it via pkg-config + PKG_CHECK_MODULES([GDBM], [gdbm], _gdbm=yes, _gdbm=no) + if test "x$_gdbm" = "xyes"; then + AC_SUBST([GDBM_CFLAGS]) + AC_SUBST([GDBM_CXXFLAGS]) + AC_SUBST([GDBM_LIBS]) + GDBM="yes" + fi +fi + +if test "$GDBM" = "yes"; then + export LDFLAGS + export LIBS + export CFLAGS + AC_CHECK_LIB(gdbm, gdbm_open) + if test "x$ac_cv_lib_gdbm_gdbm_open" = "xno"; then + GDBM="no" + fi +fi + +# now, if we didn't find gdbm or it was disabled, try berkeley db +if test "$GDBM" = "no"; then + AC_LANG(C++) + export LDFLAGS + export LIBS + export CXXFLAGS + AX_BERKELEY_DB_CXX([4.0.0],[ + LDFLAGS="$DB_CXX_LIBS $LDFLAGS" + BERKELEY="yes" + ],[BERKELEY="no"]) +fi + + + +export CFLAGS +export LIBS +export LDFLAGS +AC_CHECK_LIB(pcre, pcre_compile) + + + +# these functions must exist +AC_CHECK_FUNCS(getopt fdopen fgetc getenv getpass) + +# complain if the functions checked for above does not exists +if test "$ac_cv_func_getopt" != yes; then + echo + echo "*** Warning: function getopt() not found!" + echo "*** You will not be able to compile dbtool!" + #exit 1 +fi + +if test "$ac_cv_func_fdopen" != yes; then + echo + echo "*** Warning: function fdopen() not found!" + echo "*** You will not be able to compile dbtool!" + #exit 1 +fi + +if test "$ac_cv_func_fgetc" != yes; then + echo + echo "*** Warning: function fgetc() not found!" + echo "*** You will not be able to compile dbtool!" + #exit 1 +fi + +if test "$ac_cv_func_getenv" != yes; then + echo + echo "*** Warning: function getenv() not found!" + echo "*** You will not be able to compile dbtool!" + #exit 1 +fi + +if test "$ac_cv_lib_pcre_pcre_compile" != yes; then + echo + echo "*** Warning: the PCRE library could not be found!" + echo "*** You will not be able to compile dbtool!" + echo "*** Please get a copy from http://www.pcre.org," + echo "*** install it and then retry!" + exit 1 +fi + +if test "$GDBM" = "yes"; then + USEDB="GDBM" +elif test "$BERKELEY" = "yes"; then + USEDB="BERKELEY-DB" + CXXFLAGS="-DHAVE_BERKELEY=1 $CXXFLAGS" +else + echo "Neither gdbm or berkeley-db is instaled!" + exit 1 +fi + + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST + +# the default prefix +AC_PREFIX_DEFAULT(/usr/local) + +# finaly write out +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT + + +AC_MSG_RESULT([ + Build configured for $PACKAGE $VERSION: + CXX: ${CXX} + CXXFLAGS: ${CXXFLAGS} + LDFLAGS: ${LDFLAGS} + LIBS: ${LIBS} + debug: ${enable_debug} + static build: ${STATIC} + + prefix: ${prefix} + libdir: ${libdir} + includedir: ${includedir} + + target platform: ${host} + + db backend: ${USEDB} + Type 'make' to build, 'make install' to install. +]) + + +echo diff --git a/dbtool.cc b/dbtool.cc new file mode 100644 index 0000000..a1ae552 --- /dev/null +++ b/dbtool.cc @@ -0,0 +1,151 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + +#include "platform.h" +#include "dbtool.h" +#include "config.h" +#include "engine.h" +#include "cipher.h" + +Config config; +cipher rijn; + +int main(int argc, char *argv[]) { + config.args(argc, argv); + Engine engine; + string pkg = PACKAGE; + + if(config.parse() != 0) { + cerr << config.usage; + exit(1); + } + else { + switch(config.command) { + case 'i': + /* insert */ + if(config.key == "") { + cerr << pkg << ": key required\n"; + exit(1); + } + engine.insert(); + break; + case 'd': + /* dump */ + engine.dump(); + break; + case 'I': + engine.from_stdin(); + break; + case 's': + /* select */ + if(config.key == "") { + cerr << pkg << ": key required\n"; + exit(1); + } + engine.select(); + break; + case 'S': + /* regexp select */ + if(config.key == "") { + cerr << pkg << ": key (regexp) required\n"; + exit(1); + } + engine.regexp(); + break; + case 'r': + /* remove */ + if(config.key == "") { + cerr << pkg << ": key required\n"; + exit(1); + } + engine.remove(); + break; + case 'u': + /* update */ + if(config.key == "") { + cerr << pkg << ": key required\n"; + exit(1); + } + engine.update(); + break; + case 'v': + /* version */ + cerr << "This is " << pkg << " version " << VERSION << " by T.v. Dein.\n"; + exit(1); + case 'h': + /* usage/help */ + cerr << config.usage; + exit(1); + } + } + exit(0); +} + + + +string readpass() { + char *pass; + char *envpass; + envpass = getenv(PW_VARNAME); + if(envpass != NULL) { + string pw = envpass; + return pw; + } + else { +#ifdef HAVE_GETPASS + pass = getpass("passphrase: "); + string password = pass; + free(pass); +#else + cout << "passphrase: "; + string password; + cin >> password; +#endif + return password; + } +} + + diff --git a/dbtool.h b/dbtool.h new file mode 100644 index 0000000..e5b270d --- /dev/null +++ b/dbtool.h @@ -0,0 +1,74 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + +#ifndef DBTOOL_H +#define DBTOOL_H + +using namespace std; + +/* the name of the environment variable to be used if -d is omited */ +#ifndef DB_VARNAME +#define DB_VARNAME "DB_DATABASE" +#endif + +#ifndef PW_VARNAME +#define PW_VARNAME "DB_PASSPHRASE" +#endif + +#include + +extern "C" { +#include +} + + +// pure functions +string readpass(); + +#endif // DBTOOL_H + + diff --git a/dbtool.pod b/dbtool.pod new file mode 100644 index 0000000..ebfd0e9 --- /dev/null +++ b/dbtool.pod @@ -0,0 +1,298 @@ +# -*-cperl-*- +=head1 NAME + +dbtool - a tool for storing key/value pairs in a hash database + +=head1 SYNOPSIS + + dbtool -d database [DirusSfwVhtRFpP] [-k key] [-v value] + +=head1 DESCRIPTION + +This manual page documents the program B. B can be used +to store and retrieve data in a key/value format in +a hash database. Perl compatible regular expressions are supported +both for storing and retrieving of data. It's main advantages are the +ability to maintain huge amounts of data and speed. + +=head1 OPTIONS + +=over + +=item B<-D> + +Dump all key/value pairs of the database. Keys and values will be +separated by whitespace or by the character specified by B<-F>. + +=item B<-f> + +Enable B, which has the following causes: + +=over + +=item I + +Keys (and the associated value) will be overwritten if it already +exists. + +=item I + +Key/value will be created if it does not exist. + +=back + +=item B<-F> -I + +Optional field separator. The default separator is one whitespace. +Use B<-F> in conjunction with B<-D> to specify an alternate output +field separator or with B<-i> if data is read in from I (without +B<-k> and B<-v>). + +=item B<-h> + +Prints out a short help message to I and exits. + +=item B<-i> + +Insert data. The B<-k> and B<-v> options are required. You will get an error +message if the key already exists. Use B<-f> to avoid such a message +and let B overwrite the key instead. + If both key (B<-k>) and value (B<-v>) are not provided, B +will read in the data from I. The default input separator +is one whitespace. The first field (separated by whitespace) will be +considered as the key and the rest of the input line will be considered +as the value associated with the key. You can provide an alternate +input field separator using the option B<-F>. + It is also possible to separate the key and value of an input line +using a regular expression with the B<-t> option(see below). + +=item B<-k> I + +Use I as the key. Use B<-k> in conjunction with B<-i>, B<-u>, B<-r>, +B<-s> or B<-S>. + +=item B<-r> + +Remove data. Only the key to be removed (B<-k>) is required. + +=item B<-R> + +Reverse the meaning of the expression provided with B<-t>. By default +B will use the first match as the key and the second one as +the value. With B<-R> this will be reversed. + +=item B<-s> + +Search for a key specified by B<-k>. The associated value will be printed +to I. You can use B<-w> to get the key too separated by whitespace +or by the parameter of B<-F>. You can only search for keys, not for values. + +=item B<-S> + +Search for a key. The parameter to the option B<-k> will be considered +as a perl compatible regular expression. It is possible to get multiple +results, which will be printed to I separated by newline. Otherwise +B<-S> behaves like B<-s>. + +=item B<-t> I + +Use I to decide which part of an input line has to be used as the +key and which one as the value. The regular expression must contain two +parts surrounded by round parenthesis'. See the section EXAMPLES for some +uses of B<-t>. This option can only be used in conjunction with B<-i> without +B<-k> and B<-v>. + +=item B<-u> + +Update data. A key (B<-k>) and a value (B<-v>) is required. You will get an +error message if the key does not exist. You can use the option B<-f> to avoid +such a message and to insert the data if it does not exist instead. + +=item B<-p> + +Use encrypted database. dbtool will ask you for the passphrase, +unless the environment variable DB_PASSPHRASE is set. + + +=item B<-P> I + +Use encrypted database. Specify the passphrase on the commandline. + +=item B<-v> I + +Use I as the value associated with some key. Use B<-v> in conjunction +with B<-i>, B<-u> or B<-r>. + +=item B<-V> + +Print out the version of B. + +=item B<-w> + +Print search results together with the associated keys separated by whitespace +or the parameter of B<-F>. + +=back + + + +=head1 EXPRESSIONS + +Regular expressions are provided using the B. It supports most of +the features which perl provides. See the section »DIFFERENCES FROM PERL« in the PCRE +manpage. You can also take a look to the perl regular expression man page with +the following command: + + perldoc perlre + +(which requires perl to be installed). + + +=head1 ENCRYPTION + +As of version 1.4 B supports encrypted databases. See the descriptions +of the options B<-p> and B<-P>. The algorithm used for encryption is B +block cipher encryption. + +B does not use the passphrase which the user supplies. It uses instead +the MD5 digest of the passphrase as the encryption key. + +Please note, that B itself does not distinguish between encrypted or +unencrypted databases. That means, you will get strange results if you try +to access an encrypted database without the options B<-p> or B<-P> being set. + +B by default will only encrypt the values of a database, not the keys. +This might change in future versions. + + + +=head1 EXAMPLES + +=over + +=item + + dbtool -d test.db -i -k "test" -v "blah blah blah" + +Insert the key "test" which is associated to the value +"blah blah blah" into test.db. + + +=item + + dbtool -d test.db -u -f -k "test" -v "blubber" + +Update the key "test" even if it does not exist with "blubber". + + +=item + + dbtool -d test.db -r -k "test" + +Remove the entry to which the key "test" points. + + +=item + + dbtool -d test.db -S -k "^\d\d" + +Search for all keys which start at least with two digits. + + +=item + + dbtool -d test.db -D | grep -i "tom" + +Dump out the whole database test.db and search for "tom". This +method allows you to search for values. + + +=item + + cat /etc/passwd | dbtool -d test.db -i -f -t "^(.+?):.*:(\d+?):$" + +In this example we store the contents of the file passwd in +a hash database. The username will be the key of an entry and +the userid will be the associated value. The key must be any character +from the beginning of a line until the first appearance of a colon. +The value must be one or more digits after the 2nd colon until the next +colon: + + apache:x:48:48:Apache:/var/www:/bin/false + ^^^^^^ ^^ + | | + | o--- value + | + o------------ key + + +=item + + find /home -ls | dbtool -d catalog.dbm -i -f -R -t "^(.+?) (\/.*)$" + +In this example the output of the unix command 'find /home -ls' will +be used as input for B. The key for an entry will begin on the +first appearance of a slash character until the end of the line. Everything +in front of it will be the value (because of the B<-R>): + + 302 12 -rw------- 1 scip scip 9734 Feb 11 2000 /home/scip/D/lrk5/README + (---------------[ value ]--------------------------) (--------[ key ]-------) + +I use this command in my backup script for creating a catalog of all saved files +and it's attributes. + + +=back + + +=head1 REPORTING BUGS + +Report bugs to . + + +=head1 COPYRIGHT + +Copyright (c) 2000-2001 T.v. Dein. +This is free software; see the source for copying conditions. There is NO warranty; +not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +=head1 SEE ALSO + +=over + +=item B + +Perl regular expressions. + +=item B + +The homepage of the B library. + +=back + + +=head1 AVAILABILITY + +B can be downloaded from B. + + +=head1 AUTHORS + +I> + + + +=cut + + + + + + + + + + + + diff --git a/digest.cc b/digest.cc new file mode 100644 index 0000000..3f1c351 --- /dev/null +++ b/digest.cc @@ -0,0 +1,312 @@ +// Copyright (C) 1999-2001 Open Source Telecom Corporation. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// As a special exception to the GNU General Public License, permission is +// granted for additional uses of the text contained in its release +// of Common C++. +// +// The exception is that, if you link the Common C++ library with other files +// to produce an executable, this does not by itself cause the +// resulting executable to be covered by the GNU General Public License. +// Your use of that executable is in no way restricted on account of +// linking the Common C++ library code into it. +// +// This exception does not however invalidate any other reasons why +// the executable file might be covered by the GNU General Public License. +// +// This exception applies only to the code released under the +// name Common C++. If you copy code from other releases into a copy of +// Common C++, as the General Public License permits, the exception does +// not apply to the code that you add in this way. To avoid misleading +// anyone as to the status of such modified files, you must delete +// this exception notice from them. +// +// If you write modifications of your own for Common C++, it is your choice +// whether to permit this exception to apply to your modifications. +// If you do not wish that, delete this exception notice. + +#include "digest.h" + + + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +inline unsigned long rotate_left(unsigned long x, unsigned long n) +{ + return (x << n) | (x >> (32-n)); +} + +inline unsigned long F(unsigned long x, unsigned long y, unsigned long z) +{ + return (x & y) | (~x & z); +} + +inline unsigned long G(unsigned long x, unsigned long y, unsigned long z) +{ + return (x & z) | (y & ~z); +} + +inline unsigned long H(unsigned long x, unsigned long y, unsigned long z) +{ + return x ^ y ^ z; +} + +inline unsigned long I(unsigned long x, unsigned long y, unsigned long z) +{ + return y ^ (x | ~z); +} + + +static void FF(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) +{ + a += F(b, c, d) + x + ac; + a = rotate_left(a, s) + b; +} + +static void GG(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) +{ + a += G(b, c, d) + x + ac; + a = rotate_left(a, s) + b; +} + +static void HH(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) +{ + a += H(b, c, d) + x + ac; + a = rotate_left(a, s) + b; +} + +static void II(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) +{ + a += I(b, c, d) + x + ac; + a = rotate_left(a, s) + b; +} + +MD5Digest::MD5Digest() : +Digest() +{ + initDigest(); + updated = true; +} + +void MD5Digest::initDigest(void) +{ + count[0] = count[1] = 0; + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + bpos = 0; + updated = false; +} + +int MD5Digest::overflow(int c) +{ + updated = true; + buf[bpos++] = (unsigned char)c; + if(bpos >= 64) + Update(); + + return c; +} + +void MD5Digest::Update(void) +{ + unsigned long x[16], a, b, c, d; + int i; + + if(!bpos) + return; + + while(bpos < 64) + buf[bpos++] = 0; + + if((count[0] += 512) < 512) + ++count[1]; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + + for(i = 0; i < 16; ++i) + x[i] = (unsigned long)(buf[i * 4]) | + (unsigned long)(buf[i * 4 + 1] << 8) | + (unsigned long)(buf[i * 4 + 2] << 16) | + (unsigned long)(buf[i * 4 + 3] << 24); + + FF(a, b, c, d, x[ 0], S11, 0xd76aa478); + FF(d, a, b, c, x[ 1], S12, 0xe8c7b756); + FF(c, d, a, b, x[ 2], S13, 0x242070db); + FF(b, c, d, a, x[ 3], S14, 0xc1bdceee); + FF(a, b, c, d, x[ 4], S11, 0xf57c0faf); + FF(d, a, b, c, x[ 5], S12, 0x4787c62a); + FF(c, d, a, b, x[ 6], S13, 0xa8304613); + FF(b, c, d, a, x[ 7], S14, 0xfd469501); + FF(a, b, c, d, x[ 8], S11, 0x698098d8); + FF(d, a, b, c, x[ 9], S12, 0x8b44f7af); + FF(c, d, a, b, x[10], S13, 0xffff5bb1); + FF(b, c, d, a, x[11], S14, 0x895cd7be); + FF(a, b, c, d, x[12], S11, 0x6b901122); + FF(d, a, b, c, x[13], S12, 0xfd987193); + FF(c, d, a, b, x[14], S13, 0xa679438e); + FF(b, c, d, a, x[15], S14, 0x49b40821); + + GG(a, b, c, d, x[ 1], S21, 0xf61e2562); + GG(d, a, b, c, x[ 6], S22, 0xc040b340); + GG(c, d, a, b, x[11], S23, 0x265e5a51); + GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); + GG(a, b, c, d, x[ 5], S21, 0xd62f105d); + GG(d, a, b, c, x[10], S22, 0x2441453); + GG(c, d, a, b, x[15], S23, 0xd8a1e681); + GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); + GG(a, b, c, d, x[ 9], S21, 0x21e1cde6); + GG(d, a, b, c, x[14], S22, 0xc33707d6); + GG(c, d, a, b, x[ 3], S23, 0xf4d50d87); + GG(b, c, d, a, x[ 8], S24, 0x455a14ed); + GG(a, b, c, d, x[13], S21, 0xa9e3e905); + GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8); + GG(c, d, a, b, x[ 7], S23, 0x676f02d9); + GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); + + HH(a, b, c, d, x[ 5], S31, 0xfffa3942); + HH(d, a, b, c, x[ 8], S32, 0x8771f681); + HH(c, d, a, b, x[11], S33, 0x6d9d6122); + HH(b, c, d, a, x[14], S34, 0xfde5380c); + HH(a, b, c, d, x[ 1], S31, 0xa4beea44); + HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9); + HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60); + HH(b, c, d, a, x[10], S34, 0xbebfbc70); + HH(a, b, c, d, x[13], S31, 0x289b7ec6); + HH(d, a, b, c, x[ 0], S32, 0xeaa127fa); + HH(c, d, a, b, x[ 3], S33, 0xd4ef3085); + HH(b, c, d, a, x[ 6], S34, 0x4881d05); + HH(a, b, c, d, x[ 9], S31, 0xd9d4d039); + HH(d, a, b, c, x[12], S32, 0xe6db99e5); + HH(c, d, a, b, x[15], S33, 0x1fa27cf8); + HH(b, c, d, a, x[ 2], S34, 0xc4ac5665); + + II(a, b, c, d, x[ 0], S41, 0xf4292244); + II(d, a, b, c, x[ 7], S42, 0x432aff97); + II(c, d, a, b, x[14], S43, 0xab9423a7); + II(b, c, d, a, x[ 5], S44, 0xfc93a039); + II(a, b, c, d, x[12], S41, 0x655b59c3); + II(d, a, b, c, x[ 3], S42, 0x8f0ccc92); + II(c, d, a, b, x[10], S43, 0xffeff47d); + II(b, c, d, a, x[ 1], S44, 0x85845dd1); + II(a, b, c, d, x[ 8], S41, 0x6fa87e4f); + II(d, a, b, c, x[15], S42, 0xfe2ce6e0); + II(c, d, a, b, x[ 6], S43, 0xa3014314); + II(b, c, d, a, x[13], S44, 0x4e0811a1); + II(a, b, c, d, x[ 4], S41, 0xf7537e82); + II(d, a, b, c, x[11], S42, 0xbd3af235); + II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); + II(b, c, d, a, x[ 9], S44, 0xeb86d391); + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + updated = true; +} + +void MD5Digest::Commit(void) +{ + unsigned char cbuf[8]; + unsigned long i, len; + + static unsigned char pad[64]={ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + if(!updated && !bpos) + return; + + count[0] += (unsigned long)(bpos << 3); + if(count[0] < (unsigned long)(bpos << 3)) + ++count[1]; + + for(i = 0; i < 2; ++i) + { + cbuf[i * 4] = (unsigned char)count[i] & 0xff; + cbuf[i * 4 + 1] = (unsigned char)((count[i] >> 8) & 0xff); + cbuf[i * 4 + 2] = (unsigned char)((count[i] >> 16) & 0xff); + cbuf[i * 4 + 3] = (unsigned char)((count[i] >> 24) & 0xff); + } + + i = (unsigned) ((count[0] >> 3) & 0x3f); + len = (i < 56) ? (56 - i) : (120 - i); + if(len) + putDigest(pad, len); + + putDigest(cbuf, 8); + + for(i = 0; i < 4; ++i) + { + md5[i * 4] = (unsigned char)state[i] & 0xff; + md5[i * 4 + 1] = (unsigned char)((state[i] >> 8) & 0xff); + md5[i * 4 + 2] = (unsigned char)((state[i] >> 16) & 0xff); + md5[i * 4 + 3] = (unsigned char)((state[i] >> 24) & 0xff); + } + initDigest(); +} + +unsigned MD5Digest::getDigest(unsigned char *buffer) +{ + Commit(); + + memcpy(buffer, md5, 16); + return 16; +} + +void MD5Digest::putDigest(unsigned char *buffer, unsigned len) +{ + while(len--) + { + buf[bpos++] = *(buffer++); + if(bpos >= 64) + Update(); + } +} + +char* MD5Digest::stringDigest() { + char *buf; + buf = new char[33]; + int i; + + Commit(); + + for(i = 0; i < 16; ++i) + sprintf(buf + 2 * i, "%02x", md5[i]); + + return buf; +} + diff --git a/digest.h b/digest.h new file mode 100644 index 0000000..9142842 --- /dev/null +++ b/digest.h @@ -0,0 +1,134 @@ +// Copyright (C) 1999-2001 Open Source Telecom Corporation. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// As a special exception to the GNU General Public License, permission is +// granted for additional uses of the text contained in its release +// of Common C++. +// +// The exception is that, if you link the Common C++ library with other +// files to produce an executable, this does not by itself cause the +// resulting executable to be covered by the GNU General Public License. +// Your use of that executable is in no way restricted on account of +// linking the Common C++ library code into it. +// +// This exception does not however invalidate any other reasons why +// the executable file might be covered by the GNU General Public License. +// +// This exception applies only to the code released under the +// name Common C++. If you copy code from other releases into a copy of +// Common C++, as the General Public License permits, the exception does +// not apply to the code that you add in this way. To avoid misleading +// anyone as to the status of such modified files, you must delete +// this exception notice from them. +// +// If you write modifications of your own for Common C++, it is your choice +// whether to permit this exception to apply to your modifications. +// If you do not wish that, delete this exception notice. + +#ifndef DIGEST_H +#define DIGEST_H + +#include + +extern "C" { +#include +} + + + +/** + * The digest base class is used for implementing and deriving one way + * hashing functions. + * + * @author David Sugar + * @short base class for hashing services. + */ +class Digest { +protected: + Digest() {}; + + /** + * Reset the digest table to an initial default value. + */ + virtual void initDigest(void) = 0; + + /** + * Get the size of a digest in octets. + * + * @return number of bytes in digest. + */ + virtual unsigned getSize(void) = 0; + + /** + * Copy the binary digest buffer to user memory. + * + * @return number of bytes in digest. + * @param buffer to write into. + */ + virtual unsigned getDigest(unsigned char *buffer) = 0; + + /** + * Put data into the digest bypassing the stream subsystem. + * + * @param buffer to read from. + * @param length of data. + */ + virtual void putDigest(unsigned char *buffer, unsigned length) = 0; + +}; + + +/** + * A md5 collection/computation accululator class. + * + * @author David Sugar + * @short md5 hash accumulation. + */ +class MD5Digest : public Digest +{ +private: + unsigned long state[4]; + unsigned long count[2]; + unsigned char buf[64]; + unsigned bpos; + unsigned char md5[16]; + bool updated; + +protected: + int overflow(int c); + + void Update(void); + + void Commit(void); + +public: + MD5Digest(); + + void initDigest(void); + + inline unsigned getSize(void) + {return 16;}; + + unsigned getDigest(unsigned char *buffer); + + void putDigest(unsigned char *buffer, unsigned len); + + char* stringDigest(); +}; + + +#endif + diff --git a/engine.cc b/engine.cc new file mode 100644 index 0000000..37ceee5 --- /dev/null +++ b/engine.cc @@ -0,0 +1,607 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + + + +#include "dbtool.h" +#include "engine.h" +#include "platform.h" +/* + * Initialize the database and get a new Db instance pointer + */ +void Engine::init() { + pkg = PACKAGE; + int mode; +#ifdef HAVE_BERKELEY + int err; +#endif + if(config.filename == "") { + cerr << pkg << ": no database file specified!" << endl; + exit(1); + } +#ifdef HAVE_BERKELEY + db = new Db(NULL,0); + db->set_error_stream(&cerr); + db->set_errpfx(pkg.c_str()); + if(config.readonly == 1) + mode = DB_RDONLY; + else + mode = DB_CREATE; +#else + if(config.readonly == 1) + mode = GDBM_READER; + else + mode = GDBM_WRCREAT; +#endif + + + if(config.force == 1) { +#ifdef HAVE_BERKELEY + if ((err = db->open(NULL, config.filename.c_str(), NULL, DB_HASH, mode, FILEMODE)) != 0) { + cerr << "Failed to open " + config.filename << "(" << strerror(err) << ")" << endl; + exit(1); + } +#else + + db = gdbm_open( + (char *)config.filename.c_str(), + BLOCKSIZE, + mode, + FILEMODE, + 0 + ); +#endif + } + else { +#ifdef HAVE_BERKELEY + if ((err = db->open(NULL, config.filename.c_str(), NULL, DB_HASH, mode, FILEMODE)) != 0) { + cerr << "Failed to open " + config.filename << "(" << strerror(err) << ")" << endl; + exit(1); + } +#else + db = gdbm_open( + (char *)config.filename.c_str(), + BLOCKSIZE, + mode, + FILEMODE, + 0 + ); +#endif + } +#ifndef HAVE_BERKELEY + if(!db) { + cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl; + exit(1); + } +#endif + + /* + * ok, at this point everything is ok, usage is correct, + * database is open, now check the passphrase, if encrypted + * database requested. + */ + if(config.encrypted) { + if(config.phrase == "") { + config.phrase = readpass(); + } + rijn.init(config.phrase); /* this might fail */ + config.phrase = " "; + } +} + + +/* + * dump out all data in db + */ +void Engine::dump() { + init(); +#ifdef HAVE_BERKELEY + try { + Dbc *dbcp; + db->cursor(NULL, &dbcp, 0); + Dbt key; + Dbt data; + while (dbcp->get(&key, &data, DB_NEXT) == 0) { + /* iterate over every tuple and dump it out */ + string K((char *)key.get_data(), key.get_size()); + string V((char *)data.get_data(), data.get_size()); + if(config.reverse == 1) { + cout << decode(V) << config.separator << K << endl; + } + else { + cout << K << config.separator << decode(V) << endl; + } + } + dbcp->close(); + } + catch (DbException &dbe) { + cerr << pkg << ": " << dbe.what() << "\n"; + } + db->close(0); +#else + datum key; + datum value; + key = gdbm_firstkey(db); + while ( key.dptr != NULL ) { + /* iterate over every tuple and dump it out */ + value = gdbm_fetch(db, key); + string K(key.dptr, key.dsize); + string V(value.dptr, value.dsize); + if(config.reverse == 1) { + cout << decode(V) << config.separator << K << endl; + } + else { + cout << K << config.separator << decode(V) << endl; + } + key = gdbm_nextkey(db,key); + } + gdbm_close(db); +#endif +} + + + + +/* + * search for regexp given in config.key + */ +void Engine::regexp() { + init(); + int num; + pcre *p_pcre; + pcre_extra *p_pcre_extra; + char *err_str; + int sub_len = 9; + int *sub_vec; + int erroffset; + p_pcre_extra = NULL; + p_pcre = pcre_compile((char *)config.key.c_str(), 0, + (const char **)(&err_str), &erroffset, NULL); +#ifdef HAVE_BERKELEY + Dbc *dbcp; + db->cursor(NULL, &dbcp, 0); + Dbt key; + Dbt data; + while (dbcp->get(&key, &data, DB_NEXT) == 0) { + string K((char *)key.get_data(), key.get_size()); + string V((char *)data.get_data(), data.get_size()); +#else + datum key; + datum value; + key = gdbm_firstkey(db); + while ( key.dptr != NULL ) { + value = gdbm_fetch(db, key); + string K(key.dptr, key.dsize); + string V(value.dptr, value.dsize); +#endif + sub_vec = new int(sub_len); + num = pcre_exec(p_pcre, p_pcre_extra, (char *)K.c_str(), + (int)K.length(), 0, 0, (int *)sub_vec, sub_len); + if(num == 1){ + if(config.reverse == 1) { + cout << decode(V); + if(config.with == 1) { + cout << config.separator << K; + } + cout << endl; + } + else { + if(config.with == 1) { + cout << K << config.separator; + } + cout << decode(V) << endl; + } + } + K = ""; + V = ""; + delete(sub_vec); +#ifndef HAVE_BERKELEY + key = gdbm_nextkey(db,key); +#endif + } + pcre_free(p_pcre); +#ifdef HAVE_BERKELEY + dbcp->close(); + db->close(0); +#else + gdbm_close(db); +#endif +} + + + + + + +/* + * Insert data into the db + */ +void Engine::from_stdin() { + init(); +#ifdef HAVE_BERKELEY + int err; +#else + int ret; +#endif + + FILE *stream; + stream = fdopen(0, "r"); + char c; + string mode = "key"; + string key = ""; + string value = ""; + string line = ""; + + int num, match; + pcre *p_pcre; + pcre_extra *p_pcre_extra; + char *err_str; + int sub_len = 9; + int *sub_vec; + char *v1; + char *v2; + int erroffset; + p_pcre_extra = NULL; + p_pcre = pcre_compile((char *)config.token.c_str(), 0, + (const char **)(&err_str), &erroffset, NULL); + while((c = fgetc(stream)) != EOF) { + if(c == '\n') { + // record end + mode = "key"; + if(config.token != "") { + v1 = new char[line.length()]; + v2 = new char[line.length()]; + sub_vec = new int[sub_len]; + num = pcre_exec(p_pcre, p_pcre_extra, (char *)line.c_str(), + (int)line.length(), 0, 0, (int *)sub_vec, sub_len); + if(num < 0) + cerr << "Token \"" << config.token << "\" did not match on \"" << line << "\"!\n"; + else if(num == 1) + cerr << "Token " << config.token << " did not produce sub strings!\n"; + else { + match = pcre_copy_substring((char *)line.c_str(), sub_vec, num, 1, v1, line.length()); + match = pcre_copy_substring((char *)line.c_str(), sub_vec, num, 2, v2, line.length()); + if(config.reverse) { + value = v1; + key = v2; + } + else { + value = v2; + key = v1; + } + } + delete(sub_vec); + pcre_free((void *)v1); + pcre_free((void *)v2); + line = ""; + } + value = encode(value); +#ifdef HAVE_BERKELEY + Dbt d_key((char *)key.c_str(), key.length()); + Dbt d_value((char *)value.c_str(), value.length()); +#else + datum d_key = {(char *)key.c_str(), key.length()}; + datum d_value = {(char *)value.c_str(), value.length()}; +#endif + if(config.force == 1) { +#ifdef HAVE_BERKELEY + if((err = db->put(0, &d_key, &d_value, 0)) != 0) { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } +#else + ret = gdbm_store(db, d_key, d_value, GDBM_REPLACE); +#endif + } + else { +#ifdef HAVE_BERKELEY + if((err = db->put(NULL, &d_key, &d_value, DB_NOOVERWRITE)) != 0) { + if(err == DB_KEYEXIST) { + cerr << "Key " + config.key + " already exists" << "(" << strerror(err) << ")" << endl; + exit(1); + } + else { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } + } +#else + ret = gdbm_store(db, d_key, d_value, GDBM_INSERT); +#endif + } +#ifndef HAVE_BERKELEY + if(ret != 0) { + cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl; + exit(1); + } +#endif + key = ""; + value = ""; + continue; + } + else if(c == config.separator && mode != "value" && config.token == "") { + // key ready, the following stuff is the data! + mode = "value"; + continue; + } + if(config.token != "") { + /* we have a split token */ + line += char(c); + } + else { + if(mode == "key") + key += char(c); + else + value += char(c); + } + } + pcre_free(p_pcre); +#ifdef HAVE_BERKELEY + db->close(0); +#else + gdbm_close(db); +#endif +} + + +/* + * Insert data into the db + */ +void Engine::insert() { + init(); + string __value; + __value = encode(config.value); +#ifdef HAVE_BERKELEY + int err; + char *k; + char *v; + k = (char *)config.key.c_str(); + v = (char *)__value.c_str(); + Dbt key(k, strlen(k)); + Dbt value(v, strlen(v)); +#else + int ret; + datum key = {(char *)config.key.c_str(), config.key.length()}; + datum value = {(char *)__value.c_str(), __value.length()}; +#endif + + if(config.force == 1) { +#ifdef HAVE_BERKELEY + if((err = db->put(0, &key, &value, 0)) != 0) { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } +#else + ret = gdbm_store(db, key, value, GDBM_REPLACE); +#endif + } + else { +#ifdef HAVE_BERKELEY + if((err = db->put(NULL, &key, &value, DB_NOOVERWRITE)) != 0) { + if(err == DB_KEYEXIST) { + cerr << "Key " + config.key + " already exists" << "(" << strerror(err) << ")" << endl; + exit(1); + } + else { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } + } +#else + ret = gdbm_store(db, key, value, GDBM_INSERT); +#endif + } +#ifdef HAVE_BERKELEY + db->close(0); +#else + if(ret != 0) { + cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl; + exit(1); + } + gdbm_close(db); +#endif +} + + + +/* + * update a database + */ +void Engine::update() { + init(); + string __value; + __value = encode(config.value); +#ifdef HAVE_BERKELEY + int err; + char *k; + char *v; + k = (char *)config.key.c_str(); + v = (char *)__value.c_str(); + Dbt key(k, strlen(k)); + Dbt value(v, strlen(v)); +#else + int ret; + datum key = {(char *)config.key.c_str(), config.key.length()}; + datum value = {(char *)__value.c_str(), __value.length()}; +#endif + + if(config.force == 1) { +#ifdef HAVE_BERKELEY + if((err = db->put(0, &key, &value, 0)) != 0) { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } +#else + ret = gdbm_store(db, key, value, GDBM_REPLACE); +#endif + } + else { +#ifdef HAVE_BERKELEY + Dbt val; + err = db->get(0, &key, &val, 0); + if(err == 0) { + /* key exists, do the update */ + if((err = db->put(0, &key, &value, 0)) != 0) { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } + } + else if(err == DB_NOTFOUND) { + cerr << "Key " << config.key << " does not exist\n"; + exit(1); + } + else { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } +#else + ret = gdbm_exists(db, key); + if(ret) { + ret = gdbm_store(db, key, value, GDBM_REPLACE); + } + else { + cerr << "Key " << config.key << " does not exist\n"; + exit(1); + } +#endif + } +#ifdef HAVE_BERKELEY + db->close(0); +#else + if(ret != 0) { + cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl; + exit(1); + } + gdbm_close(db); +#endif +} + + + +/* + * remove an entry + */ +void Engine::remove() { + init(); + int ret; +#ifdef HAVE_BERKELEY + Dbt key((char *)config.key.c_str(), config.key.length() + 1); + if((ret = db->del(NULL, &key, 0)) != 0) { + cerr << "Database error" << "(" << strerror(ret) << ")" << endl; + exit(1); + } + db->close(0); +#else + datum key = {(char *)config.key.c_str(), config.key.length()}; + ret = gdbm_delete(db, key); + gdbm_close(db); +#endif +} + + + +/* + * search for specific data + */ +void Engine::select() { + init(); +#ifdef HAVE_BERKELEY + int err; + char *k; + k = (char *)config.key.c_str(); + Dbt key(k, strlen(k)); + Dbt value; + err = db->get(0, &key, &value, 0); + if(err == 0) { + string gotvalue((char *)value.get_data(), value.get_size()); + if(config.reverse == 1) { + cout << decode(gotvalue); + if(config.with == 1) { + cout << config.separator << config.key; + } + cout << endl; + } + else { + if(config.with == 1) { + cout << config.key << config.separator; + } + cout << decode(gotvalue) << endl; + } + } + else { + cerr << "Database error" << "(" << strerror(err) << ")" << endl; + exit(1); + } + db->close(0); +#else + datum content; + datum key = {(char *)config.key.c_str(), config.key.length()}; + content = gdbm_fetch(db, key); + string V(content.dptr, content.dsize); + if(config.with == 1) + cout << config.key << config.separator; + cout << decode(V) << endl; + gdbm_close(db); +#endif +} + +string Engine::encode(const string& data) { + if(config.encrypted) { + return rijn.encrypt(data); + } + else + return data; +} + +string Engine::decode(const string& data) { + if(config.encrypted) { + return rijn.decrypt(data); + } + else + return data; +} + diff --git a/engine.h b/engine.h new file mode 100644 index 0000000..ec30a3a --- /dev/null +++ b/engine.h @@ -0,0 +1,126 @@ +/* + * 'dbtool' is a simple but powerful commandline interface to the + * GNU gdbm system (or, alternatively the Berkeley DB), useful for + * shellscripts which needs a database for data storage. + */ + +/* + * + * This file is part of the DBTOOL program. + * + * By accessing this software, DBTOOL, you are duly informed + * of and agree to be bound by the conditions described below + * in this notice: + * + * This software product, DBTOOL, is developed by T.v. Dein + * and copyrighted (C) 2001-2015 by T.v. Dein, with all + * rights reserved. + * + * There is no charge for DBTOOL software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellec- + * tual property rights. + * + * You should have received a copy of the GNU General Public + * License along with DBTOOL. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl.txt + * + * or by writing to: + * + * Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111-1307 + * USA + * + * Or contact: + * + * "T.v. Dein" + * + * + */ + + +#ifndef ENGINE_H +#define ENGINE_H + +/* the default initial blocksize for the gdbm database, see gdbm(3) */ +#define BLOCKSIZE 1024 + +/* the default filemode for file creation, will be xored to the users umask */ +#define FILEMODE 0644 + + +#include + +extern "C" { +#include +#include +#include +} + +#ifdef HAVE_BERKELEY + +#ifndef NO_SYSTEM_INCLUDES +#include +#include +#include +#ifndef _MSC_VER +#include +#endif +#endif + +#include "platform.h" +#include DB_CXX_HEADER + +#else + +# include + +#endif + +#include "config.h" +#include "cipher.h" + +extern Config config; /* instanced in ::main() */ +extern cipher rijn; /* instanced in ::main() */ + +/* + * The Engine class will do all gdbm related stuff, i.e. + * insert, search, create, remove and so on. + * methods defined in engine.cc + */ +class Engine { + private: + void init(); /* init() will be called from every method once */ + string encode(const string& data); + string decode(const string& data); + + /* + * the db object has the same name for both backends + */ +#ifdef HAVE_BERKELEY + Db *db; +#else + GDBM_FILE db; +#endif + + string pkg; + + public: + Engine() {}; + void insert(); + void update(); + void remove(); + void select(); + void from_stdin(); + void dump(); + void regexp(); +}; + + +#endif // ENGINE_H diff --git a/platform.h.in b/platform.h.in new file mode 100644 index 0000000..5327b5f --- /dev/null +++ b/platform.h.in @@ -0,0 +1,92 @@ +/* platform.h.in. Generated from configure.ac by autoheader. */ + +/* "Berkeley DB C++ Header File" */ +#undef DB_CXX_HEADER + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `fdopen' function. */ +#undef HAVE_FDOPEN + +/* Define to 1 if you have the `fgetc' function. */ +#undef HAVE_FGETC + +/* Define to 1 if you have the `getenv' function. */ +#undef HAVE_GETENV + +/* Define to 1 if you have the `getopt' function. */ +#undef HAVE_GETOPT + +/* Define to 1 if you have the `getpass' function. */ +#undef HAVE_GETPASS + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `gdbm' library (-lgdbm). */ +#undef HAVE_LIBGDBM + +/* Define to 1 if you have the `pcre' library (-lpcre). */ +#undef HAVE_LIBPCRE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const diff --git a/rijndael.cc b/rijndael.cc new file mode 100644 index 0000000..69d260d --- /dev/null +++ b/rijndael.cc @@ -0,0 +1,1600 @@ +// +// File : rijndael.cpp +// Creation date : Sun Nov 5 2000 03:22:10 CEST +// Author : Szymon Stefanek (stefanek@tin.it) +// +// Another implementation of the Rijndael cipher. +// This is intended to be an easily usable library file. +// This code is public domain. +// Based on the Vincent Rijmen and K.U.Leuven implementation 2.4. +// + +// +// Original Copyright notice: +// +// rijndael-alg-fst.c v2.4 April '2000 +// rijndael-alg-fst.h +// rijndael-api-fst.c +// rijndael-api-fst.h +// +// Optimised ANSI C code +// +// authors: v1.0: Antoon Bosselaers +// v2.0: Vincent Rijmen, K.U.Leuven +// v2.3: Paulo Barreto +// v2.4: Vincent Rijmen, K.U.Leuven +// +// This code is placed in the public domain. +// + +// +// This implementation works on 128 , 192 , 256 bit keys +// and on 128 bit blocks +// + +#define _RIJNDAEL_CPP_ + +#include "rijndael.h" + + +static UINT8 S[256]= +{ + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, + 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, + 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, + 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, + 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, + 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, + 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, + 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, + 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, + 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, + 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, + 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, + 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, + 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, + 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, + 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22 +}; + + +static UINT8 T1[256][4]= +{ + 0xc6,0x63,0x63,0xa5, 0xf8,0x7c,0x7c,0x84, 0xee,0x77,0x77,0x99, 0xf6,0x7b,0x7b,0x8d, + 0xff,0xf2,0xf2,0x0d, 0xd6,0x6b,0x6b,0xbd, 0xde,0x6f,0x6f,0xb1, 0x91,0xc5,0xc5,0x54, + 0x60,0x30,0x30,0x50, 0x02,0x01,0x01,0x03, 0xce,0x67,0x67,0xa9, 0x56,0x2b,0x2b,0x7d, + 0xe7,0xfe,0xfe,0x19, 0xb5,0xd7,0xd7,0x62, 0x4d,0xab,0xab,0xe6, 0xec,0x76,0x76,0x9a, + 0x8f,0xca,0xca,0x45, 0x1f,0x82,0x82,0x9d, 0x89,0xc9,0xc9,0x40, 0xfa,0x7d,0x7d,0x87, + 0xef,0xfa,0xfa,0x15, 0xb2,0x59,0x59,0xeb, 0x8e,0x47,0x47,0xc9, 0xfb,0xf0,0xf0,0x0b, + 0x41,0xad,0xad,0xec, 0xb3,0xd4,0xd4,0x67, 0x5f,0xa2,0xa2,0xfd, 0x45,0xaf,0xaf,0xea, + 0x23,0x9c,0x9c,0xbf, 0x53,0xa4,0xa4,0xf7, 0xe4,0x72,0x72,0x96, 0x9b,0xc0,0xc0,0x5b, + 0x75,0xb7,0xb7,0xc2, 0xe1,0xfd,0xfd,0x1c, 0x3d,0x93,0x93,0xae, 0x4c,0x26,0x26,0x6a, + 0x6c,0x36,0x36,0x5a, 0x7e,0x3f,0x3f,0x41, 0xf5,0xf7,0xf7,0x02, 0x83,0xcc,0xcc,0x4f, + 0x68,0x34,0x34,0x5c, 0x51,0xa5,0xa5,0xf4, 0xd1,0xe5,0xe5,0x34, 0xf9,0xf1,0xf1,0x08, + 0xe2,0x71,0x71,0x93, 0xab,0xd8,0xd8,0x73, 0x62,0x31,0x31,0x53, 0x2a,0x15,0x15,0x3f, + 0x08,0x04,0x04,0x0c, 0x95,0xc7,0xc7,0x52, 0x46,0x23,0x23,0x65, 0x9d,0xc3,0xc3,0x5e, + 0x30,0x18,0x18,0x28, 0x37,0x96,0x96,0xa1, 0x0a,0x05,0x05,0x0f, 0x2f,0x9a,0x9a,0xb5, + 0x0e,0x07,0x07,0x09, 0x24,0x12,0x12,0x36, 0x1b,0x80,0x80,0x9b, 0xdf,0xe2,0xe2,0x3d, + 0xcd,0xeb,0xeb,0x26, 0x4e,0x27,0x27,0x69, 0x7f,0xb2,0xb2,0xcd, 0xea,0x75,0x75,0x9f, + 0x12,0x09,0x09,0x1b, 0x1d,0x83,0x83,0x9e, 0x58,0x2c,0x2c,0x74, 0x34,0x1a,0x1a,0x2e, + 0x36,0x1b,0x1b,0x2d, 0xdc,0x6e,0x6e,0xb2, 0xb4,0x5a,0x5a,0xee, 0x5b,0xa0,0xa0,0xfb, + 0xa4,0x52,0x52,0xf6, 0x76,0x3b,0x3b,0x4d, 0xb7,0xd6,0xd6,0x61, 0x7d,0xb3,0xb3,0xce, + 0x52,0x29,0x29,0x7b, 0xdd,0xe3,0xe3,0x3e, 0x5e,0x2f,0x2f,0x71, 0x13,0x84,0x84,0x97, + 0xa6,0x53,0x53,0xf5, 0xb9,0xd1,0xd1,0x68, 0x00,0x00,0x00,0x00, 0xc1,0xed,0xed,0x2c, + 0x40,0x20,0x20,0x60, 0xe3,0xfc,0xfc,0x1f, 0x79,0xb1,0xb1,0xc8, 0xb6,0x5b,0x5b,0xed, + 0xd4,0x6a,0x6a,0xbe, 0x8d,0xcb,0xcb,0x46, 0x67,0xbe,0xbe,0xd9, 0x72,0x39,0x39,0x4b, + 0x94,0x4a,0x4a,0xde, 0x98,0x4c,0x4c,0xd4, 0xb0,0x58,0x58,0xe8, 0x85,0xcf,0xcf,0x4a, + 0xbb,0xd0,0xd0,0x6b, 0xc5,0xef,0xef,0x2a, 0x4f,0xaa,0xaa,0xe5, 0xed,0xfb,0xfb,0x16, + 0x86,0x43,0x43,0xc5, 0x9a,0x4d,0x4d,0xd7, 0x66,0x33,0x33,0x55, 0x11,0x85,0x85,0x94, + 0x8a,0x45,0x45,0xcf, 0xe9,0xf9,0xf9,0x10, 0x04,0x02,0x02,0x06, 0xfe,0x7f,0x7f,0x81, + 0xa0,0x50,0x50,0xf0, 0x78,0x3c,0x3c,0x44, 0x25,0x9f,0x9f,0xba, 0x4b,0xa8,0xa8,0xe3, + 0xa2,0x51,0x51,0xf3, 0x5d,0xa3,0xa3,0xfe, 0x80,0x40,0x40,0xc0, 0x05,0x8f,0x8f,0x8a, + 0x3f,0x92,0x92,0xad, 0x21,0x9d,0x9d,0xbc, 0x70,0x38,0x38,0x48, 0xf1,0xf5,0xf5,0x04, + 0x63,0xbc,0xbc,0xdf, 0x77,0xb6,0xb6,0xc1, 0xaf,0xda,0xda,0x75, 0x42,0x21,0x21,0x63, + 0x20,0x10,0x10,0x30, 0xe5,0xff,0xff,0x1a, 0xfd,0xf3,0xf3,0x0e, 0xbf,0xd2,0xd2,0x6d, + 0x81,0xcd,0xcd,0x4c, 0x18,0x0c,0x0c,0x14, 0x26,0x13,0x13,0x35, 0xc3,0xec,0xec,0x2f, + 0xbe,0x5f,0x5f,0xe1, 0x35,0x97,0x97,0xa2, 0x88,0x44,0x44,0xcc, 0x2e,0x17,0x17,0x39, + 0x93,0xc4,0xc4,0x57, 0x55,0xa7,0xa7,0xf2, 0xfc,0x7e,0x7e,0x82, 0x7a,0x3d,0x3d,0x47, + 0xc8,0x64,0x64,0xac, 0xba,0x5d,0x5d,0xe7, 0x32,0x19,0x19,0x2b, 0xe6,0x73,0x73,0x95, + 0xc0,0x60,0x60,0xa0, 0x19,0x81,0x81,0x98, 0x9e,0x4f,0x4f,0xd1, 0xa3,0xdc,0xdc,0x7f, + 0x44,0x22,0x22,0x66, 0x54,0x2a,0x2a,0x7e, 0x3b,0x90,0x90,0xab, 0x0b,0x88,0x88,0x83, + 0x8c,0x46,0x46,0xca, 0xc7,0xee,0xee,0x29, 0x6b,0xb8,0xb8,0xd3, 0x28,0x14,0x14,0x3c, + 0xa7,0xde,0xde,0x79, 0xbc,0x5e,0x5e,0xe2, 0x16,0x0b,0x0b,0x1d, 0xad,0xdb,0xdb,0x76, + 0xdb,0xe0,0xe0,0x3b, 0x64,0x32,0x32,0x56, 0x74,0x3a,0x3a,0x4e, 0x14,0x0a,0x0a,0x1e, + 0x92,0x49,0x49,0xdb, 0x0c,0x06,0x06,0x0a, 0x48,0x24,0x24,0x6c, 0xb8,0x5c,0x5c,0xe4, + 0x9f,0xc2,0xc2,0x5d, 0xbd,0xd3,0xd3,0x6e, 0x43,0xac,0xac,0xef, 0xc4,0x62,0x62,0xa6, + 0x39,0x91,0x91,0xa8, 0x31,0x95,0x95,0xa4, 0xd3,0xe4,0xe4,0x37, 0xf2,0x79,0x79,0x8b, + 0xd5,0xe7,0xe7,0x32, 0x8b,0xc8,0xc8,0x43, 0x6e,0x37,0x37,0x59, 0xda,0x6d,0x6d,0xb7, + 0x01,0x8d,0x8d,0x8c, 0xb1,0xd5,0xd5,0x64, 0x9c,0x4e,0x4e,0xd2, 0x49,0xa9,0xa9,0xe0, + 0xd8,0x6c,0x6c,0xb4, 0xac,0x56,0x56,0xfa, 0xf3,0xf4,0xf4,0x07, 0xcf,0xea,0xea,0x25, + 0xca,0x65,0x65,0xaf, 0xf4,0x7a,0x7a,0x8e, 0x47,0xae,0xae,0xe9, 0x10,0x08,0x08,0x18, + 0x6f,0xba,0xba,0xd5, 0xf0,0x78,0x78,0x88, 0x4a,0x25,0x25,0x6f, 0x5c,0x2e,0x2e,0x72, + 0x38,0x1c,0x1c,0x24, 0x57,0xa6,0xa6,0xf1, 0x73,0xb4,0xb4,0xc7, 0x97,0xc6,0xc6,0x51, + 0xcb,0xe8,0xe8,0x23, 0xa1,0xdd,0xdd,0x7c, 0xe8,0x74,0x74,0x9c, 0x3e,0x1f,0x1f,0x21, + 0x96,0x4b,0x4b,0xdd, 0x61,0xbd,0xbd,0xdc, 0x0d,0x8b,0x8b,0x86, 0x0f,0x8a,0x8a,0x85, + 0xe0,0x70,0x70,0x90, 0x7c,0x3e,0x3e,0x42, 0x71,0xb5,0xb5,0xc4, 0xcc,0x66,0x66,0xaa, + 0x90,0x48,0x48,0xd8, 0x06,0x03,0x03,0x05, 0xf7,0xf6,0xf6,0x01, 0x1c,0x0e,0x0e,0x12, + 0xc2,0x61,0x61,0xa3, 0x6a,0x35,0x35,0x5f, 0xae,0x57,0x57,0xf9, 0x69,0xb9,0xb9,0xd0, + 0x17,0x86,0x86,0x91, 0x99,0xc1,0xc1,0x58, 0x3a,0x1d,0x1d,0x27, 0x27,0x9e,0x9e,0xb9, + 0xd9,0xe1,0xe1,0x38, 0xeb,0xf8,0xf8,0x13, 0x2b,0x98,0x98,0xb3, 0x22,0x11,0x11,0x33, + 0xd2,0x69,0x69,0xbb, 0xa9,0xd9,0xd9,0x70, 0x07,0x8e,0x8e,0x89, 0x33,0x94,0x94,0xa7, + 0x2d,0x9b,0x9b,0xb6, 0x3c,0x1e,0x1e,0x22, 0x15,0x87,0x87,0x92, 0xc9,0xe9,0xe9,0x20, + 0x87,0xce,0xce,0x49, 0xaa,0x55,0x55,0xff, 0x50,0x28,0x28,0x78, 0xa5,0xdf,0xdf,0x7a, + 0x03,0x8c,0x8c,0x8f, 0x59,0xa1,0xa1,0xf8, 0x09,0x89,0x89,0x80, 0x1a,0x0d,0x0d,0x17, + 0x65,0xbf,0xbf,0xda, 0xd7,0xe6,0xe6,0x31, 0x84,0x42,0x42,0xc6, 0xd0,0x68,0x68,0xb8, + 0x82,0x41,0x41,0xc3, 0x29,0x99,0x99,0xb0, 0x5a,0x2d,0x2d,0x77, 0x1e,0x0f,0x0f,0x11, + 0x7b,0xb0,0xb0,0xcb, 0xa8,0x54,0x54,0xfc, 0x6d,0xbb,0xbb,0xd6, 0x2c,0x16,0x16,0x3a +}; + +static UINT8 T2[256][4]= +{ + 0xa5,0xc6,0x63,0x63, 0x84,0xf8,0x7c,0x7c, 0x99,0xee,0x77,0x77, 0x8d,0xf6,0x7b,0x7b, + 0x0d,0xff,0xf2,0xf2, 0xbd,0xd6,0x6b,0x6b, 0xb1,0xde,0x6f,0x6f, 0x54,0x91,0xc5,0xc5, + 0x50,0x60,0x30,0x30, 0x03,0x02,0x01,0x01, 0xa9,0xce,0x67,0x67, 0x7d,0x56,0x2b,0x2b, + 0x19,0xe7,0xfe,0xfe, 0x62,0xb5,0xd7,0xd7, 0xe6,0x4d,0xab,0xab, 0x9a,0xec,0x76,0x76, + 0x45,0x8f,0xca,0xca, 0x9d,0x1f,0x82,0x82, 0x40,0x89,0xc9,0xc9, 0x87,0xfa,0x7d,0x7d, + 0x15,0xef,0xfa,0xfa, 0xeb,0xb2,0x59,0x59, 0xc9,0x8e,0x47,0x47, 0x0b,0xfb,0xf0,0xf0, + 0xec,0x41,0xad,0xad, 0x67,0xb3,0xd4,0xd4, 0xfd,0x5f,0xa2,0xa2, 0xea,0x45,0xaf,0xaf, + 0xbf,0x23,0x9c,0x9c, 0xf7,0x53,0xa4,0xa4, 0x96,0xe4,0x72,0x72, 0x5b,0x9b,0xc0,0xc0, + 0xc2,0x75,0xb7,0xb7, 0x1c,0xe1,0xfd,0xfd, 0xae,0x3d,0x93,0x93, 0x6a,0x4c,0x26,0x26, + 0x5a,0x6c,0x36,0x36, 0x41,0x7e,0x3f,0x3f, 0x02,0xf5,0xf7,0xf7, 0x4f,0x83,0xcc,0xcc, + 0x5c,0x68,0x34,0x34, 0xf4,0x51,0xa5,0xa5, 0x34,0xd1,0xe5,0xe5, 0x08,0xf9,0xf1,0xf1, + 0x93,0xe2,0x71,0x71, 0x73,0xab,0xd8,0xd8, 0x53,0x62,0x31,0x31, 0x3f,0x2a,0x15,0x15, + 0x0c,0x08,0x04,0x04, 0x52,0x95,0xc7,0xc7, 0x65,0x46,0x23,0x23, 0x5e,0x9d,0xc3,0xc3, + 0x28,0x30,0x18,0x18, 0xa1,0x37,0x96,0x96, 0x0f,0x0a,0x05,0x05, 0xb5,0x2f,0x9a,0x9a, + 0x09,0x0e,0x07,0x07, 0x36,0x24,0x12,0x12, 0x9b,0x1b,0x80,0x80, 0x3d,0xdf,0xe2,0xe2, + 0x26,0xcd,0xeb,0xeb, 0x69,0x4e,0x27,0x27, 0xcd,0x7f,0xb2,0xb2, 0x9f,0xea,0x75,0x75, + 0x1b,0x12,0x09,0x09, 0x9e,0x1d,0x83,0x83, 0x74,0x58,0x2c,0x2c, 0x2e,0x34,0x1a,0x1a, + 0x2d,0x36,0x1b,0x1b, 0xb2,0xdc,0x6e,0x6e, 0xee,0xb4,0x5a,0x5a, 0xfb,0x5b,0xa0,0xa0, + 0xf6,0xa4,0x52,0x52, 0x4d,0x76,0x3b,0x3b, 0x61,0xb7,0xd6,0xd6, 0xce,0x7d,0xb3,0xb3, + 0x7b,0x52,0x29,0x29, 0x3e,0xdd,0xe3,0xe3, 0x71,0x5e,0x2f,0x2f, 0x97,0x13,0x84,0x84, + 0xf5,0xa6,0x53,0x53, 0x68,0xb9,0xd1,0xd1, 0x00,0x00,0x00,0x00, 0x2c,0xc1,0xed,0xed, + 0x60,0x40,0x20,0x20, 0x1f,0xe3,0xfc,0xfc, 0xc8,0x79,0xb1,0xb1, 0xed,0xb6,0x5b,0x5b, + 0xbe,0xd4,0x6a,0x6a, 0x46,0x8d,0xcb,0xcb, 0xd9,0x67,0xbe,0xbe, 0x4b,0x72,0x39,0x39, + 0xde,0x94,0x4a,0x4a, 0xd4,0x98,0x4c,0x4c, 0xe8,0xb0,0x58,0x58, 0x4a,0x85,0xcf,0xcf, + 0x6b,0xbb,0xd0,0xd0, 0x2a,0xc5,0xef,0xef, 0xe5,0x4f,0xaa,0xaa, 0x16,0xed,0xfb,0xfb, + 0xc5,0x86,0x43,0x43, 0xd7,0x9a,0x4d,0x4d, 0x55,0x66,0x33,0x33, 0x94,0x11,0x85,0x85, + 0xcf,0x8a,0x45,0x45, 0x10,0xe9,0xf9,0xf9, 0x06,0x04,0x02,0x02, 0x81,0xfe,0x7f,0x7f, + 0xf0,0xa0,0x50,0x50, 0x44,0x78,0x3c,0x3c, 0xba,0x25,0x9f,0x9f, 0xe3,0x4b,0xa8,0xa8, + 0xf3,0xa2,0x51,0x51, 0xfe,0x5d,0xa3,0xa3, 0xc0,0x80,0x40,0x40, 0x8a,0x05,0x8f,0x8f, + 0xad,0x3f,0x92,0x92, 0xbc,0x21,0x9d,0x9d, 0x48,0x70,0x38,0x38, 0x04,0xf1,0xf5,0xf5, + 0xdf,0x63,0xbc,0xbc, 0xc1,0x77,0xb6,0xb6, 0x75,0xaf,0xda,0xda, 0x63,0x42,0x21,0x21, + 0x30,0x20,0x10,0x10, 0x1a,0xe5,0xff,0xff, 0x0e,0xfd,0xf3,0xf3, 0x6d,0xbf,0xd2,0xd2, + 0x4c,0x81,0xcd,0xcd, 0x14,0x18,0x0c,0x0c, 0x35,0x26,0x13,0x13, 0x2f,0xc3,0xec,0xec, + 0xe1,0xbe,0x5f,0x5f, 0xa2,0x35,0x97,0x97, 0xcc,0x88,0x44,0x44, 0x39,0x2e,0x17,0x17, + 0x57,0x93,0xc4,0xc4, 0xf2,0x55,0xa7,0xa7, 0x82,0xfc,0x7e,0x7e, 0x47,0x7a,0x3d,0x3d, + 0xac,0xc8,0x64,0x64, 0xe7,0xba,0x5d,0x5d, 0x2b,0x32,0x19,0x19, 0x95,0xe6,0x73,0x73, + 0xa0,0xc0,0x60,0x60, 0x98,0x19,0x81,0x81, 0xd1,0x9e,0x4f,0x4f, 0x7f,0xa3,0xdc,0xdc, + 0x66,0x44,0x22,0x22, 0x7e,0x54,0x2a,0x2a, 0xab,0x3b,0x90,0x90, 0x83,0x0b,0x88,0x88, + 0xca,0x8c,0x46,0x46, 0x29,0xc7,0xee,0xee, 0xd3,0x6b,0xb8,0xb8, 0x3c,0x28,0x14,0x14, + 0x79,0xa7,0xde,0xde, 0xe2,0xbc,0x5e,0x5e, 0x1d,0x16,0x0b,0x0b, 0x76,0xad,0xdb,0xdb, + 0x3b,0xdb,0xe0,0xe0, 0x56,0x64,0x32,0x32, 0x4e,0x74,0x3a,0x3a, 0x1e,0x14,0x0a,0x0a, + 0xdb,0x92,0x49,0x49, 0x0a,0x0c,0x06,0x06, 0x6c,0x48,0x24,0x24, 0xe4,0xb8,0x5c,0x5c, + 0x5d,0x9f,0xc2,0xc2, 0x6e,0xbd,0xd3,0xd3, 0xef,0x43,0xac,0xac, 0xa6,0xc4,0x62,0x62, + 0xa8,0x39,0x91,0x91, 0xa4,0x31,0x95,0x95, 0x37,0xd3,0xe4,0xe4, 0x8b,0xf2,0x79,0x79, + 0x32,0xd5,0xe7,0xe7, 0x43,0x8b,0xc8,0xc8, 0x59,0x6e,0x37,0x37, 0xb7,0xda,0x6d,0x6d, + 0x8c,0x01,0x8d,0x8d, 0x64,0xb1,0xd5,0xd5, 0xd2,0x9c,0x4e,0x4e, 0xe0,0x49,0xa9,0xa9, + 0xb4,0xd8,0x6c,0x6c, 0xfa,0xac,0x56,0x56, 0x07,0xf3,0xf4,0xf4, 0x25,0xcf,0xea,0xea, + 0xaf,0xca,0x65,0x65, 0x8e,0xf4,0x7a,0x7a, 0xe9,0x47,0xae,0xae, 0x18,0x10,0x08,0x08, + 0xd5,0x6f,0xba,0xba, 0x88,0xf0,0x78,0x78, 0x6f,0x4a,0x25,0x25, 0x72,0x5c,0x2e,0x2e, + 0x24,0x38,0x1c,0x1c, 0xf1,0x57,0xa6,0xa6, 0xc7,0x73,0xb4,0xb4, 0x51,0x97,0xc6,0xc6, + 0x23,0xcb,0xe8,0xe8, 0x7c,0xa1,0xdd,0xdd, 0x9c,0xe8,0x74,0x74, 0x21,0x3e,0x1f,0x1f, + 0xdd,0x96,0x4b,0x4b, 0xdc,0x61,0xbd,0xbd, 0x86,0x0d,0x8b,0x8b, 0x85,0x0f,0x8a,0x8a, + 0x90,0xe0,0x70,0x70, 0x42,0x7c,0x3e,0x3e, 0xc4,0x71,0xb5,0xb5, 0xaa,0xcc,0x66,0x66, + 0xd8,0x90,0x48,0x48, 0x05,0x06,0x03,0x03, 0x01,0xf7,0xf6,0xf6, 0x12,0x1c,0x0e,0x0e, + 0xa3,0xc2,0x61,0x61, 0x5f,0x6a,0x35,0x35, 0xf9,0xae,0x57,0x57, 0xd0,0x69,0xb9,0xb9, + 0x91,0x17,0x86,0x86, 0x58,0x99,0xc1,0xc1, 0x27,0x3a,0x1d,0x1d, 0xb9,0x27,0x9e,0x9e, + 0x38,0xd9,0xe1,0xe1, 0x13,0xeb,0xf8,0xf8, 0xb3,0x2b,0x98,0x98, 0x33,0x22,0x11,0x11, + 0xbb,0xd2,0x69,0x69, 0x70,0xa9,0xd9,0xd9, 0x89,0x07,0x8e,0x8e, 0xa7,0x33,0x94,0x94, + 0xb6,0x2d,0x9b,0x9b, 0x22,0x3c,0x1e,0x1e, 0x92,0x15,0x87,0x87, 0x20,0xc9,0xe9,0xe9, + 0x49,0x87,0xce,0xce, 0xff,0xaa,0x55,0x55, 0x78,0x50,0x28,0x28, 0x7a,0xa5,0xdf,0xdf, + 0x8f,0x03,0x8c,0x8c, 0xf8,0x59,0xa1,0xa1, 0x80,0x09,0x89,0x89, 0x17,0x1a,0x0d,0x0d, + 0xda,0x65,0xbf,0xbf, 0x31,0xd7,0xe6,0xe6, 0xc6,0x84,0x42,0x42, 0xb8,0xd0,0x68,0x68, + 0xc3,0x82,0x41,0x41, 0xb0,0x29,0x99,0x99, 0x77,0x5a,0x2d,0x2d, 0x11,0x1e,0x0f,0x0f, + 0xcb,0x7b,0xb0,0xb0, 0xfc,0xa8,0x54,0x54, 0xd6,0x6d,0xbb,0xbb, 0x3a,0x2c,0x16,0x16 +}; + +static UINT8 T3[256][4]= +{ + 0x63,0xa5,0xc6,0x63, 0x7c,0x84,0xf8,0x7c, 0x77,0x99,0xee,0x77, 0x7b,0x8d,0xf6,0x7b, + 0xf2,0x0d,0xff,0xf2, 0x6b,0xbd,0xd6,0x6b, 0x6f,0xb1,0xde,0x6f, 0xc5,0x54,0x91,0xc5, + 0x30,0x50,0x60,0x30, 0x01,0x03,0x02,0x01, 0x67,0xa9,0xce,0x67, 0x2b,0x7d,0x56,0x2b, + 0xfe,0x19,0xe7,0xfe, 0xd7,0x62,0xb5,0xd7, 0xab,0xe6,0x4d,0xab, 0x76,0x9a,0xec,0x76, + 0xca,0x45,0x8f,0xca, 0x82,0x9d,0x1f,0x82, 0xc9,0x40,0x89,0xc9, 0x7d,0x87,0xfa,0x7d, + 0xfa,0x15,0xef,0xfa, 0x59,0xeb,0xb2,0x59, 0x47,0xc9,0x8e,0x47, 0xf0,0x0b,0xfb,0xf0, + 0xad,0xec,0x41,0xad, 0xd4,0x67,0xb3,0xd4, 0xa2,0xfd,0x5f,0xa2, 0xaf,0xea,0x45,0xaf, + 0x9c,0xbf,0x23,0x9c, 0xa4,0xf7,0x53,0xa4, 0x72,0x96,0xe4,0x72, 0xc0,0x5b,0x9b,0xc0, + 0xb7,0xc2,0x75,0xb7, 0xfd,0x1c,0xe1,0xfd, 0x93,0xae,0x3d,0x93, 0x26,0x6a,0x4c,0x26, + 0x36,0x5a,0x6c,0x36, 0x3f,0x41,0x7e,0x3f, 0xf7,0x02,0xf5,0xf7, 0xcc,0x4f,0x83,0xcc, + 0x34,0x5c,0x68,0x34, 0xa5,0xf4,0x51,0xa5, 0xe5,0x34,0xd1,0xe5, 0xf1,0x08,0xf9,0xf1, + 0x71,0x93,0xe2,0x71, 0xd8,0x73,0xab,0xd8, 0x31,0x53,0x62,0x31, 0x15,0x3f,0x2a,0x15, + 0x04,0x0c,0x08,0x04, 0xc7,0x52,0x95,0xc7, 0x23,0x65,0x46,0x23, 0xc3,0x5e,0x9d,0xc3, + 0x18,0x28,0x30,0x18, 0x96,0xa1,0x37,0x96, 0x05,0x0f,0x0a,0x05, 0x9a,0xb5,0x2f,0x9a, + 0x07,0x09,0x0e,0x07, 0x12,0x36,0x24,0x12, 0x80,0x9b,0x1b,0x80, 0xe2,0x3d,0xdf,0xe2, + 0xeb,0x26,0xcd,0xeb, 0x27,0x69,0x4e,0x27, 0xb2,0xcd,0x7f,0xb2, 0x75,0x9f,0xea,0x75, + 0x09,0x1b,0x12,0x09, 0x83,0x9e,0x1d,0x83, 0x2c,0x74,0x58,0x2c, 0x1a,0x2e,0x34,0x1a, + 0x1b,0x2d,0x36,0x1b, 0x6e,0xb2,0xdc,0x6e, 0x5a,0xee,0xb4,0x5a, 0xa0,0xfb,0x5b,0xa0, + 0x52,0xf6,0xa4,0x52, 0x3b,0x4d,0x76,0x3b, 0xd6,0x61,0xb7,0xd6, 0xb3,0xce,0x7d,0xb3, + 0x29,0x7b,0x52,0x29, 0xe3,0x3e,0xdd,0xe3, 0x2f,0x71,0x5e,0x2f, 0x84,0x97,0x13,0x84, + 0x53,0xf5,0xa6,0x53, 0xd1,0x68,0xb9,0xd1, 0x00,0x00,0x00,0x00, 0xed,0x2c,0xc1,0xed, + 0x20,0x60,0x40,0x20, 0xfc,0x1f,0xe3,0xfc, 0xb1,0xc8,0x79,0xb1, 0x5b,0xed,0xb6,0x5b, + 0x6a,0xbe,0xd4,0x6a, 0xcb,0x46,0x8d,0xcb, 0xbe,0xd9,0x67,0xbe, 0x39,0x4b,0x72,0x39, + 0x4a,0xde,0x94,0x4a, 0x4c,0xd4,0x98,0x4c, 0x58,0xe8,0xb0,0x58, 0xcf,0x4a,0x85,0xcf, + 0xd0,0x6b,0xbb,0xd0, 0xef,0x2a,0xc5,0xef, 0xaa,0xe5,0x4f,0xaa, 0xfb,0x16,0xed,0xfb, + 0x43,0xc5,0x86,0x43, 0x4d,0xd7,0x9a,0x4d, 0x33,0x55,0x66,0x33, 0x85,0x94,0x11,0x85, + 0x45,0xcf,0x8a,0x45, 0xf9,0x10,0xe9,0xf9, 0x02,0x06,0x04,0x02, 0x7f,0x81,0xfe,0x7f, + 0x50,0xf0,0xa0,0x50, 0x3c,0x44,0x78,0x3c, 0x9f,0xba,0x25,0x9f, 0xa8,0xe3,0x4b,0xa8, + 0x51,0xf3,0xa2,0x51, 0xa3,0xfe,0x5d,0xa3, 0x40,0xc0,0x80,0x40, 0x8f,0x8a,0x05,0x8f, + 0x92,0xad,0x3f,0x92, 0x9d,0xbc,0x21,0x9d, 0x38,0x48,0x70,0x38, 0xf5,0x04,0xf1,0xf5, + 0xbc,0xdf,0x63,0xbc, 0xb6,0xc1,0x77,0xb6, 0xda,0x75,0xaf,0xda, 0x21,0x63,0x42,0x21, + 0x10,0x30,0x20,0x10, 0xff,0x1a,0xe5,0xff, 0xf3,0x0e,0xfd,0xf3, 0xd2,0x6d,0xbf,0xd2, + 0xcd,0x4c,0x81,0xcd, 0x0c,0x14,0x18,0x0c, 0x13,0x35,0x26,0x13, 0xec,0x2f,0xc3,0xec, + 0x5f,0xe1,0xbe,0x5f, 0x97,0xa2,0x35,0x97, 0x44,0xcc,0x88,0x44, 0x17,0x39,0x2e,0x17, + 0xc4,0x57,0x93,0xc4, 0xa7,0xf2,0x55,0xa7, 0x7e,0x82,0xfc,0x7e, 0x3d,0x47,0x7a,0x3d, + 0x64,0xac,0xc8,0x64, 0x5d,0xe7,0xba,0x5d, 0x19,0x2b,0x32,0x19, 0x73,0x95,0xe6,0x73, + 0x60,0xa0,0xc0,0x60, 0x81,0x98,0x19,0x81, 0x4f,0xd1,0x9e,0x4f, 0xdc,0x7f,0xa3,0xdc, + 0x22,0x66,0x44,0x22, 0x2a,0x7e,0x54,0x2a, 0x90,0xab,0x3b,0x90, 0x88,0x83,0x0b,0x88, + 0x46,0xca,0x8c,0x46, 0xee,0x29,0xc7,0xee, 0xb8,0xd3,0x6b,0xb8, 0x14,0x3c,0x28,0x14, + 0xde,0x79,0xa7,0xde, 0x5e,0xe2,0xbc,0x5e, 0x0b,0x1d,0x16,0x0b, 0xdb,0x76,0xad,0xdb, + 0xe0,0x3b,0xdb,0xe0, 0x32,0x56,0x64,0x32, 0x3a,0x4e,0x74,0x3a, 0x0a,0x1e,0x14,0x0a, + 0x49,0xdb,0x92,0x49, 0x06,0x0a,0x0c,0x06, 0x24,0x6c,0x48,0x24, 0x5c,0xe4,0xb8,0x5c, + 0xc2,0x5d,0x9f,0xc2, 0xd3,0x6e,0xbd,0xd3, 0xac,0xef,0x43,0xac, 0x62,0xa6,0xc4,0x62, + 0x91,0xa8,0x39,0x91, 0x95,0xa4,0x31,0x95, 0xe4,0x37,0xd3,0xe4, 0x79,0x8b,0xf2,0x79, + 0xe7,0x32,0xd5,0xe7, 0xc8,0x43,0x8b,0xc8, 0x37,0x59,0x6e,0x37, 0x6d,0xb7,0xda,0x6d, + 0x8d,0x8c,0x01,0x8d, 0xd5,0x64,0xb1,0xd5, 0x4e,0xd2,0x9c,0x4e, 0xa9,0xe0,0x49,0xa9, + 0x6c,0xb4,0xd8,0x6c, 0x56,0xfa,0xac,0x56, 0xf4,0x07,0xf3,0xf4, 0xea,0x25,0xcf,0xea, + 0x65,0xaf,0xca,0x65, 0x7a,0x8e,0xf4,0x7a, 0xae,0xe9,0x47,0xae, 0x08,0x18,0x10,0x08, + 0xba,0xd5,0x6f,0xba, 0x78,0x88,0xf0,0x78, 0x25,0x6f,0x4a,0x25, 0x2e,0x72,0x5c,0x2e, + 0x1c,0x24,0x38,0x1c, 0xa6,0xf1,0x57,0xa6, 0xb4,0xc7,0x73,0xb4, 0xc6,0x51,0x97,0xc6, + 0xe8,0x23,0xcb,0xe8, 0xdd,0x7c,0xa1,0xdd, 0x74,0x9c,0xe8,0x74, 0x1f,0x21,0x3e,0x1f, + 0x4b,0xdd,0x96,0x4b, 0xbd,0xdc,0x61,0xbd, 0x8b,0x86,0x0d,0x8b, 0x8a,0x85,0x0f,0x8a, + 0x70,0x90,0xe0,0x70, 0x3e,0x42,0x7c,0x3e, 0xb5,0xc4,0x71,0xb5, 0x66,0xaa,0xcc,0x66, + 0x48,0xd8,0x90,0x48, 0x03,0x05,0x06,0x03, 0xf6,0x01,0xf7,0xf6, 0x0e,0x12,0x1c,0x0e, + 0x61,0xa3,0xc2,0x61, 0x35,0x5f,0x6a,0x35, 0x57,0xf9,0xae,0x57, 0xb9,0xd0,0x69,0xb9, + 0x86,0x91,0x17,0x86, 0xc1,0x58,0x99,0xc1, 0x1d,0x27,0x3a,0x1d, 0x9e,0xb9,0x27,0x9e, + 0xe1,0x38,0xd9,0xe1, 0xf8,0x13,0xeb,0xf8, 0x98,0xb3,0x2b,0x98, 0x11,0x33,0x22,0x11, + 0x69,0xbb,0xd2,0x69, 0xd9,0x70,0xa9,0xd9, 0x8e,0x89,0x07,0x8e, 0x94,0xa7,0x33,0x94, + 0x9b,0xb6,0x2d,0x9b, 0x1e,0x22,0x3c,0x1e, 0x87,0x92,0x15,0x87, 0xe9,0x20,0xc9,0xe9, + 0xce,0x49,0x87,0xce, 0x55,0xff,0xaa,0x55, 0x28,0x78,0x50,0x28, 0xdf,0x7a,0xa5,0xdf, + 0x8c,0x8f,0x03,0x8c, 0xa1,0xf8,0x59,0xa1, 0x89,0x80,0x09,0x89, 0x0d,0x17,0x1a,0x0d, + 0xbf,0xda,0x65,0xbf, 0xe6,0x31,0xd7,0xe6, 0x42,0xc6,0x84,0x42, 0x68,0xb8,0xd0,0x68, + 0x41,0xc3,0x82,0x41, 0x99,0xb0,0x29,0x99, 0x2d,0x77,0x5a,0x2d, 0x0f,0x11,0x1e,0x0f, + 0xb0,0xcb,0x7b,0xb0, 0x54,0xfc,0xa8,0x54, 0xbb,0xd6,0x6d,0xbb, 0x16,0x3a,0x2c,0x16 +}; + +static UINT8 T4[256][4]= +{ + 0x63,0x63,0xa5,0xc6, 0x7c,0x7c,0x84,0xf8, 0x77,0x77,0x99,0xee, 0x7b,0x7b,0x8d,0xf6, + 0xf2,0xf2,0x0d,0xff, 0x6b,0x6b,0xbd,0xd6, 0x6f,0x6f,0xb1,0xde, 0xc5,0xc5,0x54,0x91, + 0x30,0x30,0x50,0x60, 0x01,0x01,0x03,0x02, 0x67,0x67,0xa9,0xce, 0x2b,0x2b,0x7d,0x56, + 0xfe,0xfe,0x19,0xe7, 0xd7,0xd7,0x62,0xb5, 0xab,0xab,0xe6,0x4d, 0x76,0x76,0x9a,0xec, + 0xca,0xca,0x45,0x8f, 0x82,0x82,0x9d,0x1f, 0xc9,0xc9,0x40,0x89, 0x7d,0x7d,0x87,0xfa, + 0xfa,0xfa,0x15,0xef, 0x59,0x59,0xeb,0xb2, 0x47,0x47,0xc9,0x8e, 0xf0,0xf0,0x0b,0xfb, + 0xad,0xad,0xec,0x41, 0xd4,0xd4,0x67,0xb3, 0xa2,0xa2,0xfd,0x5f, 0xaf,0xaf,0xea,0x45, + 0x9c,0x9c,0xbf,0x23, 0xa4,0xa4,0xf7,0x53, 0x72,0x72,0x96,0xe4, 0xc0,0xc0,0x5b,0x9b, + 0xb7,0xb7,0xc2,0x75, 0xfd,0xfd,0x1c,0xe1, 0x93,0x93,0xae,0x3d, 0x26,0x26,0x6a,0x4c, + 0x36,0x36,0x5a,0x6c, 0x3f,0x3f,0x41,0x7e, 0xf7,0xf7,0x02,0xf5, 0xcc,0xcc,0x4f,0x83, + 0x34,0x34,0x5c,0x68, 0xa5,0xa5,0xf4,0x51, 0xe5,0xe5,0x34,0xd1, 0xf1,0xf1,0x08,0xf9, + 0x71,0x71,0x93,0xe2, 0xd8,0xd8,0x73,0xab, 0x31,0x31,0x53,0x62, 0x15,0x15,0x3f,0x2a, + 0x04,0x04,0x0c,0x08, 0xc7,0xc7,0x52,0x95, 0x23,0x23,0x65,0x46, 0xc3,0xc3,0x5e,0x9d, + 0x18,0x18,0x28,0x30, 0x96,0x96,0xa1,0x37, 0x05,0x05,0x0f,0x0a, 0x9a,0x9a,0xb5,0x2f, + 0x07,0x07,0x09,0x0e, 0x12,0x12,0x36,0x24, 0x80,0x80,0x9b,0x1b, 0xe2,0xe2,0x3d,0xdf, + 0xeb,0xeb,0x26,0xcd, 0x27,0x27,0x69,0x4e, 0xb2,0xb2,0xcd,0x7f, 0x75,0x75,0x9f,0xea, + 0x09,0x09,0x1b,0x12, 0x83,0x83,0x9e,0x1d, 0x2c,0x2c,0x74,0x58, 0x1a,0x1a,0x2e,0x34, + 0x1b,0x1b,0x2d,0x36, 0x6e,0x6e,0xb2,0xdc, 0x5a,0x5a,0xee,0xb4, 0xa0,0xa0,0xfb,0x5b, + 0x52,0x52,0xf6,0xa4, 0x3b,0x3b,0x4d,0x76, 0xd6,0xd6,0x61,0xb7, 0xb3,0xb3,0xce,0x7d, + 0x29,0x29,0x7b,0x52, 0xe3,0xe3,0x3e,0xdd, 0x2f,0x2f,0x71,0x5e, 0x84,0x84,0x97,0x13, + 0x53,0x53,0xf5,0xa6, 0xd1,0xd1,0x68,0xb9, 0x00,0x00,0x00,0x00, 0xed,0xed,0x2c,0xc1, + 0x20,0x20,0x60,0x40, 0xfc,0xfc,0x1f,0xe3, 0xb1,0xb1,0xc8,0x79, 0x5b,0x5b,0xed,0xb6, + 0x6a,0x6a,0xbe,0xd4, 0xcb,0xcb,0x46,0x8d, 0xbe,0xbe,0xd9,0x67, 0x39,0x39,0x4b,0x72, + 0x4a,0x4a,0xde,0x94, 0x4c,0x4c,0xd4,0x98, 0x58,0x58,0xe8,0xb0, 0xcf,0xcf,0x4a,0x85, + 0xd0,0xd0,0x6b,0xbb, 0xef,0xef,0x2a,0xc5, 0xaa,0xaa,0xe5,0x4f, 0xfb,0xfb,0x16,0xed, + 0x43,0x43,0xc5,0x86, 0x4d,0x4d,0xd7,0x9a, 0x33,0x33,0x55,0x66, 0x85,0x85,0x94,0x11, + 0x45,0x45,0xcf,0x8a, 0xf9,0xf9,0x10,0xe9, 0x02,0x02,0x06,0x04, 0x7f,0x7f,0x81,0xfe, + 0x50,0x50,0xf0,0xa0, 0x3c,0x3c,0x44,0x78, 0x9f,0x9f,0xba,0x25, 0xa8,0xa8,0xe3,0x4b, + 0x51,0x51,0xf3,0xa2, 0xa3,0xa3,0xfe,0x5d, 0x40,0x40,0xc0,0x80, 0x8f,0x8f,0x8a,0x05, + 0x92,0x92,0xad,0x3f, 0x9d,0x9d,0xbc,0x21, 0x38,0x38,0x48,0x70, 0xf5,0xf5,0x04,0xf1, + 0xbc,0xbc,0xdf,0x63, 0xb6,0xb6,0xc1,0x77, 0xda,0xda,0x75,0xaf, 0x21,0x21,0x63,0x42, + 0x10,0x10,0x30,0x20, 0xff,0xff,0x1a,0xe5, 0xf3,0xf3,0x0e,0xfd, 0xd2,0xd2,0x6d,0xbf, + 0xcd,0xcd,0x4c,0x81, 0x0c,0x0c,0x14,0x18, 0x13,0x13,0x35,0x26, 0xec,0xec,0x2f,0xc3, + 0x5f,0x5f,0xe1,0xbe, 0x97,0x97,0xa2,0x35, 0x44,0x44,0xcc,0x88, 0x17,0x17,0x39,0x2e, + 0xc4,0xc4,0x57,0x93, 0xa7,0xa7,0xf2,0x55, 0x7e,0x7e,0x82,0xfc, 0x3d,0x3d,0x47,0x7a, + 0x64,0x64,0xac,0xc8, 0x5d,0x5d,0xe7,0xba, 0x19,0x19,0x2b,0x32, 0x73,0x73,0x95,0xe6, + 0x60,0x60,0xa0,0xc0, 0x81,0x81,0x98,0x19, 0x4f,0x4f,0xd1,0x9e, 0xdc,0xdc,0x7f,0xa3, + 0x22,0x22,0x66,0x44, 0x2a,0x2a,0x7e,0x54, 0x90,0x90,0xab,0x3b, 0x88,0x88,0x83,0x0b, + 0x46,0x46,0xca,0x8c, 0xee,0xee,0x29,0xc7, 0xb8,0xb8,0xd3,0x6b, 0x14,0x14,0x3c,0x28, + 0xde,0xde,0x79,0xa7, 0x5e,0x5e,0xe2,0xbc, 0x0b,0x0b,0x1d,0x16, 0xdb,0xdb,0x76,0xad, + 0xe0,0xe0,0x3b,0xdb, 0x32,0x32,0x56,0x64, 0x3a,0x3a,0x4e,0x74, 0x0a,0x0a,0x1e,0x14, + 0x49,0x49,0xdb,0x92, 0x06,0x06,0x0a,0x0c, 0x24,0x24,0x6c,0x48, 0x5c,0x5c,0xe4,0xb8, + 0xc2,0xc2,0x5d,0x9f, 0xd3,0xd3,0x6e,0xbd, 0xac,0xac,0xef,0x43, 0x62,0x62,0xa6,0xc4, + 0x91,0x91,0xa8,0x39, 0x95,0x95,0xa4,0x31, 0xe4,0xe4,0x37,0xd3, 0x79,0x79,0x8b,0xf2, + 0xe7,0xe7,0x32,0xd5, 0xc8,0xc8,0x43,0x8b, 0x37,0x37,0x59,0x6e, 0x6d,0x6d,0xb7,0xda, + 0x8d,0x8d,0x8c,0x01, 0xd5,0xd5,0x64,0xb1, 0x4e,0x4e,0xd2,0x9c, 0xa9,0xa9,0xe0,0x49, + 0x6c,0x6c,0xb4,0xd8, 0x56,0x56,0xfa,0xac, 0xf4,0xf4,0x07,0xf3, 0xea,0xea,0x25,0xcf, + 0x65,0x65,0xaf,0xca, 0x7a,0x7a,0x8e,0xf4, 0xae,0xae,0xe9,0x47, 0x08,0x08,0x18,0x10, + 0xba,0xba,0xd5,0x6f, 0x78,0x78,0x88,0xf0, 0x25,0x25,0x6f,0x4a, 0x2e,0x2e,0x72,0x5c, + 0x1c,0x1c,0x24,0x38, 0xa6,0xa6,0xf1,0x57, 0xb4,0xb4,0xc7,0x73, 0xc6,0xc6,0x51,0x97, + 0xe8,0xe8,0x23,0xcb, 0xdd,0xdd,0x7c,0xa1, 0x74,0x74,0x9c,0xe8, 0x1f,0x1f,0x21,0x3e, + 0x4b,0x4b,0xdd,0x96, 0xbd,0xbd,0xdc,0x61, 0x8b,0x8b,0x86,0x0d, 0x8a,0x8a,0x85,0x0f, + 0x70,0x70,0x90,0xe0, 0x3e,0x3e,0x42,0x7c, 0xb5,0xb5,0xc4,0x71, 0x66,0x66,0xaa,0xcc, + 0x48,0x48,0xd8,0x90, 0x03,0x03,0x05,0x06, 0xf6,0xf6,0x01,0xf7, 0x0e,0x0e,0x12,0x1c, + 0x61,0x61,0xa3,0xc2, 0x35,0x35,0x5f,0x6a, 0x57,0x57,0xf9,0xae, 0xb9,0xb9,0xd0,0x69, + 0x86,0x86,0x91,0x17, 0xc1,0xc1,0x58,0x99, 0x1d,0x1d,0x27,0x3a, 0x9e,0x9e,0xb9,0x27, + 0xe1,0xe1,0x38,0xd9, 0xf8,0xf8,0x13,0xeb, 0x98,0x98,0xb3,0x2b, 0x11,0x11,0x33,0x22, + 0x69,0x69,0xbb,0xd2, 0xd9,0xd9,0x70,0xa9, 0x8e,0x8e,0x89,0x07, 0x94,0x94,0xa7,0x33, + 0x9b,0x9b,0xb6,0x2d, 0x1e,0x1e,0x22,0x3c, 0x87,0x87,0x92,0x15, 0xe9,0xe9,0x20,0xc9, + 0xce,0xce,0x49,0x87, 0x55,0x55,0xff,0xaa, 0x28,0x28,0x78,0x50, 0xdf,0xdf,0x7a,0xa5, + 0x8c,0x8c,0x8f,0x03, 0xa1,0xa1,0xf8,0x59, 0x89,0x89,0x80,0x09, 0x0d,0x0d,0x17,0x1a, + 0xbf,0xbf,0xda,0x65, 0xe6,0xe6,0x31,0xd7, 0x42,0x42,0xc6,0x84, 0x68,0x68,0xb8,0xd0, + 0x41,0x41,0xc3,0x82, 0x99,0x99,0xb0,0x29, 0x2d,0x2d,0x77,0x5a, 0x0f,0x0f,0x11,0x1e, + 0xb0,0xb0,0xcb,0x7b, 0x54,0x54,0xfc,0xa8, 0xbb,0xbb,0xd6,0x6d, 0x16,0x16,0x3a,0x2c +}; + +static UINT8 T5[256][4]= +{ + 0x51,0xf4,0xa7,0x50, 0x7e,0x41,0x65,0x53, 0x1a,0x17,0xa4,0xc3, 0x3a,0x27,0x5e,0x96, + 0x3b,0xab,0x6b,0xcb, 0x1f,0x9d,0x45,0xf1, 0xac,0xfa,0x58,0xab, 0x4b,0xe3,0x03,0x93, + 0x20,0x30,0xfa,0x55, 0xad,0x76,0x6d,0xf6, 0x88,0xcc,0x76,0x91, 0xf5,0x02,0x4c,0x25, + 0x4f,0xe5,0xd7,0xfc, 0xc5,0x2a,0xcb,0xd7, 0x26,0x35,0x44,0x80, 0xb5,0x62,0xa3,0x8f, + 0xde,0xb1,0x5a,0x49, 0x25,0xba,0x1b,0x67, 0x45,0xea,0x0e,0x98, 0x5d,0xfe,0xc0,0xe1, + 0xc3,0x2f,0x75,0x02, 0x81,0x4c,0xf0,0x12, 0x8d,0x46,0x97,0xa3, 0x6b,0xd3,0xf9,0xc6, + 0x03,0x8f,0x5f,0xe7, 0x15,0x92,0x9c,0x95, 0xbf,0x6d,0x7a,0xeb, 0x95,0x52,0x59,0xda, + 0xd4,0xbe,0x83,0x2d, 0x58,0x74,0x21,0xd3, 0x49,0xe0,0x69,0x29, 0x8e,0xc9,0xc8,0x44, + 0x75,0xc2,0x89,0x6a, 0xf4,0x8e,0x79,0x78, 0x99,0x58,0x3e,0x6b, 0x27,0xb9,0x71,0xdd, + 0xbe,0xe1,0x4f,0xb6, 0xf0,0x88,0xad,0x17, 0xc9,0x20,0xac,0x66, 0x7d,0xce,0x3a,0xb4, + 0x63,0xdf,0x4a,0x18, 0xe5,0x1a,0x31,0x82, 0x97,0x51,0x33,0x60, 0x62,0x53,0x7f,0x45, + 0xb1,0x64,0x77,0xe0, 0xbb,0x6b,0xae,0x84, 0xfe,0x81,0xa0,0x1c, 0xf9,0x08,0x2b,0x94, + 0x70,0x48,0x68,0x58, 0x8f,0x45,0xfd,0x19, 0x94,0xde,0x6c,0x87, 0x52,0x7b,0xf8,0xb7, + 0xab,0x73,0xd3,0x23, 0x72,0x4b,0x02,0xe2, 0xe3,0x1f,0x8f,0x57, 0x66,0x55,0xab,0x2a, + 0xb2,0xeb,0x28,0x07, 0x2f,0xb5,0xc2,0x03, 0x86,0xc5,0x7b,0x9a, 0xd3,0x37,0x08,0xa5, + 0x30,0x28,0x87,0xf2, 0x23,0xbf,0xa5,0xb2, 0x02,0x03,0x6a,0xba, 0xed,0x16,0x82,0x5c, + 0x8a,0xcf,0x1c,0x2b, 0xa7,0x79,0xb4,0x92, 0xf3,0x07,0xf2,0xf0, 0x4e,0x69,0xe2,0xa1, + 0x65,0xda,0xf4,0xcd, 0x06,0x05,0xbe,0xd5, 0xd1,0x34,0x62,0x1f, 0xc4,0xa6,0xfe,0x8a, + 0x34,0x2e,0x53,0x9d, 0xa2,0xf3,0x55,0xa0, 0x05,0x8a,0xe1,0x32, 0xa4,0xf6,0xeb,0x75, + 0x0b,0x83,0xec,0x39, 0x40,0x60,0xef,0xaa, 0x5e,0x71,0x9f,0x06, 0xbd,0x6e,0x10,0x51, + 0x3e,0x21,0x8a,0xf9, 0x96,0xdd,0x06,0x3d, 0xdd,0x3e,0x05,0xae, 0x4d,0xe6,0xbd,0x46, + 0x91,0x54,0x8d,0xb5, 0x71,0xc4,0x5d,0x05, 0x04,0x06,0xd4,0x6f, 0x60,0x50,0x15,0xff, + 0x19,0x98,0xfb,0x24, 0xd6,0xbd,0xe9,0x97, 0x89,0x40,0x43,0xcc, 0x67,0xd9,0x9e,0x77, + 0xb0,0xe8,0x42,0xbd, 0x07,0x89,0x8b,0x88, 0xe7,0x19,0x5b,0x38, 0x79,0xc8,0xee,0xdb, + 0xa1,0x7c,0x0a,0x47, 0x7c,0x42,0x0f,0xe9, 0xf8,0x84,0x1e,0xc9, 0x00,0x00,0x00,0x00, + 0x09,0x80,0x86,0x83, 0x32,0x2b,0xed,0x48, 0x1e,0x11,0x70,0xac, 0x6c,0x5a,0x72,0x4e, + 0xfd,0x0e,0xff,0xfb, 0x0f,0x85,0x38,0x56, 0x3d,0xae,0xd5,0x1e, 0x36,0x2d,0x39,0x27, + 0x0a,0x0f,0xd9,0x64, 0x68,0x5c,0xa6,0x21, 0x9b,0x5b,0x54,0xd1, 0x24,0x36,0x2e,0x3a, + 0x0c,0x0a,0x67,0xb1, 0x93,0x57,0xe7,0x0f, 0xb4,0xee,0x96,0xd2, 0x1b,0x9b,0x91,0x9e, + 0x80,0xc0,0xc5,0x4f, 0x61,0xdc,0x20,0xa2, 0x5a,0x77,0x4b,0x69, 0x1c,0x12,0x1a,0x16, + 0xe2,0x93,0xba,0x0a, 0xc0,0xa0,0x2a,0xe5, 0x3c,0x22,0xe0,0x43, 0x12,0x1b,0x17,0x1d, + 0x0e,0x09,0x0d,0x0b, 0xf2,0x8b,0xc7,0xad, 0x2d,0xb6,0xa8,0xb9, 0x14,0x1e,0xa9,0xc8, + 0x57,0xf1,0x19,0x85, 0xaf,0x75,0x07,0x4c, 0xee,0x99,0xdd,0xbb, 0xa3,0x7f,0x60,0xfd, + 0xf7,0x01,0x26,0x9f, 0x5c,0x72,0xf5,0xbc, 0x44,0x66,0x3b,0xc5, 0x5b,0xfb,0x7e,0x34, + 0x8b,0x43,0x29,0x76, 0xcb,0x23,0xc6,0xdc, 0xb6,0xed,0xfc,0x68, 0xb8,0xe4,0xf1,0x63, + 0xd7,0x31,0xdc,0xca, 0x42,0x63,0x85,0x10, 0x13,0x97,0x22,0x40, 0x84,0xc6,0x11,0x20, + 0x85,0x4a,0x24,0x7d, 0xd2,0xbb,0x3d,0xf8, 0xae,0xf9,0x32,0x11, 0xc7,0x29,0xa1,0x6d, + 0x1d,0x9e,0x2f,0x4b, 0xdc,0xb2,0x30,0xf3, 0x0d,0x86,0x52,0xec, 0x77,0xc1,0xe3,0xd0, + 0x2b,0xb3,0x16,0x6c, 0xa9,0x70,0xb9,0x99, 0x11,0x94,0x48,0xfa, 0x47,0xe9,0x64,0x22, + 0xa8,0xfc,0x8c,0xc4, 0xa0,0xf0,0x3f,0x1a, 0x56,0x7d,0x2c,0xd8, 0x22,0x33,0x90,0xef, + 0x87,0x49,0x4e,0xc7, 0xd9,0x38,0xd1,0xc1, 0x8c,0xca,0xa2,0xfe, 0x98,0xd4,0x0b,0x36, + 0xa6,0xf5,0x81,0xcf, 0xa5,0x7a,0xde,0x28, 0xda,0xb7,0x8e,0x26, 0x3f,0xad,0xbf,0xa4, + 0x2c,0x3a,0x9d,0xe4, 0x50,0x78,0x92,0x0d, 0x6a,0x5f,0xcc,0x9b, 0x54,0x7e,0x46,0x62, + 0xf6,0x8d,0x13,0xc2, 0x90,0xd8,0xb8,0xe8, 0x2e,0x39,0xf7,0x5e, 0x82,0xc3,0xaf,0xf5, + 0x9f,0x5d,0x80,0xbe, 0x69,0xd0,0x93,0x7c, 0x6f,0xd5,0x2d,0xa9, 0xcf,0x25,0x12,0xb3, + 0xc8,0xac,0x99,0x3b, 0x10,0x18,0x7d,0xa7, 0xe8,0x9c,0x63,0x6e, 0xdb,0x3b,0xbb,0x7b, + 0xcd,0x26,0x78,0x09, 0x6e,0x59,0x18,0xf4, 0xec,0x9a,0xb7,0x01, 0x83,0x4f,0x9a,0xa8, + 0xe6,0x95,0x6e,0x65, 0xaa,0xff,0xe6,0x7e, 0x21,0xbc,0xcf,0x08, 0xef,0x15,0xe8,0xe6, + 0xba,0xe7,0x9b,0xd9, 0x4a,0x6f,0x36,0xce, 0xea,0x9f,0x09,0xd4, 0x29,0xb0,0x7c,0xd6, + 0x31,0xa4,0xb2,0xaf, 0x2a,0x3f,0x23,0x31, 0xc6,0xa5,0x94,0x30, 0x35,0xa2,0x66,0xc0, + 0x74,0x4e,0xbc,0x37, 0xfc,0x82,0xca,0xa6, 0xe0,0x90,0xd0,0xb0, 0x33,0xa7,0xd8,0x15, + 0xf1,0x04,0x98,0x4a, 0x41,0xec,0xda,0xf7, 0x7f,0xcd,0x50,0x0e, 0x17,0x91,0xf6,0x2f, + 0x76,0x4d,0xd6,0x8d, 0x43,0xef,0xb0,0x4d, 0xcc,0xaa,0x4d,0x54, 0xe4,0x96,0x04,0xdf, + 0x9e,0xd1,0xb5,0xe3, 0x4c,0x6a,0x88,0x1b, 0xc1,0x2c,0x1f,0xb8, 0x46,0x65,0x51,0x7f, + 0x9d,0x5e,0xea,0x04, 0x01,0x8c,0x35,0x5d, 0xfa,0x87,0x74,0x73, 0xfb,0x0b,0x41,0x2e, + 0xb3,0x67,0x1d,0x5a, 0x92,0xdb,0xd2,0x52, 0xe9,0x10,0x56,0x33, 0x6d,0xd6,0x47,0x13, + 0x9a,0xd7,0x61,0x8c, 0x37,0xa1,0x0c,0x7a, 0x59,0xf8,0x14,0x8e, 0xeb,0x13,0x3c,0x89, + 0xce,0xa9,0x27,0xee, 0xb7,0x61,0xc9,0x35, 0xe1,0x1c,0xe5,0xed, 0x7a,0x47,0xb1,0x3c, + 0x9c,0xd2,0xdf,0x59, 0x55,0xf2,0x73,0x3f, 0x18,0x14,0xce,0x79, 0x73,0xc7,0x37,0xbf, + 0x53,0xf7,0xcd,0xea, 0x5f,0xfd,0xaa,0x5b, 0xdf,0x3d,0x6f,0x14, 0x78,0x44,0xdb,0x86, + 0xca,0xaf,0xf3,0x81, 0xb9,0x68,0xc4,0x3e, 0x38,0x24,0x34,0x2c, 0xc2,0xa3,0x40,0x5f, + 0x16,0x1d,0xc3,0x72, 0xbc,0xe2,0x25,0x0c, 0x28,0x3c,0x49,0x8b, 0xff,0x0d,0x95,0x41, + 0x39,0xa8,0x01,0x71, 0x08,0x0c,0xb3,0xde, 0xd8,0xb4,0xe4,0x9c, 0x64,0x56,0xc1,0x90, + 0x7b,0xcb,0x84,0x61, 0xd5,0x32,0xb6,0x70, 0x48,0x6c,0x5c,0x74, 0xd0,0xb8,0x57,0x42 +}; + +static UINT8 T6[256][4]= +{ + 0x50,0x51,0xf4,0xa7, 0x53,0x7e,0x41,0x65, 0xc3,0x1a,0x17,0xa4, 0x96,0x3a,0x27,0x5e, + 0xcb,0x3b,0xab,0x6b, 0xf1,0x1f,0x9d,0x45, 0xab,0xac,0xfa,0x58, 0x93,0x4b,0xe3,0x03, + 0x55,0x20,0x30,0xfa, 0xf6,0xad,0x76,0x6d, 0x91,0x88,0xcc,0x76, 0x25,0xf5,0x02,0x4c, + 0xfc,0x4f,0xe5,0xd7, 0xd7,0xc5,0x2a,0xcb, 0x80,0x26,0x35,0x44, 0x8f,0xb5,0x62,0xa3, + 0x49,0xde,0xb1,0x5a, 0x67,0x25,0xba,0x1b, 0x98,0x45,0xea,0x0e, 0xe1,0x5d,0xfe,0xc0, + 0x02,0xc3,0x2f,0x75, 0x12,0x81,0x4c,0xf0, 0xa3,0x8d,0x46,0x97, 0xc6,0x6b,0xd3,0xf9, + 0xe7,0x03,0x8f,0x5f, 0x95,0x15,0x92,0x9c, 0xeb,0xbf,0x6d,0x7a, 0xda,0x95,0x52,0x59, + 0x2d,0xd4,0xbe,0x83, 0xd3,0x58,0x74,0x21, 0x29,0x49,0xe0,0x69, 0x44,0x8e,0xc9,0xc8, + 0x6a,0x75,0xc2,0x89, 0x78,0xf4,0x8e,0x79, 0x6b,0x99,0x58,0x3e, 0xdd,0x27,0xb9,0x71, + 0xb6,0xbe,0xe1,0x4f, 0x17,0xf0,0x88,0xad, 0x66,0xc9,0x20,0xac, 0xb4,0x7d,0xce,0x3a, + 0x18,0x63,0xdf,0x4a, 0x82,0xe5,0x1a,0x31, 0x60,0x97,0x51,0x33, 0x45,0x62,0x53,0x7f, + 0xe0,0xb1,0x64,0x77, 0x84,0xbb,0x6b,0xae, 0x1c,0xfe,0x81,0xa0, 0x94,0xf9,0x08,0x2b, + 0x58,0x70,0x48,0x68, 0x19,0x8f,0x45,0xfd, 0x87,0x94,0xde,0x6c, 0xb7,0x52,0x7b,0xf8, + 0x23,0xab,0x73,0xd3, 0xe2,0x72,0x4b,0x02, 0x57,0xe3,0x1f,0x8f, 0x2a,0x66,0x55,0xab, + 0x07,0xb2,0xeb,0x28, 0x03,0x2f,0xb5,0xc2, 0x9a,0x86,0xc5,0x7b, 0xa5,0xd3,0x37,0x08, + 0xf2,0x30,0x28,0x87, 0xb2,0x23,0xbf,0xa5, 0xba,0x02,0x03,0x6a, 0x5c,0xed,0x16,0x82, + 0x2b,0x8a,0xcf,0x1c, 0x92,0xa7,0x79,0xb4, 0xf0,0xf3,0x07,0xf2, 0xa1,0x4e,0x69,0xe2, + 0xcd,0x65,0xda,0xf4, 0xd5,0x06,0x05,0xbe, 0x1f,0xd1,0x34,0x62, 0x8a,0xc4,0xa6,0xfe, + 0x9d,0x34,0x2e,0x53, 0xa0,0xa2,0xf3,0x55, 0x32,0x05,0x8a,0xe1, 0x75,0xa4,0xf6,0xeb, + 0x39,0x0b,0x83,0xec, 0xaa,0x40,0x60,0xef, 0x06,0x5e,0x71,0x9f, 0x51,0xbd,0x6e,0x10, + 0xf9,0x3e,0x21,0x8a, 0x3d,0x96,0xdd,0x06, 0xae,0xdd,0x3e,0x05, 0x46,0x4d,0xe6,0xbd, + 0xb5,0x91,0x54,0x8d, 0x05,0x71,0xc4,0x5d, 0x6f,0x04,0x06,0xd4, 0xff,0x60,0x50,0x15, + 0x24,0x19,0x98,0xfb, 0x97,0xd6,0xbd,0xe9, 0xcc,0x89,0x40,0x43, 0x77,0x67,0xd9,0x9e, + 0xbd,0xb0,0xe8,0x42, 0x88,0x07,0x89,0x8b, 0x38,0xe7,0x19,0x5b, 0xdb,0x79,0xc8,0xee, + 0x47,0xa1,0x7c,0x0a, 0xe9,0x7c,0x42,0x0f, 0xc9,0xf8,0x84,0x1e, 0x00,0x00,0x00,0x00, + 0x83,0x09,0x80,0x86, 0x48,0x32,0x2b,0xed, 0xac,0x1e,0x11,0x70, 0x4e,0x6c,0x5a,0x72, + 0xfb,0xfd,0x0e,0xff, 0x56,0x0f,0x85,0x38, 0x1e,0x3d,0xae,0xd5, 0x27,0x36,0x2d,0x39, + 0x64,0x0a,0x0f,0xd9, 0x21,0x68,0x5c,0xa6, 0xd1,0x9b,0x5b,0x54, 0x3a,0x24,0x36,0x2e, + 0xb1,0x0c,0x0a,0x67, 0x0f,0x93,0x57,0xe7, 0xd2,0xb4,0xee,0x96, 0x9e,0x1b,0x9b,0x91, + 0x4f,0x80,0xc0,0xc5, 0xa2,0x61,0xdc,0x20, 0x69,0x5a,0x77,0x4b, 0x16,0x1c,0x12,0x1a, + 0x0a,0xe2,0x93,0xba, 0xe5,0xc0,0xa0,0x2a, 0x43,0x3c,0x22,0xe0, 0x1d,0x12,0x1b,0x17, + 0x0b,0x0e,0x09,0x0d, 0xad,0xf2,0x8b,0xc7, 0xb9,0x2d,0xb6,0xa8, 0xc8,0x14,0x1e,0xa9, + 0x85,0x57,0xf1,0x19, 0x4c,0xaf,0x75,0x07, 0xbb,0xee,0x99,0xdd, 0xfd,0xa3,0x7f,0x60, + 0x9f,0xf7,0x01,0x26, 0xbc,0x5c,0x72,0xf5, 0xc5,0x44,0x66,0x3b, 0x34,0x5b,0xfb,0x7e, + 0x76,0x8b,0x43,0x29, 0xdc,0xcb,0x23,0xc6, 0x68,0xb6,0xed,0xfc, 0x63,0xb8,0xe4,0xf1, + 0xca,0xd7,0x31,0xdc, 0x10,0x42,0x63,0x85, 0x40,0x13,0x97,0x22, 0x20,0x84,0xc6,0x11, + 0x7d,0x85,0x4a,0x24, 0xf8,0xd2,0xbb,0x3d, 0x11,0xae,0xf9,0x32, 0x6d,0xc7,0x29,0xa1, + 0x4b,0x1d,0x9e,0x2f, 0xf3,0xdc,0xb2,0x30, 0xec,0x0d,0x86,0x52, 0xd0,0x77,0xc1,0xe3, + 0x6c,0x2b,0xb3,0x16, 0x99,0xa9,0x70,0xb9, 0xfa,0x11,0x94,0x48, 0x22,0x47,0xe9,0x64, + 0xc4,0xa8,0xfc,0x8c, 0x1a,0xa0,0xf0,0x3f, 0xd8,0x56,0x7d,0x2c, 0xef,0x22,0x33,0x90, + 0xc7,0x87,0x49,0x4e, 0xc1,0xd9,0x38,0xd1, 0xfe,0x8c,0xca,0xa2, 0x36,0x98,0xd4,0x0b, + 0xcf,0xa6,0xf5,0x81, 0x28,0xa5,0x7a,0xde, 0x26,0xda,0xb7,0x8e, 0xa4,0x3f,0xad,0xbf, + 0xe4,0x2c,0x3a,0x9d, 0x0d,0x50,0x78,0x92, 0x9b,0x6a,0x5f,0xcc, 0x62,0x54,0x7e,0x46, + 0xc2,0xf6,0x8d,0x13, 0xe8,0x90,0xd8,0xb8, 0x5e,0x2e,0x39,0xf7, 0xf5,0x82,0xc3,0xaf, + 0xbe,0x9f,0x5d,0x80, 0x7c,0x69,0xd0,0x93, 0xa9,0x6f,0xd5,0x2d, 0xb3,0xcf,0x25,0x12, + 0x3b,0xc8,0xac,0x99, 0xa7,0x10,0x18,0x7d, 0x6e,0xe8,0x9c,0x63, 0x7b,0xdb,0x3b,0xbb, + 0x09,0xcd,0x26,0x78, 0xf4,0x6e,0x59,0x18, 0x01,0xec,0x9a,0xb7, 0xa8,0x83,0x4f,0x9a, + 0x65,0xe6,0x95,0x6e, 0x7e,0xaa,0xff,0xe6, 0x08,0x21,0xbc,0xcf, 0xe6,0xef,0x15,0xe8, + 0xd9,0xba,0xe7,0x9b, 0xce,0x4a,0x6f,0x36, 0xd4,0xea,0x9f,0x09, 0xd6,0x29,0xb0,0x7c, + 0xaf,0x31,0xa4,0xb2, 0x31,0x2a,0x3f,0x23, 0x30,0xc6,0xa5,0x94, 0xc0,0x35,0xa2,0x66, + 0x37,0x74,0x4e,0xbc, 0xa6,0xfc,0x82,0xca, 0xb0,0xe0,0x90,0xd0, 0x15,0x33,0xa7,0xd8, + 0x4a,0xf1,0x04,0x98, 0xf7,0x41,0xec,0xda, 0x0e,0x7f,0xcd,0x50, 0x2f,0x17,0x91,0xf6, + 0x8d,0x76,0x4d,0xd6, 0x4d,0x43,0xef,0xb0, 0x54,0xcc,0xaa,0x4d, 0xdf,0xe4,0x96,0x04, + 0xe3,0x9e,0xd1,0xb5, 0x1b,0x4c,0x6a,0x88, 0xb8,0xc1,0x2c,0x1f, 0x7f,0x46,0x65,0x51, + 0x04,0x9d,0x5e,0xea, 0x5d,0x01,0x8c,0x35, 0x73,0xfa,0x87,0x74, 0x2e,0xfb,0x0b,0x41, + 0x5a,0xb3,0x67,0x1d, 0x52,0x92,0xdb,0xd2, 0x33,0xe9,0x10,0x56, 0x13,0x6d,0xd6,0x47, + 0x8c,0x9a,0xd7,0x61, 0x7a,0x37,0xa1,0x0c, 0x8e,0x59,0xf8,0x14, 0x89,0xeb,0x13,0x3c, + 0xee,0xce,0xa9,0x27, 0x35,0xb7,0x61,0xc9, 0xed,0xe1,0x1c,0xe5, 0x3c,0x7a,0x47,0xb1, + 0x59,0x9c,0xd2,0xdf, 0x3f,0x55,0xf2,0x73, 0x79,0x18,0x14,0xce, 0xbf,0x73,0xc7,0x37, + 0xea,0x53,0xf7,0xcd, 0x5b,0x5f,0xfd,0xaa, 0x14,0xdf,0x3d,0x6f, 0x86,0x78,0x44,0xdb, + 0x81,0xca,0xaf,0xf3, 0x3e,0xb9,0x68,0xc4, 0x2c,0x38,0x24,0x34, 0x5f,0xc2,0xa3,0x40, + 0x72,0x16,0x1d,0xc3, 0x0c,0xbc,0xe2,0x25, 0x8b,0x28,0x3c,0x49, 0x41,0xff,0x0d,0x95, + 0x71,0x39,0xa8,0x01, 0xde,0x08,0x0c,0xb3, 0x9c,0xd8,0xb4,0xe4, 0x90,0x64,0x56,0xc1, + 0x61,0x7b,0xcb,0x84, 0x70,0xd5,0x32,0xb6, 0x74,0x48,0x6c,0x5c, 0x42,0xd0,0xb8,0x57 +}; + +static UINT8 T7[256][4]= +{ + 0xa7,0x50,0x51,0xf4, 0x65,0x53,0x7e,0x41, 0xa4,0xc3,0x1a,0x17, 0x5e,0x96,0x3a,0x27, + 0x6b,0xcb,0x3b,0xab, 0x45,0xf1,0x1f,0x9d, 0x58,0xab,0xac,0xfa, 0x03,0x93,0x4b,0xe3, + 0xfa,0x55,0x20,0x30, 0x6d,0xf6,0xad,0x76, 0x76,0x91,0x88,0xcc, 0x4c,0x25,0xf5,0x02, + 0xd7,0xfc,0x4f,0xe5, 0xcb,0xd7,0xc5,0x2a, 0x44,0x80,0x26,0x35, 0xa3,0x8f,0xb5,0x62, + 0x5a,0x49,0xde,0xb1, 0x1b,0x67,0x25,0xba, 0x0e,0x98,0x45,0xea, 0xc0,0xe1,0x5d,0xfe, + 0x75,0x02,0xc3,0x2f, 0xf0,0x12,0x81,0x4c, 0x97,0xa3,0x8d,0x46, 0xf9,0xc6,0x6b,0xd3, + 0x5f,0xe7,0x03,0x8f, 0x9c,0x95,0x15,0x92, 0x7a,0xeb,0xbf,0x6d, 0x59,0xda,0x95,0x52, + 0x83,0x2d,0xd4,0xbe, 0x21,0xd3,0x58,0x74, 0x69,0x29,0x49,0xe0, 0xc8,0x44,0x8e,0xc9, + 0x89,0x6a,0x75,0xc2, 0x79,0x78,0xf4,0x8e, 0x3e,0x6b,0x99,0x58, 0x71,0xdd,0x27,0xb9, + 0x4f,0xb6,0xbe,0xe1, 0xad,0x17,0xf0,0x88, 0xac,0x66,0xc9,0x20, 0x3a,0xb4,0x7d,0xce, + 0x4a,0x18,0x63,0xdf, 0x31,0x82,0xe5,0x1a, 0x33,0x60,0x97,0x51, 0x7f,0x45,0x62,0x53, + 0x77,0xe0,0xb1,0x64, 0xae,0x84,0xbb,0x6b, 0xa0,0x1c,0xfe,0x81, 0x2b,0x94,0xf9,0x08, + 0x68,0x58,0x70,0x48, 0xfd,0x19,0x8f,0x45, 0x6c,0x87,0x94,0xde, 0xf8,0xb7,0x52,0x7b, + 0xd3,0x23,0xab,0x73, 0x02,0xe2,0x72,0x4b, 0x8f,0x57,0xe3,0x1f, 0xab,0x2a,0x66,0x55, + 0x28,0x07,0xb2,0xeb, 0xc2,0x03,0x2f,0xb5, 0x7b,0x9a,0x86,0xc5, 0x08,0xa5,0xd3,0x37, + 0x87,0xf2,0x30,0x28, 0xa5,0xb2,0x23,0xbf, 0x6a,0xba,0x02,0x03, 0x82,0x5c,0xed,0x16, + 0x1c,0x2b,0x8a,0xcf, 0xb4,0x92,0xa7,0x79, 0xf2,0xf0,0xf3,0x07, 0xe2,0xa1,0x4e,0x69, + 0xf4,0xcd,0x65,0xda, 0xbe,0xd5,0x06,0x05, 0x62,0x1f,0xd1,0x34, 0xfe,0x8a,0xc4,0xa6, + 0x53,0x9d,0x34,0x2e, 0x55,0xa0,0xa2,0xf3, 0xe1,0x32,0x05,0x8a, 0xeb,0x75,0xa4,0xf6, + 0xec,0x39,0x0b,0x83, 0xef,0xaa,0x40,0x60, 0x9f,0x06,0x5e,0x71, 0x10,0x51,0xbd,0x6e, + 0x8a,0xf9,0x3e,0x21, 0x06,0x3d,0x96,0xdd, 0x05,0xae,0xdd,0x3e, 0xbd,0x46,0x4d,0xe6, + 0x8d,0xb5,0x91,0x54, 0x5d,0x05,0x71,0xc4, 0xd4,0x6f,0x04,0x06, 0x15,0xff,0x60,0x50, + 0xfb,0x24,0x19,0x98, 0xe9,0x97,0xd6,0xbd, 0x43,0xcc,0x89,0x40, 0x9e,0x77,0x67,0xd9, + 0x42,0xbd,0xb0,0xe8, 0x8b,0x88,0x07,0x89, 0x5b,0x38,0xe7,0x19, 0xee,0xdb,0x79,0xc8, + 0x0a,0x47,0xa1,0x7c, 0x0f,0xe9,0x7c,0x42, 0x1e,0xc9,0xf8,0x84, 0x00,0x00,0x00,0x00, + 0x86,0x83,0x09,0x80, 0xed,0x48,0x32,0x2b, 0x70,0xac,0x1e,0x11, 0x72,0x4e,0x6c,0x5a, + 0xff,0xfb,0xfd,0x0e, 0x38,0x56,0x0f,0x85, 0xd5,0x1e,0x3d,0xae, 0x39,0x27,0x36,0x2d, + 0xd9,0x64,0x0a,0x0f, 0xa6,0x21,0x68,0x5c, 0x54,0xd1,0x9b,0x5b, 0x2e,0x3a,0x24,0x36, + 0x67,0xb1,0x0c,0x0a, 0xe7,0x0f,0x93,0x57, 0x96,0xd2,0xb4,0xee, 0x91,0x9e,0x1b,0x9b, + 0xc5,0x4f,0x80,0xc0, 0x20,0xa2,0x61,0xdc, 0x4b,0x69,0x5a,0x77, 0x1a,0x16,0x1c,0x12, + 0xba,0x0a,0xe2,0x93, 0x2a,0xe5,0xc0,0xa0, 0xe0,0x43,0x3c,0x22, 0x17,0x1d,0x12,0x1b, + 0x0d,0x0b,0x0e,0x09, 0xc7,0xad,0xf2,0x8b, 0xa8,0xb9,0x2d,0xb6, 0xa9,0xc8,0x14,0x1e, + 0x19,0x85,0x57,0xf1, 0x07,0x4c,0xaf,0x75, 0xdd,0xbb,0xee,0x99, 0x60,0xfd,0xa3,0x7f, + 0x26,0x9f,0xf7,0x01, 0xf5,0xbc,0x5c,0x72, 0x3b,0xc5,0x44,0x66, 0x7e,0x34,0x5b,0xfb, + 0x29,0x76,0x8b,0x43, 0xc6,0xdc,0xcb,0x23, 0xfc,0x68,0xb6,0xed, 0xf1,0x63,0xb8,0xe4, + 0xdc,0xca,0xd7,0x31, 0x85,0x10,0x42,0x63, 0x22,0x40,0x13,0x97, 0x11,0x20,0x84,0xc6, + 0x24,0x7d,0x85,0x4a, 0x3d,0xf8,0xd2,0xbb, 0x32,0x11,0xae,0xf9, 0xa1,0x6d,0xc7,0x29, + 0x2f,0x4b,0x1d,0x9e, 0x30,0xf3,0xdc,0xb2, 0x52,0xec,0x0d,0x86, 0xe3,0xd0,0x77,0xc1, + 0x16,0x6c,0x2b,0xb3, 0xb9,0x99,0xa9,0x70, 0x48,0xfa,0x11,0x94, 0x64,0x22,0x47,0xe9, + 0x8c,0xc4,0xa8,0xfc, 0x3f,0x1a,0xa0,0xf0, 0x2c,0xd8,0x56,0x7d, 0x90,0xef,0x22,0x33, + 0x4e,0xc7,0x87,0x49, 0xd1,0xc1,0xd9,0x38, 0xa2,0xfe,0x8c,0xca, 0x0b,0x36,0x98,0xd4, + 0x81,0xcf,0xa6,0xf5, 0xde,0x28,0xa5,0x7a, 0x8e,0x26,0xda,0xb7, 0xbf,0xa4,0x3f,0xad, + 0x9d,0xe4,0x2c,0x3a, 0x92,0x0d,0x50,0x78, 0xcc,0x9b,0x6a,0x5f, 0x46,0x62,0x54,0x7e, + 0x13,0xc2,0xf6,0x8d, 0xb8,0xe8,0x90,0xd8, 0xf7,0x5e,0x2e,0x39, 0xaf,0xf5,0x82,0xc3, + 0x80,0xbe,0x9f,0x5d, 0x93,0x7c,0x69,0xd0, 0x2d,0xa9,0x6f,0xd5, 0x12,0xb3,0xcf,0x25, + 0x99,0x3b,0xc8,0xac, 0x7d,0xa7,0x10,0x18, 0x63,0x6e,0xe8,0x9c, 0xbb,0x7b,0xdb,0x3b, + 0x78,0x09,0xcd,0x26, 0x18,0xf4,0x6e,0x59, 0xb7,0x01,0xec,0x9a, 0x9a,0xa8,0x83,0x4f, + 0x6e,0x65,0xe6,0x95, 0xe6,0x7e,0xaa,0xff, 0xcf,0x08,0x21,0xbc, 0xe8,0xe6,0xef,0x15, + 0x9b,0xd9,0xba,0xe7, 0x36,0xce,0x4a,0x6f, 0x09,0xd4,0xea,0x9f, 0x7c,0xd6,0x29,0xb0, + 0xb2,0xaf,0x31,0xa4, 0x23,0x31,0x2a,0x3f, 0x94,0x30,0xc6,0xa5, 0x66,0xc0,0x35,0xa2, + 0xbc,0x37,0x74,0x4e, 0xca,0xa6,0xfc,0x82, 0xd0,0xb0,0xe0,0x90, 0xd8,0x15,0x33,0xa7, + 0x98,0x4a,0xf1,0x04, 0xda,0xf7,0x41,0xec, 0x50,0x0e,0x7f,0xcd, 0xf6,0x2f,0x17,0x91, + 0xd6,0x8d,0x76,0x4d, 0xb0,0x4d,0x43,0xef, 0x4d,0x54,0xcc,0xaa, 0x04,0xdf,0xe4,0x96, + 0xb5,0xe3,0x9e,0xd1, 0x88,0x1b,0x4c,0x6a, 0x1f,0xb8,0xc1,0x2c, 0x51,0x7f,0x46,0x65, + 0xea,0x04,0x9d,0x5e, 0x35,0x5d,0x01,0x8c, 0x74,0x73,0xfa,0x87, 0x41,0x2e,0xfb,0x0b, + 0x1d,0x5a,0xb3,0x67, 0xd2,0x52,0x92,0xdb, 0x56,0x33,0xe9,0x10, 0x47,0x13,0x6d,0xd6, + 0x61,0x8c,0x9a,0xd7, 0x0c,0x7a,0x37,0xa1, 0x14,0x8e,0x59,0xf8, 0x3c,0x89,0xeb,0x13, + 0x27,0xee,0xce,0xa9, 0xc9,0x35,0xb7,0x61, 0xe5,0xed,0xe1,0x1c, 0xb1,0x3c,0x7a,0x47, + 0xdf,0x59,0x9c,0xd2, 0x73,0x3f,0x55,0xf2, 0xce,0x79,0x18,0x14, 0x37,0xbf,0x73,0xc7, + 0xcd,0xea,0x53,0xf7, 0xaa,0x5b,0x5f,0xfd, 0x6f,0x14,0xdf,0x3d, 0xdb,0x86,0x78,0x44, + 0xf3,0x81,0xca,0xaf, 0xc4,0x3e,0xb9,0x68, 0x34,0x2c,0x38,0x24, 0x40,0x5f,0xc2,0xa3, + 0xc3,0x72,0x16,0x1d, 0x25,0x0c,0xbc,0xe2, 0x49,0x8b,0x28,0x3c, 0x95,0x41,0xff,0x0d, + 0x01,0x71,0x39,0xa8, 0xb3,0xde,0x08,0x0c, 0xe4,0x9c,0xd8,0xb4, 0xc1,0x90,0x64,0x56, + 0x84,0x61,0x7b,0xcb, 0xb6,0x70,0xd5,0x32, 0x5c,0x74,0x48,0x6c, 0x57,0x42,0xd0,0xb8 +}; + +static UINT8 T8[256][4]= +{ + 0xf4,0xa7,0x50,0x51, 0x41,0x65,0x53,0x7e, 0x17,0xa4,0xc3,0x1a, 0x27,0x5e,0x96,0x3a, + 0xab,0x6b,0xcb,0x3b, 0x9d,0x45,0xf1,0x1f, 0xfa,0x58,0xab,0xac, 0xe3,0x03,0x93,0x4b, + 0x30,0xfa,0x55,0x20, 0x76,0x6d,0xf6,0xad, 0xcc,0x76,0x91,0x88, 0x02,0x4c,0x25,0xf5, + 0xe5,0xd7,0xfc,0x4f, 0x2a,0xcb,0xd7,0xc5, 0x35,0x44,0x80,0x26, 0x62,0xa3,0x8f,0xb5, + 0xb1,0x5a,0x49,0xde, 0xba,0x1b,0x67,0x25, 0xea,0x0e,0x98,0x45, 0xfe,0xc0,0xe1,0x5d, + 0x2f,0x75,0x02,0xc3, 0x4c,0xf0,0x12,0x81, 0x46,0x97,0xa3,0x8d, 0xd3,0xf9,0xc6,0x6b, + 0x8f,0x5f,0xe7,0x03, 0x92,0x9c,0x95,0x15, 0x6d,0x7a,0xeb,0xbf, 0x52,0x59,0xda,0x95, + 0xbe,0x83,0x2d,0xd4, 0x74,0x21,0xd3,0x58, 0xe0,0x69,0x29,0x49, 0xc9,0xc8,0x44,0x8e, + 0xc2,0x89,0x6a,0x75, 0x8e,0x79,0x78,0xf4, 0x58,0x3e,0x6b,0x99, 0xb9,0x71,0xdd,0x27, + 0xe1,0x4f,0xb6,0xbe, 0x88,0xad,0x17,0xf0, 0x20,0xac,0x66,0xc9, 0xce,0x3a,0xb4,0x7d, + 0xdf,0x4a,0x18,0x63, 0x1a,0x31,0x82,0xe5, 0x51,0x33,0x60,0x97, 0x53,0x7f,0x45,0x62, + 0x64,0x77,0xe0,0xb1, 0x6b,0xae,0x84,0xbb, 0x81,0xa0,0x1c,0xfe, 0x08,0x2b,0x94,0xf9, + 0x48,0x68,0x58,0x70, 0x45,0xfd,0x19,0x8f, 0xde,0x6c,0x87,0x94, 0x7b,0xf8,0xb7,0x52, + 0x73,0xd3,0x23,0xab, 0x4b,0x02,0xe2,0x72, 0x1f,0x8f,0x57,0xe3, 0x55,0xab,0x2a,0x66, + 0xeb,0x28,0x07,0xb2, 0xb5,0xc2,0x03,0x2f, 0xc5,0x7b,0x9a,0x86, 0x37,0x08,0xa5,0xd3, + 0x28,0x87,0xf2,0x30, 0xbf,0xa5,0xb2,0x23, 0x03,0x6a,0xba,0x02, 0x16,0x82,0x5c,0xed, + 0xcf,0x1c,0x2b,0x8a, 0x79,0xb4,0x92,0xa7, 0x07,0xf2,0xf0,0xf3, 0x69,0xe2,0xa1,0x4e, + 0xda,0xf4,0xcd,0x65, 0x05,0xbe,0xd5,0x06, 0x34,0x62,0x1f,0xd1, 0xa6,0xfe,0x8a,0xc4, + 0x2e,0x53,0x9d,0x34, 0xf3,0x55,0xa0,0xa2, 0x8a,0xe1,0x32,0x05, 0xf6,0xeb,0x75,0xa4, + 0x83,0xec,0x39,0x0b, 0x60,0xef,0xaa,0x40, 0x71,0x9f,0x06,0x5e, 0x6e,0x10,0x51,0xbd, + 0x21,0x8a,0xf9,0x3e, 0xdd,0x06,0x3d,0x96, 0x3e,0x05,0xae,0xdd, 0xe6,0xbd,0x46,0x4d, + 0x54,0x8d,0xb5,0x91, 0xc4,0x5d,0x05,0x71, 0x06,0xd4,0x6f,0x04, 0x50,0x15,0xff,0x60, + 0x98,0xfb,0x24,0x19, 0xbd,0xe9,0x97,0xd6, 0x40,0x43,0xcc,0x89, 0xd9,0x9e,0x77,0x67, + 0xe8,0x42,0xbd,0xb0, 0x89,0x8b,0x88,0x07, 0x19,0x5b,0x38,0xe7, 0xc8,0xee,0xdb,0x79, + 0x7c,0x0a,0x47,0xa1, 0x42,0x0f,0xe9,0x7c, 0x84,0x1e,0xc9,0xf8, 0x00,0x00,0x00,0x00, + 0x80,0x86,0x83,0x09, 0x2b,0xed,0x48,0x32, 0x11,0x70,0xac,0x1e, 0x5a,0x72,0x4e,0x6c, + 0x0e,0xff,0xfb,0xfd, 0x85,0x38,0x56,0x0f, 0xae,0xd5,0x1e,0x3d, 0x2d,0x39,0x27,0x36, + 0x0f,0xd9,0x64,0x0a, 0x5c,0xa6,0x21,0x68, 0x5b,0x54,0xd1,0x9b, 0x36,0x2e,0x3a,0x24, + 0x0a,0x67,0xb1,0x0c, 0x57,0xe7,0x0f,0x93, 0xee,0x96,0xd2,0xb4, 0x9b,0x91,0x9e,0x1b, + 0xc0,0xc5,0x4f,0x80, 0xdc,0x20,0xa2,0x61, 0x77,0x4b,0x69,0x5a, 0x12,0x1a,0x16,0x1c, + 0x93,0xba,0x0a,0xe2, 0xa0,0x2a,0xe5,0xc0, 0x22,0xe0,0x43,0x3c, 0x1b,0x17,0x1d,0x12, + 0x09,0x0d,0x0b,0x0e, 0x8b,0xc7,0xad,0xf2, 0xb6,0xa8,0xb9,0x2d, 0x1e,0xa9,0xc8,0x14, + 0xf1,0x19,0x85,0x57, 0x75,0x07,0x4c,0xaf, 0x99,0xdd,0xbb,0xee, 0x7f,0x60,0xfd,0xa3, + 0x01,0x26,0x9f,0xf7, 0x72,0xf5,0xbc,0x5c, 0x66,0x3b,0xc5,0x44, 0xfb,0x7e,0x34,0x5b, + 0x43,0x29,0x76,0x8b, 0x23,0xc6,0xdc,0xcb, 0xed,0xfc,0x68,0xb6, 0xe4,0xf1,0x63,0xb8, + 0x31,0xdc,0xca,0xd7, 0x63,0x85,0x10,0x42, 0x97,0x22,0x40,0x13, 0xc6,0x11,0x20,0x84, + 0x4a,0x24,0x7d,0x85, 0xbb,0x3d,0xf8,0xd2, 0xf9,0x32,0x11,0xae, 0x29,0xa1,0x6d,0xc7, + 0x9e,0x2f,0x4b,0x1d, 0xb2,0x30,0xf3,0xdc, 0x86,0x52,0xec,0x0d, 0xc1,0xe3,0xd0,0x77, + 0xb3,0x16,0x6c,0x2b, 0x70,0xb9,0x99,0xa9, 0x94,0x48,0xfa,0x11, 0xe9,0x64,0x22,0x47, + 0xfc,0x8c,0xc4,0xa8, 0xf0,0x3f,0x1a,0xa0, 0x7d,0x2c,0xd8,0x56, 0x33,0x90,0xef,0x22, + 0x49,0x4e,0xc7,0x87, 0x38,0xd1,0xc1,0xd9, 0xca,0xa2,0xfe,0x8c, 0xd4,0x0b,0x36,0x98, + 0xf5,0x81,0xcf,0xa6, 0x7a,0xde,0x28,0xa5, 0xb7,0x8e,0x26,0xda, 0xad,0xbf,0xa4,0x3f, + 0x3a,0x9d,0xe4,0x2c, 0x78,0x92,0x0d,0x50, 0x5f,0xcc,0x9b,0x6a, 0x7e,0x46,0x62,0x54, + 0x8d,0x13,0xc2,0xf6, 0xd8,0xb8,0xe8,0x90, 0x39,0xf7,0x5e,0x2e, 0xc3,0xaf,0xf5,0x82, + 0x5d,0x80,0xbe,0x9f, 0xd0,0x93,0x7c,0x69, 0xd5,0x2d,0xa9,0x6f, 0x25,0x12,0xb3,0xcf, + 0xac,0x99,0x3b,0xc8, 0x18,0x7d,0xa7,0x10, 0x9c,0x63,0x6e,0xe8, 0x3b,0xbb,0x7b,0xdb, + 0x26,0x78,0x09,0xcd, 0x59,0x18,0xf4,0x6e, 0x9a,0xb7,0x01,0xec, 0x4f,0x9a,0xa8,0x83, + 0x95,0x6e,0x65,0xe6, 0xff,0xe6,0x7e,0xaa, 0xbc,0xcf,0x08,0x21, 0x15,0xe8,0xe6,0xef, + 0xe7,0x9b,0xd9,0xba, 0x6f,0x36,0xce,0x4a, 0x9f,0x09,0xd4,0xea, 0xb0,0x7c,0xd6,0x29, + 0xa4,0xb2,0xaf,0x31, 0x3f,0x23,0x31,0x2a, 0xa5,0x94,0x30,0xc6, 0xa2,0x66,0xc0,0x35, + 0x4e,0xbc,0x37,0x74, 0x82,0xca,0xa6,0xfc, 0x90,0xd0,0xb0,0xe0, 0xa7,0xd8,0x15,0x33, + 0x04,0x98,0x4a,0xf1, 0xec,0xda,0xf7,0x41, 0xcd,0x50,0x0e,0x7f, 0x91,0xf6,0x2f,0x17, + 0x4d,0xd6,0x8d,0x76, 0xef,0xb0,0x4d,0x43, 0xaa,0x4d,0x54,0xcc, 0x96,0x04,0xdf,0xe4, + 0xd1,0xb5,0xe3,0x9e, 0x6a,0x88,0x1b,0x4c, 0x2c,0x1f,0xb8,0xc1, 0x65,0x51,0x7f,0x46, + 0x5e,0xea,0x04,0x9d, 0x8c,0x35,0x5d,0x01, 0x87,0x74,0x73,0xfa, 0x0b,0x41,0x2e,0xfb, + 0x67,0x1d,0x5a,0xb3, 0xdb,0xd2,0x52,0x92, 0x10,0x56,0x33,0xe9, 0xd6,0x47,0x13,0x6d, + 0xd7,0x61,0x8c,0x9a, 0xa1,0x0c,0x7a,0x37, 0xf8,0x14,0x8e,0x59, 0x13,0x3c,0x89,0xeb, + 0xa9,0x27,0xee,0xce, 0x61,0xc9,0x35,0xb7, 0x1c,0xe5,0xed,0xe1, 0x47,0xb1,0x3c,0x7a, + 0xd2,0xdf,0x59,0x9c, 0xf2,0x73,0x3f,0x55, 0x14,0xce,0x79,0x18, 0xc7,0x37,0xbf,0x73, + 0xf7,0xcd,0xea,0x53, 0xfd,0xaa,0x5b,0x5f, 0x3d,0x6f,0x14,0xdf, 0x44,0xdb,0x86,0x78, + 0xaf,0xf3,0x81,0xca, 0x68,0xc4,0x3e,0xb9, 0x24,0x34,0x2c,0x38, 0xa3,0x40,0x5f,0xc2, + 0x1d,0xc3,0x72,0x16, 0xe2,0x25,0x0c,0xbc, 0x3c,0x49,0x8b,0x28, 0x0d,0x95,0x41,0xff, + 0xa8,0x01,0x71,0x39, 0x0c,0xb3,0xde,0x08, 0xb4,0xe4,0x9c,0xd8, 0x56,0xc1,0x90,0x64, + 0xcb,0x84,0x61,0x7b, 0x32,0xb6,0x70,0xd5, 0x6c,0x5c,0x74,0x48, 0xb8,0x57,0x42,0xd0 +}; + +static UINT8 S5[256]= +{ + 0x52,0x09,0x6a,0xd5, + 0x30,0x36,0xa5,0x38, + 0xbf,0x40,0xa3,0x9e, + 0x81,0xf3,0xd7,0xfb, + 0x7c,0xe3,0x39,0x82, + 0x9b,0x2f,0xff,0x87, + 0x34,0x8e,0x43,0x44, + 0xc4,0xde,0xe9,0xcb, + 0x54,0x7b,0x94,0x32, + 0xa6,0xc2,0x23,0x3d, + 0xee,0x4c,0x95,0x0b, + 0x42,0xfa,0xc3,0x4e, + 0x08,0x2e,0xa1,0x66, + 0x28,0xd9,0x24,0xb2, + 0x76,0x5b,0xa2,0x49, + 0x6d,0x8b,0xd1,0x25, + 0x72,0xf8,0xf6,0x64, + 0x86,0x68,0x98,0x16, + 0xd4,0xa4,0x5c,0xcc, + 0x5d,0x65,0xb6,0x92, + 0x6c,0x70,0x48,0x50, + 0xfd,0xed,0xb9,0xda, + 0x5e,0x15,0x46,0x57, + 0xa7,0x8d,0x9d,0x84, + 0x90,0xd8,0xab,0x00, + 0x8c,0xbc,0xd3,0x0a, + 0xf7,0xe4,0x58,0x05, + 0xb8,0xb3,0x45,0x06, + 0xd0,0x2c,0x1e,0x8f, + 0xca,0x3f,0x0f,0x02, + 0xc1,0xaf,0xbd,0x03, + 0x01,0x13,0x8a,0x6b, + 0x3a,0x91,0x11,0x41, + 0x4f,0x67,0xdc,0xea, + 0x97,0xf2,0xcf,0xce, + 0xf0,0xb4,0xe6,0x73, + 0x96,0xac,0x74,0x22, + 0xe7,0xad,0x35,0x85, + 0xe2,0xf9,0x37,0xe8, + 0x1c,0x75,0xdf,0x6e, + 0x47,0xf1,0x1a,0x71, + 0x1d,0x29,0xc5,0x89, + 0x6f,0xb7,0x62,0x0e, + 0xaa,0x18,0xbe,0x1b, + 0xfc,0x56,0x3e,0x4b, + 0xc6,0xd2,0x79,0x20, + 0x9a,0xdb,0xc0,0xfe, + 0x78,0xcd,0x5a,0xf4, + 0x1f,0xdd,0xa8,0x33, + 0x88,0x07,0xc7,0x31, + 0xb1,0x12,0x10,0x59, + 0x27,0x80,0xec,0x5f, + 0x60,0x51,0x7f,0xa9, + 0x19,0xb5,0x4a,0x0d, + 0x2d,0xe5,0x7a,0x9f, + 0x93,0xc9,0x9c,0xef, + 0xa0,0xe0,0x3b,0x4d, + 0xae,0x2a,0xf5,0xb0, + 0xc8,0xeb,0xbb,0x3c, + 0x83,0x53,0x99,0x61, + 0x17,0x2b,0x04,0x7e, + 0xba,0x77,0xd6,0x26, + 0xe1,0x69,0x14,0x63, + 0x55,0x21,0x0c,0x7d +}; + +static UINT8 U1[256][4]= +{ + 0x00,0x00,0x00,0x00, 0x0e,0x09,0x0d,0x0b, 0x1c,0x12,0x1a,0x16, 0x12,0x1b,0x17,0x1d, + 0x38,0x24,0x34,0x2c, 0x36,0x2d,0x39,0x27, 0x24,0x36,0x2e,0x3a, 0x2a,0x3f,0x23,0x31, + 0x70,0x48,0x68,0x58, 0x7e,0x41,0x65,0x53, 0x6c,0x5a,0x72,0x4e, 0x62,0x53,0x7f,0x45, + 0x48,0x6c,0x5c,0x74, 0x46,0x65,0x51,0x7f, 0x54,0x7e,0x46,0x62, 0x5a,0x77,0x4b,0x69, + 0xe0,0x90,0xd0,0xb0, 0xee,0x99,0xdd,0xbb, 0xfc,0x82,0xca,0xa6, 0xf2,0x8b,0xc7,0xad, + 0xd8,0xb4,0xe4,0x9c, 0xd6,0xbd,0xe9,0x97, 0xc4,0xa6,0xfe,0x8a, 0xca,0xaf,0xf3,0x81, + 0x90,0xd8,0xb8,0xe8, 0x9e,0xd1,0xb5,0xe3, 0x8c,0xca,0xa2,0xfe, 0x82,0xc3,0xaf,0xf5, + 0xa8,0xfc,0x8c,0xc4, 0xa6,0xf5,0x81,0xcf, 0xb4,0xee,0x96,0xd2, 0xba,0xe7,0x9b,0xd9, + 0xdb,0x3b,0xbb,0x7b, 0xd5,0x32,0xb6,0x70, 0xc7,0x29,0xa1,0x6d, 0xc9,0x20,0xac,0x66, + 0xe3,0x1f,0x8f,0x57, 0xed,0x16,0x82,0x5c, 0xff,0x0d,0x95,0x41, 0xf1,0x04,0x98,0x4a, + 0xab,0x73,0xd3,0x23, 0xa5,0x7a,0xde,0x28, 0xb7,0x61,0xc9,0x35, 0xb9,0x68,0xc4,0x3e, + 0x93,0x57,0xe7,0x0f, 0x9d,0x5e,0xea,0x04, 0x8f,0x45,0xfd,0x19, 0x81,0x4c,0xf0,0x12, + 0x3b,0xab,0x6b,0xcb, 0x35,0xa2,0x66,0xc0, 0x27,0xb9,0x71,0xdd, 0x29,0xb0,0x7c,0xd6, + 0x03,0x8f,0x5f,0xe7, 0x0d,0x86,0x52,0xec, 0x1f,0x9d,0x45,0xf1, 0x11,0x94,0x48,0xfa, + 0x4b,0xe3,0x03,0x93, 0x45,0xea,0x0e,0x98, 0x57,0xf1,0x19,0x85, 0x59,0xf8,0x14,0x8e, + 0x73,0xc7,0x37,0xbf, 0x7d,0xce,0x3a,0xb4, 0x6f,0xd5,0x2d,0xa9, 0x61,0xdc,0x20,0xa2, + 0xad,0x76,0x6d,0xf6, 0xa3,0x7f,0x60,0xfd, 0xb1,0x64,0x77,0xe0, 0xbf,0x6d,0x7a,0xeb, + 0x95,0x52,0x59,0xda, 0x9b,0x5b,0x54,0xd1, 0x89,0x40,0x43,0xcc, 0x87,0x49,0x4e,0xc7, + 0xdd,0x3e,0x05,0xae, 0xd3,0x37,0x08,0xa5, 0xc1,0x2c,0x1f,0xb8, 0xcf,0x25,0x12,0xb3, + 0xe5,0x1a,0x31,0x82, 0xeb,0x13,0x3c,0x89, 0xf9,0x08,0x2b,0x94, 0xf7,0x01,0x26,0x9f, + 0x4d,0xe6,0xbd,0x46, 0x43,0xef,0xb0,0x4d, 0x51,0xf4,0xa7,0x50, 0x5f,0xfd,0xaa,0x5b, + 0x75,0xc2,0x89,0x6a, 0x7b,0xcb,0x84,0x61, 0x69,0xd0,0x93,0x7c, 0x67,0xd9,0x9e,0x77, + 0x3d,0xae,0xd5,0x1e, 0x33,0xa7,0xd8,0x15, 0x21,0xbc,0xcf,0x08, 0x2f,0xb5,0xc2,0x03, + 0x05,0x8a,0xe1,0x32, 0x0b,0x83,0xec,0x39, 0x19,0x98,0xfb,0x24, 0x17,0x91,0xf6,0x2f, + 0x76,0x4d,0xd6,0x8d, 0x78,0x44,0xdb,0x86, 0x6a,0x5f,0xcc,0x9b, 0x64,0x56,0xc1,0x90, + 0x4e,0x69,0xe2,0xa1, 0x40,0x60,0xef,0xaa, 0x52,0x7b,0xf8,0xb7, 0x5c,0x72,0xf5,0xbc, + 0x06,0x05,0xbe,0xd5, 0x08,0x0c,0xb3,0xde, 0x1a,0x17,0xa4,0xc3, 0x14,0x1e,0xa9,0xc8, + 0x3e,0x21,0x8a,0xf9, 0x30,0x28,0x87,0xf2, 0x22,0x33,0x90,0xef, 0x2c,0x3a,0x9d,0xe4, + 0x96,0xdd,0x06,0x3d, 0x98,0xd4,0x0b,0x36, 0x8a,0xcf,0x1c,0x2b, 0x84,0xc6,0x11,0x20, + 0xae,0xf9,0x32,0x11, 0xa0,0xf0,0x3f,0x1a, 0xb2,0xeb,0x28,0x07, 0xbc,0xe2,0x25,0x0c, + 0xe6,0x95,0x6e,0x65, 0xe8,0x9c,0x63,0x6e, 0xfa,0x87,0x74,0x73, 0xf4,0x8e,0x79,0x78, + 0xde,0xb1,0x5a,0x49, 0xd0,0xb8,0x57,0x42, 0xc2,0xa3,0x40,0x5f, 0xcc,0xaa,0x4d,0x54, + 0x41,0xec,0xda,0xf7, 0x4f,0xe5,0xd7,0xfc, 0x5d,0xfe,0xc0,0xe1, 0x53,0xf7,0xcd,0xea, + 0x79,0xc8,0xee,0xdb, 0x77,0xc1,0xe3,0xd0, 0x65,0xda,0xf4,0xcd, 0x6b,0xd3,0xf9,0xc6, + 0x31,0xa4,0xb2,0xaf, 0x3f,0xad,0xbf,0xa4, 0x2d,0xb6,0xa8,0xb9, 0x23,0xbf,0xa5,0xb2, + 0x09,0x80,0x86,0x83, 0x07,0x89,0x8b,0x88, 0x15,0x92,0x9c,0x95, 0x1b,0x9b,0x91,0x9e, + 0xa1,0x7c,0x0a,0x47, 0xaf,0x75,0x07,0x4c, 0xbd,0x6e,0x10,0x51, 0xb3,0x67,0x1d,0x5a, + 0x99,0x58,0x3e,0x6b, 0x97,0x51,0x33,0x60, 0x85,0x4a,0x24,0x7d, 0x8b,0x43,0x29,0x76, + 0xd1,0x34,0x62,0x1f, 0xdf,0x3d,0x6f,0x14, 0xcd,0x26,0x78,0x09, 0xc3,0x2f,0x75,0x02, + 0xe9,0x10,0x56,0x33, 0xe7,0x19,0x5b,0x38, 0xf5,0x02,0x4c,0x25, 0xfb,0x0b,0x41,0x2e, + 0x9a,0xd7,0x61,0x8c, 0x94,0xde,0x6c,0x87, 0x86,0xc5,0x7b,0x9a, 0x88,0xcc,0x76,0x91, + 0xa2,0xf3,0x55,0xa0, 0xac,0xfa,0x58,0xab, 0xbe,0xe1,0x4f,0xb6, 0xb0,0xe8,0x42,0xbd, + 0xea,0x9f,0x09,0xd4, 0xe4,0x96,0x04,0xdf, 0xf6,0x8d,0x13,0xc2, 0xf8,0x84,0x1e,0xc9, + 0xd2,0xbb,0x3d,0xf8, 0xdc,0xb2,0x30,0xf3, 0xce,0xa9,0x27,0xee, 0xc0,0xa0,0x2a,0xe5, + 0x7a,0x47,0xb1,0x3c, 0x74,0x4e,0xbc,0x37, 0x66,0x55,0xab,0x2a, 0x68,0x5c,0xa6,0x21, + 0x42,0x63,0x85,0x10, 0x4c,0x6a,0x88,0x1b, 0x5e,0x71,0x9f,0x06, 0x50,0x78,0x92,0x0d, + 0x0a,0x0f,0xd9,0x64, 0x04,0x06,0xd4,0x6f, 0x16,0x1d,0xc3,0x72, 0x18,0x14,0xce,0x79, + 0x32,0x2b,0xed,0x48, 0x3c,0x22,0xe0,0x43, 0x2e,0x39,0xf7,0x5e, 0x20,0x30,0xfa,0x55, + 0xec,0x9a,0xb7,0x01, 0xe2,0x93,0xba,0x0a, 0xf0,0x88,0xad,0x17, 0xfe,0x81,0xa0,0x1c, + 0xd4,0xbe,0x83,0x2d, 0xda,0xb7,0x8e,0x26, 0xc8,0xac,0x99,0x3b, 0xc6,0xa5,0x94,0x30, + 0x9c,0xd2,0xdf,0x59, 0x92,0xdb,0xd2,0x52, 0x80,0xc0,0xc5,0x4f, 0x8e,0xc9,0xc8,0x44, + 0xa4,0xf6,0xeb,0x75, 0xaa,0xff,0xe6,0x7e, 0xb8,0xe4,0xf1,0x63, 0xb6,0xed,0xfc,0x68, + 0x0c,0x0a,0x67,0xb1, 0x02,0x03,0x6a,0xba, 0x10,0x18,0x7d,0xa7, 0x1e,0x11,0x70,0xac, + 0x34,0x2e,0x53,0x9d, 0x3a,0x27,0x5e,0x96, 0x28,0x3c,0x49,0x8b, 0x26,0x35,0x44,0x80, + 0x7c,0x42,0x0f,0xe9, 0x72,0x4b,0x02,0xe2, 0x60,0x50,0x15,0xff, 0x6e,0x59,0x18,0xf4, + 0x44,0x66,0x3b,0xc5, 0x4a,0x6f,0x36,0xce, 0x58,0x74,0x21,0xd3, 0x56,0x7d,0x2c,0xd8, + 0x37,0xa1,0x0c,0x7a, 0x39,0xa8,0x01,0x71, 0x2b,0xb3,0x16,0x6c, 0x25,0xba,0x1b,0x67, + 0x0f,0x85,0x38,0x56, 0x01,0x8c,0x35,0x5d, 0x13,0x97,0x22,0x40, 0x1d,0x9e,0x2f,0x4b, + 0x47,0xe9,0x64,0x22, 0x49,0xe0,0x69,0x29, 0x5b,0xfb,0x7e,0x34, 0x55,0xf2,0x73,0x3f, + 0x7f,0xcd,0x50,0x0e, 0x71,0xc4,0x5d,0x05, 0x63,0xdf,0x4a,0x18, 0x6d,0xd6,0x47,0x13, + 0xd7,0x31,0xdc,0xca, 0xd9,0x38,0xd1,0xc1, 0xcb,0x23,0xc6,0xdc, 0xc5,0x2a,0xcb,0xd7, + 0xef,0x15,0xe8,0xe6, 0xe1,0x1c,0xe5,0xed, 0xf3,0x07,0xf2,0xf0, 0xfd,0x0e,0xff,0xfb, + 0xa7,0x79,0xb4,0x92, 0xa9,0x70,0xb9,0x99, 0xbb,0x6b,0xae,0x84, 0xb5,0x62,0xa3,0x8f, + 0x9f,0x5d,0x80,0xbe, 0x91,0x54,0x8d,0xb5, 0x83,0x4f,0x9a,0xa8, 0x8d,0x46,0x97,0xa3 +}; + +static UINT8 U2[256][4]= +{ + 0x00,0x00,0x00,0x00, 0x0b,0x0e,0x09,0x0d, 0x16,0x1c,0x12,0x1a, 0x1d,0x12,0x1b,0x17, + 0x2c,0x38,0x24,0x34, 0x27,0x36,0x2d,0x39, 0x3a,0x24,0x36,0x2e, 0x31,0x2a,0x3f,0x23, + 0x58,0x70,0x48,0x68, 0x53,0x7e,0x41,0x65, 0x4e,0x6c,0x5a,0x72, 0x45,0x62,0x53,0x7f, + 0x74,0x48,0x6c,0x5c, 0x7f,0x46,0x65,0x51, 0x62,0x54,0x7e,0x46, 0x69,0x5a,0x77,0x4b, + 0xb0,0xe0,0x90,0xd0, 0xbb,0xee,0x99,0xdd, 0xa6,0xfc,0x82,0xca, 0xad,0xf2,0x8b,0xc7, + 0x9c,0xd8,0xb4,0xe4, 0x97,0xd6,0xbd,0xe9, 0x8a,0xc4,0xa6,0xfe, 0x81,0xca,0xaf,0xf3, + 0xe8,0x90,0xd8,0xb8, 0xe3,0x9e,0xd1,0xb5, 0xfe,0x8c,0xca,0xa2, 0xf5,0x82,0xc3,0xaf, + 0xc4,0xa8,0xfc,0x8c, 0xcf,0xa6,0xf5,0x81, 0xd2,0xb4,0xee,0x96, 0xd9,0xba,0xe7,0x9b, + 0x7b,0xdb,0x3b,0xbb, 0x70,0xd5,0x32,0xb6, 0x6d,0xc7,0x29,0xa1, 0x66,0xc9,0x20,0xac, + 0x57,0xe3,0x1f,0x8f, 0x5c,0xed,0x16,0x82, 0x41,0xff,0x0d,0x95, 0x4a,0xf1,0x04,0x98, + 0x23,0xab,0x73,0xd3, 0x28,0xa5,0x7a,0xde, 0x35,0xb7,0x61,0xc9, 0x3e,0xb9,0x68,0xc4, + 0x0f,0x93,0x57,0xe7, 0x04,0x9d,0x5e,0xea, 0x19,0x8f,0x45,0xfd, 0x12,0x81,0x4c,0xf0, + 0xcb,0x3b,0xab,0x6b, 0xc0,0x35,0xa2,0x66, 0xdd,0x27,0xb9,0x71, 0xd6,0x29,0xb0,0x7c, + 0xe7,0x03,0x8f,0x5f, 0xec,0x0d,0x86,0x52, 0xf1,0x1f,0x9d,0x45, 0xfa,0x11,0x94,0x48, + 0x93,0x4b,0xe3,0x03, 0x98,0x45,0xea,0x0e, 0x85,0x57,0xf1,0x19, 0x8e,0x59,0xf8,0x14, + 0xbf,0x73,0xc7,0x37, 0xb4,0x7d,0xce,0x3a, 0xa9,0x6f,0xd5,0x2d, 0xa2,0x61,0xdc,0x20, + 0xf6,0xad,0x76,0x6d, 0xfd,0xa3,0x7f,0x60, 0xe0,0xb1,0x64,0x77, 0xeb,0xbf,0x6d,0x7a, + 0xda,0x95,0x52,0x59, 0xd1,0x9b,0x5b,0x54, 0xcc,0x89,0x40,0x43, 0xc7,0x87,0x49,0x4e, + 0xae,0xdd,0x3e,0x05, 0xa5,0xd3,0x37,0x08, 0xb8,0xc1,0x2c,0x1f, 0xb3,0xcf,0x25,0x12, + 0x82,0xe5,0x1a,0x31, 0x89,0xeb,0x13,0x3c, 0x94,0xf9,0x08,0x2b, 0x9f,0xf7,0x01,0x26, + 0x46,0x4d,0xe6,0xbd, 0x4d,0x43,0xef,0xb0, 0x50,0x51,0xf4,0xa7, 0x5b,0x5f,0xfd,0xaa, + 0x6a,0x75,0xc2,0x89, 0x61,0x7b,0xcb,0x84, 0x7c,0x69,0xd0,0x93, 0x77,0x67,0xd9,0x9e, + 0x1e,0x3d,0xae,0xd5, 0x15,0x33,0xa7,0xd8, 0x08,0x21,0xbc,0xcf, 0x03,0x2f,0xb5,0xc2, + 0x32,0x05,0x8a,0xe1, 0x39,0x0b,0x83,0xec, 0x24,0x19,0x98,0xfb, 0x2f,0x17,0x91,0xf6, + 0x8d,0x76,0x4d,0xd6, 0x86,0x78,0x44,0xdb, 0x9b,0x6a,0x5f,0xcc, 0x90,0x64,0x56,0xc1, + 0xa1,0x4e,0x69,0xe2, 0xaa,0x40,0x60,0xef, 0xb7,0x52,0x7b,0xf8, 0xbc,0x5c,0x72,0xf5, + 0xd5,0x06,0x05,0xbe, 0xde,0x08,0x0c,0xb3, 0xc3,0x1a,0x17,0xa4, 0xc8,0x14,0x1e,0xa9, + 0xf9,0x3e,0x21,0x8a, 0xf2,0x30,0x28,0x87, 0xef,0x22,0x33,0x90, 0xe4,0x2c,0x3a,0x9d, + 0x3d,0x96,0xdd,0x06, 0x36,0x98,0xd4,0x0b, 0x2b,0x8a,0xcf,0x1c, 0x20,0x84,0xc6,0x11, + 0x11,0xae,0xf9,0x32, 0x1a,0xa0,0xf0,0x3f, 0x07,0xb2,0xeb,0x28, 0x0c,0xbc,0xe2,0x25, + 0x65,0xe6,0x95,0x6e, 0x6e,0xe8,0x9c,0x63, 0x73,0xfa,0x87,0x74, 0x78,0xf4,0x8e,0x79, + 0x49,0xde,0xb1,0x5a, 0x42,0xd0,0xb8,0x57, 0x5f,0xc2,0xa3,0x40, 0x54,0xcc,0xaa,0x4d, + 0xf7,0x41,0xec,0xda, 0xfc,0x4f,0xe5,0xd7, 0xe1,0x5d,0xfe,0xc0, 0xea,0x53,0xf7,0xcd, + 0xdb,0x79,0xc8,0xee, 0xd0,0x77,0xc1,0xe3, 0xcd,0x65,0xda,0xf4, 0xc6,0x6b,0xd3,0xf9, + 0xaf,0x31,0xa4,0xb2, 0xa4,0x3f,0xad,0xbf, 0xb9,0x2d,0xb6,0xa8, 0xb2,0x23,0xbf,0xa5, + 0x83,0x09,0x80,0x86, 0x88,0x07,0x89,0x8b, 0x95,0x15,0x92,0x9c, 0x9e,0x1b,0x9b,0x91, + 0x47,0xa1,0x7c,0x0a, 0x4c,0xaf,0x75,0x07, 0x51,0xbd,0x6e,0x10, 0x5a,0xb3,0x67,0x1d, + 0x6b,0x99,0x58,0x3e, 0x60,0x97,0x51,0x33, 0x7d,0x85,0x4a,0x24, 0x76,0x8b,0x43,0x29, + 0x1f,0xd1,0x34,0x62, 0x14,0xdf,0x3d,0x6f, 0x09,0xcd,0x26,0x78, 0x02,0xc3,0x2f,0x75, + 0x33,0xe9,0x10,0x56, 0x38,0xe7,0x19,0x5b, 0x25,0xf5,0x02,0x4c, 0x2e,0xfb,0x0b,0x41, + 0x8c,0x9a,0xd7,0x61, 0x87,0x94,0xde,0x6c, 0x9a,0x86,0xc5,0x7b, 0x91,0x88,0xcc,0x76, + 0xa0,0xa2,0xf3,0x55, 0xab,0xac,0xfa,0x58, 0xb6,0xbe,0xe1,0x4f, 0xbd,0xb0,0xe8,0x42, + 0xd4,0xea,0x9f,0x09, 0xdf,0xe4,0x96,0x04, 0xc2,0xf6,0x8d,0x13, 0xc9,0xf8,0x84,0x1e, + 0xf8,0xd2,0xbb,0x3d, 0xf3,0xdc,0xb2,0x30, 0xee,0xce,0xa9,0x27, 0xe5,0xc0,0xa0,0x2a, + 0x3c,0x7a,0x47,0xb1, 0x37,0x74,0x4e,0xbc, 0x2a,0x66,0x55,0xab, 0x21,0x68,0x5c,0xa6, + 0x10,0x42,0x63,0x85, 0x1b,0x4c,0x6a,0x88, 0x06,0x5e,0x71,0x9f, 0x0d,0x50,0x78,0x92, + 0x64,0x0a,0x0f,0xd9, 0x6f,0x04,0x06,0xd4, 0x72,0x16,0x1d,0xc3, 0x79,0x18,0x14,0xce, + 0x48,0x32,0x2b,0xed, 0x43,0x3c,0x22,0xe0, 0x5e,0x2e,0x39,0xf7, 0x55,0x20,0x30,0xfa, + 0x01,0xec,0x9a,0xb7, 0x0a,0xe2,0x93,0xba, 0x17,0xf0,0x88,0xad, 0x1c,0xfe,0x81,0xa0, + 0x2d,0xd4,0xbe,0x83, 0x26,0xda,0xb7,0x8e, 0x3b,0xc8,0xac,0x99, 0x30,0xc6,0xa5,0x94, + 0x59,0x9c,0xd2,0xdf, 0x52,0x92,0xdb,0xd2, 0x4f,0x80,0xc0,0xc5, 0x44,0x8e,0xc9,0xc8, + 0x75,0xa4,0xf6,0xeb, 0x7e,0xaa,0xff,0xe6, 0x63,0xb8,0xe4,0xf1, 0x68,0xb6,0xed,0xfc, + 0xb1,0x0c,0x0a,0x67, 0xba,0x02,0x03,0x6a, 0xa7,0x10,0x18,0x7d, 0xac,0x1e,0x11,0x70, + 0x9d,0x34,0x2e,0x53, 0x96,0x3a,0x27,0x5e, 0x8b,0x28,0x3c,0x49, 0x80,0x26,0x35,0x44, + 0xe9,0x7c,0x42,0x0f, 0xe2,0x72,0x4b,0x02, 0xff,0x60,0x50,0x15, 0xf4,0x6e,0x59,0x18, + 0xc5,0x44,0x66,0x3b, 0xce,0x4a,0x6f,0x36, 0xd3,0x58,0x74,0x21, 0xd8,0x56,0x7d,0x2c, + 0x7a,0x37,0xa1,0x0c, 0x71,0x39,0xa8,0x01, 0x6c,0x2b,0xb3,0x16, 0x67,0x25,0xba,0x1b, + 0x56,0x0f,0x85,0x38, 0x5d,0x01,0x8c,0x35, 0x40,0x13,0x97,0x22, 0x4b,0x1d,0x9e,0x2f, + 0x22,0x47,0xe9,0x64, 0x29,0x49,0xe0,0x69, 0x34,0x5b,0xfb,0x7e, 0x3f,0x55,0xf2,0x73, + 0x0e,0x7f,0xcd,0x50, 0x05,0x71,0xc4,0x5d, 0x18,0x63,0xdf,0x4a, 0x13,0x6d,0xd6,0x47, + 0xca,0xd7,0x31,0xdc, 0xc1,0xd9,0x38,0xd1, 0xdc,0xcb,0x23,0xc6, 0xd7,0xc5,0x2a,0xcb, + 0xe6,0xef,0x15,0xe8, 0xed,0xe1,0x1c,0xe5, 0xf0,0xf3,0x07,0xf2, 0xfb,0xfd,0x0e,0xff, + 0x92,0xa7,0x79,0xb4, 0x99,0xa9,0x70,0xb9, 0x84,0xbb,0x6b,0xae, 0x8f,0xb5,0x62,0xa3, + 0xbe,0x9f,0x5d,0x80, 0xb5,0x91,0x54,0x8d, 0xa8,0x83,0x4f,0x9a, 0xa3,0x8d,0x46,0x97 +}; + +static UINT8 U3[256][4]= +{ + 0x00,0x00,0x00,0x00, 0x0d,0x0b,0x0e,0x09, 0x1a,0x16,0x1c,0x12, 0x17,0x1d,0x12,0x1b, + 0x34,0x2c,0x38,0x24, 0x39,0x27,0x36,0x2d, 0x2e,0x3a,0x24,0x36, 0x23,0x31,0x2a,0x3f, + 0x68,0x58,0x70,0x48, 0x65,0x53,0x7e,0x41, 0x72,0x4e,0x6c,0x5a, 0x7f,0x45,0x62,0x53, + 0x5c,0x74,0x48,0x6c, 0x51,0x7f,0x46,0x65, 0x46,0x62,0x54,0x7e, 0x4b,0x69,0x5a,0x77, + 0xd0,0xb0,0xe0,0x90, 0xdd,0xbb,0xee,0x99, 0xca,0xa6,0xfc,0x82, 0xc7,0xad,0xf2,0x8b, + 0xe4,0x9c,0xd8,0xb4, 0xe9,0x97,0xd6,0xbd, 0xfe,0x8a,0xc4,0xa6, 0xf3,0x81,0xca,0xaf, + 0xb8,0xe8,0x90,0xd8, 0xb5,0xe3,0x9e,0xd1, 0xa2,0xfe,0x8c,0xca, 0xaf,0xf5,0x82,0xc3, + 0x8c,0xc4,0xa8,0xfc, 0x81,0xcf,0xa6,0xf5, 0x96,0xd2,0xb4,0xee, 0x9b,0xd9,0xba,0xe7, + 0xbb,0x7b,0xdb,0x3b, 0xb6,0x70,0xd5,0x32, 0xa1,0x6d,0xc7,0x29, 0xac,0x66,0xc9,0x20, + 0x8f,0x57,0xe3,0x1f, 0x82,0x5c,0xed,0x16, 0x95,0x41,0xff,0x0d, 0x98,0x4a,0xf1,0x04, + 0xd3,0x23,0xab,0x73, 0xde,0x28,0xa5,0x7a, 0xc9,0x35,0xb7,0x61, 0xc4,0x3e,0xb9,0x68, + 0xe7,0x0f,0x93,0x57, 0xea,0x04,0x9d,0x5e, 0xfd,0x19,0x8f,0x45, 0xf0,0x12,0x81,0x4c, + 0x6b,0xcb,0x3b,0xab, 0x66,0xc0,0x35,0xa2, 0x71,0xdd,0x27,0xb9, 0x7c,0xd6,0x29,0xb0, + 0x5f,0xe7,0x03,0x8f, 0x52,0xec,0x0d,0x86, 0x45,0xf1,0x1f,0x9d, 0x48,0xfa,0x11,0x94, + 0x03,0x93,0x4b,0xe3, 0x0e,0x98,0x45,0xea, 0x19,0x85,0x57,0xf1, 0x14,0x8e,0x59,0xf8, + 0x37,0xbf,0x73,0xc7, 0x3a,0xb4,0x7d,0xce, 0x2d,0xa9,0x6f,0xd5, 0x20,0xa2,0x61,0xdc, + 0x6d,0xf6,0xad,0x76, 0x60,0xfd,0xa3,0x7f, 0x77,0xe0,0xb1,0x64, 0x7a,0xeb,0xbf,0x6d, + 0x59,0xda,0x95,0x52, 0x54,0xd1,0x9b,0x5b, 0x43,0xcc,0x89,0x40, 0x4e,0xc7,0x87,0x49, + 0x05,0xae,0xdd,0x3e, 0x08,0xa5,0xd3,0x37, 0x1f,0xb8,0xc1,0x2c, 0x12,0xb3,0xcf,0x25, + 0x31,0x82,0xe5,0x1a, 0x3c,0x89,0xeb,0x13, 0x2b,0x94,0xf9,0x08, 0x26,0x9f,0xf7,0x01, + 0xbd,0x46,0x4d,0xe6, 0xb0,0x4d,0x43,0xef, 0xa7,0x50,0x51,0xf4, 0xaa,0x5b,0x5f,0xfd, + 0x89,0x6a,0x75,0xc2, 0x84,0x61,0x7b,0xcb, 0x93,0x7c,0x69,0xd0, 0x9e,0x77,0x67,0xd9, + 0xd5,0x1e,0x3d,0xae, 0xd8,0x15,0x33,0xa7, 0xcf,0x08,0x21,0xbc, 0xc2,0x03,0x2f,0xb5, + 0xe1,0x32,0x05,0x8a, 0xec,0x39,0x0b,0x83, 0xfb,0x24,0x19,0x98, 0xf6,0x2f,0x17,0x91, + 0xd6,0x8d,0x76,0x4d, 0xdb,0x86,0x78,0x44, 0xcc,0x9b,0x6a,0x5f, 0xc1,0x90,0x64,0x56, + 0xe2,0xa1,0x4e,0x69, 0xef,0xaa,0x40,0x60, 0xf8,0xb7,0x52,0x7b, 0xf5,0xbc,0x5c,0x72, + 0xbe,0xd5,0x06,0x05, 0xb3,0xde,0x08,0x0c, 0xa4,0xc3,0x1a,0x17, 0xa9,0xc8,0x14,0x1e, + 0x8a,0xf9,0x3e,0x21, 0x87,0xf2,0x30,0x28, 0x90,0xef,0x22,0x33, 0x9d,0xe4,0x2c,0x3a, + 0x06,0x3d,0x96,0xdd, 0x0b,0x36,0x98,0xd4, 0x1c,0x2b,0x8a,0xcf, 0x11,0x20,0x84,0xc6, + 0x32,0x11,0xae,0xf9, 0x3f,0x1a,0xa0,0xf0, 0x28,0x07,0xb2,0xeb, 0x25,0x0c,0xbc,0xe2, + 0x6e,0x65,0xe6,0x95, 0x63,0x6e,0xe8,0x9c, 0x74,0x73,0xfa,0x87, 0x79,0x78,0xf4,0x8e, + 0x5a,0x49,0xde,0xb1, 0x57,0x42,0xd0,0xb8, 0x40,0x5f,0xc2,0xa3, 0x4d,0x54,0xcc,0xaa, + 0xda,0xf7,0x41,0xec, 0xd7,0xfc,0x4f,0xe5, 0xc0,0xe1,0x5d,0xfe, 0xcd,0xea,0x53,0xf7, + 0xee,0xdb,0x79,0xc8, 0xe3,0xd0,0x77,0xc1, 0xf4,0xcd,0x65,0xda, 0xf9,0xc6,0x6b,0xd3, + 0xb2,0xaf,0x31,0xa4, 0xbf,0xa4,0x3f,0xad, 0xa8,0xb9,0x2d,0xb6, 0xa5,0xb2,0x23,0xbf, + 0x86,0x83,0x09,0x80, 0x8b,0x88,0x07,0x89, 0x9c,0x95,0x15,0x92, 0x91,0x9e,0x1b,0x9b, + 0x0a,0x47,0xa1,0x7c, 0x07,0x4c,0xaf,0x75, 0x10,0x51,0xbd,0x6e, 0x1d,0x5a,0xb3,0x67, + 0x3e,0x6b,0x99,0x58, 0x33,0x60,0x97,0x51, 0x24,0x7d,0x85,0x4a, 0x29,0x76,0x8b,0x43, + 0x62,0x1f,0xd1,0x34, 0x6f,0x14,0xdf,0x3d, 0x78,0x09,0xcd,0x26, 0x75,0x02,0xc3,0x2f, + 0x56,0x33,0xe9,0x10, 0x5b,0x38,0xe7,0x19, 0x4c,0x25,0xf5,0x02, 0x41,0x2e,0xfb,0x0b, + 0x61,0x8c,0x9a,0xd7, 0x6c,0x87,0x94,0xde, 0x7b,0x9a,0x86,0xc5, 0x76,0x91,0x88,0xcc, + 0x55,0xa0,0xa2,0xf3, 0x58,0xab,0xac,0xfa, 0x4f,0xb6,0xbe,0xe1, 0x42,0xbd,0xb0,0xe8, + 0x09,0xd4,0xea,0x9f, 0x04,0xdf,0xe4,0x96, 0x13,0xc2,0xf6,0x8d, 0x1e,0xc9,0xf8,0x84, + 0x3d,0xf8,0xd2,0xbb, 0x30,0xf3,0xdc,0xb2, 0x27,0xee,0xce,0xa9, 0x2a,0xe5,0xc0,0xa0, + 0xb1,0x3c,0x7a,0x47, 0xbc,0x37,0x74,0x4e, 0xab,0x2a,0x66,0x55, 0xa6,0x21,0x68,0x5c, + 0x85,0x10,0x42,0x63, 0x88,0x1b,0x4c,0x6a, 0x9f,0x06,0x5e,0x71, 0x92,0x0d,0x50,0x78, + 0xd9,0x64,0x0a,0x0f, 0xd4,0x6f,0x04,0x06, 0xc3,0x72,0x16,0x1d, 0xce,0x79,0x18,0x14, + 0xed,0x48,0x32,0x2b, 0xe0,0x43,0x3c,0x22, 0xf7,0x5e,0x2e,0x39, 0xfa,0x55,0x20,0x30, + 0xb7,0x01,0xec,0x9a, 0xba,0x0a,0xe2,0x93, 0xad,0x17,0xf0,0x88, 0xa0,0x1c,0xfe,0x81, + 0x83,0x2d,0xd4,0xbe, 0x8e,0x26,0xda,0xb7, 0x99,0x3b,0xc8,0xac, 0x94,0x30,0xc6,0xa5, + 0xdf,0x59,0x9c,0xd2, 0xd2,0x52,0x92,0xdb, 0xc5,0x4f,0x80,0xc0, 0xc8,0x44,0x8e,0xc9, + 0xeb,0x75,0xa4,0xf6, 0xe6,0x7e,0xaa,0xff, 0xf1,0x63,0xb8,0xe4, 0xfc,0x68,0xb6,0xed, + 0x67,0xb1,0x0c,0x0a, 0x6a,0xba,0x02,0x03, 0x7d,0xa7,0x10,0x18, 0x70,0xac,0x1e,0x11, + 0x53,0x9d,0x34,0x2e, 0x5e,0x96,0x3a,0x27, 0x49,0x8b,0x28,0x3c, 0x44,0x80,0x26,0x35, + 0x0f,0xe9,0x7c,0x42, 0x02,0xe2,0x72,0x4b, 0x15,0xff,0x60,0x50, 0x18,0xf4,0x6e,0x59, + 0x3b,0xc5,0x44,0x66, 0x36,0xce,0x4a,0x6f, 0x21,0xd3,0x58,0x74, 0x2c,0xd8,0x56,0x7d, + 0x0c,0x7a,0x37,0xa1, 0x01,0x71,0x39,0xa8, 0x16,0x6c,0x2b,0xb3, 0x1b,0x67,0x25,0xba, + 0x38,0x56,0x0f,0x85, 0x35,0x5d,0x01,0x8c, 0x22,0x40,0x13,0x97, 0x2f,0x4b,0x1d,0x9e, + 0x64,0x22,0x47,0xe9, 0x69,0x29,0x49,0xe0, 0x7e,0x34,0x5b,0xfb, 0x73,0x3f,0x55,0xf2, + 0x50,0x0e,0x7f,0xcd, 0x5d,0x05,0x71,0xc4, 0x4a,0x18,0x63,0xdf, 0x47,0x13,0x6d,0xd6, + 0xdc,0xca,0xd7,0x31, 0xd1,0xc1,0xd9,0x38, 0xc6,0xdc,0xcb,0x23, 0xcb,0xd7,0xc5,0x2a, + 0xe8,0xe6,0xef,0x15, 0xe5,0xed,0xe1,0x1c, 0xf2,0xf0,0xf3,0x07, 0xff,0xfb,0xfd,0x0e, + 0xb4,0x92,0xa7,0x79, 0xb9,0x99,0xa9,0x70, 0xae,0x84,0xbb,0x6b, 0xa3,0x8f,0xb5,0x62, + 0x80,0xbe,0x9f,0x5d, 0x8d,0xb5,0x91,0x54, 0x9a,0xa8,0x83,0x4f, 0x97,0xa3,0x8d,0x46 +}; + +static UINT8 U4[256][4]= +{ + 0x00,0x00,0x00,0x00, 0x09,0x0d,0x0b,0x0e, 0x12,0x1a,0x16,0x1c, 0x1b,0x17,0x1d,0x12, + 0x24,0x34,0x2c,0x38, 0x2d,0x39,0x27,0x36, 0x36,0x2e,0x3a,0x24, 0x3f,0x23,0x31,0x2a, + 0x48,0x68,0x58,0x70, 0x41,0x65,0x53,0x7e, 0x5a,0x72,0x4e,0x6c, 0x53,0x7f,0x45,0x62, + 0x6c,0x5c,0x74,0x48, 0x65,0x51,0x7f,0x46, 0x7e,0x46,0x62,0x54, 0x77,0x4b,0x69,0x5a, + 0x90,0xd0,0xb0,0xe0, 0x99,0xdd,0xbb,0xee, 0x82,0xca,0xa6,0xfc, 0x8b,0xc7,0xad,0xf2, + 0xb4,0xe4,0x9c,0xd8, 0xbd,0xe9,0x97,0xd6, 0xa6,0xfe,0x8a,0xc4, 0xaf,0xf3,0x81,0xca, + 0xd8,0xb8,0xe8,0x90, 0xd1,0xb5,0xe3,0x9e, 0xca,0xa2,0xfe,0x8c, 0xc3,0xaf,0xf5,0x82, + 0xfc,0x8c,0xc4,0xa8, 0xf5,0x81,0xcf,0xa6, 0xee,0x96,0xd2,0xb4, 0xe7,0x9b,0xd9,0xba, + 0x3b,0xbb,0x7b,0xdb, 0x32,0xb6,0x70,0xd5, 0x29,0xa1,0x6d,0xc7, 0x20,0xac,0x66,0xc9, + 0x1f,0x8f,0x57,0xe3, 0x16,0x82,0x5c,0xed, 0x0d,0x95,0x41,0xff, 0x04,0x98,0x4a,0xf1, + 0x73,0xd3,0x23,0xab, 0x7a,0xde,0x28,0xa5, 0x61,0xc9,0x35,0xb7, 0x68,0xc4,0x3e,0xb9, + 0x57,0xe7,0x0f,0x93, 0x5e,0xea,0x04,0x9d, 0x45,0xfd,0x19,0x8f, 0x4c,0xf0,0x12,0x81, + 0xab,0x6b,0xcb,0x3b, 0xa2,0x66,0xc0,0x35, 0xb9,0x71,0xdd,0x27, 0xb0,0x7c,0xd6,0x29, + 0x8f,0x5f,0xe7,0x03, 0x86,0x52,0xec,0x0d, 0x9d,0x45,0xf1,0x1f, 0x94,0x48,0xfa,0x11, + 0xe3,0x03,0x93,0x4b, 0xea,0x0e,0x98,0x45, 0xf1,0x19,0x85,0x57, 0xf8,0x14,0x8e,0x59, + 0xc7,0x37,0xbf,0x73, 0xce,0x3a,0xb4,0x7d, 0xd5,0x2d,0xa9,0x6f, 0xdc,0x20,0xa2,0x61, + 0x76,0x6d,0xf6,0xad, 0x7f,0x60,0xfd,0xa3, 0x64,0x77,0xe0,0xb1, 0x6d,0x7a,0xeb,0xbf, + 0x52,0x59,0xda,0x95, 0x5b,0x54,0xd1,0x9b, 0x40,0x43,0xcc,0x89, 0x49,0x4e,0xc7,0x87, + 0x3e,0x05,0xae,0xdd, 0x37,0x08,0xa5,0xd3, 0x2c,0x1f,0xb8,0xc1, 0x25,0x12,0xb3,0xcf, + 0x1a,0x31,0x82,0xe5, 0x13,0x3c,0x89,0xeb, 0x08,0x2b,0x94,0xf9, 0x01,0x26,0x9f,0xf7, + 0xe6,0xbd,0x46,0x4d, 0xef,0xb0,0x4d,0x43, 0xf4,0xa7,0x50,0x51, 0xfd,0xaa,0x5b,0x5f, + 0xc2,0x89,0x6a,0x75, 0xcb,0x84,0x61,0x7b, 0xd0,0x93,0x7c,0x69, 0xd9,0x9e,0x77,0x67, + 0xae,0xd5,0x1e,0x3d, 0xa7,0xd8,0x15,0x33, 0xbc,0xcf,0x08,0x21, 0xb5,0xc2,0x03,0x2f, + 0x8a,0xe1,0x32,0x05, 0x83,0xec,0x39,0x0b, 0x98,0xfb,0x24,0x19, 0x91,0xf6,0x2f,0x17, + 0x4d,0xd6,0x8d,0x76, 0x44,0xdb,0x86,0x78, 0x5f,0xcc,0x9b,0x6a, 0x56,0xc1,0x90,0x64, + 0x69,0xe2,0xa1,0x4e, 0x60,0xef,0xaa,0x40, 0x7b,0xf8,0xb7,0x52, 0x72,0xf5,0xbc,0x5c, + 0x05,0xbe,0xd5,0x06, 0x0c,0xb3,0xde,0x08, 0x17,0xa4,0xc3,0x1a, 0x1e,0xa9,0xc8,0x14, + 0x21,0x8a,0xf9,0x3e, 0x28,0x87,0xf2,0x30, 0x33,0x90,0xef,0x22, 0x3a,0x9d,0xe4,0x2c, + 0xdd,0x06,0x3d,0x96, 0xd4,0x0b,0x36,0x98, 0xcf,0x1c,0x2b,0x8a, 0xc6,0x11,0x20,0x84, + 0xf9,0x32,0x11,0xae, 0xf0,0x3f,0x1a,0xa0, 0xeb,0x28,0x07,0xb2, 0xe2,0x25,0x0c,0xbc, + 0x95,0x6e,0x65,0xe6, 0x9c,0x63,0x6e,0xe8, 0x87,0x74,0x73,0xfa, 0x8e,0x79,0x78,0xf4, + 0xb1,0x5a,0x49,0xde, 0xb8,0x57,0x42,0xd0, 0xa3,0x40,0x5f,0xc2, 0xaa,0x4d,0x54,0xcc, + 0xec,0xda,0xf7,0x41, 0xe5,0xd7,0xfc,0x4f, 0xfe,0xc0,0xe1,0x5d, 0xf7,0xcd,0xea,0x53, + 0xc8,0xee,0xdb,0x79, 0xc1,0xe3,0xd0,0x77, 0xda,0xf4,0xcd,0x65, 0xd3,0xf9,0xc6,0x6b, + 0xa4,0xb2,0xaf,0x31, 0xad,0xbf,0xa4,0x3f, 0xb6,0xa8,0xb9,0x2d, 0xbf,0xa5,0xb2,0x23, + 0x80,0x86,0x83,0x09, 0x89,0x8b,0x88,0x07, 0x92,0x9c,0x95,0x15, 0x9b,0x91,0x9e,0x1b, + 0x7c,0x0a,0x47,0xa1, 0x75,0x07,0x4c,0xaf, 0x6e,0x10,0x51,0xbd, 0x67,0x1d,0x5a,0xb3, + 0x58,0x3e,0x6b,0x99, 0x51,0x33,0x60,0x97, 0x4a,0x24,0x7d,0x85, 0x43,0x29,0x76,0x8b, + 0x34,0x62,0x1f,0xd1, 0x3d,0x6f,0x14,0xdf, 0x26,0x78,0x09,0xcd, 0x2f,0x75,0x02,0xc3, + 0x10,0x56,0x33,0xe9, 0x19,0x5b,0x38,0xe7, 0x02,0x4c,0x25,0xf5, 0x0b,0x41,0x2e,0xfb, + 0xd7,0x61,0x8c,0x9a, 0xde,0x6c,0x87,0x94, 0xc5,0x7b,0x9a,0x86, 0xcc,0x76,0x91,0x88, + 0xf3,0x55,0xa0,0xa2, 0xfa,0x58,0xab,0xac, 0xe1,0x4f,0xb6,0xbe, 0xe8,0x42,0xbd,0xb0, + 0x9f,0x09,0xd4,0xea, 0x96,0x04,0xdf,0xe4, 0x8d,0x13,0xc2,0xf6, 0x84,0x1e,0xc9,0xf8, + 0xbb,0x3d,0xf8,0xd2, 0xb2,0x30,0xf3,0xdc, 0xa9,0x27,0xee,0xce, 0xa0,0x2a,0xe5,0xc0, + 0x47,0xb1,0x3c,0x7a, 0x4e,0xbc,0x37,0x74, 0x55,0xab,0x2a,0x66, 0x5c,0xa6,0x21,0x68, + 0x63,0x85,0x10,0x42, 0x6a,0x88,0x1b,0x4c, 0x71,0x9f,0x06,0x5e, 0x78,0x92,0x0d,0x50, + 0x0f,0xd9,0x64,0x0a, 0x06,0xd4,0x6f,0x04, 0x1d,0xc3,0x72,0x16, 0x14,0xce,0x79,0x18, + 0x2b,0xed,0x48,0x32, 0x22,0xe0,0x43,0x3c, 0x39,0xf7,0x5e,0x2e, 0x30,0xfa,0x55,0x20, + 0x9a,0xb7,0x01,0xec, 0x93,0xba,0x0a,0xe2, 0x88,0xad,0x17,0xf0, 0x81,0xa0,0x1c,0xfe, + 0xbe,0x83,0x2d,0xd4, 0xb7,0x8e,0x26,0xda, 0xac,0x99,0x3b,0xc8, 0xa5,0x94,0x30,0xc6, + 0xd2,0xdf,0x59,0x9c, 0xdb,0xd2,0x52,0x92, 0xc0,0xc5,0x4f,0x80, 0xc9,0xc8,0x44,0x8e, + 0xf6,0xeb,0x75,0xa4, 0xff,0xe6,0x7e,0xaa, 0xe4,0xf1,0x63,0xb8, 0xed,0xfc,0x68,0xb6, + 0x0a,0x67,0xb1,0x0c, 0x03,0x6a,0xba,0x02, 0x18,0x7d,0xa7,0x10, 0x11,0x70,0xac,0x1e, + 0x2e,0x53,0x9d,0x34, 0x27,0x5e,0x96,0x3a, 0x3c,0x49,0x8b,0x28, 0x35,0x44,0x80,0x26, + 0x42,0x0f,0xe9,0x7c, 0x4b,0x02,0xe2,0x72, 0x50,0x15,0xff,0x60, 0x59,0x18,0xf4,0x6e, + 0x66,0x3b,0xc5,0x44, 0x6f,0x36,0xce,0x4a, 0x74,0x21,0xd3,0x58, 0x7d,0x2c,0xd8,0x56, + 0xa1,0x0c,0x7a,0x37, 0xa8,0x01,0x71,0x39, 0xb3,0x16,0x6c,0x2b, 0xba,0x1b,0x67,0x25, + 0x85,0x38,0x56,0x0f, 0x8c,0x35,0x5d,0x01, 0x97,0x22,0x40,0x13, 0x9e,0x2f,0x4b,0x1d, + 0xe9,0x64,0x22,0x47, 0xe0,0x69,0x29,0x49, 0xfb,0x7e,0x34,0x5b, 0xf2,0x73,0x3f,0x55, + 0xcd,0x50,0x0e,0x7f, 0xc4,0x5d,0x05,0x71, 0xdf,0x4a,0x18,0x63, 0xd6,0x47,0x13,0x6d, + 0x31,0xdc,0xca,0xd7, 0x38,0xd1,0xc1,0xd9, 0x23,0xc6,0xdc,0xcb, 0x2a,0xcb,0xd7,0xc5, + 0x15,0xe8,0xe6,0xef, 0x1c,0xe5,0xed,0xe1, 0x07,0xf2,0xf0,0xf3, 0x0e,0xff,0xfb,0xfd, + 0x79,0xb4,0x92,0xa7, 0x70,0xb9,0x99,0xa9, 0x6b,0xae,0x84,0xbb, 0x62,0xa3,0x8f,0xb5, + 0x5d,0x80,0xbe,0x9f, 0x54,0x8d,0xb5,0x91, 0x4f,0x9a,0xa8,0x83, 0x46,0x97,0xa3,0x8d +}; + +static UINT32 rcon[30]= +{ + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, + 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, + 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, + 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 +}; + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// API +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Rijndael::Rijndael() +{ + m_state = Invalid; +} + +Rijndael::~Rijndael() +{ + // nothing here +} + +int Rijndael::init(Mode mode,Direction dir,const UINT8 * key,KeyLength keyLen,UINT8 * initVector) +{ + // Not initialized yet + m_state = Invalid; + + // Check the mode + if((mode != CBC) && (mode != ECB) && (mode != CFB1))return RIJNDAEL_UNSUPPORTED_MODE; + m_mode = mode; + + // And the direction + if((dir != Encrypt) && (dir != Decrypt))return RIJNDAEL_UNSUPPORTED_DIRECTION; + m_direction = dir; + + // Allow to set an init vector + if(initVector) + { + // specified init vector + for(int i = 0;i < MAX_IV_SIZE;i++) + { + m_initVector[i] = initVector[i]; + } + } else { + // zero init vector + for(int i = 0;i < MAX_IV_SIZE;i++) + { + m_initVector[i] = 0; + } + } + + UINT32 uKeyLenInBytes; + + // And check the key length + switch(keyLen) + { + case Key16Bytes: + uKeyLenInBytes = 16; + m_uRounds = 10; + break; + case Key24Bytes: + uKeyLenInBytes = 24; + m_uRounds = 12; + break; + case Key32Bytes: + uKeyLenInBytes = 32; + m_uRounds = 14; + break; + default: + return RIJNDAEL_UNSUPPORTED_KEY_LENGTH; + break; + } + // The number of rounds is calculated as + // m_uRounds = (m_uKeyLenInBits / 32) + 6; + + if(!key)return RIJNDAEL_BAD_KEY; + + UINT8 keyMatrix[_MAX_KEY_COLUMNS][4]; + + for(UINT32 i = 0;i < uKeyLenInBytes;i++)keyMatrix[i >> 2][i & 3] = key[i]; + + keySched(keyMatrix); + + if(m_direction == Decrypt)keyEncToDec(); + + m_state = Valid; + + return RIJNDAEL_SUCCESS; +} + +int Rijndael::blockEncrypt(const UINT8 *input,int inputLen,UINT8 *outBuffer) +{ + int i, k, numBlocks; + UINT8 block[16], iv[4][4]; + + if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED; + if(m_direction != Encrypt)return RIJNDAEL_BAD_DIRECTION; + + if(input == 0 || inputLen <= 0)return 0; + + numBlocks = inputLen/128; + + switch(m_mode){ + case ECB: + for(i = numBlocks;i > 0;i--) + { + encrypt(input,outBuffer); + input += 16; + outBuffer += 16; + } + break; + case CBC: + ((UINT32*)block)[0] = ((UINT32*)m_initVector)[0] ^ ((UINT32*)input)[0]; + ((UINT32*)block)[1] = ((UINT32*)m_initVector)[1] ^ ((UINT32*)input)[1]; + ((UINT32*)block)[2] = ((UINT32*)m_initVector)[2] ^ ((UINT32*)input)[2]; + ((UINT32*)block)[3] = ((UINT32*)m_initVector)[3] ^ ((UINT32*)input)[3]; + encrypt(block,outBuffer); + input += 16; + for(i = numBlocks - 1;i > 0;i--) + { + ((UINT32*)block)[0] = ((UINT32*)outBuffer)[0] ^ ((UINT32*)input)[0]; + ((UINT32*)block)[1] = ((UINT32*)outBuffer)[1] ^ ((UINT32*)input)[1]; + ((UINT32*)block)[2] = ((UINT32*)outBuffer)[2] ^ ((UINT32*)input)[2]; + ((UINT32*)block)[3] = ((UINT32*)outBuffer)[3] ^ ((UINT32*)input)[3]; + outBuffer += 16; + encrypt(block,outBuffer); + input += 16; + } + break; + case CFB1: +#if STRICT_ALIGN + memcpy(iv,m_initVector,16); +#else /* !STRICT_ALIGN */ + *((UINT32*)iv[0]) = *((UINT32*)(m_initVector )); + *((UINT32*)iv[1]) = *((UINT32*)(m_initVector + 4)); + *((UINT32*)iv[2]) = *((UINT32*)(m_initVector + 8)); + *((UINT32*)iv[3]) = *((UINT32*)(m_initVector +12)); +#endif /* ?STRICT_ALIGN */ + for(i = numBlocks; i > 0; i--) + { + for(k = 0; k < 128; k++) + { + *((UINT32*) block ) = *((UINT32*)iv[0]); + *((UINT32*)(block+ 4)) = *((UINT32*)iv[1]); + *((UINT32*)(block+ 8)) = *((UINT32*)iv[2]); + *((UINT32*)(block+12)) = *((UINT32*)iv[3]); + encrypt(block,block); + outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7); + iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7); + iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7); + iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7); + iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7); + iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7); + iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7); + iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7); + iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7); + iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7); + iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7); + iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7); + iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7); + iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7); + iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7); + iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7); + iv[3][3] = (iv[3][3] << 1) | (outBuffer[k/8] >> (7-(k&7))) & 1; + } + } + break; + default: + return -1; + break; + } + + return 128 * numBlocks; +} + +int Rijndael::padEncrypt(const UINT8 *input, int inputOctets, UINT8 *outBuffer) +{ + int i, numBlocks, padLen; + UINT8 block[16], *iv; + + if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED; + if(m_direction != Encrypt)return RIJNDAEL_NOT_INITIALIZED; + + if(input == 0 || inputOctets <= 0)return 0; + + numBlocks = inputOctets/16; + + switch(m_mode) + { + case ECB: + for(i = numBlocks; i > 0; i--) + { + encrypt(input, outBuffer); + input += 16; + outBuffer += 16; + } + padLen = 16 - (inputOctets - 16*numBlocks); +// assert(padLen > 0 && padLen <= 16); + memcpy(block, input, 16 - padLen); + memset(block + 16 - padLen, padLen, padLen); + encrypt(block,outBuffer); + break; + case CBC: + iv = m_initVector; + for(i = numBlocks; i > 0; i--) + { + ((UINT32*)block)[0] = ((UINT32*)input)[0] ^ ((UINT32*)iv)[0]; + ((UINT32*)block)[1] = ((UINT32*)input)[1] ^ ((UINT32*)iv)[1]; + ((UINT32*)block)[2] = ((UINT32*)input)[2] ^ ((UINT32*)iv)[2]; + ((UINT32*)block)[3] = ((UINT32*)input)[3] ^ ((UINT32*)iv)[3]; + encrypt(block, outBuffer); + iv = outBuffer; + input += 16; + outBuffer += 16; + } + padLen = 16 - (inputOctets - 16*numBlocks); +// assert(padLen > 0 && padLen <= 16); // DO SOMETHING HERE ? + for (i = 0; i < 16 - padLen; i++) { + block[i] = input[i] ^ iv[i]; + } + for (i = 16 - padLen; i < 16; i++) { + block[i] = (UINT8)padLen ^ iv[i]; + } + encrypt(block,outBuffer); + break; + default: + return -1; + break; + } + + return 16*(numBlocks + 1); +} + +int Rijndael::blockDecrypt(const UINT8 *input, int inputLen, UINT8 *outBuffer) +{ + int i, k, numBlocks; + UINT8 block[16], iv[4][4]; + + if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED; + if((m_mode != CFB1) && (m_direction == Encrypt))return RIJNDAEL_BAD_DIRECTION; + + if (input == 0 || inputLen <= 0)return 0; + + numBlocks = inputLen/128; + + switch(m_mode) + { + case ECB: + for (i = numBlocks; i > 0; i--) + { + decrypt(input,outBuffer); + input += 16; + outBuffer += 16; + } + break; + case CBC: +#if STRICT_ALIGN + memcpy(iv,m_initVector,16); +#else + *((UINT32*)iv[0]) = *((UINT32*)(m_initVector )); + *((UINT32*)iv[1]) = *((UINT32*)(m_initVector+ 4)); + *((UINT32*)iv[2]) = *((UINT32*)(m_initVector+ 8)); + *((UINT32*)iv[3]) = *((UINT32*)(m_initVector+12)); +#endif + for (i = numBlocks; i > 0; i--) + { + decrypt(input, block); + ((UINT32*)block)[0] ^= *((UINT32*)iv[0]); + ((UINT32*)block)[1] ^= *((UINT32*)iv[1]); + ((UINT32*)block)[2] ^= *((UINT32*)iv[2]); + ((UINT32*)block)[3] ^= *((UINT32*)iv[3]); +#if STRICT_ALIGN + memcpy(iv, input, 16); + memcpy(outBuf, block, 16); +#else + *((UINT32*)iv[0]) = ((UINT32*)input)[0]; ((UINT32*)outBuffer)[0] = ((UINT32*)block)[0]; + *((UINT32*)iv[1]) = ((UINT32*)input)[1]; ((UINT32*)outBuffer)[1] = ((UINT32*)block)[1]; + *((UINT32*)iv[2]) = ((UINT32*)input)[2]; ((UINT32*)outBuffer)[2] = ((UINT32*)block)[2]; + *((UINT32*)iv[3]) = ((UINT32*)input)[3]; ((UINT32*)outBuffer)[3] = ((UINT32*)block)[3]; +#endif + input += 16; + outBuffer += 16; + } + break; + case CFB1: +#if STRICT_ALIGN + memcpy(iv, m_initVector, 16); +#else + *((UINT32*)iv[0]) = *((UINT32*)(m_initVector)); + *((UINT32*)iv[1]) = *((UINT32*)(m_initVector+ 4)); + *((UINT32*)iv[2]) = *((UINT32*)(m_initVector+ 8)); + *((UINT32*)iv[3]) = *((UINT32*)(m_initVector+12)); +#endif + for(i = numBlocks; i > 0; i--) + { + for(k = 0; k < 128; k++) + { + *((UINT32*) block ) = *((UINT32*)iv[0]); + *((UINT32*)(block+ 4)) = *((UINT32*)iv[1]); + *((UINT32*)(block+ 8)) = *((UINT32*)iv[2]); + *((UINT32*)(block+12)) = *((UINT32*)iv[3]); + encrypt(block, block); + iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7); + iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7); + iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7); + iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7); + iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7); + iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7); + iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7); + iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7); + iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7); + iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7); + iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7); + iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7); + iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7); + iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7); + iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7); + iv[3][3] = (iv[3][3] << 1) | (input[k/8] >> (7-(k&7))) & 1; + outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7); + } + } + break; + default: + return -1; + break; + } + + return 128*numBlocks; +} + +int Rijndael::padDecrypt(const UINT8 *input, int inputOctets, UINT8 *outBuffer) +{ + int i, numBlocks, padLen; + UINT8 block[16]; + UINT32 iv[4]; + + if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED; + if(m_direction != Decrypt)return RIJNDAEL_BAD_DIRECTION; + + if(input == 0 || inputOctets <= 0)return 0; + + if((inputOctets % 16) != 0)return RIJNDAEL_CORRUPTED_DATA; + + numBlocks = inputOctets/16; + + switch(m_mode){ + case ECB: + for (i = numBlocks - 1; i > 0; i--) + { + decrypt(input, outBuffer); + input += 16; + outBuffer += 16; + } + + decrypt(input, block); + padLen = block[15]; + if (padLen >= 16)return RIJNDAEL_CORRUPTED_DATA; + for(i = 16 - padLen; i < 16; i++) + { + if(block[i] != padLen)return RIJNDAEL_CORRUPTED_DATA; + } + memcpy(outBuffer, block, 16 - padLen); + break; + case CBC: + memcpy(iv, m_initVector, 16); + /* all blocks but last */ + for (i = numBlocks - 1; i > 0; i--) + { + decrypt(input, block); + ((UINT32*)block)[0] ^= iv[0]; + ((UINT32*)block)[1] ^= iv[1]; + ((UINT32*)block)[2] ^= iv[2]; + ((UINT32*)block)[3] ^= iv[3]; + memcpy(iv, input, 16); + memcpy(outBuffer, block, 16); + input += 16; + outBuffer += 16; + } + /* last block */ + decrypt(input, block); + ((UINT32*)block)[0] ^= iv[0]; + ((UINT32*)block)[1] ^= iv[1]; + ((UINT32*)block)[2] ^= iv[2]; + ((UINT32*)block)[3] ^= iv[3]; + padLen = block[15]; + if(padLen <= 0 || padLen > 16)return RIJNDAEL_CORRUPTED_DATA; + for(i = 16 - padLen; i < 16; i++) + { + if(block[i] != padLen)return RIJNDAEL_CORRUPTED_DATA; + } + memcpy(outBuffer, block, 16 - padLen); + break; + + default: + return -1; + break; + } + + return 16*numBlocks - padLen; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ALGORITHM +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +void Rijndael::keySched(UINT8 key[_MAX_KEY_COLUMNS][4]) +{ + int j,rconpointer = 0; + + // Calculate the necessary round keys + // The number of calculations depends on keyBits and blockBits + int uKeyColumns = m_uRounds - 6; + + UINT8 tempKey[_MAX_KEY_COLUMNS][4]; + + // Copy the input key to the temporary key matrix + + for(j = 0;j < uKeyColumns;j++) + { + *((UINT32*)(tempKey[j])) = *((UINT32*)(key[j])); + } + + int r = 0; + int t = 0; + + // copy values into round key array + for(j = 0;(j < uKeyColumns) && (r <= m_uRounds); ) + { + for(;(j < uKeyColumns) && (t < 4); j++, t++) + { + *((UINT32*)m_expandedKey[r][t]) = *((UINT32*)tempKey[j]); + } + + + if(t == 4) + { + r++; + t = 0; + } + } + + while(r <= m_uRounds) + { + tempKey[0][0] ^= S[tempKey[uKeyColumns-1][1]]; + tempKey[0][1] ^= S[tempKey[uKeyColumns-1][2]]; + tempKey[0][2] ^= S[tempKey[uKeyColumns-1][3]]; + tempKey[0][3] ^= S[tempKey[uKeyColumns-1][0]]; + tempKey[0][0] ^= rcon[rconpointer++]; + + if (uKeyColumns != 8) + { + for(j = 1; j < uKeyColumns; j++) + { + *((UINT32*)tempKey[j]) ^= *((UINT32*)tempKey[j-1]); + } + } else { + for(j = 1; j < uKeyColumns/2; j++) + { + *((UINT32*)tempKey[j]) ^= *((UINT32*)tempKey[j-1]); + } + tempKey[uKeyColumns/2][0] ^= S[tempKey[uKeyColumns/2 - 1][0]]; + tempKey[uKeyColumns/2][1] ^= S[tempKey[uKeyColumns/2 - 1][1]]; + tempKey[uKeyColumns/2][2] ^= S[tempKey[uKeyColumns/2 - 1][2]]; + tempKey[uKeyColumns/2][3] ^= S[tempKey[uKeyColumns/2 - 1][3]]; + for(j = uKeyColumns/2 + 1; j < uKeyColumns; j++) + { + *((UINT32*)tempKey[j]) ^= *((UINT32*)tempKey[j-1]); + } + } + for(j = 0; (j < uKeyColumns) && (r <= m_uRounds); ) + { + for(; (j < uKeyColumns) && (t < 4); j++, t++) + { + *((UINT32*)m_expandedKey[r][t]) = *((UINT32*)tempKey[j]); + } + if(t == 4) + { + r++; + t = 0; + } + } + } +} + +void Rijndael::keyEncToDec() +{ + int r; + UINT8 *w; + + for(r = 1; r < m_uRounds; r++) + { + w = m_expandedKey[r][0]; + *((UINT32*)w) = *((UINT32*)U1[w[0]]) ^ *((UINT32*)U2[w[1]]) ^ *((UINT32*)U3[w[2]]) ^ *((UINT32*)U4[w[3]]); + w = m_expandedKey[r][1]; + *((UINT32*)w) = *((UINT32*)U1[w[0]]) ^ *((UINT32*)U2[w[1]]) ^ *((UINT32*)U3[w[2]]) ^ *((UINT32*)U4[w[3]]); + w = m_expandedKey[r][2]; + *((UINT32*)w) = *((UINT32*)U1[w[0]]) ^ *((UINT32*)U2[w[1]]) ^ *((UINT32*)U3[w[2]]) ^ *((UINT32*)U4[w[3]]); + w = m_expandedKey[r][3]; + *((UINT32*)w) = *((UINT32*)U1[w[0]]) ^ *((UINT32*)U2[w[1]]) ^ *((UINT32*)U3[w[2]]) ^ *((UINT32*)U4[w[3]]); + } +} + +void Rijndael::encrypt(const UINT8 a[16], UINT8 b[16]) +{ + int r; + UINT8 temp[4][4]; + + *((UINT32*)temp[0]) = *((UINT32*)(a )) ^ *((UINT32*)m_expandedKey[0][0]); + *((UINT32*)temp[1]) = *((UINT32*)(a+ 4)) ^ *((UINT32*)m_expandedKey[0][1]); + *((UINT32*)temp[2]) = *((UINT32*)(a+ 8)) ^ *((UINT32*)m_expandedKey[0][2]); + *((UINT32*)temp[3]) = *((UINT32*)(a+12)) ^ *((UINT32*)m_expandedKey[0][3]); + *((UINT32*)(b )) = *((UINT32*)T1[temp[0][0]]) + ^ *((UINT32*)T2[temp[1][1]]) + ^ *((UINT32*)T3[temp[2][2]]) + ^ *((UINT32*)T4[temp[3][3]]); + *((UINT32*)(b + 4)) = *((UINT32*)T1[temp[1][0]]) + ^ *((UINT32*)T2[temp[2][1]]) + ^ *((UINT32*)T3[temp[3][2]]) + ^ *((UINT32*)T4[temp[0][3]]); + *((UINT32*)(b + 8)) = *((UINT32*)T1[temp[2][0]]) + ^ *((UINT32*)T2[temp[3][1]]) + ^ *((UINT32*)T3[temp[0][2]]) + ^ *((UINT32*)T4[temp[1][3]]); + *((UINT32*)(b +12)) = *((UINT32*)T1[temp[3][0]]) + ^ *((UINT32*)T2[temp[0][1]]) + ^ *((UINT32*)T3[temp[1][2]]) + ^ *((UINT32*)T4[temp[2][3]]); + for(r = 1; r < m_uRounds-1; r++) + { + *((UINT32*)temp[0]) = *((UINT32*)(b )) ^ *((UINT32*)m_expandedKey[r][0]); + *((UINT32*)temp[1]) = *((UINT32*)(b+ 4)) ^ *((UINT32*)m_expandedKey[r][1]); + *((UINT32*)temp[2]) = *((UINT32*)(b+ 8)) ^ *((UINT32*)m_expandedKey[r][2]); + *((UINT32*)temp[3]) = *((UINT32*)(b+12)) ^ *((UINT32*)m_expandedKey[r][3]); + + *((UINT32*)(b )) = *((UINT32*)T1[temp[0][0]]) + ^ *((UINT32*)T2[temp[1][1]]) + ^ *((UINT32*)T3[temp[2][2]]) + ^ *((UINT32*)T4[temp[3][3]]); + *((UINT32*)(b + 4)) = *((UINT32*)T1[temp[1][0]]) + ^ *((UINT32*)T2[temp[2][1]]) + ^ *((UINT32*)T3[temp[3][2]]) + ^ *((UINT32*)T4[temp[0][3]]); + *((UINT32*)(b + 8)) = *((UINT32*)T1[temp[2][0]]) + ^ *((UINT32*)T2[temp[3][1]]) + ^ *((UINT32*)T3[temp[0][2]]) + ^ *((UINT32*)T4[temp[1][3]]); + *((UINT32*)(b +12)) = *((UINT32*)T1[temp[3][0]]) + ^ *((UINT32*)T2[temp[0][1]]) + ^ *((UINT32*)T3[temp[1][2]]) + ^ *((UINT32*)T4[temp[2][3]]); + } + *((UINT32*)temp[0]) = *((UINT32*)(b )) ^ *((UINT32*)m_expandedKey[m_uRounds-1][0]); + *((UINT32*)temp[1]) = *((UINT32*)(b+ 4)) ^ *((UINT32*)m_expandedKey[m_uRounds-1][1]); + *((UINT32*)temp[2]) = *((UINT32*)(b+ 8)) ^ *((UINT32*)m_expandedKey[m_uRounds-1][2]); + *((UINT32*)temp[3]) = *((UINT32*)(b+12)) ^ *((UINT32*)m_expandedKey[m_uRounds-1][3]); + b[ 0] = T1[temp[0][0]][1]; + b[ 1] = T1[temp[1][1]][1]; + b[ 2] = T1[temp[2][2]][1]; + b[ 3] = T1[temp[3][3]][1]; + b[ 4] = T1[temp[1][0]][1]; + b[ 5] = T1[temp[2][1]][1]; + b[ 6] = T1[temp[3][2]][1]; + b[ 7] = T1[temp[0][3]][1]; + b[ 8] = T1[temp[2][0]][1]; + b[ 9] = T1[temp[3][1]][1]; + b[10] = T1[temp[0][2]][1]; + b[11] = T1[temp[1][3]][1]; + b[12] = T1[temp[3][0]][1]; + b[13] = T1[temp[0][1]][1]; + b[14] = T1[temp[1][2]][1]; + b[15] = T1[temp[2][3]][1]; + *((UINT32*)(b )) ^= *((UINT32*)m_expandedKey[m_uRounds][0]); + *((UINT32*)(b+ 4)) ^= *((UINT32*)m_expandedKey[m_uRounds][1]); + *((UINT32*)(b+ 8)) ^= *((UINT32*)m_expandedKey[m_uRounds][2]); + *((UINT32*)(b+12)) ^= *((UINT32*)m_expandedKey[m_uRounds][3]); +} + +void Rijndael::decrypt(const UINT8 a[16], UINT8 b[16]) +{ + int r; + UINT8 temp[4][4]; + + *((UINT32*)temp[0]) = *((UINT32*)(a )) ^ *((UINT32*)m_expandedKey[m_uRounds][0]); + *((UINT32*)temp[1]) = *((UINT32*)(a+ 4)) ^ *((UINT32*)m_expandedKey[m_uRounds][1]); + *((UINT32*)temp[2]) = *((UINT32*)(a+ 8)) ^ *((UINT32*)m_expandedKey[m_uRounds][2]); + *((UINT32*)temp[3]) = *((UINT32*)(a+12)) ^ *((UINT32*)m_expandedKey[m_uRounds][3]); + + *((UINT32*)(b )) = *((UINT32*)T5[temp[0][0]]) + ^ *((UINT32*)T6[temp[3][1]]) + ^ *((UINT32*)T7[temp[2][2]]) + ^ *((UINT32*)T8[temp[1][3]]); + *((UINT32*)(b+ 4)) = *((UINT32*)T5[temp[1][0]]) + ^ *((UINT32*)T6[temp[0][1]]) + ^ *((UINT32*)T7[temp[3][2]]) + ^ *((UINT32*)T8[temp[2][3]]); + *((UINT32*)(b+ 8)) = *((UINT32*)T5[temp[2][0]]) + ^ *((UINT32*)T6[temp[1][1]]) + ^ *((UINT32*)T7[temp[0][2]]) + ^ *((UINT32*)T8[temp[3][3]]); + *((UINT32*)(b+12)) = *((UINT32*)T5[temp[3][0]]) + ^ *((UINT32*)T6[temp[2][1]]) + ^ *((UINT32*)T7[temp[1][2]]) + ^ *((UINT32*)T8[temp[0][3]]); + for(r = m_uRounds-1; r > 1; r--) + { + *((UINT32*)temp[0]) = *((UINT32*)(b )) ^ *((UINT32*)m_expandedKey[r][0]); + *((UINT32*)temp[1]) = *((UINT32*)(b+ 4)) ^ *((UINT32*)m_expandedKey[r][1]); + *((UINT32*)temp[2]) = *((UINT32*)(b+ 8)) ^ *((UINT32*)m_expandedKey[r][2]); + *((UINT32*)temp[3]) = *((UINT32*)(b+12)) ^ *((UINT32*)m_expandedKey[r][3]); + *((UINT32*)(b )) = *((UINT32*)T5[temp[0][0]]) + ^ *((UINT32*)T6[temp[3][1]]) + ^ *((UINT32*)T7[temp[2][2]]) + ^ *((UINT32*)T8[temp[1][3]]); + *((UINT32*)(b+ 4)) = *((UINT32*)T5[temp[1][0]]) + ^ *((UINT32*)T6[temp[0][1]]) + ^ *((UINT32*)T7[temp[3][2]]) + ^ *((UINT32*)T8[temp[2][3]]); + *((UINT32*)(b+ 8)) = *((UINT32*)T5[temp[2][0]]) + ^ *((UINT32*)T6[temp[1][1]]) + ^ *((UINT32*)T7[temp[0][2]]) + ^ *((UINT32*)T8[temp[3][3]]); + *((UINT32*)(b+12)) = *((UINT32*)T5[temp[3][0]]) + ^ *((UINT32*)T6[temp[2][1]]) + ^ *((UINT32*)T7[temp[1][2]]) + ^ *((UINT32*)T8[temp[0][3]]); + } + + *((UINT32*)temp[0]) = *((UINT32*)(b )) ^ *((UINT32*)m_expandedKey[1][0]); + *((UINT32*)temp[1]) = *((UINT32*)(b+ 4)) ^ *((UINT32*)m_expandedKey[1][1]); + *((UINT32*)temp[2]) = *((UINT32*)(b+ 8)) ^ *((UINT32*)m_expandedKey[1][2]); + *((UINT32*)temp[3]) = *((UINT32*)(b+12)) ^ *((UINT32*)m_expandedKey[1][3]); + b[ 0] = S5[temp[0][0]]; + b[ 1] = S5[temp[3][1]]; + b[ 2] = S5[temp[2][2]]; + b[ 3] = S5[temp[1][3]]; + b[ 4] = S5[temp[1][0]]; + b[ 5] = S5[temp[0][1]]; + b[ 6] = S5[temp[3][2]]; + b[ 7] = S5[temp[2][3]]; + b[ 8] = S5[temp[2][0]]; + b[ 9] = S5[temp[1][1]]; + b[10] = S5[temp[0][2]]; + b[11] = S5[temp[3][3]]; + b[12] = S5[temp[3][0]]; + b[13] = S5[temp[2][1]]; + b[14] = S5[temp[1][2]]; + b[15] = S5[temp[0][3]]; + *((UINT32*)(b )) ^= *((UINT32*)m_expandedKey[0][0]); + *((UINT32*)(b+ 4)) ^= *((UINT32*)m_expandedKey[0][1]); + *((UINT32*)(b+ 8)) ^= *((UINT32*)m_expandedKey[0][2]); + *((UINT32*)(b+12)) ^= *((UINT32*)m_expandedKey[0][3]); +} diff --git a/rijndael.h b/rijndael.h new file mode 100644 index 0000000..8d6dd43 --- /dev/null +++ b/rijndael.h @@ -0,0 +1,163 @@ +#ifndef _RIJNDAEL_H_ +#define _RIJNDAEL_H_ + +// +// File : rijndael.h +// Creation date : Sun Nov 5 2000 03:21:05 CEST +// Author : Szymon Stefanek (stefanek@tin.it) +// +// Another implementation of the Rijndael cipher. +// This is intended to be an easily usable library file. +// This code is public domain. +// Based on the Vincent Rijmen and K.U.Leuven implementation 2.4. +// + +// +// Original Copyright notice: +// +// rijndael-alg-fst.c v2.4 April '2000 +// rijndael-alg-fst.h +// rijndael-api-fst.c +// rijndael-api-fst.h +// +// Optimised ANSI C code +// +// authors: v1.0: Antoon Bosselaers +// v2.0: Vincent Rijmen, K.U.Leuven +// v2.3: Paulo Barreto +// v2.4: Vincent Rijmen, K.U.Leuven +// +// This code is placed in the public domain. +// + +// +// This implementation works on 128 , 192 , 256 bit keys +// and on 128 bit blocks +// + +// +// Example of usage: +// +// // Input data +// unsigned char key[32]; // The key +// initializeYour256BitKey(); // Obviously initialized with sth +// const unsigned char * plainText = getYourPlainText(); // Your plain text +// int plainTextLen = strlen(plainText); // Plain text length +// +// // Encrypting +// Rijndael rin; +// unsigned char output[plainTextLen + 16]; +// +// rin.init(Rijndael::CBC,Rijndael::Encrypt,key,Rijndael::Key32Bytes); +// // It is a good idea to check the error code +// int len = rin.padEncrypt(plainText,len,output); +// if(len >= 0)useYourEncryptedText(); +// else encryptError(len); +// +// // Decrypting: we can reuse the same object +// unsigned char output2[len]; +// rin.init(Rijndael::CBC,Rijndael::Decrypt,key,Rijndael::Key32Bytes)); +// len = rin.padDecrypt(output,len,output2); +// if(len >= 0)useYourDecryptedText(); +// else decryptError(len); +// + +extern "C" { +#include +#include +#include +} + +#define _MAX_KEY_COLUMNS (256/32) +#define _MAX_ROUNDS 14 +#define MAX_IV_SIZE 16 + +// We assume that unsigned int is 32 bits long.... +typedef unsigned char UINT8; +typedef unsigned int UINT32; +typedef unsigned short UINT16; + +// Error codes +#define RIJNDAEL_SUCCESS 0 +#define RIJNDAEL_UNSUPPORTED_MODE -1 +#define RIJNDAEL_UNSUPPORTED_DIRECTION -2 +#define RIJNDAEL_UNSUPPORTED_KEY_LENGTH -3 +#define RIJNDAEL_BAD_KEY -4 +#define RIJNDAEL_NOT_INITIALIZED -5 +#define RIJNDAEL_BAD_DIRECTION -6 +#define RIJNDAEL_CORRUPTED_DATA -7 + +class Rijndael +{ +public: + enum Direction { Encrypt , Decrypt }; + enum Mode { ECB , CBC , CFB1 }; + enum KeyLength { Key16Bytes , Key24Bytes , Key32Bytes }; + // + // Creates a Rijndael cipher object + // You have to call init() before you can encrypt or decrypt stuff + // + Rijndael(); + ~Rijndael(); +protected: + // Internal stuff + enum State { Valid , Invalid }; + + State m_state; + Mode m_mode; + Direction m_direction; + UINT8 m_initVector[MAX_IV_SIZE]; + UINT32 m_uRounds; + UINT8 m_expandedKey[_MAX_ROUNDS+1][4][4]; +public: + ////////////////////////////////////////////////////////////////////////////////////////// + // API + ////////////////////////////////////////////////////////////////////////////////////////// + + // init(): Initializes the crypt session + // Returns RIJNDAEL_SUCCESS or an error code + // mode : Rijndael::ECB, Rijndael::CBC or Rijndael::CFB1 + // You have to use the same mode for encrypting and decrypting + // dir : Rijndael::Encrypt or Rijndael::Decrypt + // A cipher instance works only in one direction + // (Well , it could be easily modified to work in both + // directions with a single init() call, but it looks + // useless to me...anyway , it is a matter of generating + // two expanded keys) + // key : array of unsigned octets , it can be 16 , 24 or 32 bytes long + // this CAN be binary data (it is not expected to be null terminated) + // keyLen : Rijndael::Key16Bytes , Rijndael::Key24Bytes or Rijndael::Key32Bytes + // initVector: initialization vector, you will usually use 0 here + int init(Mode mode,Direction dir,const UINT8 *key,KeyLength keyLen,UINT8 * initVector = 0); + // Encrypts the input array (can be binary data) + // The input array length must be a multiple of 16 bytes, the remaining part + // is DISCARDED. + // so it actually encrypts inputLen / 128 blocks of input and puts it in outBuffer + // Input len is in BITS! + // outBuffer must be at least inputLen / 8 bytes long. + // Returns the encrypted buffer length in BITS or an error code < 0 in case of error + int blockEncrypt(const UINT8 *input, int inputLen, UINT8 *outBuffer); + // Encrypts the input array (can be binary data) + // The input array can be any length , it is automatically padded on a 16 byte boundary. + // Input len is in BYTES! + // outBuffer must be at least (inputLen + 16) bytes long + // Returns the encrypted buffer length in BYTES or an error code < 0 in case of error + int padEncrypt(const UINT8 *input, int inputOctets, UINT8 *outBuffer); + // Decrypts the input vector + // Input len is in BITS! + // outBuffer must be at least inputLen / 8 bytes long + // Returns the decrypted buffer length in BITS and an error code < 0 in case of error + int blockDecrypt(const UINT8 *input, int inputLen, UINT8 *outBuffer); + // Decrypts the input vector + // Input len is in BYTES! + // outBuffer must be at least inputLen bytes long + // Returns the decrypted buffer length in BYTES and an error code < 0 in case of error + int padDecrypt(const UINT8 *input, int inputOctets, UINT8 *outBuffer); +protected: + void keySched(UINT8 key[_MAX_KEY_COLUMNS][4]); + void keyEncToDec(); + void encrypt(const UINT8 a[16], UINT8 b[16]); + void decrypt(const UINT8 a[16], UINT8 b[16]); +}; + +#endif // _RIJNDAEL_H_ diff --git a/samples/README b/samples/README new file mode 100644 index 0000000..ab6aeff --- /dev/null +++ b/samples/README @@ -0,0 +1 @@ +This directory contains examples how to use dbtool. diff --git a/samples/account-db/README b/samples/account-db/README new file mode 100644 index 0000000..de816bd --- /dev/null +++ b/samples/account-db/README @@ -0,0 +1,12 @@ + +This is an example of how to use the new +encryption support of dbtool. + +accdb is a account database tool, which +you can use (really :-) to maintain all +your accounts in one database file. + +Never forget a password! + + +T.v. Dein \ No newline at end of file diff --git a/samples/account-db/accdb b/samples/account-db/accdb new file mode 100755 index 0000000..8db4e50 --- /dev/null +++ b/samples/account-db/accdb @@ -0,0 +1,112 @@ +#!/bin/sh +# +# This is a little interactive tool which helps you +# to maintain your accounts on one place. +# +# It uses an encrypted database for protecting the +# account list. The tool does not work with temporary +# files for security reasons. +# +# Just execute it. It will show you a little menu of +# all available commands. That's really easy :-) +# +# T.v. Dein + + +# +# the account database +db=~/.accdb + +# +# check if dbtool version is 1.4 or higher +version=`dbtool -V 2>&1 | sed 's/[a-zA-Z .]*//g'` +if [ "x$version" != "x" ]; then + let res="$version < 14" + if [ "x$res" = "x1" ]; then + echo "This version of dbtool does not support encryption!" + exit 1 + fi +else + echo "dbtool is not installed!" + exit 1 +fi + +# +# get the passphrase +echo -n "Enter passphrase: " +read PW + +if [ "x$PW" = "x" ]; then + echo "empty passphrase!" + exit -1 +fi + +# +# store it in a local environment variable, +# so it will not appear in the process list and +# dbtool itself will not ask for it +export DB_PASSPHRASE=$PW + + +# +# the silly menu +function menu { + echo + echo -n "[L]ist [N]ew [S]earch [Q]uit> " +} + + +# +# go +echo +menu + +while : +do + read command + + if [ "x$command" = "xL" -o "x$command" = "xl" ]; then + echo + if [ -e $db ]; then + # + # just dump all entries out. Use a custom output + # separator for better formatting with sed :-) + dbtool -d $db -p -D -F "¶" | sed 's/¶/ => /' + fi + elif [ "x$command" = "xN" -o "x$command" = "xn" ]; then + echo + echo -n "Enter entry name: " + read name + if [ "x$name" = "x" ]; then + echo "empty name!" + else + echo -n "Enter username: " + read user + echo -n "Enter password: " + read pass + # + # create a new entry, separate the key and the value + # using the pipe character, overwrite existing entry + echo "$name| Username: $user, Password: $pass" \ + | dbtool -p -i -f -d $db -F "|" + echo "entry $name inserted." + fi + elif [ "x$command" = "xS" -o "x$command" = "xs" ]; then + echo -n "Enter search string: " + read string + # + # search for the given key + dbtool -p -d $db -s -k $string + elif [ "x$command" = "xQ" -o "x$command" = "xq" ]; then + echo + echo "Thanks for the fish." + echo + exit 0 + fi + + menu +done + +# +# clear the environment variable. just in case... +unset DB_PASSPHRASE diff --git a/samples/locate/README b/samples/locate/README new file mode 100644 index 0000000..845228b --- /dev/null +++ b/samples/locate/README @@ -0,0 +1,19 @@ +just an example showing what's possible +with dbtool. These two shell scripts +are doing the same job as GNU locate. + + updatedb + creates a database which contains + every file (with path) of a system + along with all it's attributes. + + locate + searches in this database using + user supplied regular expressions + +You need to edit both scripts to suit +your system. + + + +T.v. Dein diff --git a/samples/locate/locate b/samples/locate/locate new file mode 100755 index 0000000..aa4b80e --- /dev/null +++ b/samples/locate/locate @@ -0,0 +1,24 @@ +#!/bin/sh +# +# simple locate alike +# written as an example how to +# use dbtool. +# +# locate searches the database +# for a file which matches a +# certain string. The parameter +# to locate can be a fully perl- +# compliant regular expression. +# + +dbtool="/usr/bin/dbtool"; +find="/usr/bin/find"; +db="/var/local/locate.db"; +sort="/bin/sort"; +regex=$1; + +if [ "x$regex" != "x" ]; then + $dbtool -d $db -S -k $regex -w -R; +else + echo "Usage: locate "; +fi diff --git a/samples/locate/locate~ b/samples/locate/locate~ new file mode 100755 index 0000000..d5dc1cf --- /dev/null +++ b/samples/locate/locate~ @@ -0,0 +1,25 @@ +#!/bin/sh +# +# simple locate alike +# written as an example how to +# use dbtool. +# +# locate searches the database +# for a file which matches a +# certain string. The parameter +# to locate can be a fully perl- +# compliant regular expression. +# +# $Id: locate,v 1.3 2001/06/26 23:00:02 scip Exp $ + +dbtool="/usr/bin/dbtool"; +find="/usr/bin/find"; +db="/var/local/locate.db"; +sort="/bin/sort"; +regex=$1; + +if [ "x$regex" != "x" ]; then + $dbtool -d $db -S -k $regex -w -R; +else + echo "Usage: locate "; +fi diff --git a/samples/locate/updatedb b/samples/locate/updatedb new file mode 100755 index 0000000..0487d9e --- /dev/null +++ b/samples/locate/updatedb @@ -0,0 +1,19 @@ +#!/bin/sh +# +# simple locate alike +# written as an example how to +# use dbtool. +# +# updatedb creates the database +# which is then used by locate +# to search for a certain string. +# + +dbtool="/usr/bin/dbtool"; +find="/usr/bin/find"; +db="/var/local/locate.db"; +egrep="/bin/egrep"; +cp="/bin/cp" + +$cp /dev/null $db; +$find / -ls | $egrep -v "^\/proc|dev|tmp" | $dbtool -d $db -i -f -R -t "^(.+?) (\/.*)$"; diff --git a/samples/locate/updatedb~ b/samples/locate/updatedb~ new file mode 100755 index 0000000..a6ce26e --- /dev/null +++ b/samples/locate/updatedb~ @@ -0,0 +1,21 @@ +#!/bin/sh +# +# simple locate alike +# written as an example how to +# use dbtool. +# +# updatedb creates the database +# which is then used by locate +# to search for a certain string. +# +# $Id: updatedb,v 1.2 2001/06/26 23:00:02 scip Exp $ +# + +dbtool="/usr/bin/dbtool"; +find="/usr/bin/find"; +db="/var/local/locate.db"; +egrep="/bin/egrep"; +cp="/bin/cp" + +$cp /dev/null $db; +$find / -ls | $egrep -v "^\/proc|dev|tmp" | $dbtool -d $db -i -f -R -t "^(.+?) (\/.*)$"; diff --git a/samples/uback/README b/samples/uback/README new file mode 100644 index 0000000..01fa89b --- /dev/null +++ b/samples/uback/README @@ -0,0 +1,11 @@ +uback is a backup script which uses dbtool to +maintain catalog databases of the files which +have backed up. + +Download uback from the following location: + + ftp://www.0x49.org/scip/Scripts/uback-1.2.tar.gz + + + +T.v. Dein