added qse_encode_hmacmbs()/qse_encode_hmacwcs()/qse_decode_hmacmbs()/qse_decode_hmacwcs()

This commit is contained in:
hyung-hwan 2019-08-19 09:07:21 +00:00
parent 2f07153431
commit 94cc9298c1
6 changed files with 159 additions and 18 deletions

View File

@ -165,7 +165,7 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/ac/ar-lib \
$(top_srcdir)/ac/compile $(top_srcdir)/ac/config.guess \ $(top_srcdir)/ac/compile $(top_srcdir)/ac/config.guess \
$(top_srcdir)/ac/config.sub $(top_srcdir)/ac/install-sh \ $(top_srcdir)/ac/config.sub $(top_srcdir)/ac/install-sh \
$(top_srcdir)/ac/ltmain.sh $(top_srcdir)/ac/missing README \ $(top_srcdir)/ac/ltmain.sh $(top_srcdir)/ac/missing README \
ac/ar-lib ac/compile ac/config.guess ac/config.sub \ ac/ar-lib ac/compile ac/config.guess ac/config.sub ac/depcomp \
ac/install-sh ac/ltmain.sh ac/missing ac/install-sh ac/ltmain.sh ac/missing
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION) distdir = $(PACKAGE)-$(VERSION)

20
qse/configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for qse 0.8.2. # Generated by GNU Autoconf 2.69 for qse 0.8.3.
# #
# Report bugs to <Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)>. # Report bugs to <Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)>.
# #
@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='qse' PACKAGE_NAME='qse'
PACKAGE_TARNAME='qse' PACKAGE_TARNAME='qse'
PACKAGE_VERSION='0.8.2' PACKAGE_VERSION='0.8.3'
PACKAGE_STRING='qse 0.8.2' PACKAGE_STRING='qse 0.8.3'
PACKAGE_BUGREPORT='Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)' PACKAGE_BUGREPORT='Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)'
PACKAGE_URL='http://code.miflux.com/@qse' PACKAGE_URL='http://code.miflux.com/@qse'
@ -1414,7 +1414,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures qse 0.8.2 to adapt to many kinds of systems. \`configure' configures qse 0.8.3 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1484,7 +1484,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of qse 0.8.2:";; short | recursive ) echo "Configuration of qse 0.8.3:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1629,7 +1629,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
qse configure 0.8.2 qse configure 0.8.3
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -2413,7 +2413,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by qse $as_me 0.8.2, which was It was created by qse $as_me 0.8.3, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -3288,7 +3288,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='qse' PACKAGE='qse'
VERSION='0.8.2' VERSION='0.8.3'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -24323,7 +24323,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by qse $as_me 0.8.2, which was This file was extended by qse $as_me 0.8.3, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -24390,7 +24390,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
qse config.status 0.8.2 qse config.status 0.8.3
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -4,7 +4,7 @@ dnl Make sure you change the version information
dnl in include/qse/conf_*.h whenever you change the version dnl in include/qse/conf_*.h whenever you change the version
dnl here. Those files don't depend on autoconf, thus requiring dnl here. Those files don't depend on autoconf, thus requiring
dnl manual change. dnl manual change.
AC_INIT([qse],[0.8.2],[Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)],[],[http://code.miflux.com/@qse]) AC_INIT([qse],[0.8.3],[Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)],[],[http://code.miflux.com/@qse])
AC_CONFIG_HEADER([include/qse/config.h]) AC_CONFIG_HEADER([include/qse/config.h])
AC_CONFIG_AUX_DIR([ac]) AC_CONFIG_AUX_DIR([ac])

View File

@ -105,7 +105,7 @@ qse_size_t qse_get_hmac_block_size (
* prefixed with hmac followed by the pair values encoded in hexdecimal * prefixed with hmac followed by the pair values encoded in hexdecimal
* digits seperated by a dash * digits seperated by a dash
*/ */
qse_mchar_t* qse_encode_hmacstr ( qse_mchar_t* qse_encode_hmacmbs (
qse_hmac_sha_type_t sha_type, qse_hmac_sha_type_t sha_type,
const qse_uint8_t* keyptr, const qse_uint8_t* keyptr,
qse_size_t keylen, qse_size_t keylen,
@ -114,16 +114,43 @@ qse_mchar_t* qse_encode_hmacstr (
qse_mmgr_t* mmgr qse_mmgr_t* mmgr
); );
qse_xptl_t* qse_decode_hmacstr ( qse_xptl_t* qse_decode_hmacmbs (
qse_hmac_sha_type_t sha_type, qse_hmac_sha_type_t sha_type,
const qse_uint8_t* keyptr, const qse_uint8_t* keyptr,
qse_size_t keylen, qse_size_t keylen,
const qse_mchar_t* hmacstr, const qse_mchar_t* hmacmbs,
qse_size_t* count, qse_size_t* count,
qse_mmgr_t* mmgr qse_mmgr_t* mmgr
); );
qse_wchar_t* qse_encode_hmacwcs (
qse_hmac_sha_type_t sha_type,
const qse_uint8_t* keyptr,
qse_size_t keylen,
qse_xptl_t* data,
qse_size_t count,
qse_mmgr_t* mmgr
);
qse_xptl_t* qse_decode_hmacwcs (
qse_hmac_sha_type_t sha_type,
const qse_uint8_t* keyptr,
qse_size_t keylen,
const qse_wchar_t* hmacwcs,
qse_size_t* count,
qse_mmgr_t* mmgr
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_encode_hmacstr qse_encode_hmacmbs
# define qse_decode_hmacstr qse_decode_hmacmbs
#else
# define qse_encode_hmacstr qse_encode_hmacwcs
# define qse_decode_hmacstr qse_decode_hmacwcs
#endif
#if defined(__cplusplus) #if defined(__cplusplus)
} }
#endif #endif

View File

@ -29,6 +29,7 @@
#include <qse/Types.hpp> #include <qse/Types.hpp>
#include <qse/Uncopyable.hpp> #include <qse/Uncopyable.hpp>
#include <qse/cmn/Mmgr.hpp>
#include <qse/si/mtx.h> #include <qse/si/mtx.h>
QSE_BEGIN_NAMESPACE(QSE) QSE_BEGIN_NAMESPACE(QSE)

View File

@ -245,8 +245,9 @@ qse_size_t qse_hmac_digest (qse_hmac_t* ctx, qse_uint8_t* digest, qse_size_t siz
} }
/* ------------------------------------------------------------------------ */
qse_mchar_t* qse_encode_hmacstr (qse_hmac_sha_type_t sha_type, const qse_uint8_t* keyptr, qse_size_t keylen, qse_xptl_t* data, qse_size_t count, qse_mmgr_t* mmgr) qse_mchar_t* qse_encode_hmacmbs (qse_hmac_sha_type_t sha_type, const qse_uint8_t* keyptr, qse_size_t keylen, qse_xptl_t* data, qse_size_t count, qse_mmgr_t* mmgr)
{ {
qse_size_t reqsize = 0, i , j; qse_size_t reqsize = 0, i , j;
qse_mchar_t* buf, * ptr; qse_mchar_t* buf, * ptr;
@ -277,13 +278,14 @@ qse_mchar_t* qse_encode_hmacstr (qse_hmac_sha_type_t sha_type, const qse_uint8_t
qse_hmac_digest (&hmac, digest, digest_len); qse_hmac_digest (&hmac, digest, digest_len);
ptr = buf; ptr = buf;
for (i = 0; i < digest_len; i++) ptr += qse_mbsfmt(ptr, ("%02x"), digest[i]); for (i = 0; i < digest_len; i++) ptr += qse_mbsfmt(ptr, QSE_MT("%02x"), digest[i]);
*ptr = '-'; *ptr = '-';
return buf; return buf;
} }
qse_xptl_t* qse_decode_hmacstr (qse_hmac_sha_type_t sha_type, const qse_uint8_t* keyptr, qse_size_t keylen, const qse_mchar_t* hmacstr, qse_size_t* count, qse_mmgr_t* mmgr)
qse_xptl_t* qse_decode_hmacmbs (qse_hmac_sha_type_t sha_type, const qse_uint8_t* keyptr, qse_size_t keylen, const qse_mchar_t* hmacstr, qse_size_t* count, qse_mmgr_t* mmgr)
{ {
qse_uint8_t digest[QSE_HMAC_MAX_DIGEST_LEN]; qse_uint8_t digest[QSE_HMAC_MAX_DIGEST_LEN];
qse_uint8_t orgdig[QSE_HMAC_MAX_DIGEST_LEN]; qse_uint8_t orgdig[QSE_HMAC_MAX_DIGEST_LEN];
@ -352,3 +354,114 @@ qse_xptl_t* qse_decode_hmacstr (qse_hmac_sha_type_t sha_type, const qse_uint8_t*
*count = segcount; *count = segcount;
return (qse_xptl_t*)data; return (qse_xptl_t*)data;
} }
/* ------------------------------------------------------------------------ */
qse_wchar_t* qse_encode_hmacwcs (qse_hmac_sha_type_t sha_type, const qse_uint8_t* keyptr, qse_size_t keylen, qse_xptl_t* data, qse_size_t count, qse_mmgr_t* mmgr)
{
qse_size_t reqsize = 0, i , j;
qse_wchar_t* buf, * ptr;
qse_xptl_t* dptr;
qse_hmac_t hmac;
qse_uint8_t digest[QSE_HMAC_MAX_DIGEST_LEN];
qse_size_t digest_len = sha_digest_size(sha_type);
for (i = 0, dptr = data; i < count; i++, dptr++) reqsize += 1 + (dptr->len * 2);
reqsize += digest_len * 2 + 1;
buf = (qse_wchar_t*)QSE_MMGR_ALLOC(mmgr, reqsize * QSE_SIZEOF(*buf));
if (!buf) return QSE_NULL;
ptr = &buf[digest_len * 2 + 1];
for (i = 0, dptr = data; i < count; i++, dptr++)
{
for (j = 0; j < dptr->len; j++)
{
ptr += qse_wcsfmt(ptr, QSE_WT("%02x"), *((qse_uint8_t*)dptr->ptr + j));
}
if (i < count - 1) *ptr++ = QSE_WT('-');
}
*ptr = '\0';
qse_hmac_initialize (&hmac, sha_type, keyptr, keylen);
qse_hmac_update (&hmac, (const qse_uint8_t*)&buf[digest_len * 2 + 1], ptr - &buf[digest_len * 2 + 1]);
qse_hmac_digest (&hmac, digest, digest_len);
ptr = buf;
for (i = 0; i < digest_len; i++) ptr += qse_wcsfmt(ptr, QSE_WT("%02x"), digest[i]);
*ptr = '-';
return buf;
}
qse_xptl_t* qse_decode_hmacwcs (qse_hmac_sha_type_t sha_type, const qse_uint8_t* keyptr, qse_size_t keylen, const qse_wchar_t* hmacstr, qse_size_t* count, qse_mmgr_t* mmgr)
{
qse_uint8_t digest[QSE_HMAC_MAX_DIGEST_LEN];
qse_uint8_t orgdig[QSE_HMAC_MAX_DIGEST_LEN];
qse_size_t digest_len = sha_digest_size(sha_type);
const qse_wchar_t* ptr, * segptr, * segstart;
qse_size_t seglen, reqlen = 0, segcount = 0, i;
qse_uint8_t* data, * uptr;
qse_xptl_t* xptl;
qse_hmac_t hmac;
for (ptr = hmacstr, i = 0; *ptr != QSE_WT('\0') && *ptr != QSE_WT('-'); ptr += 2, i++)
{
if (!QSE_ISWXDIGIT(ptr[0]) || !QSE_ISWXDIGIT(ptr[1])) return QSE_NULL;
if (i >= digest_len) return QSE_NULL; /* digest too long */
orgdig[i] = QSE_WXDIGITTONUM(ptr[0]) * 16 + QSE_WXDIGITTONUM(ptr[1]);
}
if (*ptr == QSE_WT('\0')) return QSE_NULL; /* no dash found after digest */
if (i != digest_len) return QSE_NULL; /* digest too short */
ptr++;
qse_hmac_initialize (&hmac, sha_type, keyptr, keylen);
qse_hmac_update (&hmac, (const qse_uint8_t*)ptr, qse_wcslen(ptr));
qse_hmac_digest (&hmac, digest, digest_len);
if (QSE_MEMCMP(digest, orgdig, digest_len) != 0) return QSE_NULL; /* wrong hmac */
segstart = ptr;
while (1)
{
segptr = ptr;
for (ptr = segptr; *ptr != QSE_WT('\0') && *ptr != QSE_WT('-'); ptr++) ;
seglen = ptr - segptr;
if (seglen & 1) return QSE_NULL; /* odd-length segment */
reqlen += (seglen >> 1) + QSE_SIZEOF(*xptl);
segcount++;
if (*ptr == QSE_WT('\0')) break;
ptr++;
}
data = (qse_uint8_t*)QSE_MMGR_ALLOC(mmgr, reqlen);
if (!data) return QSE_NULL;
ptr = segstart;
xptl = (qse_xptl_t*)data;
uptr = data + (segcount * QSE_SIZEOF(*xptl));
while (1)
{
segptr = ptr;
xptl->ptr = uptr;
for (ptr = segptr, i = 0; *ptr != QSE_WT('\0') && *ptr != QSE_WT('-'); ptr += 2, i++)
{
*uptr++ = QSE_WXDIGITTONUM(ptr[0]) * 16 + QSE_WXDIGITTONUM(ptr[1]);
}
xptl->len = i;
xptl++;
if (*ptr == QSE_WT('\0')) break;
ptr++;
}
*count = segcount;
return (qse_xptl_t*)data;
}