Added SHA384 and SHA512 digests. Tweaks for getting rid of windows warnings. Use recv instead of read on socket. Bumped version to 0.63 (libfko) and 0.23 (FKO perl module).
git-svn-id: file:///home/mbr/svn/fwknop/trunk@123 510a4753-2344-4c79-9c09-4d669213fbeb
This commit is contained in:
@@ -1,48 +1,57 @@
|
||||
2009-08-02 Damien Stuart <dstuart@dstuart.org>
|
||||
* Tweaks to digest code - added SHA384 and SHA512 to supported digests.
|
||||
* Updated autoconf files to account or new headers and types recently added.
|
||||
* Bumped libfko version to 0.63 and perl FKO module version to 0.23.
|
||||
|
||||
2009-07-26 Michael Rash <mbr@cipherdyne.org>
|
||||
* Implemented -s command line argument on the fwknop client command line
|
||||
so that the IP "0.0.0.0" can be sent within an SPA packet. The fwknopd
|
||||
server can wrap access requirements around this IP.
|
||||
* Initial public release of fwknop-c-0.62.
|
||||
* Implemented -s command line argument on the fwknop client command line
|
||||
so that the IP "0.0.0.0" can be sent within an SPA packet. The fwknopd
|
||||
server can wrap access requirements around this IP.
|
||||
* Initial public release of fwknop-c-0.62.
|
||||
|
||||
2009-07-23 Michael Rash <mbr@cipherdyne.org>
|
||||
* Added the --show-last and --no-save command line options to show the
|
||||
command line used for the previous fwknop invocation, and to have the
|
||||
fwknop client not save its command line arguments.
|
||||
* Bug fix to force libfko to recalculate the random data embedded in the
|
||||
the SPA packet after a random port is acquired via --rand-port or
|
||||
--nat-rand-port. This is a precaution so that an attacker cannot guess
|
||||
some of the internal SPA data based on the destination port number.
|
||||
* Added the --show-last and --no-save command line options to show the
|
||||
command line used for the previous fwknop invocation, and to have the
|
||||
fwknop client not save its command line arguments.
|
||||
* Bug fix to force libfko to recalculate the random data embedded in the
|
||||
the SPA packet after a random port is acquired via --rand-port or
|
||||
--nat-rand-port. This is a precaution so that an attacker cannot guess
|
||||
some of the internal SPA data based on the destination port number.
|
||||
|
||||
2009-07-21 Michael Rash <mbr@cipherdyne.org>
|
||||
* Got forward and local NAT modes working with the --nat-access,
|
||||
--nat-local, --nat-port, and --nat-randport options. All NAT modes
|
||||
are now passing the fwknop test suite.
|
||||
* Added the --server-command option to build an SPA packet with a command
|
||||
for the server to execute.
|
||||
* Added the --fw-timeout option for client side timeouts to be specified.
|
||||
* Added the --time-offset-plus and --time-offset-minus options to allow
|
||||
the user to influence the timestamp associated with an SPA packet.
|
||||
* Added the --rand-port option so that the SPA packet destination port can
|
||||
be randomized.
|
||||
* Got forward and local NAT modes working with the --nat-access,
|
||||
--nat-local, --nat-port, and --nat-randport options. All NAT modes
|
||||
are now passing the fwknop test suite.
|
||||
* Added the --server-command option to build an SPA packet with a command
|
||||
for the server to execute.
|
||||
* Added the --fw-timeout option for client side timeouts to be specified.
|
||||
* Added the --time-offset-plus and --time-offset-minus options to allow
|
||||
the user to influence the timestamp associated with an SPA packet.
|
||||
* Added the --rand-port option so that the SPA packet destination port can
|
||||
be randomized.
|
||||
|
||||
2009-07-16 Michael Rash <mbr@cipherdyne.org>
|
||||
* Added the ability to send SPA packets over valid HTTP requests with
|
||||
the fwknop-c client.
|
||||
* Added support for transmitting SPA packets over IPv6 via TCP and UDP
|
||||
sockets, and also via HTTP.
|
||||
* Added GnuPG 'hQ' base64 encoded prefix handling (this prefix is
|
||||
stripped out of encrypted SPA packet data).
|
||||
* Added hostname resolution support to the fwknop-c client if the SPA
|
||||
server is specified as a hostname instead of an IP address.
|
||||
* Added the ability to send SPA packets over valid HTTP requests with
|
||||
the fwknop-c client.
|
||||
* Added support for transmitting SPA packets over IPv6 via TCP and UDP
|
||||
sockets, and also via HTTP.
|
||||
* Added GnuPG 'hQ' base64 encoded prefix handling (this prefix is
|
||||
stripped out of encrypted SPA packet data).
|
||||
* Added hostname resolution support to the fwknop-c client if the SPA
|
||||
server is specified as a hostname instead of an IP address.
|
||||
|
||||
2008-05-24 Damien Stuart <dstuart@dstuart.org>
|
||||
* Added win32 direcory with Visual Studio 2008 solution and project files
|
||||
for buildin on the Windows platform.
|
||||
|
||||
2008-12-21 Damien Stuart <dstuart@dstuart.org>
|
||||
|
||||
Build 0.0.0 alpha
|
||||
|
||||
* autogen.sh: created.
|
||||
* autoconf/automake: Initial configuration created.
|
||||
* autogen.sh: created.
|
||||
* autoconf/automake: Initial configuration created.
|
||||
|
||||
Copyright 2001, 2002, 2003, 2004, 2005 g10 Code GmbH
|
||||
Copyright 2009, Damien Stuart
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
|
||||
+9
-3
@@ -3,7 +3,7 @@ dnl Process thie file with autoconf to produce the configure script
|
||||
AC_PREREQ(2.61)
|
||||
|
||||
m4_define(my_package, [fwknop-c])
|
||||
m4_define(my_version, [0.62])
|
||||
m4_define(my_version, [0.63])
|
||||
m4_define(my_bug_email, [dstuart@dstuart.org])
|
||||
|
||||
AC_INIT(my_package, my_version, my_bug_email)
|
||||
@@ -21,6 +21,7 @@ AC_GNU_SOURCE
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
AC_PROG_CXX
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CPP
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
@@ -31,14 +32,18 @@ AC_PROG_LIBTOOL
|
||||
# Checks for header files.
|
||||
#
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS([ctype.h endian.h netinet/in.h stdint.h stdlib.h string.h strings.h sys/byteorder.h sys/endian.h sys/socket.h sys/stat.h sys/time.h termios.h unistd.h])
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_CHECK_HEADERS([ctype.h endian.h netdb.h netinet/in.h stdint.h stdlib.h string.h strings.h sys/byteorder.h sys/endian.h sys/socket.h sys/stat.h sys/time.h termios.h unistd.h])
|
||||
|
||||
# Type checks.
|
||||
#
|
||||
AC_C_CONST
|
||||
AC_TYPE_OFF_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT8_T
|
||||
|
||||
AC_CHECK_SIZEOF(unsigned int)
|
||||
AC_CHECK_TYPES([uint8_t, uint32_t])
|
||||
|
||||
@@ -49,6 +54,7 @@ AC_C_BIGENDIAN
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_REALLOC
|
||||
AC_FUNC_STAT
|
||||
|
||||
AC_CHECK_FUNCS([bzero gettimeofday memmove memset socket strchr strcspn strdup strncasecmp strndup strrchr strspn])
|
||||
|
||||
AC_SEARCH_LIBS([socket], [socket])
|
||||
|
||||
@@ -381,6 +381,8 @@ are (in order of strength):
|
||||
@item FKO_DIGEST_MD5
|
||||
@item FKO_DIGEST_SHA1
|
||||
@item FKO_DIGEST_SHA256 (libfko default)
|
||||
@item FKO_DIGEST_SHA384
|
||||
@item FKO_DIGEST_SHA512
|
||||
@end table
|
||||
@end deftypevar
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ libfko_source_files = \
|
||||
fko_decode.c fko_encryption.c fko_error.c fko_funcs.c fko_message.c \
|
||||
fko_nat_access.c fko_rand_value.c fko_server_auth.c fko.h fko_limits.h \
|
||||
fko_timestamp.c fko_user.c fko_util.h md5.c md5.h \
|
||||
rijndael.c rijndael.h sha1.c sha256.c sha.h strlcat.c \
|
||||
rijndael.c rijndael.h sha1.c sha1.h sha2.c sha2.h strlcat.c \
|
||||
strlcpy.c fko_state.h fko_context.h gpgme_funcs.c gpgme_funcs.h
|
||||
|
||||
libfko_la_SOURCES = $(libfko_source_files)
|
||||
|
||||
+103
-32
@@ -27,9 +27,10 @@
|
||||
/* Convert a raw digest into its hex string representation.
|
||||
*/
|
||||
void
|
||||
digest_to_hex(char *out, unsigned char *in, int size)
|
||||
digest_to_hex(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for(i=0; i<size; i++)
|
||||
{
|
||||
sprintf(out, "%02x", in[i]);
|
||||
@@ -40,7 +41,7 @@ digest_to_hex(char *out, unsigned char *in, int size)
|
||||
/* Compute MD5 hash on in and store result in out.
|
||||
*/
|
||||
void
|
||||
md5(unsigned char *out, unsigned char *in, int size)
|
||||
md5(unsigned char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
MD5Context ctx;
|
||||
|
||||
@@ -52,23 +53,23 @@ md5(unsigned char *out, unsigned char *in, int size)
|
||||
/* Compute MD5 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
md5_hex(char *out, unsigned char *in, int size)
|
||||
md5_hex(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[MD5_DIGESTSIZE];
|
||||
uint8_t md[MD5_DIGEST_LENGTH];
|
||||
|
||||
md5(md, in, size);
|
||||
digest_to_hex(out, md, MD5_DIGESTSIZE);
|
||||
digest_to_hex(out, md, MD5_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
/* Compute MD5 hash on in and store the base64 string result in out.
|
||||
*/
|
||||
void
|
||||
md5_base64(char *out, unsigned char *in, int size)
|
||||
md5_base64(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[MD5_DIGESTSIZE];
|
||||
uint8_t md[MD5_DIGEST_LENGTH];
|
||||
|
||||
md5(md, in, size);
|
||||
b64_encode(md, out, MD5_DIGESTSIZE);
|
||||
b64_encode(md, out, MD5_DIGEST_LENGTH);
|
||||
|
||||
strip_b64_eq(out);
|
||||
}
|
||||
@@ -76,35 +77,35 @@ md5_base64(char *out, unsigned char *in, int size)
|
||||
/* Compute SHA1 hash on in and store result in out.
|
||||
*/
|
||||
void
|
||||
sha1(unsigned char *out, unsigned char *in, int size)
|
||||
sha1(unsigned char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
SHA_INFO sha_info;
|
||||
SHA1_INFO sha1_info;
|
||||
|
||||
sha1_init(&sha_info);
|
||||
sha1_update(&sha_info, (uint8_t*)in, size);
|
||||
sha1_final(out, &sha_info);
|
||||
sha1_init(&sha1_info);
|
||||
sha1_update(&sha1_info, (uint8_t*)in, size);
|
||||
sha1_final(out, &sha1_info);
|
||||
}
|
||||
|
||||
/* Compute SHA1 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha1_hex(char *out, unsigned char *in, int size)
|
||||
sha1_hex(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA1_DIGESTSIZE];
|
||||
uint8_t md[SHA1_DIGEST_LENGTH];
|
||||
|
||||
sha1(md, in, size);
|
||||
digest_to_hex(out, md, SHA1_DIGESTSIZE);
|
||||
digest_to_hex(out, md, SHA1_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
/* Compute SHA1 hash on in and store the base64 string result in out.
|
||||
*/
|
||||
void
|
||||
sha1_base64(char *out, unsigned char *in, int size)
|
||||
sha1_base64(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA1_DIGESTSIZE];
|
||||
uint8_t md[SHA1_DIGEST_LENGTH];
|
||||
|
||||
sha1(md, in, size);
|
||||
b64_encode(md, out, SHA1_DIGESTSIZE);
|
||||
b64_encode(md, out, SHA1_DIGEST_LENGTH);
|
||||
|
||||
strip_b64_eq(out);
|
||||
}
|
||||
@@ -112,39 +113,109 @@ sha1_base64(char *out, unsigned char *in, int size)
|
||||
/* Compute SHA256 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha256(unsigned char *out, unsigned char *in, int size)
|
||||
sha256(unsigned char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
SHA_INFO sha_info;
|
||||
SHA256_CTX sha256_ctx;
|
||||
|
||||
sha256_init(&sha_info);
|
||||
sha256_update(&sha_info, (uint8_t*)in, size);
|
||||
sha256_final(&sha_info);
|
||||
sha256_unpackdigest(out, &sha_info);
|
||||
SHA256_Init(&sha256_ctx);
|
||||
SHA256_Update(&sha256_ctx, (const uint8_t*)in, size);
|
||||
SHA256_Final(out, &sha256_ctx);
|
||||
}
|
||||
|
||||
/* Compute SHA256 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha256_hex(char *out, unsigned char *in, int size)
|
||||
sha256_hex(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA256_DIGESTSIZE];
|
||||
uint8_t md[SHA256_DIGEST_LENGTH];
|
||||
|
||||
sha256(md, in, size);
|
||||
digest_to_hex(out, md, SHA256_DIGESTSIZE);
|
||||
digest_to_hex(out, md, SHA256_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
/* Compute SHA256 hash on in and store the base64 string result in out.
|
||||
*/
|
||||
void
|
||||
sha256_base64(char *out, unsigned char *in, int size)
|
||||
sha256_base64(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA256_DIGESTSIZE];
|
||||
uint8_t md[SHA256_DIGEST_LENGTH];
|
||||
|
||||
sha256(md, in, size);
|
||||
b64_encode(md, out, SHA256_DIGESTSIZE);
|
||||
b64_encode(md, out, SHA256_DIGEST_LENGTH);
|
||||
|
||||
strip_b64_eq(out);
|
||||
}
|
||||
|
||||
/* Compute SHA384 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha384(unsigned char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
SHA384_CTX sha384_ctx;
|
||||
|
||||
SHA384_Init(&sha384_ctx);
|
||||
SHA384_Update(&sha384_ctx, (const uint8_t*)in, size);
|
||||
SHA384_Final(out, &sha384_ctx);
|
||||
}
|
||||
|
||||
/* Compute SHA384 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha384_hex(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA384_DIGEST_LENGTH];
|
||||
|
||||
sha384(md, in, size);
|
||||
digest_to_hex(out, md, SHA384_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
/* Compute SHA384 hash on in and store the base64 string result in out.
|
||||
*/
|
||||
void
|
||||
sha384_base64(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA384_DIGEST_LENGTH];
|
||||
|
||||
sha384(md, in, size);
|
||||
b64_encode(md, out, SHA384_DIGEST_LENGTH);
|
||||
|
||||
strip_b64_eq(out);
|
||||
}
|
||||
|
||||
/* Compute SHA512 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha512(unsigned char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
SHA512_CTX sha512_ctx;
|
||||
|
||||
SHA512_Init(&sha512_ctx);
|
||||
SHA512_Update(&sha512_ctx, (const uint8_t*)in, size);
|
||||
SHA512_Final(out, &sha512_ctx);
|
||||
}
|
||||
|
||||
/* Compute SHA512 hash on in and store the hex string result in out.
|
||||
*/
|
||||
void
|
||||
sha512_hex(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA512_DIGEST_LENGTH];
|
||||
|
||||
sha512(md, in, size);
|
||||
digest_to_hex(out, md, SHA512_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
/* Compute SHA512 hash on in and store the base64 string result in out.
|
||||
*/
|
||||
void
|
||||
sha512_base64(char *out, unsigned char *in, size_t size)
|
||||
{
|
||||
uint8_t md[SHA512_DIGEST_LENGTH];
|
||||
|
||||
sha512(md, in, size);
|
||||
b64_encode(md, out, SHA512_DIGEST_LENGTH);
|
||||
|
||||
strip_b64_eq(out);
|
||||
}
|
||||
|
||||
/***EOF***/
|
||||
|
||||
+25
-11
@@ -27,22 +27,36 @@
|
||||
#include "fko_common.h"
|
||||
|
||||
#include "md5.h"
|
||||
#include "sha.h"
|
||||
#include "sha1.h"
|
||||
#include "sha2.h"
|
||||
|
||||
/* Size calculation macros
|
||||
*/
|
||||
#define MD_HEX_SIZE(x) x * 2
|
||||
#define MD_B64_SIZE(x) ((x * 4) / 3) + 1
|
||||
|
||||
void md5(unsigned char* out, unsigned char* in, int size);
|
||||
void md5_hex(char* out, unsigned char* in, int size);
|
||||
void md5_base64(char* out, unsigned char* in, int size);
|
||||
void sha1(unsigned char* out, unsigned char* in, int size);
|
||||
void sha1_hex(char* out, unsigned char* in, int size);
|
||||
void sha1_base64(char* out, unsigned char* in, int size);
|
||||
void sha256(unsigned char* out, unsigned char* in, int size);
|
||||
void sha256_hex(char* out, unsigned char* in, int size);
|
||||
void sha256_base64(char* out, unsigned char* in, int size);
|
||||
/* Predefined base64 encoded digest sizes.
|
||||
*/
|
||||
#define MD5_B64_LENGTH 22
|
||||
#define SHA1_B64_LENGTH 27
|
||||
#define SHA256_B64_LENGTH 43
|
||||
#define SHA384_B64_LENGTH 64
|
||||
#define SHA512_B64_LENGTH 86
|
||||
|
||||
void md5(unsigned char* out, unsigned char* in, size_t size);
|
||||
void md5_hex(char* out, unsigned char* in, size_t size);
|
||||
void md5_base64(char* out, unsigned char* in, size_t size);
|
||||
void sha1(unsigned char* out, unsigned char* in, size_t size);
|
||||
void sha1_hex(char* out, unsigned char* in, size_t size);
|
||||
void sha1_base64(char* out, unsigned char* in, size_t size);
|
||||
void sha256(unsigned char* out, unsigned char* in, size_t size);
|
||||
void sha256_hex(char* out, unsigned char* in, size_t size);
|
||||
void sha256_base64(char* out, unsigned char* in, size_t size);
|
||||
void sha384(unsigned char* out, unsigned char* in, size_t size);
|
||||
void sha384_hex(char* out, unsigned char* in, size_t size);
|
||||
void sha384_base64(char* out, unsigned char* in, size_t size);
|
||||
void sha512(unsigned char* out, unsigned char* in, size_t size);
|
||||
void sha512_hex(char* out, unsigned char* in, size_t size);
|
||||
void sha512_base64(char* out, unsigned char* in, size_t size);
|
||||
|
||||
#endif /* DIGEST_H */
|
||||
|
||||
|
||||
@@ -67,6 +67,8 @@ typedef enum {
|
||||
FKO_DIGEST_MD5 = 1,
|
||||
FKO_DIGEST_SHA1,
|
||||
FKO_DIGEST_SHA256,
|
||||
FKO_DIGEST_SHA384,
|
||||
FKO_DIGEST_SHA512,
|
||||
FKO_LAST_DIGEST_TYPE /* Always leave this as the last one */
|
||||
} fko_digest_type_t;
|
||||
|
||||
|
||||
+5
-2
@@ -52,8 +52,11 @@
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned int uint32_t;
|
||||
/* These are needed for the digest code under windows.
|
||||
*/
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
#define strdup _strdup
|
||||
#else
|
||||
|
||||
+19
-3
@@ -57,18 +57,26 @@ fko_decode_spa_data(fko_ctx_t ctx)
|
||||
|
||||
switch(t_size)
|
||||
{
|
||||
case MD_B64_SIZE(MD5_DIGESTSIZE):
|
||||
case MD5_B64_LENGTH:
|
||||
ctx->digest_type = FKO_DIGEST_MD5;
|
||||
break;
|
||||
|
||||
case MD_B64_SIZE(SHA1_DIGESTSIZE):
|
||||
case SHA1_B64_LENGTH:
|
||||
ctx->digest_type = FKO_DIGEST_SHA1;
|
||||
break;
|
||||
|
||||
case MD_B64_SIZE(SHA256_DIGESTSIZE):
|
||||
case SHA256_B64_LENGTH:
|
||||
ctx->digest_type = FKO_DIGEST_SHA256;
|
||||
break;
|
||||
|
||||
case SHA384_B64_LENGTH:
|
||||
ctx->digest_type = FKO_DIGEST_SHA384;
|
||||
break;
|
||||
|
||||
case SHA512_B64_LENGTH:
|
||||
ctx->digest_type = FKO_DIGEST_SHA512;
|
||||
break;
|
||||
|
||||
default: /* Invalid or unsupported digest */
|
||||
return(FKO_ERROR_INVALID_DIGEST_TYPE);
|
||||
}
|
||||
@@ -108,6 +116,14 @@ fko_decode_spa_data(fko_ctx_t ctx)
|
||||
sha256_base64(tbuf, (unsigned char*)ctx->encoded_msg, strlen(ctx->encoded_msg));
|
||||
break;
|
||||
|
||||
case FKO_DIGEST_SHA384:
|
||||
sha384_base64(tbuf, (unsigned char*)ctx->encoded_msg, strlen(ctx->encoded_msg));
|
||||
break;
|
||||
|
||||
case FKO_DIGEST_SHA512:
|
||||
sha512_base64(tbuf, (unsigned char*)ctx->encoded_msg, strlen(ctx->encoded_msg));
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
/* We give up here if the computed digest does not match the
|
||||
|
||||
+21
-3
@@ -82,7 +82,7 @@ fko_set_spa_digest(fko_ctx_t ctx)
|
||||
switch(ctx->digest_type)
|
||||
{
|
||||
case FKO_DIGEST_MD5:
|
||||
md = malloc(MD_HEX_SIZE(MD5_DIGESTSIZE)+1);
|
||||
md = malloc(MD_HEX_SIZE(MD5_DIGEST_LENGTH)+1);
|
||||
if(md == NULL)
|
||||
return(FKO_ERROR_MEMORY_ALLOCATION);
|
||||
|
||||
@@ -91,7 +91,7 @@ fko_set_spa_digest(fko_ctx_t ctx)
|
||||
break;
|
||||
|
||||
case FKO_DIGEST_SHA1:
|
||||
md = malloc(MD_HEX_SIZE(SHA1_DIGESTSIZE)+1);
|
||||
md = malloc(MD_HEX_SIZE(SHA1_DIGEST_LENGTH)+1);
|
||||
if(md == NULL)
|
||||
return(FKO_ERROR_MEMORY_ALLOCATION);
|
||||
|
||||
@@ -100,7 +100,7 @@ fko_set_spa_digest(fko_ctx_t ctx)
|
||||
break;
|
||||
|
||||
case FKO_DIGEST_SHA256:
|
||||
md = malloc(MD_HEX_SIZE(SHA256_DIGESTSIZE)+1);
|
||||
md = malloc(MD_HEX_SIZE(SHA256_DIGEST_LENGTH)+1);
|
||||
if(md == NULL)
|
||||
return(FKO_ERROR_MEMORY_ALLOCATION);
|
||||
|
||||
@@ -108,6 +108,24 @@ fko_set_spa_digest(fko_ctx_t ctx)
|
||||
(unsigned char*)ctx->encoded_msg, strlen(ctx->encoded_msg));
|
||||
break;
|
||||
|
||||
case FKO_DIGEST_SHA384:
|
||||
md = malloc(MD_HEX_SIZE(SHA384_DIGEST_LENGTH)+1);
|
||||
if(md == NULL)
|
||||
return(FKO_ERROR_MEMORY_ALLOCATION);
|
||||
|
||||
sha384_base64(md,
|
||||
(unsigned char*)ctx->encoded_msg, strlen(ctx->encoded_msg));
|
||||
break;
|
||||
|
||||
case FKO_DIGEST_SHA512:
|
||||
md = malloc(MD_HEX_SIZE(SHA512_DIGEST_LENGTH)+1);
|
||||
if(md == NULL)
|
||||
return(FKO_ERROR_MEMORY_ALLOCATION);
|
||||
|
||||
sha512_base64(md,
|
||||
(unsigned char*)ctx->encoded_msg, strlen(ctx->encoded_msg));
|
||||
break;
|
||||
|
||||
default:
|
||||
return(FKO_ERROR_INVALID_DIGEST_TYPE);
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
#include "fko_common.h"
|
||||
|
||||
#define MD5_DIGESTSIZE 16
|
||||
#define MD5_DIGEST_LENGTH 16
|
||||
|
||||
typedef struct _MD5Context {
|
||||
uint32_t buf[4];
|
||||
|
||||
+87
-87
@@ -16,7 +16,7 @@
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
#include "sha.h"
|
||||
#include "sha1.h"
|
||||
|
||||
/* SHA f()-functions */
|
||||
#define f1(x,y,z) ((x & y) | (~x & z))
|
||||
@@ -62,13 +62,13 @@
|
||||
|
||||
|
||||
void
|
||||
sha1_transform(SHA_INFO *sha_info)
|
||||
sha1_transform(SHA1_INFO *sha1_info)
|
||||
{
|
||||
int i;
|
||||
uint8_t *dp;
|
||||
uint32_t T, A, B, C, D, E, W[80], *WP;
|
||||
|
||||
dp = sha_info->data;
|
||||
dp = sha1_info->data;
|
||||
|
||||
#undef SWAP_DONE
|
||||
|
||||
@@ -132,11 +132,11 @@ sha1_transform(SHA_INFO *sha_info)
|
||||
W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
|
||||
W[i] = R32(W[i], 1);
|
||||
}
|
||||
A = sha_info->digest[0];
|
||||
B = sha_info->digest[1];
|
||||
C = sha_info->digest[2];
|
||||
D = sha_info->digest[3];
|
||||
E = sha_info->digest[4];
|
||||
A = sha1_info->digest[0];
|
||||
B = sha1_info->digest[1];
|
||||
C = sha1_info->digest[2];
|
||||
D = sha1_info->digest[3];
|
||||
E = sha1_info->digest[4];
|
||||
WP = W;
|
||||
#ifdef UNRAVEL
|
||||
FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1);
|
||||
@@ -147,11 +147,11 @@ sha1_transform(SHA_INFO *sha_info)
|
||||
FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3);
|
||||
FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4);
|
||||
FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4);
|
||||
sha_info->digest[0] = T32(sha_info->digest[0] + E);
|
||||
sha_info->digest[1] = T32(sha_info->digest[1] + T);
|
||||
sha_info->digest[2] = T32(sha_info->digest[2] + A);
|
||||
sha_info->digest[3] = T32(sha_info->digest[3] + B);
|
||||
sha_info->digest[4] = T32(sha_info->digest[4] + C);
|
||||
sha1_info->digest[0] = T32(sha1_info->digest[0] + E);
|
||||
sha1_info->digest[1] = T32(sha1_info->digest[1] + T);
|
||||
sha1_info->digest[2] = T32(sha1_info->digest[2] + A);
|
||||
sha1_info->digest[3] = T32(sha1_info->digest[3] + B);
|
||||
sha1_info->digest[4] = T32(sha1_info->digest[4] + C);
|
||||
#else /* !UNRAVEL */
|
||||
#ifdef UNROLL_LOOPS
|
||||
FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);
|
||||
@@ -168,123 +168,123 @@ sha1_transform(SHA_INFO *sha_info)
|
||||
for (i = 40; i < 60; ++i) { FG(3); }
|
||||
for (i = 60; i < 80; ++i) { FG(4); }
|
||||
#endif /* !UNROLL_LOOPS */
|
||||
sha_info->digest[0] = T32(sha_info->digest[0] + A);
|
||||
sha_info->digest[1] = T32(sha_info->digest[1] + B);
|
||||
sha_info->digest[2] = T32(sha_info->digest[2] + C);
|
||||
sha_info->digest[3] = T32(sha_info->digest[3] + D);
|
||||
sha_info->digest[4] = T32(sha_info->digest[4] + E);
|
||||
sha1_info->digest[0] = T32(sha1_info->digest[0] + A);
|
||||
sha1_info->digest[1] = T32(sha1_info->digest[1] + B);
|
||||
sha1_info->digest[2] = T32(sha1_info->digest[2] + C);
|
||||
sha1_info->digest[3] = T32(sha1_info->digest[3] + D);
|
||||
sha1_info->digest[4] = T32(sha1_info->digest[4] + E);
|
||||
#endif /* !UNRAVEL */
|
||||
}
|
||||
|
||||
/* initialize the SHA digest */
|
||||
|
||||
void
|
||||
sha1_init(SHA_INFO *sha_info)
|
||||
sha1_init(SHA1_INFO *sha1_info)
|
||||
{
|
||||
sha_info->digest[0] = 0x67452301L;
|
||||
sha_info->digest[1] = 0xefcdab89L;
|
||||
sha_info->digest[2] = 0x98badcfeL;
|
||||
sha_info->digest[3] = 0x10325476L;
|
||||
sha_info->digest[4] = 0xc3d2e1f0L;
|
||||
sha_info->count_lo = 0L;
|
||||
sha_info->count_hi = 0L;
|
||||
sha_info->local = 0;
|
||||
sha1_info->digest[0] = 0x67452301L;
|
||||
sha1_info->digest[1] = 0xefcdab89L;
|
||||
sha1_info->digest[2] = 0x98badcfeL;
|
||||
sha1_info->digest[3] = 0x10325476L;
|
||||
sha1_info->digest[4] = 0xc3d2e1f0L;
|
||||
sha1_info->count_lo = 0L;
|
||||
sha1_info->count_hi = 0L;
|
||||
sha1_info->local = 0;
|
||||
}
|
||||
|
||||
/* update the SHA digest */
|
||||
|
||||
void
|
||||
sha1_update(SHA_INFO *sha_info, uint8_t *buffer, int count)
|
||||
sha1_update(SHA1_INFO *sha1_info, uint8_t *buffer, int count)
|
||||
{
|
||||
int i;
|
||||
uint32_t clo;
|
||||
|
||||
clo = T32(sha_info->count_lo + ((uint32_t) count << 3));
|
||||
if (clo < sha_info->count_lo) {
|
||||
++sha_info->count_hi;
|
||||
clo = T32(sha1_info->count_lo + ((uint32_t) count << 3));
|
||||
if (clo < sha1_info->count_lo) {
|
||||
++sha1_info->count_hi;
|
||||
}
|
||||
sha_info->count_lo = clo;
|
||||
sha_info->count_hi += (uint32_t) count >> 29;
|
||||
if (sha_info->local) {
|
||||
i = SHA_BLOCKSIZE - sha_info->local;
|
||||
sha1_info->count_lo = clo;
|
||||
sha1_info->count_hi += (uint32_t) count >> 29;
|
||||
if (sha1_info->local) {
|
||||
i = SHA1_BLOCKSIZE - sha1_info->local;
|
||||
if (i > count) {
|
||||
i = count;
|
||||
}
|
||||
memcpy(((uint8_t *) sha_info->data) + sha_info->local, buffer, i);
|
||||
memcpy(((uint8_t *) sha1_info->data) + sha1_info->local, buffer, i);
|
||||
count -= i;
|
||||
buffer += i;
|
||||
sha_info->local += i;
|
||||
if (sha_info->local == SHA_BLOCKSIZE) {
|
||||
sha1_transform(sha_info);
|
||||
sha1_info->local += i;
|
||||
if (sha1_info->local == SHA1_BLOCKSIZE) {
|
||||
sha1_transform(sha1_info);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
while (count >= SHA_BLOCKSIZE) {
|
||||
memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
|
||||
buffer += SHA_BLOCKSIZE;
|
||||
count -= SHA_BLOCKSIZE;
|
||||
sha1_transform(sha_info);
|
||||
while (count >= SHA1_BLOCKSIZE) {
|
||||
memcpy(sha1_info->data, buffer, SHA1_BLOCKSIZE);
|
||||
buffer += SHA1_BLOCKSIZE;
|
||||
count -= SHA1_BLOCKSIZE;
|
||||
sha1_transform(sha1_info);
|
||||
}
|
||||
memcpy(sha_info->data, buffer, count);
|
||||
sha_info->local = count;
|
||||
memcpy(sha1_info->data, buffer, count);
|
||||
sha1_info->local = count;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sha1_transform_and_copy(unsigned char digest[20], SHA_INFO *sha_info)
|
||||
sha1_transform_and_copy(unsigned char digest[20], SHA1_INFO *sha1_info)
|
||||
{
|
||||
sha1_transform(sha_info);
|
||||
digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
|
||||
digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
|
||||
digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);
|
||||
digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);
|
||||
digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
|
||||
digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
|
||||
digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);
|
||||
digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);
|
||||
digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
|
||||
digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
|
||||
digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);
|
||||
digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);
|
||||
digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
|
||||
digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
|
||||
digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);
|
||||
digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);
|
||||
digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
|
||||
digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
|
||||
digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);
|
||||
digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);
|
||||
sha1_transform(sha1_info);
|
||||
digest[ 0] = (unsigned char) ((sha1_info->digest[0] >> 24) & 0xff);
|
||||
digest[ 1] = (unsigned char) ((sha1_info->digest[0] >> 16) & 0xff);
|
||||
digest[ 2] = (unsigned char) ((sha1_info->digest[0] >> 8) & 0xff);
|
||||
digest[ 3] = (unsigned char) ((sha1_info->digest[0] ) & 0xff);
|
||||
digest[ 4] = (unsigned char) ((sha1_info->digest[1] >> 24) & 0xff);
|
||||
digest[ 5] = (unsigned char) ((sha1_info->digest[1] >> 16) & 0xff);
|
||||
digest[ 6] = (unsigned char) ((sha1_info->digest[1] >> 8) & 0xff);
|
||||
digest[ 7] = (unsigned char) ((sha1_info->digest[1] ) & 0xff);
|
||||
digest[ 8] = (unsigned char) ((sha1_info->digest[2] >> 24) & 0xff);
|
||||
digest[ 9] = (unsigned char) ((sha1_info->digest[2] >> 16) & 0xff);
|
||||
digest[10] = (unsigned char) ((sha1_info->digest[2] >> 8) & 0xff);
|
||||
digest[11] = (unsigned char) ((sha1_info->digest[2] ) & 0xff);
|
||||
digest[12] = (unsigned char) ((sha1_info->digest[3] >> 24) & 0xff);
|
||||
digest[13] = (unsigned char) ((sha1_info->digest[3] >> 16) & 0xff);
|
||||
digest[14] = (unsigned char) ((sha1_info->digest[3] >> 8) & 0xff);
|
||||
digest[15] = (unsigned char) ((sha1_info->digest[3] ) & 0xff);
|
||||
digest[16] = (unsigned char) ((sha1_info->digest[4] >> 24) & 0xff);
|
||||
digest[17] = (unsigned char) ((sha1_info->digest[4] >> 16) & 0xff);
|
||||
digest[18] = (unsigned char) ((sha1_info->digest[4] >> 8) & 0xff);
|
||||
digest[19] = (unsigned char) ((sha1_info->digest[4] ) & 0xff);
|
||||
}
|
||||
|
||||
/* finish computing the SHA digest */
|
||||
void
|
||||
sha1_final(uint8_t digest[20], SHA_INFO *sha_info)
|
||||
sha1_final(uint8_t digest[20], SHA1_INFO *sha1_info)
|
||||
{
|
||||
int count;
|
||||
uint32_t lo_bit_count, hi_bit_count;
|
||||
|
||||
lo_bit_count = sha_info->count_lo;
|
||||
hi_bit_count = sha_info->count_hi;
|
||||
lo_bit_count = sha1_info->count_lo;
|
||||
hi_bit_count = sha1_info->count_hi;
|
||||
count = (int) ((lo_bit_count >> 3) & 0x3f);
|
||||
((uint8_t *) sha_info->data)[count++] = 0x80;
|
||||
if (count > SHA_BLOCKSIZE - 8) {
|
||||
memset(((uint8_t *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
|
||||
sha1_transform(sha_info);
|
||||
memset((uint8_t *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
|
||||
((uint8_t *) sha1_info->data)[count++] = 0x80;
|
||||
if (count > SHA1_BLOCKSIZE - 8) {
|
||||
memset(((uint8_t *) sha1_info->data) + count, 0, SHA1_BLOCKSIZE - count);
|
||||
sha1_transform(sha1_info);
|
||||
memset((uint8_t *) sha1_info->data, 0, SHA1_BLOCKSIZE - 8);
|
||||
} else {
|
||||
memset(((uint8_t *) sha_info->data) + count, 0,
|
||||
SHA_BLOCKSIZE - 8 - count);
|
||||
memset(((uint8_t *) sha1_info->data) + count, 0,
|
||||
SHA1_BLOCKSIZE - 8 - count);
|
||||
}
|
||||
sha_info->data[56] = (uint8_t)((hi_bit_count >> 24) & 0xff);
|
||||
sha_info->data[57] = (uint8_t)((hi_bit_count >> 16) & 0xff);
|
||||
sha_info->data[58] = (uint8_t)((hi_bit_count >> 8) & 0xff);
|
||||
sha_info->data[59] = (uint8_t)((hi_bit_count >> 0) & 0xff);
|
||||
sha_info->data[60] = (uint8_t)((lo_bit_count >> 24) & 0xff);
|
||||
sha_info->data[61] = (uint8_t)((lo_bit_count >> 16) & 0xff);
|
||||
sha_info->data[62] = (uint8_t)((lo_bit_count >> 8) & 0xff);
|
||||
sha_info->data[63] = (uint8_t)((lo_bit_count >> 0) & 0xff);
|
||||
sha1_transform_and_copy(digest, sha_info);
|
||||
sha1_info->data[56] = (uint8_t)((hi_bit_count >> 24) & 0xff);
|
||||
sha1_info->data[57] = (uint8_t)((hi_bit_count >> 16) & 0xff);
|
||||
sha1_info->data[58] = (uint8_t)((hi_bit_count >> 8) & 0xff);
|
||||
sha1_info->data[59] = (uint8_t)((hi_bit_count >> 0) & 0xff);
|
||||
sha1_info->data[60] = (uint8_t)((lo_bit_count >> 24) & 0xff);
|
||||
sha1_info->data[61] = (uint8_t)((lo_bit_count >> 16) & 0xff);
|
||||
sha1_info->data[62] = (uint8_t)((lo_bit_count >> 8) & 0xff);
|
||||
sha1_info->data[63] = (uint8_t)((lo_bit_count >> 0) & 0xff);
|
||||
sha1_transform_and_copy(digest, sha1_info);
|
||||
}
|
||||
|
||||
/***EOF***/
|
||||
|
||||
+14
-22
@@ -1,12 +1,12 @@
|
||||
/* $Id$
|
||||
*****************************************************************************
|
||||
*
|
||||
* File: sha.h
|
||||
* File: sha1.h
|
||||
*
|
||||
* Purpose: Header for sha.c
|
||||
* Purpose: Header for sha1.c
|
||||
*
|
||||
* sha - An implementation of the NIST SHA Message Digest
|
||||
* algorithm. This header covers SHA1 and SHA256
|
||||
* sha - An implementation of the NIST SHA1 Message Digest
|
||||
* algorithm.
|
||||
*
|
||||
* Copyright (C) 2001 Rafael R. Sevilla <sevillar@team.ph.inter.net>
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -25,8 +25,8 @@
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
#ifndef SHA_H
|
||||
#define SHA_H 1
|
||||
#ifndef SHA1_H
|
||||
#define SHA1_H 1
|
||||
|
||||
#include "fko_common.h"
|
||||
|
||||
@@ -40,28 +40,20 @@
|
||||
#define TRUNC32(x) ((x) & 0xffffffffL)
|
||||
#endif
|
||||
|
||||
#define SHA_BLOCKSIZE 64
|
||||
#define SHA1_DIGESTSIZE 20
|
||||
#define SHA256_DIGESTSIZE 32
|
||||
#define SHA1_BLOCKSIZE 64
|
||||
#define SHA1_DIGEST_LENGTH 20
|
||||
|
||||
typedef struct {
|
||||
uint32_t digest[8];
|
||||
uint32_t count_lo, count_hi;
|
||||
uint8_t data[SHA_BLOCKSIZE];
|
||||
uint8_t data[SHA1_BLOCKSIZE];
|
||||
int local;
|
||||
} SHA_INFO;
|
||||
} SHA1_INFO;
|
||||
|
||||
/* SHA1 prototypes.
|
||||
*/
|
||||
void sha1_init(SHA_INFO *sha_info);
|
||||
void sha1_update(SHA_INFO *sha_info, uint8_t *buffer, int count);
|
||||
void sha1_final(uint8_t digest[SHA1_DIGESTSIZE], SHA_INFO *sha_info);
|
||||
void sha1_init(SHA1_INFO *sha1_info);
|
||||
void sha1_update(SHA1_INFO *sha1_info, uint8_t *buffer, int count);
|
||||
void sha1_final(uint8_t digest[SHA1_DIGEST_LENGTH], SHA1_INFO *sha1_info);
|
||||
|
||||
/* SHA256 prototypes.
|
||||
*/
|
||||
void sha256_init(SHA_INFO *sha_info);
|
||||
void sha256_update(SHA_INFO *sha_info, uint8_t *buffer, int count);
|
||||
void sha256_final(SHA_INFO *sha_info);
|
||||
void sha256_unpackdigest(uint8_t digest[SHA256_DIGESTSIZE], SHA_INFO *sha_info);
|
||||
|
||||
#endif /* SHA_H */
|
||||
#endif /* SHA1_H */
|
||||
-295
@@ -1,295 +0,0 @@
|
||||
/* $Id$
|
||||
*****************************************************************************
|
||||
*
|
||||
* File: sha256.c
|
||||
*
|
||||
* Purpose: Implementation of the SHA256 message-digest algorithm for
|
||||
* libfwknop.
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2001 Rafael R. Sevilla <sevillar@team.ph.inter.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
#include "sha.h"
|
||||
|
||||
/* 32-bit rotate to the RIGHT
|
||||
*/
|
||||
#define ROT32(x,n) TRUNC32(((x >> n) | (x << (32 - n))))
|
||||
|
||||
#define CH(x, y, z) (((x) & (y))^(~(x) & (z)))
|
||||
#define MAJ(x, y, z)(((x) & (y))^((x) & (z))^((y) & (z)))
|
||||
|
||||
/* Upper-case sigma functions in SHA spec
|
||||
*/
|
||||
#define USIG0(x) (ROT32(x, 2)^ROT32(x, 13)^ROT32(x, 22))
|
||||
#define USIG1(x) (ROT32(x, 6)^ROT32(x, 11)^ROT32(x, 25))
|
||||
|
||||
/* Lower-case sigma functions in SHA spec
|
||||
*/
|
||||
#define LSIG0(x) (ROT32(x, 7)^ROT32(x, 18)^TRUNC32(x >> 3))
|
||||
#define LSIG1(x) (ROT32(x, 17)^ROT32(x, 19)^TRUNC32(x >> 10))
|
||||
|
||||
/* SHA256 constants
|
||||
*/
|
||||
static uint32_t K[64] = {
|
||||
0x428a2f98L, 0x71374491L, 0xb5c0fbcfL, 0xe9b5dba5L,
|
||||
0x3956c25bL, 0x59f111f1L, 0x923f82a4L, 0xab1c5ed5L,
|
||||
0xd807aa98L, 0x12835b01L, 0x243185beL, 0x550c7dc3L,
|
||||
0x72be5d74L, 0x80deb1feL, 0x9bdc06a7L, 0xc19bf174L,
|
||||
0xe49b69c1L, 0xefbe4786L, 0x0fc19dc6L, 0x240ca1ccL,
|
||||
0x2de92c6fL, 0x4a7484aaL, 0x5cb0a9dcL, 0x76f988daL,
|
||||
0x983e5152L, 0xa831c66dL, 0xb00327c8L, 0xbf597fc7L,
|
||||
0xc6e00bf3L, 0xd5a79147L, 0x06ca6351L, 0x14292967L,
|
||||
0x27b70a85L, 0x2e1b2138L, 0x4d2c6dfcL, 0x53380d13L,
|
||||
0x650a7354L, 0x766a0abbL, 0x81c2c92eL, 0x92722c85L,
|
||||
0xa2bfe8a1L, 0xa81a664bL, 0xc24b8b70L, 0xc76c51a3L,
|
||||
0xd192e819L, 0xd6990624L, 0xf40e3585L, 0x106aa070L,
|
||||
0x19a4c116L, 0x1e376c08L, 0x2748774cL, 0x34b0bcb5L,
|
||||
0x391c0cb3L, 0x4ed8aa4aL, 0x5b9cca4fL, 0x682e6ff3L,
|
||||
0x748f82eeL, 0x78a5636fL, 0x84c87814L, 0x8cc70208L,
|
||||
0x90befffaL, 0xa4506cebL, 0xbef9a3f7L, 0xc67178f2L
|
||||
};
|
||||
|
||||
static void
|
||||
sha256_transform(SHA_INFO *sha_info)
|
||||
{
|
||||
int i, j;
|
||||
uint8_t *dp;
|
||||
uint32_t T, T1, T2, A, B, C, D, E, F, G, H, W[64];
|
||||
|
||||
dp = sha_info->data;
|
||||
|
||||
#undef SWAP_DONE
|
||||
|
||||
#if BYTEORDER == 1234
|
||||
#define SWAP_DONE
|
||||
for (i = 0; i < 16; ++i) {
|
||||
T = *((uint32_t *) dp);
|
||||
dp += 4;
|
||||
W[i] =
|
||||
((T << 24) & 0xff000000) |
|
||||
((T << 8) & 0x00ff0000) |
|
||||
((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if BYTEORDER == 4321
|
||||
#define SWAP_DONE
|
||||
for (i = 0; i < 16; ++i) {
|
||||
T = *((uint32_t *) dp);
|
||||
dp += 4;
|
||||
W[i] = TRUNC32(T);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if BYTEORDER == 12345678
|
||||
#define SWAP_DONE
|
||||
for (i = 0; i < 16; i += 2) {
|
||||
T = *((uint32_t *) dp);
|
||||
dp += 8;
|
||||
W[i] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
|
||||
((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
|
||||
T >>= 32;
|
||||
W[i+1] = ((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
|
||||
((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if BYTEORDER == 87654321
|
||||
#define SWAP_DONE
|
||||
for (i = 0; i < 16; i += 2) {
|
||||
T = *((uint32_t *) dp);
|
||||
dp += 8;
|
||||
W[i] = TRUNC32(T >> 32);
|
||||
W[i+1] = TRUNC32(T);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef SWAP_DONE
|
||||
#define SWAP_DONE
|
||||
for (i = 0; i < 16; ++i) {
|
||||
T = *((uint32_t *) dp);
|
||||
dp += 4;
|
||||
W[i] = TRUNC32(T);
|
||||
}
|
||||
#ifndef WIN32
|
||||
#warning Undetermined or unsupported Byte Order... We will try LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif /* SWAP_DONE */
|
||||
|
||||
A = sha_info->digest[0];
|
||||
B = sha_info->digest[1];
|
||||
C = sha_info->digest[2];
|
||||
D = sha_info->digest[3];
|
||||
E = sha_info->digest[4];
|
||||
F = sha_info->digest[5];
|
||||
G = sha_info->digest[6];
|
||||
H = sha_info->digest[7];
|
||||
|
||||
for (i=16; i<64; i++)
|
||||
W[i] = TRUNC32(LSIG1(W[i-2]) + W[i-7] + LSIG0(W[i-15]) + W[i-16]);
|
||||
|
||||
for (j=0; j<64; j++) {
|
||||
T1 = TRUNC32(H + USIG1(E) + CH(E, F, G) + K[j] + W[j]);
|
||||
T2 = TRUNC32(USIG0(A) + MAJ(A, B, C));
|
||||
H = G;
|
||||
G = F;
|
||||
F = E;
|
||||
E = TRUNC32(D + T1);
|
||||
D = C;
|
||||
C = B;
|
||||
B = A;
|
||||
A = TRUNC32(T1 + T2);
|
||||
}
|
||||
|
||||
sha_info->digest[0] = TRUNC32(sha_info->digest[0] + A);
|
||||
sha_info->digest[1] = TRUNC32(sha_info->digest[1] + B);
|
||||
sha_info->digest[2] = TRUNC32(sha_info->digest[2] + C);
|
||||
sha_info->digest[3] = TRUNC32(sha_info->digest[3] + D);
|
||||
sha_info->digest[4] = TRUNC32(sha_info->digest[4] + E);
|
||||
sha_info->digest[5] = TRUNC32(sha_info->digest[5] + F);
|
||||
sha_info->digest[6] = TRUNC32(sha_info->digest[6] + G);
|
||||
sha_info->digest[7] = TRUNC32(sha_info->digest[7] + H);
|
||||
}
|
||||
|
||||
void
|
||||
sha256_init(SHA_INFO *sha_info)
|
||||
{
|
||||
sha_info->digest[0] = 0x6a09e667L;
|
||||
sha_info->digest[1] = 0xbb67ae85L;
|
||||
sha_info->digest[2] = 0x3c6ef372L;
|
||||
sha_info->digest[3] = 0xa54ff53aL;
|
||||
sha_info->digest[4] = 0x510e527fL;
|
||||
sha_info->digest[5] = 0x9b05688cL;
|
||||
sha_info->digest[6] = 0x1f83d9abL;
|
||||
sha_info->digest[7] = 0x5be0cd19L;
|
||||
sha_info->count_lo = 0L;
|
||||
sha_info->count_hi = 0L;
|
||||
sha_info->local = 0;
|
||||
memset((uint8_t *)sha_info->data, 0, SHA_BLOCKSIZE);
|
||||
}
|
||||
|
||||
/* Update the SHA digest
|
||||
*/
|
||||
void
|
||||
sha256_update(SHA_INFO *sha_info, uint8_t *buffer, int count)
|
||||
{
|
||||
int i;
|
||||
uint32_t clo;
|
||||
|
||||
clo = TRUNC32(sha_info->count_lo + ((uint8_t) count << 3));
|
||||
if (clo < sha_info->count_lo) {
|
||||
sha_info->count_hi++;
|
||||
}
|
||||
sha_info->count_lo = clo;
|
||||
sha_info->count_hi += (uint32_t) count >> 29;
|
||||
if (sha_info->local) {
|
||||
i = SHA_BLOCKSIZE - sha_info->local;
|
||||
if (i > count) {
|
||||
i = count;
|
||||
}
|
||||
memcpy(((uint8_t *) sha_info->data) + sha_info->local, buffer, i);
|
||||
count -= i;
|
||||
buffer += i;
|
||||
sha_info->local += i;
|
||||
if (sha_info->local == SHA_BLOCKSIZE) {
|
||||
sha256_transform(sha_info);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
while (count >= SHA_BLOCKSIZE) {
|
||||
memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
|
||||
buffer += SHA_BLOCKSIZE;
|
||||
count -= SHA_BLOCKSIZE;
|
||||
sha256_transform(sha_info);
|
||||
}
|
||||
memcpy(sha_info->data, buffer, count);
|
||||
sha_info->local = count;
|
||||
}
|
||||
|
||||
/* Finish computing the SHA digest
|
||||
*/
|
||||
void
|
||||
sha256_final(SHA_INFO *sha_info)
|
||||
{
|
||||
int count;
|
||||
uint32_t lo_bit_count, hi_bit_count;
|
||||
|
||||
lo_bit_count = sha_info->count_lo;
|
||||
hi_bit_count = sha_info->count_hi;
|
||||
count = (int) ((lo_bit_count >> 3) & 0x3f);
|
||||
((uint8_t *) sha_info->data)[count++] = 0x80;
|
||||
if (count > SHA_BLOCKSIZE - 8) {
|
||||
memset(((uint8_t *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
|
||||
sha256_transform(sha_info);
|
||||
memset((uint8_t *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
|
||||
} else {
|
||||
memset(((uint8_t *) sha_info->data) + count, 0,
|
||||
SHA_BLOCKSIZE - 8 - count);
|
||||
}
|
||||
sha_info->data[56] = (hi_bit_count >> 24) & 0xff;
|
||||
sha_info->data[57] = (hi_bit_count >> 16) & 0xff;
|
||||
sha_info->data[58] = (hi_bit_count >> 8) & 0xff;
|
||||
sha_info->data[59] = (hi_bit_count >> 0) & 0xff;
|
||||
sha_info->data[60] = (lo_bit_count >> 24) & 0xff;
|
||||
sha_info->data[61] = (lo_bit_count >> 16) & 0xff;
|
||||
sha_info->data[62] = (lo_bit_count >> 8) & 0xff;
|
||||
sha_info->data[63] = (lo_bit_count >> 0) & 0xff;
|
||||
sha256_transform(sha_info);
|
||||
}
|
||||
|
||||
void
|
||||
sha256_unpackdigest(uint8_t digest[32], SHA_INFO *sha_info)
|
||||
{
|
||||
digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
|
||||
digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
|
||||
digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);
|
||||
digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);
|
||||
digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
|
||||
digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
|
||||
digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);
|
||||
digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);
|
||||
digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
|
||||
digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
|
||||
digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);
|
||||
digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);
|
||||
digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
|
||||
digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
|
||||
digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);
|
||||
digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);
|
||||
digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
|
||||
digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
|
||||
digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);
|
||||
digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);
|
||||
digest[20] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);
|
||||
digest[21] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);
|
||||
digest[22] = (unsigned char) ((sha_info->digest[5] >> 8) & 0xff);
|
||||
digest[23] = (unsigned char) ((sha_info->digest[5] ) & 0xff);
|
||||
digest[24] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);
|
||||
digest[25] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);
|
||||
digest[26] = (unsigned char) ((sha_info->digest[6] >> 8) & 0xff);
|
||||
digest[27] = (unsigned char) ((sha_info->digest[6] ) & 0xff);
|
||||
digest[28] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);
|
||||
digest[29] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);
|
||||
digest[30] = (unsigned char) ((sha_info->digest[7] >> 8) & 0xff);
|
||||
digest[31] = (unsigned char) ((sha_info->digest[7] ) & 0xff);
|
||||
}
|
||||
|
||||
|
||||
/***EOF***/
|
||||
+9
-1
@@ -16,7 +16,7 @@ use warnings;
|
||||
use Carp;
|
||||
require Exporter;
|
||||
|
||||
our $VERSION = '0.22';
|
||||
our $VERSION = '0.23';
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
|
||||
@@ -706,6 +706,14 @@ The SHA1 message digest algorithm.
|
||||
|
||||
The SHA256 message digest algorithm. This is the I<libfko> default.
|
||||
|
||||
=item * B<FKO_DIGEST_SHA384>
|
||||
|
||||
The SHA384 message digest algorithm. This is the I<libfko> default.
|
||||
|
||||
=item * B<FKO_DIGEST_SHA512>
|
||||
|
||||
The SHA512 message digest algorithm. This is the I<libfko> default.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@ our @DIGEST_TYPES = qw(
|
||||
FKO_DIGEST_MD5
|
||||
FKO_DIGEST_SHA1
|
||||
FKO_DIGEST_SHA256
|
||||
FKO_DIGEST_SHA384
|
||||
FKO_DIGEST_SHA512
|
||||
);
|
||||
|
||||
# Encryption types tag list.
|
||||
@@ -101,6 +103,8 @@ use constant {
|
||||
FKO_DIGEST_MD5 => 1,
|
||||
FKO_DIGEST_SHA1 => 2,
|
||||
FKO_DIGEST_SHA256 => 3,
|
||||
FKO_DIGEST_SHA384 => 4,
|
||||
FKO_DIGEST_SHA512 => 5,
|
||||
|
||||
# Encryption types
|
||||
FKO_ENCRYPTION_RIJNDAEL => 1,
|
||||
|
||||
+11
-3
@@ -77,11 +77,15 @@ get_char_val(const char *var_name, char *dest, char *lptr)
|
||||
static int
|
||||
parse_time_offset(char *offset_str)
|
||||
{
|
||||
int offset = 0, i, j, offset_type = TIME_OFFSET_SECONDS;
|
||||
int i, j;
|
||||
int offset = 0;
|
||||
int offset_type = TIME_OFFSET_SECONDS;
|
||||
int os_len = strlen(offset_str);
|
||||
|
||||
char offset_digits[MAX_TIME_STR_LEN];
|
||||
|
||||
j=0;
|
||||
for (i=0; i < strlen(offset_str); i++) {
|
||||
for (i=0; i < os_len; i++) {
|
||||
if (isdigit(offset_str[i])) {
|
||||
offset_digits[j] = offset_str[i];
|
||||
j++;
|
||||
@@ -247,7 +251,7 @@ validate_options(fko_cli_options_t *options)
|
||||
void
|
||||
config_init(fko_cli_options_t *options, int argc, char **argv)
|
||||
{
|
||||
int cmd_arg, index, i;
|
||||
int cmd_arg, index;
|
||||
struct opts_track ot;
|
||||
|
||||
/* Zero out options and opts_track.
|
||||
@@ -309,6 +313,10 @@ config_init(fko_cli_options_t *options, int argc, char **argv)
|
||||
options->digest_type = FKO_DIGEST_SHA1;
|
||||
else if(strncasecmp(optarg, "sha256", 6) == 0)
|
||||
options->digest_type = FKO_DIGEST_SHA256;
|
||||
else if(strncasecmp(optarg, "sha384", 6) == 0)
|
||||
options->digest_type = FKO_DIGEST_SHA384;
|
||||
else if(strncasecmp(optarg, "sha512", 6) == 0)
|
||||
options->digest_type = FKO_DIGEST_SHA512;
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "* Invalid digest type: %s\n", optarg);
|
||||
|
||||
+3
-3
@@ -431,8 +431,9 @@ static int
|
||||
ipv4_str_has_port(char *str)
|
||||
{
|
||||
int rv = 0, i;
|
||||
int st_len = strlen(str);
|
||||
|
||||
for (i=0; i < strlen(str); i++) {
|
||||
for (i=0; i < st_len; i++) {
|
||||
if (str[i] == ',' || str[i] == ':') {
|
||||
str[i] = ','; /* force "<ip>,<port>" format */
|
||||
rv = 1;
|
||||
@@ -453,7 +454,6 @@ static void resolve_ip_http(fko_cli_options_t *options)
|
||||
struct addrinfo *result, *rp, hints;
|
||||
char http_buf[HTTP_MAX_REQUEST_LEN];
|
||||
char http_response[HTTP_MAX_RESPONSE_LEN];
|
||||
char ip_str[MAX_IP_STR_LEN];
|
||||
|
||||
/* Build our HTTP request to resolve the external IP (this is similar to
|
||||
* to contacting whatismyip.org, but using a different URL).
|
||||
@@ -520,7 +520,7 @@ static void resolve_ip_http(fko_cli_options_t *options)
|
||||
);
|
||||
}
|
||||
|
||||
res = read(sock, http_response, HTTP_MAX_RESPONSE_LEN);
|
||||
res = recv(sock, http_response, HTTP_MAX_RESPONSE_LEN, 0);
|
||||
http_response[HTTP_MAX_RESPONSE_LEN-1] = '\0';
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
Reference in New Issue
Block a user