Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F146089395
D6166.id17045.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
41 KB
Referenced Files
None
Subscribers
None
D6166.id17045.diff
View Options
Index: lib/libcrypt/Makefile
===================================================================
--- lib/libcrypt/Makefile
+++ lib/libcrypt/Makefile
@@ -10,16 +10,25 @@
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"
@@ -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
===================================================================
--- /dev/null
+++ 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
===================================================================
--- /dev/null
+++ 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,14 +9,20 @@
${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 \
md5.1 sha256.1 \
md5.1 sha384.1 \
md5.1 sha512.1 \
- md5.1 sha512t256.1
+ md5.1 sha512t256.1 \
+ md5.1 skein256.1 \
+ md5.1 skein512.1 \
+ md5.1 skein1024.1
LIBADD= md
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,12 +91,15 @@
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 */
-#define HEX_DIGEST_LENGTH 129
+ RIPEMD160_DIGEST_LENGTH, SKEIN1024_DIGEST_LENGTH)*2+1 */
+#define HEX_DIGEST_LENGTH 257
/* 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
@@ -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,9 +8,21 @@
**
************************************************************************/
+#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 */
@@ -750,4 +762,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,6 +48,12 @@
#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 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);
+
/***************************** 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)
Index: sys/crypto/skein/skein_freebsd.h
===================================================================
--- /dev/null
+++ 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_port.h
===================================================================
--- sys/crypto/skein/skein_port.h
+++ sys/crypto/skein/skein_port.h
@@ -15,16 +15,20 @@
**
********************************************************************/
-#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 */
+typedef u_int8_t u08b_t; /* 8-bit unsigned integer */
+typedef u_int32_t uint_32t; /* 32-bit unsigned integer */
+typedef u_int64_t 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 +50,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(u08b_t *dst,const u64b_t *src,size_t bCnt);
+void Skein_Get64_LSB_First(u64b_t *dst,const u08b_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 +75,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
@@ -88,14 +85,14 @@
#ifndef Skein_Put64_LSB_First
void Skein_Put64_LSB_First(u08b_t *dst,const u64b_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 */
@@ -103,22 +100,56 @@
#ifndef Skein_Get64_LSB_First
void Skein_Get64_LSB_First(u64b_t *dst,const u08b_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
Sat, Feb 28, 5:33 PM (13 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29076968
Default Alt Text
D6166.id17045.diff (41 KB)
Attached To
Mode
D6166: Import Bruce Schneier's Skein hashing algorithm
Attached
Detach File
Event Timeline
Log In to Comment