Re: [PATCH 1/6] modes: add functions implementing common code for 64-bit ciphers

2020-07-08 Thread Dmitry Baryshkov
сб, 27 июн. 2020 г. в 22:37, Dmitry Baryshkov :
>
> 64-bit ciphers are old, but it would be good to use common code for
> their implementations.

Gracious ping for this patchset.

>
> Signed-off-by: Dmitry Baryshkov 
> ---
>  src/lib/libcrypto/modes/cbc64.c | 202 
>  src/lib/libcrypto/modes/cfb64.c | 169 ++
>  src/lib/libcrypto/modes/ctr64.c | 174 +++
>  src/lib/libcrypto/modes/modes.h |  26 
>  src/lib/libcrypto/modes/ofb64.c | 119 +++
>  5 files changed, 690 insertions(+)
>  create mode 100644 src/lib/libcrypto/modes/cbc64.c
>  create mode 100644 src/lib/libcrypto/modes/cfb64.c
>  create mode 100644 src/lib/libcrypto/modes/ctr64.c
>  create mode 100644 src/lib/libcrypto/modes/ofb64.c
>
> diff --git a/src/lib/libcrypto/modes/cbc64.c b/src/lib/libcrypto/modes/cbc64.c
> new file mode 100644
> index ..ec65ac5d3468
> --- /dev/null
> +++ b/src/lib/libcrypto/modes/cbc64.c
> @@ -0,0 +1,202 @@
> +/* $OpenBSD: cbc64.c,v 1.4 2015/02/10 09:46:30 miod Exp $ */
> +/* 
> + * Copyright (c) 2008 The OpenSSL Project.  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.
> + *
> + * 3. All advertising materials mentioning features or use of this
> + *software must display the following acknowledgment:
> + *"This product includes software developed by the OpenSSL Project
> + *for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
> + *
> + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
> + *endorse or promote products derived from this software without
> + *prior written permission. For written permission, please contact
> + *openssl-c...@openssl.org.
> + *
> + * 5. Products derived from this software may not be called "OpenSSL"
> + *nor may "OpenSSL" appear in their names without prior written
> + *permission of the OpenSSL Project.
> + *
> + * 6. Redistributions of any form whatsoever must retain the following
> + *acknowledgment:
> + *"This product includes software developed by the OpenSSL Project
> + *for use in the OpenSSL Toolkit (http://www.openssl.org/)"
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
> + * EXPRESSED 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 OpenSSL PROJECT OR
> + * ITS 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.
> + * 
> + *
> + */
> +
> +#include 
> +#include "modes_lcl.h"
> +#include 
> +
> +#ifndef MODES_DEBUG
> +# ifndef NDEBUG
> +#  define NDEBUG
> +# endif
> +#endif
> +
> +#undef STRICT_ALIGNMENT
> +#ifdef __STRICT_ALIGNMENT
> +#define STRICT_ALIGNMENT 1
> +#else
> +#define STRICT_ALIGNMENT 0
> +#endif
> +
> +void CRYPTO_cbc64_encrypt(const unsigned char *in, unsigned char *out,
> +   size_t len, const void *key,
> +   unsigned char ivec[8], block64_f block)
> +{
> +   size_t n;
> +   const unsigned char *iv = ivec;
> +
> +#if !defined(OPENSSL_SMALL_FOOTPRINT)
> +   if (STRICT_ALIGNMENT &&
> +   ((size_t)in|(size_t)out|(size_t)ivec)%sizeof(size_t) != 0) {
> +   while (len>=8) {
> +   for(n=0; n<8; ++n)
> +   out[n] = in[n] ^ iv[n];
> +   (*block)(out, out, key);
> +   iv = out;
> +   len -= 8;
> +   in  += 8;
> +   out += 8;
> +   }
> +   } else {
> +   while (len>=8) {
> +   for(n=0; n<8; n+=sizeof(size_t))
> +   *(size_t*)(out+n) =
> +   *(size_t*)(in+n) ^ *(size_t*)(iv+n);
> +   

[PATCH 1/6] modes: add functions implementing common code for 64-bit ciphers

2020-06-27 Thread Dmitry Baryshkov
64-bit ciphers are old, but it would be good to use common code for
their implementations.

Signed-off-by: Dmitry Baryshkov 
---
 src/lib/libcrypto/modes/cbc64.c | 202 
 src/lib/libcrypto/modes/cfb64.c | 169 ++
 src/lib/libcrypto/modes/ctr64.c | 174 +++
 src/lib/libcrypto/modes/modes.h |  26 
 src/lib/libcrypto/modes/ofb64.c | 119 +++
 5 files changed, 690 insertions(+)
 create mode 100644 src/lib/libcrypto/modes/cbc64.c
 create mode 100644 src/lib/libcrypto/modes/cfb64.c
 create mode 100644 src/lib/libcrypto/modes/ctr64.c
 create mode 100644 src/lib/libcrypto/modes/ofb64.c

diff --git a/src/lib/libcrypto/modes/cbc64.c b/src/lib/libcrypto/modes/cbc64.c
new file mode 100644
index ..ec65ac5d3468
--- /dev/null
+++ b/src/lib/libcrypto/modes/cbc64.c
@@ -0,0 +1,202 @@
+/* $OpenBSD: cbc64.c,v 1.4 2015/02/10 09:46:30 miod Exp $ */
+/* 
+ * Copyright (c) 2008 The OpenSSL Project.  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.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *software must display the following acknowledgment:
+ *"This product includes software developed by the OpenSSL Project
+ *for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *endorse or promote products derived from this software without
+ *prior written permission. For written permission, please contact
+ *openssl-c...@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *nor may "OpenSSL" appear in their names without prior written
+ *permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *acknowledgment:
+ *"This product includes software developed by the OpenSSL Project
+ *for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 OpenSSL PROJECT OR
+ * ITS 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.
+ * 
+ *
+ */
+
+#include 
+#include "modes_lcl.h"
+#include 
+
+#ifndef MODES_DEBUG
+# ifndef NDEBUG
+#  define NDEBUG
+# endif
+#endif
+
+#undef STRICT_ALIGNMENT
+#ifdef __STRICT_ALIGNMENT
+#define STRICT_ALIGNMENT 1
+#else
+#define STRICT_ALIGNMENT 0
+#endif
+
+void CRYPTO_cbc64_encrypt(const unsigned char *in, unsigned char *out,
+   size_t len, const void *key,
+   unsigned char ivec[8], block64_f block)
+{
+   size_t n;
+   const unsigned char *iv = ivec;
+
+#if !defined(OPENSSL_SMALL_FOOTPRINT)
+   if (STRICT_ALIGNMENT &&
+   ((size_t)in|(size_t)out|(size_t)ivec)%sizeof(size_t) != 0) {
+   while (len>=8) {
+   for(n=0; n<8; ++n)
+   out[n] = in[n] ^ iv[n];
+   (*block)(out, out, key);
+   iv = out;
+   len -= 8;
+   in  += 8;
+   out += 8;
+   }
+   } else {
+   while (len>=8) {
+   for(n=0; n<8; n+=sizeof(size_t))
+   *(size_t*)(out+n) =
+   *(size_t*)(in+n) ^ *(size_t*)(iv+n);
+   (*block)(out, out, key);
+   iv = out;
+   len -= 8;
+   in  += 8;
+   out += 8;
+   }
+   }
+#endif
+   while (len) {
+   for(n=0; n<8 && n=8) {
+   (*block)(in, out, key);
+