Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142392960
D6166.id17039.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
84 KB
Referenced Files
None
Subscribers
None
D6166.id17039.diff
View Options
Index: lib/libcrypt/Makefile
===================================================================
--- lib/libcrypt/Makefile
+++ lib/libcrypt/Makefile
@@ -10,17 +10,26 @@
SHLIB_MAJOR= 5
LIB= crypt
-.PATH: ${.CURDIR}/../libmd ${.CURDIR}/../../sys/crypto/sha2
+.PATH: ${.CURDIR}/../libmd ${.CURDIR}/../../sys/crypto/sha2 ${.CURDIR}/../../sys/crypto/skein
SRCS= crypt.c misc.c \
crypt-md5.c md5c.c \
crypt-nthash.c md4c.c \
crypt-sha256.c sha256c.c \
- crypt-sha512.c sha512c.c
+ crypt-sha512.c sha512c.c \
+ skein.c skein_block.c
MAN= crypt.3
MLINKS= crypt.3 crypt_get_format.3 crypt.3 crypt_set_format.3
CFLAGS+= -I${.CURDIR}/../libmd -I${.CURDIR}/../libutil \
- -I${.CURDIR}/../../sys/crypto/sha2
+ -I${.CURDIR}/../../sys/crypto/sha2 -I${.CURDIR}/../../sys/crypto/skein
+# Use assembly optimized skein if available
+.if exists(${MACHINE_ARCH}/skein_block_asm.s)
+.PATH: ${.CURDIR}/../../sys/crypto/skein/${MACHINE_ARCH}
+SRCS += skein_block_asm.s
+CFLAGS += -DSKEIN_ASM -DSKEIN_USE_ASM=1792 # list of block functions to replace with assembly: 256+512+1024 = 1792
+ACFLAGS += -DELF -Wa,--noexecstack
+.endif
+
# Pull in the strong crypto, if it is present.
.if exists(${.CURDIR}/../../secure/lib/libcrypt) && ${MK_CRYPT} != "no"
.PATH: ${.CURDIR}/../../secure/lib/libcrypt
@@ -34,7 +43,10 @@
SHA512_224_Init SHA512_224_Final SHA512_224_Update \
SHA512_256_Init SHA512_256_Final SHA512_256_Update \
SHA384_Init SHA384_Final SHA384_Update \
- SHA512_Init SHA512_Final SHA512_Update
+ SHA512_Init SHA512_Final SHA512_Update \
+ SKEIN256_Init SKEIN256_Final SKEIN256_Update \
+ SKEIN512_Init SKEIN512_Final SKEIN512_Update \
+ SKEIN1024_Init SKEIN1024_Final SKEIN1024_Update
CFLAGS+= -D${sym}=__${sym}
.endfor
Index: lib/libmd/Makefile
===================================================================
--- lib/libmd/Makefile
+++ lib/libmd/Makefile
@@ -9,12 +9,15 @@
sha0c.c sha0hl.c sha1c.c sha1hl.c \
sha256c.c sha256hl.c \
sha384hl.c \
- sha512c.c sha512hl.c sha512thl.c
-INCS= md4.h md5.h ripemd.h sha.h sha256.h sha384.h sha512.h sha512t.h
+ sha512c.c sha512hl.c sha512thl.c \
+ skein.c skein_block.c \
+ skein256hl.c skein512hl.c skein1024hl.c
+INCS= md4.h md5.h ripemd.h sha.h sha256.h sha384.h sha512.h sha512t.h \
+ skein.h skein_port.h skein_freebsd.h skein_iv.h
WARNS?= 0
-MAN+= md4.3 md5.3 ripemd.3 sha.3 sha256.3 sha512.3
+MAN+= md4.3 md5.3 ripemd.3 sha.3 sha256.3 sha512.3 skein.3
MLINKS+=md4.3 MD4Init.3 md4.3 MD4Update.3 md4.3 MD4Final.3
MLINKS+=md4.3 MD4End.3 md4.3 MD4File.3 md4.3 MD4FileChunk.3
MLINKS+=md4.3 MD4Data.3
@@ -47,11 +50,27 @@
MLINKS+=sha512.3 SHA512_256_Final.3 sha512.3 SHA512_256_End.3
MLINKS+=sha512.3 SHA512_256_File.3 sha512.3 SHA512_256_FileChunk.3
MLINKS+=sha512.3 SHA512_256_Data.3
+MLINKS+=skein.3 SKEIN256_Init.3 skein.3 SKEIN256_Update.3
+MLINKS+=skein.3 SKEIN256_Final.3 skein.3 SKEIN256_End.3
+MLINKS+=skein.3 SKEIN256_File.3 skein.3 SKEIN256_FileChunk.3
+MLINKS+=skein.3 SKEIN256_Data.3 skein.3 skein256.3
+MLINKS+=skein.3 SKEIN512_Init.3 skein.3 SKEIN512_Update.3
+MLINKS+=skein.3 SKEIN512_Final.3 skein.3 SKEIN512_End.3
+MLINKS+=skein.3 SKEIN512_File.3 skein.3 SKEIN512_FileChunk.3
+MLINKS+=skein.3 SKEIN512_Data.3 skein.3 skein512.3
+MLINKS+=skein.3 SKEIN1024_Init.3 skein.3 SKEIN1024_Update.3
+MLINKS+=skein.3 SKEIN1024_Final.3 skein.3 SKEIN1024_End.3
+MLINKS+=skein.3 SKEIN1024_File.3 skein.3 SKEIN1024_FileChunk.3
+MLINKS+=skein.3 SKEIN1024_Data.3 skein.3 skein1024.3
+
CLEANFILES+= md[245]hl.c md[245].ref md[245].3 mddriver \
rmd160.ref rmd160hl.c rmddriver \
sha0.ref sha0hl.c sha1.ref sha1hl.c shadriver \
sha256.ref sha256hl.c sha384hl.c sha384.ref \
- sha512.ref sha512hl.c sha512t256.ref sha512thl.c
+ sha512.ref sha512hl.c sha512t256.ref sha512thl.c \
+ skein256hl.c skein512hl.c skein1024hl.c \
+ skein256.ref skein512.ref skein1024.ref \
+ skeindriver
# Define WEAK_REFS to provide weak aliases for libmd symbols
#
@@ -60,8 +79,10 @@
# * macros are used to rename symbols to libcrypt internal names
# * no weak aliases are generated
CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../sys/crypto/sha2
+CFLAGS+= -I${.CURDIR}/../../sys/crypto/skein
CFLAGS+= -DWEAK_REFS
.PATH: ${.CURDIR}/${MACHINE_ARCH} ${.CURDIR}/../../sys/crypto/sha2
+.PATH: ${.CURDIR}/../../sys/crypto/skein ${.CURDIR}/../../sys/crypto/skein/${MACHINE_ARCH}
.if exists(${MACHINE_ARCH}/sha.S)
SRCS+= sha.S
@@ -71,7 +92,11 @@
SRCS+= rmd160.S
CFLAGS+= -DRMD160_ASM
.endif
-.if exists(${MACHINE_ARCH}/sha.S) || exists(${MACHINE_ARCH}/rmd160.S)
+.if exists(${MACHINE_ARCH}/skein_block_asm.s)
+SRCS+= skein_block_asm.s
+CFLAGS+= -DSKEIN_ASM -DSKEIN_USE_ASM=1792 # list of block functions to replace with assembly: 256+512+1024 = 1792
+.endif
+.if exists(${MACHINE_ARCH}/sha.S) || exists(${MACHINE_ARCH}/rmd160.S) || exists(${MACHINE_ARCH}/skein_block_asm.s)
ACFLAGS+= -DELF -Wa,--noexecstack
.endif
@@ -124,6 +149,25 @@
-e 's/RIPEMD160__/RIPEMD160_/g' \
${.ALLSRC}) > ${.TARGET}
+skein256hl.c: mdXhl.c
+ (echo '#define LENGTH 32'; \
+ sed -e 's/mdX/skein/g' -e 's/MDX/SKEIN256_/g' \
+ -e 's/SKEIN256__/SKEIN256_/g' \
+ ${.ALLSRC}) > ${.TARGET}
+
+skein512hl.c: mdXhl.c
+ (echo '#define LENGTH 64'; \
+ sed -e 's/mdX/skein/g' -e 's/MDX/SKEIN512_/g' \
+ -e 's/SKEIN512__/SKEIN512_/g' \
+ ${.ALLSRC}) > ${.TARGET}
+
+skein1024hl.c: mdXhl.c
+ (echo '#define LENGTH 128'; \
+ sed -e 's/mdX/skein/g' -e 's/MDX/SKEIN1024_/g' \
+ -e 's/SKEIN1024__/SKEIN1024_/g' \
+ ${.ALLSRC}) > ${.TARGET}
+
+
.for i in 2 4 5
md${i}.3: ${.CURDIR}/mdX.3
sed -e "s/mdX/md${i}/g" -e "s/MDX/MD${i}/g" ${.ALLSRC} > ${.TARGET}
@@ -250,8 +294,51 @@
@echo 'RIPEMD160 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \
'9b752e45573d4b39f4dbd3323cab82bf63326bfb' >> ${.TARGET}
+skein256.ref:
+ echo 'SKEIN256 test suite:' > ${.TARGET}
+ @echo 'SKEIN256 ("") = c8877087da56e072870daa843f176e9453115929094c3a40c463a196c29bf7ba' >> ${.TARGET}
+ @echo 'SKEIN256 ("abc") = 258bdec343b9fde1639221a5ae0144a96e552e5288753c5fec76c05fc2fc1870' >> ${.TARGET}
+ @echo 'SKEIN256 ("message digest") =' \
+ '4d2ce0062b5eb3a4db95bc1117dd8aa014f6cd50fdc8e64f31f7d41f9231e488' >> ${.TARGET}
+ @echo 'SKEIN256 ("abcdefghijklmnopqrstuvwxyz") =' \
+ '46d8440685461b00e3ddb891b2ecc6855287d2bd8834a95fb1c1708b00ea5e82' >> ${.TARGET}
+ @echo 'SKEIN256 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =' \
+ '7c5eb606389556b33d34eb2536459528dc0af97adbcd0ce273aeb650f598d4b2' >> ${.TARGET}
+ @echo 'SKEIN256 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \
+ '4def7a7e5464a140ae9c3a80279fbebce4bd00f9faad819ab7e001512f67a10d' >> ${.TARGET}
+
+skein512.ref:
+ echo 'SKEIN512 test suite:' > ${.TARGET}
+ @echo 'SKEIN512 ("") =' \
+ 'bc5b4c50925519c290cc634277ae3d6257212395cba733bbad37a4af0fa06af41fca7903d06564fea7a2d3730dbdb80c1f85562dfcc070334ea4d1d9e72cba7a' >> ${.TARGET}
+ @echo 'SKEIN512 ("abc") =' \
+ '8f5dd9ec798152668e35129496b029a960c9a9b88662f7f9482f110b31f9f93893ecfb25c009baad9e46737197d5630379816a886aa05526d3a70df272d96e75' >> ${.TARGET}
+ @echo 'SKEIN512 ("message digest") =' \
+ '15b73c158ffb875fed4d72801ded0794c720b121c0c78edf45f900937e6933d9e21a3a984206933d504b5dbb2368000411477ee1b204c986068df77886542fcc' >> ${.TARGET}
+ @echo 'SKEIN512 ("abcdefghijklmnopqrstuvwxyz") =' \
+ '23793ad900ef12f9165c8080da6fdfd2c8354a2929b8aadf83aa82a3c6470342f57cf8c035ec0d97429b626c4d94f28632c8f5134fd367dca5cf293d2ec13f8c' >> ${.TARGET}
+ @echo 'SKEIN512 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =' \
+ '0c6bed927e022f5ddcf81877d42e5f75798a9f8fd3ede3d83baac0a2f364b082e036c11af35fe478745459dd8f5c0b73efe3c56ba5bb2009208d5a29cc6e469c' >> ${.TARGET}
+ @echo 'SKEIN512 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \
+ '2ca9fcffb3456f297d1b5f407014ecb856f0baac8eb540f534b1f187196f21e88f31103128c2f03fcc9857d7a58eb66f9525e2302d88833ee069295537a434ce' >> ${.TARGET}
+
+skein1024.ref:
+ echo 'SKEIN1024 test suite:' > ${.TARGET}
+ @echo 'SKEIN1024 ("") =' \
+ '0fff9563bb3279289227ac77d319b6fff8d7e9f09da1247b72a0a265cd6d2a62645ad547ed8193db48cff847c06494a03f55666d3b47eb4c20456c9373c86297d630d5578ebd34cb40991578f9f52b18003efa35d3da6553ff35db91b81ab890bec1b189b7f52cb2a783ebb7d823d725b0b4a71f6824e88f68f982eefc6d19c6' >> ${.TARGET}
+ @echo 'SKEIN1024 ("abc") =' \
+ '35a599a0f91abcdb4cb73c19b8cb8d947742d82c309137a7caed29e8e0a2ca7a9ff9a90c34c1908cc7e7fd99bb15032fb86e76df21b72628399b5f7c3cc209d7bb31c99cd4e19465622a049afbb87c03b5ce3888d17e6e667279ec0aa9b3e2712624c01b5f5bbe1a564220bdcf6990af0c2539019f313fdd7406cca3892a1f1f' >> ${.TARGET}
+ @echo 'SKEIN1024 ("message digest") =' \
+ 'ea891f5268acd0fac97467fc1aa89d1ce8681a9992a42540e53babee861483110c2d16f49e73bac27653ff173003e40cfb08516cd34262e6af95a5d8645c9c1abb3e813604d508b8511b30f9a5c1b352aa0791c7d2f27b2706dccea54bc7de6555b5202351751c3299f97c09cf89c40f67187e2521c0fad82b30edbb224f0458' >> ${.TARGET}
+ @echo 'SKEIN1024 ("abcdefghijklmnopqrstuvwxyz") =' \
+ 'f23d95c2a25fbcd0e797cd058fec39d3c52d2b5afd7a9af1df934e63257d1d3dcf3246e7329c0f1104c1e51e3d22e300507b0c3b9f985bb1f645ef49835080536becf83788e17fed09c9982ba65c3cb7ffe6a5f745b911c506962adf226e435c42f6f6bc08d288f9c810e807e3216ef444f3db22744441deefa4900982a1371f' >> ${.TARGET}
+ @echo 'SKEIN1024 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =' \
+ 'cf3889e8a8d11bfd3938055d7d061437962bc5eac8ae83b1b71c94be201b8cf657fdbfc38674997a008c0c903f56a23feb3ae30e012377f1cfa080a9ca7fe8b96138662653fb3335c7d06595bf8baf65e215307532094cfdfa056bd8052ab792a3944a2adaa47b30335b8badb8fe9eb94fe329cdca04e58bbc530f0af709f469' >> ${.TARGET}
+ @echo 'SKEIN1024 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \
+ 'cf21a613620e6c119eca31fdfaad449a8e02f95ca256c21d2a105f8e4157048f9fe1e897893ea18b64e0e37cb07d5ac947f27ba544caf7cbc1ad094e675aed77a366270f7eb7f46543bccfa61c526fd628408058ed00ed566ac35a9761d002e629c4fb0d430b2f4ad016fcc49c44d2981c4002da0eecc42144160e2eaea4855a' >> ${.TARGET}
+
test: md4.ref md5.ref sha0.ref rmd160.ref sha1.ref sha256.ref sha384.ref \
- sha512.ref sha512t256.ref
+ sha512.ref sha512t256.ref skein256.ref skein512.ref skein1024.ref
@${ECHO} if any of these test fail, the code produces wrong results
@${ECHO} and should NOT be used.
${CC} ${CFLAGS} ${LDFLAGS} -DMD=4 -o mddriver ${.CURDIR}/mddriver.c libmd.a
@@ -284,5 +371,15 @@
./shadriver | cmp sha512t256.ref -
@${ECHO} SHA-512t256 passed test
-rm -f shadriver
+ ${CC} ${CFLAGS} ${LDFLAGS} -DSKEIN=256 -o skeindriver ${.CURDIR}/skeindriver.c libmd.a
+ ./skeindriver | cmp skein256.ref -
+ @${ECHO} SKEIN256 passed test
+ ${CC} ${CFLAGS} ${LDFLAGS} -DSKEIN=512 -o skeindriver ${.CURDIR}/skeindriver.c libmd.a
+ ./skeindriver | cmp skein512.ref -
+ @${ECHO} SKEIN512 passed test
+ ${CC} ${CFLAGS} ${LDFLAGS} -DSKEIN=1024 -o skeindriver ${.CURDIR}/skeindriver.c libmd.a
+ ./skeindriver | cmp skein1024.ref -
+ @${ECHO} SKEIN1024 passed test
+ -rm -f skeindriver
.include <bsd.lib.mk>
Index: lib/libmd/mdX.3
===================================================================
--- lib/libmd/mdX.3
+++ lib/libmd/mdX.3
@@ -8,7 +8,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 11, 1999
+.Dd April 26, 2016
.Dt MDX 3
.Os
.Sh NAME
@@ -145,7 +145,11 @@
.Sh SEE ALSO
.Xr md4 3 ,
.Xr md5 3 ,
-.Xr sha 3
+.Xr ripemd 3 ,
+.Xr sha 3 ,
+.Xr sha256 3 ,
+.Xr sha512 3 ,
+.Xr skein 3
.Rs
.%A R. Rivest
.%T The MD4 Message-Digest Algorithm
Index: lib/libmd/ripemd.3
===================================================================
--- lib/libmd/ripemd.3
+++ lib/libmd/ripemd.3
@@ -9,7 +9,7 @@
.\" From: Id: mdX.3,v 1.14 1999/02/11 20:31:49 wollman Exp
.\" $FreeBSD$
.\"
-.Dd March 28, 2014
+.Dd April 26, 2016
.Dt RIPEMD 3
.Os
.Sh NAME
@@ -125,7 +125,10 @@
.Sh SEE ALSO
.Xr md4 3 ,
.Xr md5 3 ,
-.Xr sha 3
+.Xr sha 3 ,
+.Xr sha256 3 ,
+.Xr sha512 3 ,
+.Xr skein 3
.Sh HISTORY
These functions appeared in
.Fx 4.0 .
Index: lib/libmd/sha.3
===================================================================
--- lib/libmd/sha.3
+++ lib/libmd/sha.3
@@ -9,7 +9,7 @@
.\" From: Id: mdX.3,v 1.14 1999/02/11 20:31:49 wollman Exp
.\" $FreeBSD$
.\"
-.Dd March 28, 2014
+.Dd April 26, 2016
.Dt SHA 3
.Os
.Sh NAME
@@ -157,7 +157,9 @@
.Xr md4 3 ,
.Xr md5 3 ,
.Xr ripemd 3 ,
-.Xr sha256 3
+.Xr sha256 3 ,
+.Xr sha512 3 ,
+.Xr skein 3
.Sh HISTORY
These functions appeared in
.Fx 4.0 .
Index: lib/libmd/sha256.3
===================================================================
--- lib/libmd/sha256.3
+++ lib/libmd/sha256.3
@@ -9,7 +9,7 @@
.\" From: Id: mdX.3,v 1.14 1999/02/11 20:31:49 wollman Exp
.\" $FreeBSD$
.\"
-.Dd March 28, 2014
+.Dd April 26, 2016
.Dt SHA256 3
.Os
.Sh NAME
@@ -123,7 +123,10 @@
.Xr md4 3 ,
.Xr md5 3 ,
.Xr ripemd 3 ,
-.Xr sha 3
+.Xr sha 3 ,
+.Xr sha256 3 ,
+.Xr sha512 3 ,
+.Xr skein 3
.Sh HISTORY
These functions appeared in
.Fx 6.0 .
Index: lib/libmd/sha512.3
===================================================================
--- lib/libmd/sha512.3
+++ lib/libmd/sha512.3
@@ -192,7 +192,10 @@
.Xr md4 3 ,
.Xr md5 3 ,
.Xr ripemd 3 ,
-.Xr sha 3
+.Xr sha 3 ,
+.Xr sha256 3 ,
+.Xr sha512 3 ,
+.Xr skein 3
.Sh HISTORY
These functions appeared in
.Fx 9.0 .
Index: lib/libmd/skein.3
===================================================================
--- lib/libmd/skein.3
+++ lib/libmd/skein.3
@@ -0,0 +1,215 @@
+.\"-
+.\" Copyright (c) 2016 Allan Jude
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd May 28, 2016
+.Dt SKEIN 3
+.Os
+.Sh NAME
+.Nm SKEIN256_Init ,
+.Nm SKEIN256_Update ,
+.Nm SKEIN256_Final ,
+.Nm SKEIN256_End ,
+.Nm SKEIN256_File ,
+.Nm SKEIN256_FileChunk ,
+.Nm SKEIN256_Data ,
+.Nm SKEIN512_Init ,
+.Nm SKEIN512_Update ,
+.Nm SKEIN512_Final ,
+.Nm SKEIN512_End ,
+.Nm SKEIN512_File ,
+.Nm SKEIN512_FileChunk ,
+.Nm SKEIN512_Data ,
+.Nm SKEIN1024_Init ,
+.Nm SKEIN1024_Update ,
+.Nm SKEIN1024_Final ,
+.Nm SKEIN1024_End ,
+.Nm SKEIN1024_File ,
+.Nm SKEIN1024_FileChunk ,
+.Nm SKEIN1024_Data
+.Nd calculate the ``SKEIN'' family of message digests
+.Sh LIBRARY
+.Lb libmd
+.Sh SYNOPSIS
+.In sys/types.h
+.In skein.h
+.Ft void
+.Fn SKEIN256_Init "SKEIN256_CTX *context"
+.Ft void
+.Fn SKEIN256_Update "SKEIN256_CTX *context" "const unsigned char *data" "size_t len"
+.Ft void
+.Fn SKEIN256_Final "unsigned char digest[32]" "SKEIN256_CTX *context"
+.Ft "char *"
+.Fn SKEIN256_End "SKEIN256_CTX *context" "char *buf"
+.Ft "char *"
+.Fn SKEIN256_File "const char *filename" "char *buf"
+.Ft "char *"
+.Fn SKEIN256_FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length"
+.Ft "char *"
+.Fn SKEIN256_Data "const unsigned char *data" "unsigned int len" "char *buf"
+.Ft void
+.Fn SKEIN512_Init "SKEIN512_CTX *context"
+.Ft void
+.Fn SKEIN512_Update "SKEIN512_CTX *context" "const unsigned char *data" "size_t len"
+.Ft void
+.Fn SKEIN512_Final "unsigned char digest[64]" "SKEIN512_CTX *context"
+.Ft "char *"
+.Fn SKEIN512_End "SKEIN512_CTX *context" "char *buf"
+.Ft "char *"
+.Fn SKEIN512_File "const char *filename" "char *buf"
+.Ft "char *"
+.Fn SKEIN512_FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length"
+.Ft "char *"
+.Fn SKEIN512_Data "const unsigned char *data" "unsigned int len" "char *buf"
+.Ft void
+.Fn SKEIN1024_Init "SKEIN1024_CTX *context"
+.Ft void
+.Fn SKEIN1024_Update "SKEIN1024_CTX *context" "const unsigned char *data" "size_t len"
+.Ft void
+.Fn SKEIN1024_Final "unsigned char digest[128]" "SKEIN1024_CTX *context"
+.Ft "char *"
+.Fn SKEIN1024_End "SKEIN1024_CTX *context" "char *buf"
+.Ft "char *"
+.Fn SKEIN1024_File "const char *filename" "char *buf"
+.Ft "char *"
+.Fn SKEIN1024_FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length"
+.Ft "char *"
+.Fn SKEIN1024_Data "const unsigned char *data" "unsigned int len" "char *buf"
+.Sh DESCRIPTION
+The
+.Li SKEIN
+functions calculate a 256, 512, or 1024-bit cryptographic checksum (digest)
+for any number of input bytes.
+A cryptographic checksum is a one-way hash function.
+This net result is a
+.Dq fingerprint
+of the input-data, which does not disclose the actual input.
+.Pp
+The
+.Fn SKEIN256_Init ,
+.Fn SKEIN256_Update ,
+and
+.Fn SKEIN256_Final
+functions are the core functions.
+Allocate an
+.Vt SKEIN256_CTX ,
+initialize it with
+.Fn SKEIN256_Init ,
+run over the data with
+.Fn SKEIN256_Update ,
+and finally extract the result using
+.Fn SKEIN256_Final .
+.Pp
+.Fn SKEIN256_End
+is a wrapper for
+.Fn SKEIN256_Final
+which converts the return value to a 33-character
+(including the terminating '\e0')
+.Tn ASCII
+string which represents the 256 bits in hexadecimal.
+.Pp
+.Fn SKEIN256_File
+calculates the digest of a file, and uses
+.Fn SKEIN256_End
+to return the result.
+If the file cannot be opened, a null pointer is returned.
+.Fn SKEIN256_FileChunk
+is similar to
+.Fn SKEIN256_File ,
+but it only calculates the digest over a byte-range of the file specified,
+starting at
+.Fa offset
+and spanning
+.Fa length
+bytes.
+If the
+.Fa length
+parameter is specified as 0, or more than the length of the remaining part
+of the file,
+.Fn SKEIN256_FileChunk
+calculates the digest from
+.Fa offset
+to the end of file.
+.Fn SKEIN256_Data
+calculates the digest of a chunk of data in memory, and uses
+.Fn SKEIN256_End
+to return the result.
+.Pp
+When using
+.Fn SKEIN256_End ,
+.Fn SKEIN256_File ,
+or
+.Fn SKEIN256_Data ,
+the
+.Fa buf
+argument can be a null pointer, in which case the returned string
+is allocated with
+.Xr malloc 3
+and subsequently must be explicitly deallocated using
+.Xr free 3
+after use.
+If the
+.Fa buf
+argument is non-null it must point to at least 33 characters of buffer space.
+.Pp
+The
+.Li SKEIN512_
+and
+.Li SKEIN1024_
+functions are similar to the
+.Li SKEIN256_
+functions except they produce a 512-bit, 65 character,
+or 1024-bit, 129 character, output.
+.Sh SEE ALSO
+.Xr md4 3 ,
+.Xr md5 3 ,
+.Xr ripemd 3 ,
+.Xr sha 3 ,
+.Xr sha256 3 ,
+.Xr sha512 3
+.Sh HISTORY
+These functions appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+.An -nosplit
+The core hash routines were imported from version 1.3 of the optimized
+reference implementation written by
+.An Doug Whiting
+as submitted to the NSA SHA-3 contest.
+The algorithms were developed by
+.An Niels Ferguson ,
+.An Stefan Lucks ,
+.An Bruce Schneier ,
+.An Doug Whiting ,
+.An Mihir Bellare ,
+.An Tadayoshi Kohno ,
+.An Jon Callas,
+and
+.An Jesse Walker .
+.Sh BUGS
+No method is known to exist which finds two files having the same hash value,
+nor to find a file with a specific hash value.
+There is on the other hand no guarantee that such a method does not exist.
Index: lib/libmd/skeindriver.c
===================================================================
--- lib/libmd/skeindriver.c
+++ lib/libmd/skeindriver.c
@@ -0,0 +1,68 @@
+/* SKEINDRIVER.C - test driver for SKEIN */
+
+/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All rights
+ * reserved.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either the
+ * merchantability of this software or the suitability of this software for
+ * any particular purpose. It is provided "as is" without express or implied
+ * warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software. */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+
+#include "skein.h"
+
+/* The following makes SKEIN default to SKEIN512 if it has not already been
+ * defined with C compiler flags. */
+#ifndef SKEIN
+#define SKEIN 512
+#endif
+
+#if SKEIN == 256
+#undef SKEIN_Data
+#define SKEIN_Data SKEIN256_Data
+#elif SKEIN == 512
+#undef SKEIN_Data
+#define SKEIN_Data SKEIN512_Data
+#elif SKEIN == 1024
+#undef SKEIN_Data
+#define SKEIN_Data SKEIN1024_Data
+#endif
+
+/* Digests a string and prints the result. */
+static void
+SKEINString(char *string)
+{
+ char buf[2*128 + 1];
+
+ printf("SKEIN%d (\"%s\") = %s\n",
+ SKEIN, string, SKEIN_Data(string, strlen(string), buf));
+}
+
+/* Digests a reference suite of strings and prints the results. */
+int
+main(void)
+{
+ printf("SKEIN%d test suite:\n", SKEIN);
+
+ SKEINString("");
+ SKEINString("abc");
+ SKEINString("message digest");
+ SKEINString("abcdefghijklmnopqrstuvwxyz");
+ SKEINString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz0123456789");
+ SKEINString("1234567890123456789012345678901234567890"
+ "1234567890123456789012345678901234567890");
+
+ return 0;
+}
Index: sbin/md5/Makefile
===================================================================
--- sbin/md5/Makefile
+++ sbin/md5/Makefile
@@ -9,7 +9,10 @@
${BINDIR}/md5 ${BINDIR}/sha256 \
${BINDIR}/md5 ${BINDIR}/sha384 \
${BINDIR}/md5 ${BINDIR}/sha512 \
- ${BINDIR}/md5 ${BINDIR}/sha512t256
+ ${BINDIR}/md5 ${BINDIR}/sha512t256 \
+ ${BINDIR}/md5 ${BINDIR}/skein256 \
+ ${BINDIR}/md5 ${BINDIR}/skein512 \
+ ${BINDIR}/md5 ${BINDIR}/skein1024
MLINKS= md5.1 rmd160.1 \
md5.1 sha1.1 \
Index: sbin/md5/md5.c
===================================================================
--- sbin/md5/md5.c
+++ sbin/md5/md5.c
@@ -31,6 +31,7 @@
#include <sha384.h>
#include <sha512.h>
#include <sha512t.h>
+#include <skein.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -61,6 +62,9 @@
extern const char *SHA512_TestOutput[MDTESTCOUNT];
extern const char *SHA512t256_TestOutput[MDTESTCOUNT];
extern const char *RIPEMD160_TestOutput[MDTESTCOUNT];
+extern const char *SKEIN256_TestOutput[MDTESTCOUNT];
+extern const char *SKEIN512_TestOutput[MDTESTCOUNT];
+extern const char *SKEIN1024_TestOutput[MDTESTCOUNT];
typedef struct Algorithm_t {
const char *progname;
@@ -87,11 +91,14 @@
SHA384_CTX sha384;
SHA512_CTX sha512;
RIPEMD160_CTX ripemd160;
+ SKEIN256_CTX skein256;
+ SKEIN512_CTX skein512;
+ SKEIN1024_CTX skein1024;
} DIGEST_CTX;
/* max(MD5_DIGEST_LENGTH, SHA_DIGEST_LENGTH,
SHA256_DIGEST_LENGTH, SHA512_DIGEST_LENGTH,
- RIPEMD160_DIGEST_LENGTH)*2+1 */
+ RIPEMD160_DIGEST_LENGTH, SKEIN1024_DIGEST_LENGTH)*2+1 */
#define HEX_DIGEST_LENGTH 129
/* algorithm function table */
@@ -117,7 +124,16 @@
&SHA512_256_Data, &SHA512_256_File },
{ "rmd160", "RMD160", &RIPEMD160_TestOutput,
(DIGEST_Init*)&RIPEMD160_Init, (DIGEST_Update*)&RIPEMD160_Update,
- (DIGEST_End*)&RIPEMD160_End, &RIPEMD160_Data, &RIPEMD160_File }
+ (DIGEST_End*)&RIPEMD160_End, &RIPEMD160_Data, &RIPEMD160_File },
+ { "skein256", "Skein256", &SKEIN256_TestOutput,
+ (DIGEST_Init*)&SKEIN256_Init, (DIGEST_Update*)&SKEIN256_Update,
+ (DIGEST_End*)&SKEIN256_End, &SKEIN256_Data, &SKEIN256_File },
+ { "skein512", "Skein512", &SKEIN512_TestOutput,
+ (DIGEST_Init*)&SKEIN512_Init, (DIGEST_Update*)&SKEIN512_Update,
+ (DIGEST_End*)&SKEIN512_End, &SKEIN512_Data, &SKEIN512_File },
+ { "skein1024", "Skein1024", &SKEIN1024_TestOutput,
+ (DIGEST_Init*)&SKEIN1024_Init, (DIGEST_Update*)&SKEIN1024_Update,
+ (DIGEST_End*)&SKEIN1024_End, &SKEIN1024_Data, &SKEIN1024_File }
};
static void
@@ -382,6 +398,39 @@
"5feb69c6bf7c29d95715ad55f57d8ac5b2b7dd32"
};
+const char *SKEIN256_TestOutput[MDTESTCOUNT] = {
+ "c8877087da56e072870daa843f176e9453115929094c3a40c463a196c29bf7ba",
+ "7fba44ff1a31d71a0c1f82e6e82fb5e9ac6c92a39c9185b9951fed82d82fe635",
+ "258bdec343b9fde1639221a5ae0144a96e552e5288753c5fec76c05fc2fc1870",
+ "4d2ce0062b5eb3a4db95bc1117dd8aa014f6cd50fdc8e64f31f7d41f9231e488",
+ "46d8440685461b00e3ddb891b2ecc6855287d2bd8834a95fb1c1708b00ea5e82",
+ "7c5eb606389556b33d34eb2536459528dc0af97adbcd0ce273aeb650f598d4b2",
+ "4def7a7e5464a140ae9c3a80279fbebce4bd00f9faad819ab7e001512f67a10d",
+ "d9c017dbe355f318d036469eb9b5fbe129fc2b5786a9dc6746a516eab6fe0126"
+};
+
+const char *SKEIN512_TestOutput[MDTESTCOUNT] = {
+ "bc5b4c50925519c290cc634277ae3d6257212395cba733bbad37a4af0fa06af41fca7903d06564fea7a2d3730dbdb80c1f85562dfcc070334ea4d1d9e72cba7a",
+ "b1cd8d33f61b3737adfd59bb13ad82f4a9548e92f22956a8976cca3fdb7fee4fe91698146c4197cec85d38b83c5d93bdba92c01fd9a53870d0c7f967bc62bdce",
+ "8f5dd9ec798152668e35129496b029a960c9a9b88662f7f9482f110b31f9f93893ecfb25c009baad9e46737197d5630379816a886aa05526d3a70df272d96e75",
+ "15b73c158ffb875fed4d72801ded0794c720b121c0c78edf45f900937e6933d9e21a3a984206933d504b5dbb2368000411477ee1b204c986068df77886542fcc",
+ "23793ad900ef12f9165c8080da6fdfd2c8354a2929b8aadf83aa82a3c6470342f57cf8c035ec0d97429b626c4d94f28632c8f5134fd367dca5cf293d2ec13f8c",
+ "0c6bed927e022f5ddcf81877d42e5f75798a9f8fd3ede3d83baac0a2f364b082e036c11af35fe478745459dd8f5c0b73efe3c56ba5bb2009208d5a29cc6e469c",
+ "2ca9fcffb3456f297d1b5f407014ecb856f0baac8eb540f534b1f187196f21e88f31103128c2f03fcc9857d7a58eb66f9525e2302d88833ee069295537a434ce",
+ "1131f2aaa0e97126c9314f9f968cc827259bbfabced2943bb8c9274448998fb3b78738b4580dd500c76105fd3c03e465e1414f2c29664286b1f79d3e51128125"
+};
+
+const char *SKEIN1024_TestOutput[MDTESTCOUNT] = {
+ "0fff9563bb3279289227ac77d319b6fff8d7e9f09da1247b72a0a265cd6d2a62645ad547ed8193db48cff847c06494a03f55666d3b47eb4c20456c9373c86297d630d5578ebd34cb40991578f9f52b18003efa35d3da6553ff35db91b81ab890bec1b189b7f52cb2a783ebb7d823d725b0b4a71f6824e88f68f982eefc6d19c6",
+ "6ab4c4ba9814a3d976ec8bffa7fcc638ceba0544a97b3c98411323ffd2dc936315d13dc93c13c4e88cda6f5bac6f2558b2d8694d3b6143e40d644ae43ca940685cb37f809d3d0550c56cba8036dee729a4f8fb960732e59e64d57f7f7710f8670963cdcdc95b41daab4855fcf8b6762a64b173ee61343a2c7689af1d293eba97",
+ "35a599a0f91abcdb4cb73c19b8cb8d947742d82c309137a7caed29e8e0a2ca7a9ff9a90c34c1908cc7e7fd99bb15032fb86e76df21b72628399b5f7c3cc209d7bb31c99cd4e19465622a049afbb87c03b5ce3888d17e6e667279ec0aa9b3e2712624c01b5f5bbe1a564220bdcf6990af0c2539019f313fdd7406cca3892a1f1f",
+ "ea891f5268acd0fac97467fc1aa89d1ce8681a9992a42540e53babee861483110c2d16f49e73bac27653ff173003e40cfb08516cd34262e6af95a5d8645c9c1abb3e813604d508b8511b30f9a5c1b352aa0791c7d2f27b2706dccea54bc7de6555b5202351751c3299f97c09cf89c40f67187e2521c0fad82b30edbb224f0458",
+ "f23d95c2a25fbcd0e797cd058fec39d3c52d2b5afd7a9af1df934e63257d1d3dcf3246e7329c0f1104c1e51e3d22e300507b0c3b9f985bb1f645ef49835080536becf83788e17fed09c9982ba65c3cb7ffe6a5f745b911c506962adf226e435c42f6f6bc08d288f9c810e807e3216ef444f3db22744441deefa4900982a1371f",
+ "cf3889e8a8d11bfd3938055d7d061437962bc5eac8ae83b1b71c94be201b8cf657fdbfc38674997a008c0c903f56a23feb3ae30e012377f1cfa080a9ca7fe8b96138662653fb3335c7d06595bf8baf65e215307532094cfdfa056bd8052ab792a3944a2adaa47b30335b8badb8fe9eb94fe329cdca04e58bbc530f0af709f469",
+ "cf21a613620e6c119eca31fdfaad449a8e02f95ca256c21d2a105f8e4157048f9fe1e897893ea18b64e0e37cb07d5ac947f27ba544caf7cbc1ad094e675aed77a366270f7eb7f46543bccfa61c526fd628408058ed00ed566ac35a9761d002e629c4fb0d430b2f4ad016fcc49c44d2981c4002da0eecc42144160e2eaea4855a",
+ "e6799b78db54085a2be7ff4c8007f147fa88d326abab30be0560b953396d8802feee9a15419b48a467574e9283be15685ca8a079ee52b27166b64dd70b124b1d4e4f6aca37224c3f2685e67e67baef9f94b905698adc794a09672aba977a61b20966912acdb08c21a2c37001785355dc884751a21f848ab36e590331ff938138"
+};
+
static void
MDTestSuite(const Algorithm_t *alg)
{
Index: sys/crypto/skein/skein.h
===================================================================
--- sys/crypto/skein/skein.h
+++ sys/crypto/skein/skein.h
@@ -32,7 +32,9 @@
{
#endif
+#ifndef _KERNEL
#include <stddef.h> /* get size_t definition */
+#endif
#include "skein_port.h" /* get platform-specific definitions */
enum
@@ -63,30 +65,30 @@
typedef struct
{
- size_t hashBitLen; /* size of hash result, in bits */
- size_t bCnt; /* current byte count in buffer b[] */
- u64b_t T[SKEIN_MODIFIER_WORDS]; /* tweak words: T[0]=byte cnt, T[1]=flags */
+ size_t hashBitLen; /* size of hash result, in bits */
+ size_t bCnt; /* current byte count in buffer b[] */
+ u_int64_t T[SKEIN_MODIFIER_WORDS]; /* tweak words: T[0]=byte cnt, T[1]=flags */
} Skein_Ctxt_Hdr_t;
typedef struct /* 256-bit Skein hash context structure */
{
Skein_Ctxt_Hdr_t h; /* common header context variables */
- u64b_t X[SKEIN_256_STATE_WORDS]; /* chaining variables */
- u08b_t b[SKEIN_256_BLOCK_BYTES]; /* partial block buffer (8-byte aligned) */
+ u_int64_t X[SKEIN_256_STATE_WORDS]; /* chaining variables */
+ u_int8_t b[SKEIN_256_BLOCK_BYTES]; /* partial block buffer (8-byte aligned) */
} Skein_256_Ctxt_t;
typedef struct /* 512-bit Skein hash context structure */
{
Skein_Ctxt_Hdr_t h; /* common header context variables */
- u64b_t X[SKEIN_512_STATE_WORDS]; /* chaining variables */
- u08b_t b[SKEIN_512_BLOCK_BYTES]; /* partial block buffer (8-byte aligned) */
+ u_int64_t X[SKEIN_512_STATE_WORDS]; /* chaining variables */
+ u_int8_t b[SKEIN_512_BLOCK_BYTES]; /* partial block buffer (8-byte aligned) */
} Skein_512_Ctxt_t;
typedef struct /* 1024-bit Skein hash context structure */
{
Skein_Ctxt_Hdr_t h; /* common header context variables */
- u64b_t X[SKEIN1024_STATE_WORDS]; /* chaining variables */
- u08b_t b[SKEIN1024_BLOCK_BYTES]; /* partial block buffer (8-byte aligned) */
+ u_int64_t X[SKEIN1024_STATE_WORDS]; /* chaining variables */
+ u_int8_t b[SKEIN1024_BLOCK_BYTES]; /* partial block buffer (8-byte aligned) */
} Skein1024_Ctxt_t;
/* Skein APIs for (incremental) "straight hashing" */
@@ -94,13 +96,13 @@
int Skein_512_Init (Skein_512_Ctxt_t *ctx, size_t hashBitLen);
int Skein1024_Init (Skein1024_Ctxt_t *ctx, size_t hashBitLen);
-int Skein_256_Update(Skein_256_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt);
-int Skein_512_Update(Skein_512_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt);
-int Skein1024_Update(Skein1024_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt);
+int Skein_256_Update(Skein_256_Ctxt_t *ctx, const u_int8_t *msg, size_t msgByteCnt);
+int Skein_512_Update(Skein_512_Ctxt_t *ctx, const u_int8_t *msg, size_t msgByteCnt);
+int Skein1024_Update(Skein1024_Ctxt_t *ctx, const u_int8_t *msg, size_t msgByteCnt);
-int Skein_256_Final (Skein_256_Ctxt_t *ctx, u08b_t * hashVal);
-int Skein_512_Final (Skein_512_Ctxt_t *ctx, u08b_t * hashVal);
-int Skein1024_Final (Skein1024_Ctxt_t *ctx, u08b_t * hashVal);
+int Skein_256_Final (Skein_256_Ctxt_t *ctx, u_int8_t *hashVal);
+int Skein_512_Final (Skein_512_Ctxt_t *ctx, u_int8_t *hashVal);
+int Skein1024_Final (Skein1024_Ctxt_t *ctx, u_int8_t *hashVal);
/*
** Skein APIs for "extended" initialization: MAC keys, tree hashing.
@@ -116,26 +118,26 @@
** to precompute the MAC IV, then a copy of the context saved and
** reused for each new MAC computation.
**/
-int Skein_256_InitExt(Skein_256_Ctxt_t *ctx, size_t hashBitLen, u64b_t treeInfo, const u08b_t *key, size_t keyBytes);
-int Skein_512_InitExt(Skein_512_Ctxt_t *ctx, size_t hashBitLen, u64b_t treeInfo, const u08b_t *key, size_t keyBytes);
-int Skein1024_InitExt(Skein1024_Ctxt_t *ctx, size_t hashBitLen, u64b_t treeInfo, const u08b_t *key, size_t keyBytes);
+int Skein_256_InitExt(Skein_256_Ctxt_t *ctx, size_t hashBitLen, u_int64_t treeInfo, const u_int8_t *key, size_t keyBytes);
+int Skein_512_InitExt(Skein_512_Ctxt_t *ctx, size_t hashBitLen, u_int64_t treeInfo, const u_int8_t *key, size_t keyBytes);
+int Skein1024_InitExt(Skein1024_Ctxt_t *ctx, size_t hashBitLen, u_int64_t treeInfo, const u_int8_t *key, size_t keyBytes);
/*
** Skein APIs for MAC and tree hash:
** Final_Pad: pad, do final block, but no OUTPUT type
** Output: do just the output stage
*/
-int Skein_256_Final_Pad(Skein_256_Ctxt_t *ctx, u08b_t * hashVal);
-int Skein_512_Final_Pad(Skein_512_Ctxt_t *ctx, u08b_t * hashVal);
-int Skein1024_Final_Pad(Skein1024_Ctxt_t *ctx, u08b_t * hashVal);
+int Skein_256_Final_Pad(Skein_256_Ctxt_t *ctx, u_int8_t *hashVal);
+int Skein_512_Final_Pad(Skein_512_Ctxt_t *ctx, u_int8_t *hashVal);
+int Skein1024_Final_Pad(Skein1024_Ctxt_t *ctx, u_int8_t *hashVal);
#ifndef SKEIN_TREE_HASH
#define SKEIN_TREE_HASH (1)
#endif
#if SKEIN_TREE_HASH
-int Skein_256_Output (Skein_256_Ctxt_t *ctx, u08b_t * hashVal);
-int Skein_512_Output (Skein_512_Ctxt_t *ctx, u08b_t * hashVal);
-int Skein1024_Output (Skein1024_Ctxt_t *ctx, u08b_t * hashVal);
+int Skein_256_Output (Skein_256_Ctxt_t *ctx, u_int8_t *hashVal);
+int Skein_512_Output (Skein_512_Ctxt_t *ctx, u_int8_t *hashVal);
+int Skein1024_Output (Skein1024_Ctxt_t *ctx, u_int8_t *hashVal);
#endif
/*****************************************************************
@@ -156,13 +158,13 @@
#define SKEIN_T1_POS_FINAL SKEIN_T1_BIT(127) /* bit 127 : final block flag */
/* tweak word T[1]: flag bit definition(s) */
-#define SKEIN_T1_FLAG_FIRST (((u64b_t) 1 ) << SKEIN_T1_POS_FIRST)
-#define SKEIN_T1_FLAG_FINAL (((u64b_t) 1 ) << SKEIN_T1_POS_FINAL)
-#define SKEIN_T1_FLAG_BIT_PAD (((u64b_t) 1 ) << SKEIN_T1_POS_BIT_PAD)
+#define SKEIN_T1_FLAG_FIRST (((u_int64_t) 1 ) << SKEIN_T1_POS_FIRST)
+#define SKEIN_T1_FLAG_FINAL (((u_int64_t) 1 ) << SKEIN_T1_POS_FINAL)
+#define SKEIN_T1_FLAG_BIT_PAD (((u_int64_t) 1 ) << SKEIN_T1_POS_BIT_PAD)
/* tweak word T[1]: tree level bit field mask */
-#define SKEIN_T1_TREE_LVL_MASK (((u64b_t)0x7F) << SKEIN_T1_POS_TREE_LVL)
-#define SKEIN_T1_TREE_LEVEL(n) (((u64b_t) (n)) << SKEIN_T1_POS_TREE_LVL)
+#define SKEIN_T1_TREE_LVL_MASK (((u_int64_t)0x7F) << SKEIN_T1_POS_TREE_LVL)
+#define SKEIN_T1_TREE_LEVEL(n) (((u_int64_t) (n)) << SKEIN_T1_POS_TREE_LVL)
/* tweak word T[1]: block type field */
#define SKEIN_BLK_TYPE_KEY ( 0) /* key, for MAC and KDF */
@@ -175,7 +177,7 @@
#define SKEIN_BLK_TYPE_OUT (63) /* output stage */
#define SKEIN_BLK_TYPE_MASK (63) /* bit field mask */
-#define SKEIN_T1_BLK_TYPE(T) (((u64b_t) (SKEIN_BLK_TYPE_##T)) << SKEIN_T1_POS_BLK_TYPE)
+#define SKEIN_T1_BLK_TYPE(T) (((u_int64_t) (SKEIN_BLK_TYPE_##T)) << SKEIN_T1_POS_BLK_TYPE)
#define SKEIN_T1_BLK_TYPE_KEY SKEIN_T1_BLK_TYPE(KEY) /* key, for MAC and KDF */
#define SKEIN_T1_BLK_TYPE_CFG SKEIN_T1_BLK_TYPE(CFG) /* configuration block */
#define SKEIN_T1_BLK_TYPE_PERS SKEIN_T1_BLK_TYPE(PERS) /* personalization string */
@@ -195,7 +197,7 @@
#define SKEIN_ID_STRING_LE (0x33414853) /* "SHA3" (little-endian)*/
#endif
-#define SKEIN_MK_64(hi32,lo32) ((lo32) + (((u64b_t) (hi32)) << 32))
+#define SKEIN_MK_64(hi32,lo32) ((lo32) + (((u_int64_t) (hi32)) << 32))
#define SKEIN_SCHEMA_VER SKEIN_MK_64(SKEIN_VERSION,SKEIN_ID_STRING_LE)
#define SKEIN_KS_PARITY SKEIN_MK_64(0x1BD11BDA,0xA9FC1A22)
@@ -206,14 +208,14 @@
#define SKEIN_CFG_TREE_NODE_SIZE_POS ( 8)
#define SKEIN_CFG_TREE_MAX_LEVEL_POS (16)
-#define SKEIN_CFG_TREE_LEAF_SIZE_MSK (((u64b_t) 0xFF) << SKEIN_CFG_TREE_LEAF_SIZE_POS)
-#define SKEIN_CFG_TREE_NODE_SIZE_MSK (((u64b_t) 0xFF) << SKEIN_CFG_TREE_NODE_SIZE_POS)
-#define SKEIN_CFG_TREE_MAX_LEVEL_MSK (((u64b_t) 0xFF) << SKEIN_CFG_TREE_MAX_LEVEL_POS)
+#define SKEIN_CFG_TREE_LEAF_SIZE_MSK (((u_int64_t) 0xFF) << SKEIN_CFG_TREE_LEAF_SIZE_POS)
+#define SKEIN_CFG_TREE_NODE_SIZE_MSK (((u_int64_t) 0xFF) << SKEIN_CFG_TREE_NODE_SIZE_POS)
+#define SKEIN_CFG_TREE_MAX_LEVEL_MSK (((u_int64_t) 0xFF) << SKEIN_CFG_TREE_MAX_LEVEL_POS)
#define SKEIN_CFG_TREE_INFO(leaf,node,maxLvl) \
- ( (((u64b_t)(leaf )) << SKEIN_CFG_TREE_LEAF_SIZE_POS) | \
- (((u64b_t)(node )) << SKEIN_CFG_TREE_NODE_SIZE_POS) | \
- (((u64b_t)(maxLvl)) << SKEIN_CFG_TREE_MAX_LEVEL_POS) )
+ ( (((u_int64_t)(leaf )) << SKEIN_CFG_TREE_LEAF_SIZE_POS) | \
+ (((u_int64_t)(node )) << SKEIN_CFG_TREE_NODE_SIZE_POS) | \
+ (((u_int64_t)(maxLvl)) << SKEIN_CFG_TREE_MAX_LEVEL_POS) )
#define SKEIN_CFG_TREE_INFO_SEQUENTIAL SKEIN_CFG_TREE_INFO(0,0,0) /* use as treeInfo in InitExt() call for sequential processing */
@@ -324,4 +326,7 @@
}
#endif
+/* Pull in FreeBSD specific shims */
+#include "skein_freebsd.h"
+
#endif /* ifndef _SKEIN_H_ */
Index: sys/crypto/skein/skein.c
===================================================================
--- sys/crypto/skein/skein.c
+++ sys/crypto/skein/skein.c
@@ -8,17 +8,32 @@
**
************************************************************************/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/endian.h>
+#include <sys/types.h>
+
+/* get the memcpy/memset functions */
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
+#include <string.h>
+#endif
+
#define SKEIN_PORT_CODE /* instantiate any code in skein_port.h */
-#include <string.h> /* get the memcpy/memset functions */
#include "skein.h" /* get the Skein API definitions */
#include "skein_iv.h" /* get precomputed IVs */
/*****************************************************************/
/* External function to process blkCnt (nonzero) full block(s) of data. */
-void Skein_256_Process_Block(Skein_256_Ctxt_t *ctx,const u08b_t *blkPtr,size_t blkCnt,size_t byteCntAdd);
-void Skein_512_Process_Block(Skein_512_Ctxt_t *ctx,const u08b_t *blkPtr,size_t blkCnt,size_t byteCntAdd);
-void Skein1024_Process_Block(Skein1024_Ctxt_t *ctx,const u08b_t *blkPtr,size_t blkCnt,size_t byteCntAdd);
+void Skein_256_Process_Block(Skein_256_Ctxt_t *ctx, const u_int8_t *blkPtr,
+ size_t blkCnt, size_t byteCntAdd);
+void Skein_512_Process_Block(Skein_512_Ctxt_t *ctx, const u_int8_t *blkPtr,
+ size_t blkCnt, size_t byteCntAdd);
+void Skein1024_Process_Block(Skein1024_Ctxt_t *ctx, const u_int8_t *blkPtr,
+ size_t blkCnt, size_t byteCntAdd);
/*****************************************************************/
/* 256-bit Skein */
@@ -30,10 +45,10 @@
{
union
{
- u08b_t b[SKEIN_256_STATE_BYTES];
- u64b_t w[SKEIN_256_STATE_WORDS];
+ u_int8_t b[SKEIN_256_STATE_BYTES];
+ u_int64_t w[SKEIN_256_STATE_WORDS];
} cfg; /* config block */
-
+
Skein_Assert(hashBitLen > 0,SKEIN_BAD_HASHLEN);
ctx->h.hashBitLen = hashBitLen; /* output hash bit count */
@@ -70,14 +85,14 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* init the context for a MAC and/or tree hash operation */
/* [identical to Skein_256_Init() when keyBytes == 0 && treeInfo == SKEIN_CFG_TREE_INFO_SEQUENTIAL] */
-int Skein_256_InitExt(Skein_256_Ctxt_t *ctx,size_t hashBitLen,u64b_t treeInfo, const u08b_t *key, size_t keyBytes)
+int Skein_256_InitExt(Skein_256_Ctxt_t *ctx,size_t hashBitLen,u_int64_t treeInfo, const u_int8_t *key, size_t keyBytes)
{
union
{
- u08b_t b[SKEIN_256_STATE_BYTES];
- u64b_t w[SKEIN_256_STATE_WORDS];
+ u_int8_t b[SKEIN_256_STATE_BYTES];
+ u_int64_t w[SKEIN_256_STATE_WORDS];
} cfg; /* config block */
-
+
Skein_Assert(hashBitLen > 0,SKEIN_BAD_HASHLEN);
Skein_Assert(keyBytes == 0 || key != NULL,SKEIN_FAIL);
@@ -98,7 +113,7 @@
memcpy(ctx->X,cfg.b,sizeof(cfg.b)); /* copy over into ctx->X[] */
#if SKEIN_NEED_SWAP
{
- uint_t i;
+ u_int i;
for (i=0;i<SKEIN_256_STATE_WORDS;i++) /* convert key bytes to context words */
ctx->X[i] = Skein_Swap64(ctx->X[i]);
}
@@ -128,7 +143,7 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* process the input bytes */
-int Skein_256_Update(Skein_256_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt)
+int Skein_256_Update(Skein_256_Ctxt_t *ctx, const u_int8_t *msg, size_t msgByteCnt)
{
size_t n;
@@ -176,10 +191,11 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* finalize the hash computation and output the result */
-int Skein_256_Final(Skein_256_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein_256_Final(Skein_256_Ctxt_t *ctx, u_int8_t *hashVal)
{
size_t i,n,byteCnt;
- u64b_t X[SKEIN_256_STATE_WORDS];
+ u_int64_t X[SKEIN_256_STATE_WORDS];
+
Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL; /* tag as the final block */
@@ -196,9 +212,9 @@
memcpy(X,ctx->X,sizeof(X)); /* keep a local copy of counter mode "key" */
for (i=0;i*SKEIN_256_BLOCK_BYTES < byteCnt;i++)
{
- ((u64b_t *)ctx->b)[0]= Skein_Swap64((u64b_t) i); /* build the counter block */
+ ((u_int64_t *)ctx->b)[0]= Skein_Swap64((u_int64_t) i); /* build the counter block */
Skein_Start_New_Type(ctx,OUT_FINAL);
- Skein_256_Process_Block(ctx,ctx->b,1,sizeof(u64b_t)); /* run "counter mode" */
+ Skein_256_Process_Block(ctx,ctx->b,1,sizeof(u_int64_t)); /* run "counter mode" */
n = byteCnt - i*SKEIN_256_BLOCK_BYTES; /* number of output bytes left to go */
if (n >= SKEIN_256_BLOCK_BYTES)
n = SKEIN_256_BLOCK_BYTES;
@@ -212,8 +228,8 @@
#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
size_t Skein_256_API_CodeSize(void)
{
- return ((u08b_t *) Skein_256_API_CodeSize) -
- ((u08b_t *) Skein_256_Init);
+ return ((u_int8_t *) Skein_256_API_CodeSize) -
+ ((u_int8_t *) Skein_256_Init);
}
#endif
@@ -227,10 +243,10 @@
{
union
{
- u08b_t b[SKEIN_512_STATE_BYTES];
- u64b_t w[SKEIN_512_STATE_WORDS];
+ u_int8_t b[SKEIN_512_STATE_BYTES];
+ u_int64_t w[SKEIN_512_STATE_WORDS];
} cfg; /* config block */
-
+
Skein_Assert(hashBitLen > 0,SKEIN_BAD_HASHLEN);
ctx->h.hashBitLen = hashBitLen; /* output hash bit count */
@@ -268,14 +284,14 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* init the context for a MAC and/or tree hash operation */
/* [identical to Skein_512_Init() when keyBytes == 0 && treeInfo == SKEIN_CFG_TREE_INFO_SEQUENTIAL] */
-int Skein_512_InitExt(Skein_512_Ctxt_t *ctx,size_t hashBitLen,u64b_t treeInfo, const u08b_t *key, size_t keyBytes)
+int Skein_512_InitExt(Skein_512_Ctxt_t *ctx,size_t hashBitLen,u_int64_t treeInfo, const u_int8_t *key, size_t keyBytes)
{
union
{
- u08b_t b[SKEIN_512_STATE_BYTES];
- u64b_t w[SKEIN_512_STATE_WORDS];
+ u_int8_t b[SKEIN_512_STATE_BYTES];
+ u_int64_t w[SKEIN_512_STATE_WORDS];
} cfg; /* config block */
-
+
Skein_Assert(hashBitLen > 0,SKEIN_BAD_HASHLEN);
Skein_Assert(keyBytes == 0 || key != NULL,SKEIN_FAIL);
@@ -296,7 +312,7 @@
memcpy(ctx->X,cfg.b,sizeof(cfg.b)); /* copy over into ctx->X[] */
#if SKEIN_NEED_SWAP
{
- uint_t i;
+ u_int i;
for (i=0;i<SKEIN_512_STATE_WORDS;i++) /* convert key bytes to context words */
ctx->X[i] = Skein_Swap64(ctx->X[i]);
}
@@ -326,7 +342,7 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* process the input bytes */
-int Skein_512_Update(Skein_512_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt)
+int Skein_512_Update(Skein_512_Ctxt_t *ctx, const u_int8_t *msg, size_t msgByteCnt)
{
size_t n;
@@ -374,10 +390,11 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* finalize the hash computation and output the result */
-int Skein_512_Final(Skein_512_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein_512_Final(Skein_512_Ctxt_t *ctx, u_int8_t *hashVal)
{
size_t i,n,byteCnt;
- u64b_t X[SKEIN_512_STATE_WORDS];
+ u_int64_t X[SKEIN_512_STATE_WORDS];
+
Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL; /* tag as the final block */
@@ -394,9 +411,9 @@
memcpy(X,ctx->X,sizeof(X)); /* keep a local copy of counter mode "key" */
for (i=0;i*SKEIN_512_BLOCK_BYTES < byteCnt;i++)
{
- ((u64b_t *)ctx->b)[0]= Skein_Swap64((u64b_t) i); /* build the counter block */
+ ((u_int64_t *)ctx->b)[0]= Skein_Swap64((u_int64_t) i); /* build the counter block */
Skein_Start_New_Type(ctx,OUT_FINAL);
- Skein_512_Process_Block(ctx,ctx->b,1,sizeof(u64b_t)); /* run "counter mode" */
+ Skein_512_Process_Block(ctx,ctx->b,1,sizeof(u_int64_t)); /* run "counter mode" */
n = byteCnt - i*SKEIN_512_BLOCK_BYTES; /* number of output bytes left to go */
if (n >= SKEIN_512_BLOCK_BYTES)
n = SKEIN_512_BLOCK_BYTES;
@@ -410,8 +427,8 @@
#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
size_t Skein_512_API_CodeSize(void)
{
- return ((u08b_t *) Skein_512_API_CodeSize) -
- ((u08b_t *) Skein_512_Init);
+ return ((u_int8_t *) Skein_512_API_CodeSize) -
+ ((u_int8_t *) Skein_512_Init);
}
#endif
@@ -425,10 +442,10 @@
{
union
{
- u08b_t b[SKEIN1024_STATE_BYTES];
- u64b_t w[SKEIN1024_STATE_WORDS];
+ u_int8_t b[SKEIN1024_STATE_BYTES];
+ u_int64_t w[SKEIN1024_STATE_WORDS];
} cfg; /* config block */
-
+
Skein_Assert(hashBitLen > 0,SKEIN_BAD_HASHLEN);
ctx->h.hashBitLen = hashBitLen; /* output hash bit count */
@@ -465,14 +482,14 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* init the context for a MAC and/or tree hash operation */
/* [identical to Skein1024_Init() when keyBytes == 0 && treeInfo == SKEIN_CFG_TREE_INFO_SEQUENTIAL] */
-int Skein1024_InitExt(Skein1024_Ctxt_t *ctx,size_t hashBitLen,u64b_t treeInfo, const u08b_t *key, size_t keyBytes)
+int Skein1024_InitExt(Skein1024_Ctxt_t *ctx,size_t hashBitLen,u_int64_t treeInfo, const u_int8_t *key, size_t keyBytes)
{
union
{
- u08b_t b[SKEIN1024_STATE_BYTES];
- u64b_t w[SKEIN1024_STATE_WORDS];
+ u_int8_t b[SKEIN1024_STATE_BYTES];
+ u_int64_t w[SKEIN1024_STATE_WORDS];
} cfg; /* config block */
-
+
Skein_Assert(hashBitLen > 0,SKEIN_BAD_HASHLEN);
Skein_Assert(keyBytes == 0 || key != NULL,SKEIN_FAIL);
@@ -493,7 +510,7 @@
memcpy(ctx->X,cfg.b,sizeof(cfg.b)); /* copy over into ctx->X[] */
#if SKEIN_NEED_SWAP
{
- uint_t i;
+ u_int i;
for (i=0;i<SKEIN1024_STATE_WORDS;i++) /* convert key bytes to context words */
ctx->X[i] = Skein_Swap64(ctx->X[i]);
}
@@ -523,7 +540,7 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* process the input bytes */
-int Skein1024_Update(Skein1024_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt)
+int Skein1024_Update(Skein1024_Ctxt_t *ctx, const u_int8_t *msg, size_t msgByteCnt)
{
size_t n;
@@ -571,10 +588,11 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* finalize the hash computation and output the result */
-int Skein1024_Final(Skein1024_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein1024_Final(Skein1024_Ctxt_t *ctx, u_int8_t *hashVal)
{
size_t i,n,byteCnt;
- u64b_t X[SKEIN1024_STATE_WORDS];
+ u_int64_t X[SKEIN1024_STATE_WORDS];
+
Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL; /* tag as the final block */
@@ -591,9 +609,9 @@
memcpy(X,ctx->X,sizeof(X)); /* keep a local copy of counter mode "key" */
for (i=0;i*SKEIN1024_BLOCK_BYTES < byteCnt;i++)
{
- ((u64b_t *)ctx->b)[0]= Skein_Swap64((u64b_t) i); /* build the counter block */
+ ((u_int64_t *)ctx->b)[0]= Skein_Swap64((u_int64_t) i); /* build the counter block */
Skein_Start_New_Type(ctx,OUT_FINAL);
- Skein1024_Process_Block(ctx,ctx->b,1,sizeof(u64b_t)); /* run "counter mode" */
+ Skein1024_Process_Block(ctx,ctx->b,1,sizeof(u_int64_t)); /* run "counter mode" */
n = byteCnt - i*SKEIN1024_BLOCK_BYTES; /* number of output bytes left to go */
if (n >= SKEIN1024_BLOCK_BYTES)
n = SKEIN1024_BLOCK_BYTES;
@@ -607,8 +625,8 @@
#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
size_t Skein1024_API_CodeSize(void)
{
- return ((u08b_t *) Skein1024_API_CodeSize) -
- ((u08b_t *) Skein1024_Init);
+ return ((u_int8_t *) Skein1024_API_CodeSize) -
+ ((u_int8_t *) Skein1024_Init);
}
#endif
@@ -617,8 +635,9 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* finalize the hash computation and output the block, no OUTPUT stage */
-int Skein_256_Final_Pad(Skein_256_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein_256_Final_Pad(Skein_256_Ctxt_t *ctx, u_int8_t *hashVal)
{
+
Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL; /* tag as the final block */
@@ -633,7 +652,7 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* finalize the hash computation and output the block, no OUTPUT stage */
-int Skein_512_Final_Pad(Skein_512_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein_512_Final_Pad(Skein_512_Ctxt_t *ctx, u_int8_t *hashVal)
{
Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
@@ -649,8 +668,9 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* finalize the hash computation and output the block, no OUTPUT stage */
-int Skein1024_Final_Pad(Skein1024_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein1024_Final_Pad(Skein1024_Ctxt_t *ctx, u_int8_t *hashVal)
{
+
Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
ctx->h.T[1] |= SKEIN_T1_FLAG_FINAL; /* tag as the final block */
@@ -666,10 +686,11 @@
#if SKEIN_TREE_HASH
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* just do the OUTPUT stage */
-int Skein_256_Output(Skein_256_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein_256_Output(Skein_256_Ctxt_t *ctx, u_int8_t *hashVal)
{
size_t i,n,byteCnt;
- u64b_t X[SKEIN_256_STATE_WORDS];
+ u_int64_t X[SKEIN_256_STATE_WORDS];
+
Skein_Assert(ctx->h.bCnt <= SKEIN_256_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
/* now output the result */
@@ -680,9 +701,9 @@
memcpy(X,ctx->X,sizeof(X)); /* keep a local copy of counter mode "key" */
for (i=0;i*SKEIN_256_BLOCK_BYTES < byteCnt;i++)
{
- ((u64b_t *)ctx->b)[0]= Skein_Swap64((u64b_t) i); /* build the counter block */
+ ((u_int64_t *)ctx->b)[0]= Skein_Swap64((u_int64_t) i); /* build the counter block */
Skein_Start_New_Type(ctx,OUT_FINAL);
- Skein_256_Process_Block(ctx,ctx->b,1,sizeof(u64b_t)); /* run "counter mode" */
+ Skein_256_Process_Block(ctx,ctx->b,1,sizeof(u_int64_t)); /* run "counter mode" */
n = byteCnt - i*SKEIN_256_BLOCK_BYTES; /* number of output bytes left to go */
if (n >= SKEIN_256_BLOCK_BYTES)
n = SKEIN_256_BLOCK_BYTES;
@@ -695,10 +716,11 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* just do the OUTPUT stage */
-int Skein_512_Output(Skein_512_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein_512_Output(Skein_512_Ctxt_t *ctx, u_int8_t *hashVal)
{
size_t i,n,byteCnt;
- u64b_t X[SKEIN_512_STATE_WORDS];
+ u_int64_t X[SKEIN_512_STATE_WORDS];
+
Skein_Assert(ctx->h.bCnt <= SKEIN_512_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
/* now output the result */
@@ -709,9 +731,9 @@
memcpy(X,ctx->X,sizeof(X)); /* keep a local copy of counter mode "key" */
for (i=0;i*SKEIN_512_BLOCK_BYTES < byteCnt;i++)
{
- ((u64b_t *)ctx->b)[0]= Skein_Swap64((u64b_t) i); /* build the counter block */
+ ((u_int64_t *)ctx->b)[0]= Skein_Swap64((u_int64_t) i); /* build the counter block */
Skein_Start_New_Type(ctx,OUT_FINAL);
- Skein_512_Process_Block(ctx,ctx->b,1,sizeof(u64b_t)); /* run "counter mode" */
+ Skein_512_Process_Block(ctx,ctx->b,1,sizeof(u_int64_t)); /* run "counter mode" */
n = byteCnt - i*SKEIN_512_BLOCK_BYTES; /* number of output bytes left to go */
if (n >= SKEIN_512_BLOCK_BYTES)
n = SKEIN_512_BLOCK_BYTES;
@@ -724,10 +746,11 @@
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* just do the OUTPUT stage */
-int Skein1024_Output(Skein1024_Ctxt_t *ctx, u08b_t *hashVal)
+int Skein1024_Output(Skein1024_Ctxt_t *ctx, u_int8_t *hashVal)
{
size_t i,n,byteCnt;
- u64b_t X[SKEIN1024_STATE_WORDS];
+ u_int64_t X[SKEIN1024_STATE_WORDS];
+
Skein_Assert(ctx->h.bCnt <= SKEIN1024_BLOCK_BYTES,SKEIN_FAIL); /* catch uninitialized context */
/* now output the result */
@@ -738,9 +761,9 @@
memcpy(X,ctx->X,sizeof(X)); /* keep a local copy of counter mode "key" */
for (i=0;i*SKEIN1024_BLOCK_BYTES < byteCnt;i++)
{
- ((u64b_t *)ctx->b)[0]= Skein_Swap64((u64b_t) i); /* build the counter block */
+ ((u_int64_t *)ctx->b)[0]= Skein_Swap64((u_int64_t) i); /* build the counter block */
Skein_Start_New_Type(ctx,OUT_FINAL);
- Skein1024_Process_Block(ctx,ctx->b,1,sizeof(u64b_t)); /* run "counter mode" */
+ Skein1024_Process_Block(ctx,ctx->b,1,sizeof(u_int64_t)); /* run "counter mode" */
n = byteCnt - i*SKEIN1024_BLOCK_BYTES; /* number of output bytes left to go */
if (n >= SKEIN1024_BLOCK_BYTES)
n = SKEIN1024_BLOCK_BYTES;
@@ -750,4 +773,97 @@
}
return SKEIN_SUCCESS;
}
+
+
+/* Adapt the functions to match the prototype expected by libmd */
+void
+SKEIN256_Init(SKEIN256_CTX * ctx)
+{
+
+ Skein_256_Init(ctx, 256);
+}
+
+void
+SKEIN512_Init(SKEIN512_CTX * ctx)
+{
+
+ Skein_512_Init(ctx, 512);
+}
+
+void
+SKEIN1024_Init(SKEIN1024_CTX * ctx)
+{
+
+ Skein1024_Init(ctx, 1024);
+}
+
+void
+SKEIN256_Update(SKEIN256_CTX * ctx, const void *in, size_t len)
+{
+
+ Skein_256_Update(ctx, in, len);
+}
+
+void
+SKEIN512_Update(SKEIN512_CTX * ctx, const void *in, size_t len)
+{
+
+ Skein_512_Update(ctx, in, len);
+}
+
+void
+SKEIN1024_Update(SKEIN1024_CTX * ctx, const void *in, size_t len)
+{
+
+ Skein1024_Update(ctx, in, len);
+}
+
+void
+SKEIN256_Final(unsigned char digest[static SKEIN_256_BLOCK_BYTES], SKEIN256_CTX *ctx)
+{
+
+ Skein_256_Final(ctx, digest);
+}
+
+void
+SKEIN512_Final(unsigned char digest[static SKEIN_512_BLOCK_BYTES], SKEIN512_CTX *ctx)
+{
+
+ Skein_512_Final(ctx, digest);
+}
+
+void
+SKEIN1024_Final(unsigned char digest[static SKEIN1024_BLOCK_BYTES], SKEIN1024_CTX *ctx)
+{
+
+ Skein1024_Final(ctx, digest);
+}
+
+#ifdef WEAK_REFS
+/* When building libmd, provide weak references. Note: this is not
+ activated in the context of compiling these sources for internal
+ use in libcrypt.
+ */
+#undef SKEIN256_Init
+__weak_reference(_libmd_SKEIN256_Init, SKEIN256_Init);
+#undef SKEIN256_Update
+__weak_reference(_libmd_SKEIN256_Update, SKEIN256_Update);
+#undef SKEIN256_Final
+__weak_reference(_libmd_SKEIN256_Final, SKEIN256_Final);
+
+#undef SKEIN512_Init
+__weak_reference(_libmd_SKEIN512_Init, SKEIN512_Init);
+#undef SKEIN512_Update
+__weak_reference(_libmd_SKEIN512_Update, SKEIN512_Update);
+#undef SKEIN512_Final
+__weak_reference(_libmd_SKEIN512_Final, SKEIN512_Final);
+
+#undef SKEIN1024_Init
+__weak_reference(_libmd_SKEIN1024_Init, SKEIN1024_Init);
+#undef SKEIN1024_Update
+__weak_reference(_libmd_SKEIN1024_Update, SKEIN1024_Update);
+#undef SKEIN1024_Final
+__weak_reference(_libmd_SKEIN1024_Final, SKEIN1024_Final);
#endif
+
+#endif
Index: sys/crypto/skein/skein_block.c
===================================================================
--- sys/crypto/skein/skein_block.c
+++ sys/crypto/skein/skein_block.c
@@ -14,7 +14,18 @@
**
************************************************************************/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/endian.h>
+#include <sys/types.h>
+
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
#include <string.h>
+#endif
+
#include "skein.h"
#ifndef SKEIN_USE_ASM
@@ -37,9 +48,19 @@
#define DebugSaveTweak(ctx)
#endif
+/*****************************************************************/
+/* functions to process blkCnt (nonzero) full block(s) of data. */
+void Skein_256_Process_Block(Skein_256_Ctxt_t *ctx, const u_int8_t *blkPtr,
+ size_t blkCnt, size_t byteCntAdd);
+void Skein_512_Process_Block(Skein_512_Ctxt_t *ctx, const u_int8_t *blkPtr,
+ size_t blkCnt, size_t byteCntAdd);
+void Skein1024_Process_Block(Skein1024_Ctxt_t *ctx, const u_int8_t *blkPtr,
+ size_t blkCnt, size_t byteCntAdd);
+
+
/***************************** Skein_256 ******************************/
#if !(SKEIN_USE_ASM & 256)
-void Skein_256_Process_Block(Skein_256_Ctxt_t *ctx,const u08b_t *blkPtr,size_t blkCnt,size_t byteCntAdd)
+void Skein_256_Process_Block(Skein_256_Ctxt_t *ctx, const u_int8_t *blkPtr, size_t blkCnt, size_t byteCntAdd)
{ /* do it in C */
enum
{
@@ -59,14 +80,14 @@
#error "Invalid SKEIN_UNROLL_256" /* sanity check on unroll count */
#endif
size_t r;
- u64b_t kw[WCNT+4+RCNT*2]; /* key schedule words : chaining vars + tweak + "rotation"*/
+ u_int64_t kw[WCNT+4+RCNT*2]; /* key schedule words : chaining vars + tweak + "rotation"*/
#else
- u64b_t kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
+ u_int64_t kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
#endif
- u64b_t X0,X1,X2,X3; /* local copy of context vars, for speed */
- u64b_t w [WCNT]; /* local copy of input block */
+ u_int64_t X0,X1,X2,X3; /* local copy of context vars, for speed */
+ u_int64_t w [WCNT]; /* local copy of input block */
#ifdef SKEIN_DEBUG
- const u64b_t *Xptr[4]; /* use for debugging (help compiler put Xn in registers) */
+ const u_int64_t *Xptr[4]; /* use for debugging (help compiler put Xn in registers) */
Xptr[0] = &X0; Xptr[1] = &X1; Xptr[2] = &X2; Xptr[3] = &X3;
#endif
Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
@@ -212,10 +233,10 @@
#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
size_t Skein_256_Process_Block_CodeSize(void)
{
- return ((u08b_t *) Skein_256_Process_Block_CodeSize) -
- ((u08b_t *) Skein_256_Process_Block);
+ return ((u_int8_t *) Skein_256_Process_Block_CodeSize) -
+ ((u_int8_t *) Skein_256_Process_Block);
}
-uint_t Skein_256_Unroll_Cnt(void)
+u_int Skein_256_Unroll_Cnt(void)
{
return SKEIN_UNROLL_256;
}
@@ -224,7 +245,7 @@
/***************************** Skein_512 ******************************/
#if !(SKEIN_USE_ASM & 512)
-void Skein_512_Process_Block(Skein_512_Ctxt_t *ctx,const u08b_t *blkPtr,size_t blkCnt,size_t byteCntAdd)
+void Skein_512_Process_Block(Skein_512_Ctxt_t *ctx,const u_int8_t *blkPtr,size_t blkCnt,size_t byteCntAdd)
{ /* do it in C */
enum
{
@@ -244,14 +265,14 @@
#error "Invalid SKEIN_UNROLL_512" /* sanity check on unroll count */
#endif
size_t r;
- u64b_t kw[WCNT+4+RCNT*2]; /* key schedule words : chaining vars + tweak + "rotation"*/
+ u_int64_t kw[WCNT+4+RCNT*2]; /* key schedule words : chaining vars + tweak + "rotation"*/
#else
- u64b_t kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
+ u_int64_t kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
#endif
- u64b_t X0,X1,X2,X3,X4,X5,X6,X7; /* local copy of vars, for speed */
- u64b_t w [WCNT]; /* local copy of input block */
+ u_int64_t X0,X1,X2,X3,X4,X5,X6,X7; /* local copy of vars, for speed */
+ u_int64_t w [WCNT]; /* local copy of input block */
#ifdef SKEIN_DEBUG
- const u64b_t *Xptr[8]; /* use for debugging (help compiler put Xn in registers) */
+ const u_int64_t *Xptr[8]; /* use for debugging (help compiler put Xn in registers) */
Xptr[0] = &X0; Xptr[1] = &X1; Xptr[2] = &X2; Xptr[3] = &X3;
Xptr[4] = &X4; Xptr[5] = &X5; Xptr[6] = &X6; Xptr[7] = &X7;
#endif
@@ -420,10 +441,10 @@
#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
size_t Skein_512_Process_Block_CodeSize(void)
{
- return ((u08b_t *) Skein_512_Process_Block_CodeSize) -
- ((u08b_t *) Skein_512_Process_Block);
+ return ((u_int8_t *) Skein_512_Process_Block_CodeSize) -
+ ((u_int8_t *) Skein_512_Process_Block);
}
-uint_t Skein_512_Unroll_Cnt(void)
+u_int Skein_512_Unroll_Cnt(void)
{
return SKEIN_UNROLL_512;
}
@@ -432,7 +453,7 @@
/***************************** Skein1024 ******************************/
#if !(SKEIN_USE_ASM & 1024)
-void Skein1024_Process_Block(Skein1024_Ctxt_t *ctx,const u08b_t *blkPtr,size_t blkCnt,size_t byteCntAdd)
+void Skein1024_Process_Block(Skein1024_Ctxt_t *ctx,const u_int8_t *blkPtr,size_t blkCnt,size_t byteCntAdd)
{ /* do it in C, always looping (unrolled is bigger AND slower!) */
enum
{
@@ -452,16 +473,16 @@
#error "Invalid SKEIN_UNROLL_1024" /* sanity check on unroll count */
#endif
size_t r;
- u64b_t kw[WCNT+4+RCNT*2]; /* key schedule words : chaining vars + tweak + "rotation"*/
+ u_int64_t kw[WCNT+4+RCNT*2]; /* key schedule words : chaining vars + tweak + "rotation"*/
#else
- u64b_t kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
+ u_int64_t kw[WCNT+4]; /* key schedule words : chaining vars + tweak */
#endif
- u64b_t X00,X01,X02,X03,X04,X05,X06,X07, /* local copy of vars, for speed */
+ u_int64_t X00,X01,X02,X03,X04,X05,X06,X07, /* local copy of vars, for speed */
X08,X09,X10,X11,X12,X13,X14,X15;
- u64b_t w [WCNT]; /* local copy of input block */
+ u_int64_t w [WCNT]; /* local copy of input block */
#ifdef SKEIN_DEBUG
- const u64b_t *Xptr[16]; /* use for debugging (help compiler put Xn in registers) */
+ const u_int64_t *Xptr[16]; /* use for debugging (help compiler put Xn in registers) */
Xptr[ 0] = &X00; Xptr[ 1] = &X01; Xptr[ 2] = &X02; Xptr[ 3] = &X03;
Xptr[ 4] = &X04; Xptr[ 5] = &X05; Xptr[ 6] = &X06; Xptr[ 7] = &X07;
Xptr[ 8] = &X08; Xptr[ 9] = &X09; Xptr[10] = &X10; Xptr[11] = &X11;
@@ -678,10 +699,10 @@
#if defined(SKEIN_CODE_SIZE) || defined(SKEIN_PERF)
size_t Skein1024_Process_Block_CodeSize(void)
{
- return ((u08b_t *) Skein1024_Process_Block_CodeSize) -
- ((u08b_t *) Skein1024_Process_Block);
+ return ((u_int8_t *) Skein1024_Process_Block_CodeSize) -
+ ((u_int8_t *) Skein1024_Process_Block);
}
-uint_t Skein1024_Unroll_Cnt(void)
+u_int Skein1024_Unroll_Cnt(void)
{
return SKEIN_UNROLL_1024;
}
Index: sys/crypto/skein/skein_debug.h
===================================================================
--- sys/crypto/skein/skein_debug.h
+++ sys/crypto/skein/skein_debug.h
@@ -12,14 +12,20 @@
#ifdef SKEIN_DEBUG
/* callout functions used inside Skein code */
-void Skein_Show_Block(uint_t bits,const Skein_Ctxt_Hdr_t *h,const u64b_t *X,const u08b_t *blkPtr,
- const u64b_t *wPtr,const u64b_t *ksPtr,const u64b_t *tsPtr);
-void Skein_Show_Round(uint_t bits,const Skein_Ctxt_Hdr_t *h,size_t r,const u64b_t *X);
-void Skein_Show_R_Ptr(uint_t bits,const Skein_Ctxt_Hdr_t *h,size_t r,const u64b_t *X_ptr[]);
-void Skein_Show_Final(uint_t bits,const Skein_Ctxt_Hdr_t *h,size_t cnt,const u08b_t *outPtr);
-void Skein_Show_Key (uint_t bits,const Skein_Ctxt_Hdr_t *h,const u08b_t *key,size_t keyBytes);
+void Skein_Show_Block(u_int bits, const Skein_Ctxt_Hdr_t *h,
+ const u_int64_t *X, const u_int8_t *blkPtr,
+ const u_int64_t *wPtr, const u_int64_t *ksPtr,
+ const u_int64_t *tsPtr);
+void Skein_Show_Round(u_int bits, const Skein_Ctxt_Hdr_t *h, size_t r,
+ const u_int64_t *X);
+void Skein_Show_R_Ptr(u_int bits, const Skein_Ctxt_Hdr_t *h, size_t r,
+ const u_int64_t *X_ptr[]);
+void Skein_Show_Final(u_int bits, const Skein_Ctxt_Hdr_t *h, size_t cnt,
+ const u_int8_t *outPtr);
+void Skein_Show_Key (u_int bits, const Skein_Ctxt_Hdr_t *h,
+ const u_int8_t *key, size_t keyBytes);
-extern uint_t skein_DebugFlag; /* flags to control debug output (0 --> none) */
+extern u_int skein_DebugFlag; /* flags to control debug output (0 --> none) */
#define SKEIN_RND_SPECIAL (1000u)
#define SKEIN_RND_KEY_INITIAL (SKEIN_RND_SPECIAL+0u)
Index: sys/crypto/skein/skein_debug.c
===================================================================
--- sys/crypto/skein/skein_debug.c
+++ sys/crypto/skein/skein_debug.c
@@ -14,15 +14,15 @@
static const char INDENT[] = " "; /* how much to indent on new line */
-uint_t skein_DebugFlag = 0; /* off by default. Must be set externally */
+u_int skein_DebugFlag = 0; /* off by default. Must be set externally */
-static void Show64_step(size_t cnt,const u64b_t *X,size_t step)
+static void Show64_step(size_t cnt,const u_int64_t *X,size_t step)
{
size_t i,j;
for (i=j=0;i < cnt;i++,j+=step)
{
if (i % 4 == 0) printf(INDENT);
- printf(" %08X.%08X ",(uint_32t)(X[j] >> 32),(uint_32t)X[j]);
+ printf(" %08X.%08X ",(u_int32_t)(X[j] >> 32),(u_int32_t)X[j]);
if (i % 4 == 3 || i==cnt-1) printf("\n");
fflush(stdout);
}
@@ -30,18 +30,18 @@
#define Show64(cnt,X) Show64_step(cnt,X,1)
-static void Show64_flag(size_t cnt,const u64b_t *X)
+static void Show64_flag(size_t cnt,const u_int64_t *X)
{
size_t xptr = (size_t) X;
size_t step = (xptr & 1) ? 2 : 1;
if (step != 1)
{
- X = (const u64b_t *) (xptr & ~1);
+ X = (const u_int64_t *) (xptr & ~1);
}
Show64_step(cnt,X,step);
}
-static void Show08(size_t cnt,const u08b_t *b)
+static void Show08(size_t cnt,const u_int8_t *b)
{
size_t i;
for (i=0;i < cnt;i++)
@@ -54,7 +54,7 @@
}
}
-static const char *AlgoHeader(uint_t bits)
+static const char *AlgoHeader(u_int bits)
{
if (skein_DebugFlag & SKEIN_DEBUG_THREEFISH)
switch (bits)
@@ -73,7 +73,7 @@
return NULL;
}
-void Skein_Show_Final(uint_t bits,const Skein_Ctxt_Hdr_t *h,size_t cnt,const u08b_t *outPtr)
+void Skein_Show_Final(u_int bits,const Skein_Ctxt_Hdr_t *h,size_t cnt,const u_int8_t *outPtr)
{
if (skein_DebugFlag & SKEIN_DEBUG_CONFIG || ((h->T[1] & SKEIN_T1_BLK_TYPE_MASK) != SKEIN_T1_BLK_TYPE_CFG))
if (skein_DebugFlag & SKEIN_DEBUG_FINAL)
@@ -86,9 +86,9 @@
}
/* show state after a round (or "pseudo-round") */
-void Skein_Show_Round(uint_t bits,const Skein_Ctxt_Hdr_t *h,size_t r,const u64b_t *X)
+void Skein_Show_Round(u_int bits,const Skein_Ctxt_Hdr_t *h,size_t r,const u_int64_t *X)
{
- static uint_t injectNum=0; /* not multi-thread safe! */
+ static u_int injectNum=0; /* not multi-thread safe! */
if (skein_DebugFlag & SKEIN_DEBUG_CONFIG || ((h->T[1] & SKEIN_T1_BLK_TYPE_MASK) != SKEIN_T1_BLK_TYPE_CFG))
if (skein_DebugFlag)
@@ -121,16 +121,16 @@
}
else if (skein_DebugFlag & SKEIN_DEBUG_ROUNDS)
{
- uint_t j;
- u64b_t p[SKEIN_MAX_STATE_WORDS];
- const u08b_t *perm;
- const static u08b_t PERM_256 [4][ 4] = { { 0,1,2,3 }, { 0,3,2,1 }, { 0,1,2,3 }, { 0,3,2,1 } };
- const static u08b_t PERM_512 [4][ 8] = { { 0,1,2,3,4,5,6,7 },
+ u_int j;
+ u_int64_t p[SKEIN_MAX_STATE_WORDS];
+ const u_int8_t *perm;
+ const static u_int8_t PERM_256 [4][ 4] = { { 0,1,2,3 }, { 0,3,2,1 }, { 0,1,2,3 }, { 0,3,2,1 } };
+ const static u_int8_t PERM_512 [4][ 8] = { { 0,1,2,3,4,5,6,7 },
{ 2,1,4,7,6,5,0,3 },
{ 4,1,6,3,0,5,2,7 },
{ 6,1,0,7,2,5,4,3 }
};
- const static u08b_t PERM_1024[4][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 },
+ const static u_int8_t PERM_1024[4][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 },
{ 0, 9, 2,13, 6,11, 4,15,10, 7,12, 3,14, 5, 8, 1 },
{ 0, 7, 2, 5, 4, 3, 6, 1,12,15,14,13, 8,11,10, 9 },
{ 0,15, 2,11, 6,13, 4, 9,14, 1, 8, 5,10, 3,12, 7 }
@@ -159,10 +159,10 @@
}
/* show state after a round (or "pseudo-round"), given a list of pointers */
-void Skein_Show_R_Ptr(uint_t bits,const Skein_Ctxt_Hdr_t *h,size_t r,const u64b_t *X_ptr[])
+void Skein_Show_R_Ptr(u_int bits,const Skein_Ctxt_Hdr_t *h,size_t r,const u_int64_t *X_ptr[])
{
- uint_t i;
- u64b_t X[SKEIN_MAX_STATE_WORDS];
+ u_int i;
+ u_int64_t X[SKEIN_MAX_STATE_WORDS];
for (i=0;i<bits/64;i++) /* copy over the words */
X[i] = X_ptr[i][0];
@@ -171,18 +171,18 @@
/* show the state at the start of a block */
-void Skein_Show_Block(uint_t bits,const Skein_Ctxt_Hdr_t *h,const u64b_t *X,const u08b_t *blkPtr,
- const u64b_t *wPtr, const u64b_t *ksPtr, const u64b_t *tsPtr)
+void Skein_Show_Block(u_int bits,const Skein_Ctxt_Hdr_t *h,const u_int64_t *X,const u_int8_t *blkPtr,
+ const u_int64_t *wPtr, const u_int64_t *ksPtr, const u_int64_t *tsPtr)
{
- uint_t n;
+ u_int n;
if (skein_DebugFlag & SKEIN_DEBUG_CONFIG || ((h->T[1] & SKEIN_T1_BLK_TYPE_MASK) != SKEIN_T1_BLK_TYPE_CFG))
if (skein_DebugFlag)
{
if (skein_DebugFlag & SKEIN_DEBUG_HDR)
{
- printf("\n%s Block: outBits=%4d. T0=%06X.",AlgoHeader(bits),(uint_t) h->hashBitLen,(uint_t)h->T[0]);
+ printf("\n%s Block: outBits=%4d. T0=%06X.",AlgoHeader(bits),(u_int) h->hashBitLen,(u_int)h->T[0]);
printf(" Type=");
- n = (uint_t) ((h->T[1] & SKEIN_T1_BLK_TYPE_MASK) >> SKEIN_T1_POS_BLK_TYPE);
+ n = (u_int) ((h->T[1] & SKEIN_T1_BLK_TYPE_MASK) >> SKEIN_T1_POS_BLK_TYPE);
switch (n)
{
case SKEIN_BLK_TYPE_KEY: printf("KEY. "); break;
@@ -198,7 +198,7 @@
printf((h->T[1] & SKEIN_T1_FLAG_FIRST) ? " First":" ");
printf((h->T[1] & SKEIN_T1_FLAG_FINAL) ? " Final":" ");
printf((h->T[1] & SKEIN_T1_FLAG_BIT_PAD) ? " Pad" :" ");
- n = (uint_t) ((h->T[1] & SKEIN_T1_TREE_LVL_MASK) >> SKEIN_T1_POS_TREE_LVL);
+ n = (u_int) ((h->T[1] & SKEIN_T1_TREE_LVL_MASK) >> SKEIN_T1_POS_TREE_LVL);
if (n)
printf(" TreeLevel = %02X",n);
printf("\n");
@@ -234,7 +234,7 @@
}
}
-void Skein_Show_Key(uint_t bits,const Skein_Ctxt_Hdr_t *h,const u08b_t *key,size_t keyBytes)
+void Skein_Show_Key(u_int bits,const Skein_Ctxt_Hdr_t *h,const u_int8_t *key,size_t keyBytes)
{
if (keyBytes)
if (skein_DebugFlag & SKEIN_DEBUG_CONFIG || ((h->T[1] & SKEIN_T1_BLK_TYPE_MASK) != SKEIN_T1_BLK_TYPE_CFG))
Index: sys/crypto/skein/skein_freebsd.h
===================================================================
--- sys/crypto/skein/skein_freebsd.h
+++ sys/crypto/skein/skein_freebsd.h
@@ -0,0 +1,51 @@
+#ifndef _SKEIN_FREEBSD_H_
+#define _SKEIN_FREEBSD_H_
+
+#define SKEIN_256_BLOCK_BYTES ( 8*SKEIN_256_STATE_WORDS)
+#define SKEIN_512_BLOCK_BYTES ( 8*SKEIN_512_STATE_WORDS)
+#define SKEIN1024_BLOCK_BYTES ( 8*SKEIN1024_STATE_WORDS)
+
+#define SKEIN256_BLOCK_LENGTH SKEIN_256_BLOCK_BYTES
+#define SKEIN256_DIGEST_LENGTH 32
+#define SKEIN256_DIGEST_STRING_LENGTH (SKEIN256_DIGEST_LENGTH * 2 + 1)
+#define SKEIN512_BLOCK_LENGTH SKEIN_512_BLOCK_BYTES
+#define SKEIN512_DIGEST_LENGTH 64
+#define SKEIN512_DIGEST_STRING_LENGTH (SKEIN512_DIGEST_LENGTH * 2 + 1)
+#define SKEIN1024_BLOCK_LENGTH SKEIN1024_BLOCK_BYTES
+#define SKEIN1024_DIGEST_LENGTH 128
+#define SKEIN1024_DIGEST_STRING_LENGTH (SKEIN1024_DIGEST_LENGTH * 2 + 1)
+
+/* Make the context types look like the other hashes on FreeBSD */
+typedef Skein_256_Ctxt_t SKEIN256_CTX;
+typedef Skein_512_Ctxt_t SKEIN512_CTX;
+typedef Skein1024_Ctxt_t SKEIN1024_CTX;
+
+/* Make the prototypes look like the other hashes */
+void SKEIN256_Init (SKEIN256_CTX *ctx);
+void SKEIN512_Init (SKEIN512_CTX *ctx);
+void SKEIN1024_Init (SKEIN1024_CTX *ctx);
+
+void SKEIN256_Update(SKEIN256_CTX *ctx, const void *in, size_t len);
+void SKEIN512_Update(SKEIN512_CTX *ctx, const void *in, size_t len);
+void SKEIN1024_Update(SKEIN1024_CTX *ctx, const void *in, size_t len);
+
+void SKEIN256_Final(unsigned char digest[static SKEIN256_DIGEST_LENGTH], SKEIN256_CTX *ctx);
+void SKEIN512_Final(unsigned char digest[static SKEIN512_DIGEST_LENGTH], SKEIN512_CTX *ctx);
+void SKEIN1024_Final(unsigned char digest[static SKEIN1024_DIGEST_LENGTH], SKEIN1024_CTX *ctx);
+
+#ifndef _KERNEL
+char *SKEIN256_End(SKEIN256_CTX *, char *);
+char *SKEIN512_End(SKEIN512_CTX *, char *);
+char *SKEIN1024_End(SKEIN1024_CTX *, char *);
+char *SKEIN256_Data(const void *, unsigned int, char *);
+char *SKEIN512_Data(const void *, unsigned int, char *);
+char *SKEIN1024_Data(const void *, unsigned int, char *);
+char *SKEIN256_File(const char *, char *);
+char *SKEIN512_File(const char *, char *);
+char *SKEIN1024_File(const char *, char *);
+char *SKEIN256_FileChunk(const char *, char *, off_t, off_t);
+char *SKEIN512_FileChunk(const char *, char *, off_t, off_t);
+char *SKEIN1024_FileChunk(const char *, char *, off_t, off_t);
+#endif
+
+#endif /* ifndef _SKEIN_FREEBSD_H_ */
Index: sys/crypto/skein/skein_iv.h
===================================================================
--- sys/crypto/skein/skein_iv.h
+++ sys/crypto/skein/skein_iv.h
@@ -20,7 +20,7 @@
#define MK_64 SKEIN_MK_64
/* blkSize = 256 bits. hashSize = 128 bits */
-const u64b_t SKEIN_256_IV_128[] =
+const u_int64_t SKEIN_256_IV_128[] =
{
MK_64(0xE1111906,0x964D7260),
MK_64(0x883DAAA7,0x7C8D811C),
@@ -29,7 +29,7 @@
};
/* blkSize = 256 bits. hashSize = 160 bits */
-const u64b_t SKEIN_256_IV_160[] =
+const u_int64_t SKEIN_256_IV_160[] =
{
MK_64(0x14202314,0x72825E98),
MK_64(0x2AC4E9A2,0x5A77E590),
@@ -38,7 +38,7 @@
};
/* blkSize = 256 bits. hashSize = 224 bits */
-const u64b_t SKEIN_256_IV_224[] =
+const u_int64_t SKEIN_256_IV_224[] =
{
MK_64(0xC6098A8C,0x9AE5EA0B),
MK_64(0x876D5686,0x08C5191C),
@@ -47,7 +47,7 @@
};
/* blkSize = 256 bits. hashSize = 256 bits */
-const u64b_t SKEIN_256_IV_256[] =
+const u_int64_t SKEIN_256_IV_256[] =
{
MK_64(0xFC9DA860,0xD048B449),
MK_64(0x2FCA6647,0x9FA7D833),
@@ -56,7 +56,7 @@
};
/* blkSize = 512 bits. hashSize = 128 bits */
-const u64b_t SKEIN_512_IV_128[] =
+const u_int64_t SKEIN_512_IV_128[] =
{
MK_64(0xA8BC7BF3,0x6FBF9F52),
MK_64(0x1E9872CE,0xBD1AF0AA),
@@ -69,7 +69,7 @@
};
/* blkSize = 512 bits. hashSize = 160 bits */
-const u64b_t SKEIN_512_IV_160[] =
+const u_int64_t SKEIN_512_IV_160[] =
{
MK_64(0x28B81A2A,0xE013BD91),
MK_64(0xC2F11668,0xB5BDF78F),
@@ -82,7 +82,7 @@
};
/* blkSize = 512 bits. hashSize = 224 bits */
-const u64b_t SKEIN_512_IV_224[] =
+const u_int64_t SKEIN_512_IV_224[] =
{
MK_64(0xCCD06162,0x48677224),
MK_64(0xCBA65CF3,0xA92339EF),
@@ -95,7 +95,7 @@
};
/* blkSize = 512 bits. hashSize = 256 bits */
-const u64b_t SKEIN_512_IV_256[] =
+const u_int64_t SKEIN_512_IV_256[] =
{
MK_64(0xCCD044A1,0x2FDB3E13),
MK_64(0xE8359030,0x1A79A9EB),
@@ -108,7 +108,7 @@
};
/* blkSize = 512 bits. hashSize = 384 bits */
-const u64b_t SKEIN_512_IV_384[] =
+const u_int64_t SKEIN_512_IV_384[] =
{
MK_64(0xA3F6C6BF,0x3A75EF5F),
MK_64(0xB0FEF9CC,0xFD84FAA4),
@@ -121,7 +121,7 @@
};
/* blkSize = 512 bits. hashSize = 512 bits */
-const u64b_t SKEIN_512_IV_512[] =
+const u_int64_t SKEIN_512_IV_512[] =
{
MK_64(0x4903ADFF,0x749C51CE),
MK_64(0x0D95DE39,0x9746DF03),
@@ -134,7 +134,7 @@
};
/* blkSize = 1024 bits. hashSize = 384 bits */
-const u64b_t SKEIN1024_IV_384[] =
+const u_int64_t SKEIN1024_IV_384[] =
{
MK_64(0x5102B6B8,0xC1894A35),
MK_64(0xFEEBC9E3,0xFE8AF11A),
@@ -155,7 +155,7 @@
};
/* blkSize = 1024 bits. hashSize = 512 bits */
-const u64b_t SKEIN1024_IV_512[] =
+const u_int64_t SKEIN1024_IV_512[] =
{
MK_64(0xCAEC0E5D,0x7C1B1B18),
MK_64(0xA01B0E04,0x5F03E802),
@@ -176,7 +176,7 @@
};
/* blkSize = 1024 bits. hashSize = 1024 bits */
-const u64b_t SKEIN1024_IV_1024[] =
+const u_int64_t SKEIN1024_IV_1024[] =
{
MK_64(0xD593DA07,0x41E72355),
MK_64(0x15B5E511,0xAC73E00C),
Index: sys/crypto/skein/skein_port.h
===================================================================
--- sys/crypto/skein/skein_port.h
+++ sys/crypto/skein/skein_port.h
@@ -15,16 +15,15 @@
**
********************************************************************/
-#include "brg_types.h" /* get integer type definitions */
+#include <sys/endian.h>
+#include <sys/types.h>
-typedef unsigned int uint_t; /* native unsigned integer */
-typedef uint_8t u08b_t; /* 8-bit unsigned integer */
-typedef uint_64t u64b_t; /* 64-bit unsigned integer */
-
#ifndef RotL_64
#define RotL_64(x,N) (((x) << (N)) | ((x) >> (64-(N))))
#endif
+__BEGIN_DECLS
+
/*
* Skein is "natively" little-endian (unlike SHA-xxx), for optimal
* performance on x86 CPUs. The Skein code requires the following
@@ -46,17 +45,18 @@
*/
#ifndef SKEIN_NEED_SWAP /* compile-time "override" for endianness? */
-#include "brg_endian.h" /* get endianness selection */
-#if PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN
+#if BYTE_ORDER == BIG_ENDIAN
/* here for big-endian CPUs */
#define SKEIN_NEED_SWAP (1)
-#elif PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN
+#ifdef SKEIN_PORT_CODE
+void Skein_Put64_LSB_First(u_int8_t *dst, const u_int64_t *src, size_t bCnt);
+void Skein_Get64_LSB_First(u_int64_t *dst, const u_int8_t *src, size_t wCnt);
+#endif /* ifdef SKEIN_PORT_CODE */
+#elif BYTE_ORDER == LITTLE_ENDIAN
/* here for x86 and x86-64 CPUs (and other detected little-endian CPUs) */
#define SKEIN_NEED_SWAP (0)
-#if PLATFORM_MUST_ALIGN == 0 /* ok to use "fast" versions? */
#define Skein_Put64_LSB_First(dst08,src64,bCnt) memcpy(dst08,src64,bCnt)
#define Skein_Get64_LSB_First(dst64,src08,wCnt) memcpy(dst64,src08,8*(wCnt))
-#endif
#else
#error "Skein needs endianness setting!"
#endif
@@ -70,15 +70,7 @@
*/
#ifndef Skein_Swap64 /* swap for big-endian, nop for little-endian */
#if SKEIN_NEED_SWAP
-#define Skein_Swap64(w64) \
- ( (( ((u64b_t)(w64)) & 0xFF) << 56) | \
- (((((u64b_t)(w64)) >> 8) & 0xFF) << 48) | \
- (((((u64b_t)(w64)) >>16) & 0xFF) << 40) | \
- (((((u64b_t)(w64)) >>24) & 0xFF) << 32) | \
- (((((u64b_t)(w64)) >>32) & 0xFF) << 24) | \
- (((((u64b_t)(w64)) >>40) & 0xFF) << 16) | \
- (((((u64b_t)(w64)) >>48) & 0xFF) << 8) | \
- (((((u64b_t)(w64)) >>56) & 0xFF) ) )
+#define Skein_Swap64(w64) bswap64(w64)
#else
#define Skein_Swap64(w64) (w64)
#endif
@@ -86,39 +78,73 @@
#ifndef Skein_Put64_LSB_First
-void Skein_Put64_LSB_First(u08b_t *dst,const u64b_t *src,size_t bCnt)
+void Skein_Put64_LSB_First(u_int8_t *dst, const u_int64_t *src, size_t bCnt)
#ifdef SKEIN_PORT_CODE /* instantiate the function code here? */
- { /* this version is fully portable (big-endian or little-endian), but slow */
+{
size_t n;
- for (n=0;n<bCnt;n++)
- dst[n] = (u08b_t) (src[n>>3] >> (8*(n&7)));
- }
+ for (n = 0; n < bCnt / 8; n++)
+ le64enc(dst + n * 8, src[n]);
+}
#else
- ; /* output only the function prototype */
+; /* output only the function prototype */
#endif
#endif /* ifndef Skein_Put64_LSB_First */
#ifndef Skein_Get64_LSB_First
-void Skein_Get64_LSB_First(u64b_t *dst,const u08b_t *src,size_t wCnt)
+void Skein_Get64_LSB_First(u_int64_t *dst, const u_int8_t *src, size_t wCnt)
#ifdef SKEIN_PORT_CODE /* instantiate the function code here? */
- { /* this version is fully portable (big-endian or little-endian), but slow */
+{
size_t n;
- for (n=0;n<8*wCnt;n+=8)
- dst[n/8] = (((u64b_t) src[n ]) ) +
- (((u64b_t) src[n+1]) << 8) +
- (((u64b_t) src[n+2]) << 16) +
- (((u64b_t) src[n+3]) << 24) +
- (((u64b_t) src[n+4]) << 32) +
- (((u64b_t) src[n+5]) << 40) +
- (((u64b_t) src[n+6]) << 48) +
- (((u64b_t) src[n+7]) << 56) ;
- }
+ for (n = 0; n < wCnt; n++)
+ dst[n] = le64dec(src + n * 8);
+}
#else
- ; /* output only the function prototype */
+; /* output only the function prototype */
#endif
#endif /* ifndef Skein_Get64_LSB_First */
+/* Start FreeBSD libmd shims */
+
+/* Ensure libmd symbols do not clash with libcrypto */
+#ifndef SKEIN256_Init
+#define SKEIN256_Init _libmd_SKEIN256_Init
+#define SKEIN512_Init _libmd_SKEIN512_Init
+#define SKEIN1024_Init _libmd_SKEIN1024_Init
+#endif
+#ifndef SKEIN256_Update
+#define SKEIN256_Update _libmd_SKEIN256_Update
+#define SKEIN512_Update _libmd_SKEIN512_Update
+#define SKEIN1024_Update _libmd_SKEIN1024_Update
+#endif
+#ifndef SKEIN256_Final
+#define SKEIN256_Final _libmd_SKEIN256_Final
+#define SKEIN512_Final _libmd_SKEIN512_Final
+#define SKEIN1024_Final _libmd_SKEIN1024_Final
+#endif
+#ifndef SKEIN256_End
+#define SKEIN256_End _libmd_SKEIN256_End
+#define SKEIN512_End _libmd_SKEIN512_End
+#define SKEIN1024_End _libmd_SKEIN1024_End
+#endif
+#ifndef SKEIN256_File
+#define SKEIN256_File _libmd_SKEIN256_File
+#define SKEIN512_File _libmd_SKEIN512_File
+#define SKEIN1024_File _libmd_SKEIN1024_File
+#endif
+#ifndef SKEIN256_FileChunk
+#define SKEIN256_FileChunk _libmd_SKEIN256_FileChunk
+#define SKEIN512_FileChunk _libmd_SKEIN512_FileChunk
+#define SKEIN1024_FileChunk _libmd_SKEIN1024_FileChunk
+#endif
+#ifndef SKEIN256_Data
+#define SKEIN256_Data _libmd_SKEIN256_Data
+#define SKEIN512_Data _libmd_SKEIN512_Data
+#define SKEIN1024_Data _libmd_SKEIN1024_Data
+#endif
+
+__END_DECLS
+
#endif /* ifndef _SKEIN_PORT_H_ */
Index: sys/modules/crypto/Makefile
===================================================================
--- sys/modules/crypto/Makefile
+++ sys/modules/crypto/Makefile
@@ -8,6 +8,7 @@
.PATH: ${.CURDIR}/../../crypto/rijndael
.PATH: ${.CURDIR}/../../crypto/sha2
.PATH: ${.CURDIR}/../../crypto/siphash
+.PATH: ${.CURDIR}/../../crypto/skein
KMOD = crypto
SRCS = crypto.c cryptodev_if.c
@@ -17,6 +18,13 @@
SRCS += camellia.c camellia-api.c
SRCS += des_ecb.c des_enc.c des_setkey.c
SRCS += sha1.c sha256c.c sha512c.c
+SRCS += skein.c skein_block.c
+.if exists(${MACHINE_ARCH}/skein_block_asm.s)
+.PATH: ${.CURDIR}/../../crypto/skein/${MACHINE_ARCH}
+SRCS += skein_block_asm.s
+CFLAGS += -DSKEIN_ASM -DSKEIN_USE_ASM=1792 # list of block functions to replace with assembly: 256+512+1024 = 1792
+ACFLAGS += -DELF -Wa,--noexecstack
+.endif
SRCS += siphash.c
SRCS += gmac.c gfmult.c
SRCS += opt_param.h cryptodev_if.h bus_if.h device_if.h
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Jan 20, 12:35 PM (18 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27763314
Default Alt Text
D6166.id17039.diff (84 KB)
Attached To
Mode
D6166: Import Bruce Schneier's Skein hashing algorithm
Attached
Detach File
Event Timeline
Log In to Comment