Mail Archives: cygwin/2014/08/13/04:56:02
--------------010707080406070604070806
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
On 2014-08-12 16:11, Corinna Vinschen wrote:
> Hi Peter,
>
> On Aug 12 15:29, Peter Rosin wrote:
>> On 2014-08-09 16:37, Corinna Vinschen wrote:
>>> I just uploaded rng-tools-5-1.
>>>
>>> The Cygwin release only comes with the rngtest tool for now.
>>>
>>> The rngd daemon requires porting assembler code to COFF and the
>>> Microsoft calling convention. Any help porting this code would
>>> be greatly appreciated.
>>
>> Ok, I took a stab at it. The problems I identified in the assembly
>> are ELF debug info, different register use for the x86-64 calls and
>> a missing underscore prefix for the i686 symbols.
>>
>> I'm unsure if used registers (and which) have to be saved in the
>> MS x86-64 ABI, but that shouldn't be too hard to fix if that's the
>> case.
I found out that I need to preserve (at least) %rdi and %rsi in the
callee.
>> I also moved up the AC_SEARCH_LIBS hunk in configure.ac since
>> the existing AC_CHECK_LIB is buried inside some other construct
>> (AC_CHECK_HEADER is possibly the culprit) which causes this:
>>
>> checking for library containing argp_parse... /usr/src/rng-tools-5-1.src/rng-tools-5-1.i686/src/rng-tools-5/configure: line 4335: ac_fn_c_try_link: command not found
>> /usr/src/rng-tools-5-1.src/rng-tools-5-1.i686/src/rng-tools-5/configure: line 4335: ac_fn_c_try_link: command not found
>> no
>>
>> Anyway, with the attached patch instead of the one included in the
>> src package, it builds for both arches, but my cpu appears to lack
>> the rdrand instruction, so I have a hard time taking this any
>> further. Bummer.
>
> Thanks for your efforts! Over the weekend I tried my own port. I opted
> for creating a new file, rdrand_win_asm.S (attached for reference) to
> keep the code a bit cleaner.
And I didn't want to fork it, for easier maintenance. Your version ought
to be faster though, without all the thunking going on in my version.
> I have a machine which supports the rdrand call, but you need at least
> an Ivy Bridge CPU, For rdseed you need at least Haswell.
I found an Haswell upstairs (but no Broadwell, so still no rdseed). For
completeness, I'm attaching a version of my patch that makes it actually
run.
> Ultimately I gave up on rngd for now, for four reasons:
>
> - rngd uses poll(2) on /dev/random to wait until /dev/random becomes
> writable. /dev/random on Cygwin is always writable (we're not
> controlling the entropy pool, the OS does, and the RtlGenRandom call
> never blocks). This results in 100% CPU usage.
Yes, I saw that full core usage as well when I ran rngd...
> - Even then, using rngd on /dev/random gave *worse* results when
> testing /dev/random with rngtest :-P I'm not sure why.
Yes, I saw that too. Maybe the reason is that if you could get a better
PRNG by adding a feedback of the output to the entropy pool, that
would already be part of the PRNG? I'm not into PRNGs though...
> - Cygwin does not support any of the other three hardware entropy
> sources /dev/hwrng or /dev/tpm0. For Intel/AMD hwrng you'd need
> access to the PCI bus and certain chipsets. For tpm0 you'd
> need a TPM chip and a description how to access the chip for
> producing random numbers. The chip is supposedly available as
> cryptographic provider under Windows, but on the only machine
> in our home with a TPM chip *and* a functional Windows driver,
> there was no matching cryptographic provider returned by the call
> to CryptEnumProviders.
Sorry, I have no input on the other HW entropy sources.
> - Given that, and given the hardware constraints for the rdrand and
> rdseed calls, I decided that it's not worth to follow through with
> this stuff.
>
> Still, thanks a lot for working on that. I appreciate it. If you
> have any idea how Cygwin could provide /dev/hwrng or /dev/tpm0 to
> have at least two HW entropy sources, please feel free to discuss
> this on the cygwin-developer's list.
This seemed like something I could waste a little time on, and learn
something in the process. Which I did, so not all is lost. :-)
Cheers,
Peter
--------------010707080406070604070806
Content-Type: text/x-patch;
name="cygwin-rng-tools-5-peda.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="cygwin-rng-tools-5-peda.patch"
diff -rup origsrc/rng-tools-5/configure.ac src/rng-tools-5/configure.ac
--- origsrc/rng-tools-5/configure.ac 2014-08-12 10:33:32.064585400 +0200
+++ src/rng-tools-5/configure.ac 2014-08-12 11:18:44.431782000 +0200
@@ -56,6 +56,8 @@ dnl ------------------------------------
dnl Checks for optional library functions
dnl -------------------------------------
+AC_SEARCH_LIBS([argp_parse],[argp])
+
dnl -------------------------------------
dnl Check for libgcrypt support
dnl -------------------------------------
diff -rup origsrc/rng-tools-5/rdrand_asm.S src/rng-tools-5/rdrand_asm.S
--- origsrc/rng-tools-5/rdrand_asm.S 2014-08-13 10:16:08.499091900 +0200
+++ src/rng-tools-5/rdrand_asm.S 2014-08-13 10:12:40.745403500 +0200
@@ -20,20 +20,43 @@
#if defined(__i386__) || defined(__x86_64__)
-#define ENTRY(x) \
- .balign 64 ; \
- .globl x ; \
-x:
+#if defined __CYGWIN__
+# if defined __x86_64__
+# define MS_x86_64_ABI
+# else
+# define SYMBOL(name) _ ## name
+# endif
+#else
+# define ELF_DEBUG_INFO
+#endif
+#if !defined SYMBOL
+# define SYMBOL(name) name
+#endif
+
+#define ENTRY(x) \
+ .balign 64 ; \
+ .globl SYMBOL(x) ; \
+SYMBOL(x):
+#if defined ELF_DEBUG_INFO
#define ENDPROC(x) \
.size x, .-x ; \
.type x, @function
+#else
+#define ENDPROC(x)
+#endif
#define RDRAND_RETRY_LIMIT 10
#ifdef __x86_64__
ENTRY(x86_rdrand_bytes)
+#if defined MS_x86_64_ABI
+ push %rdi
+ push %rsi
+ mov %rcx, %rdi
+ mov %rdx, %rsi
+#endif
mov %esi, %eax
1:
mov $RDRAND_RETRY_LIMIT, %ecx
@@ -46,6 +69,10 @@ ENTRY(x86_rdrand_bytes)
ja 1b
4:
sub %esi, %eax
+#if defined MS_x86_64_ABI
+ pop %rsi
+ pop %rdi
+#endif
ret
3:
dec %ecx
@@ -55,6 +82,14 @@ ENTRY(x86_rdrand_bytes)
ENDPROC(x86_rdrand_bytes)
ENTRY(x86_rdseed_or_rdrand_bytes)
+#if defined MS_x86_64_ABI
+ push %rdi
+ push %rsi
+ mov %rcx, %rdi
+ mov %rdx, %rsi
+ mov %r8, %rdx
+ mov %r9, %rcx
+#endif
mov (%rsi), %r8d /* RDSEED count */
mov (%rcx), %r9d /* RDRAND count */
1:
@@ -69,6 +104,10 @@ ENTRY(x86_rdseed_or_rdrand_bytes)
4:
sub %r8d, (%rsi)
sub %r9d, (%rcx)
+#if defined MS_x86_64_ABI
+ pop %rsi
+ pop %rdi
+#endif
ret
3:
.byte 0x48,0x0f,0xc7,0xf0 /* rdrand %rax */
@@ -191,6 +230,12 @@ ENTRY(x86_aes_mangle)
movl 12(%ebp), %edx
push %esi
#endif
+#if defined MS_x86_64_ABI
+ push %rdi
+ push %rsi
+ mov %rcx, %rdi
+ mov %rdx, %rsi
+#endif
movl $512, CTR3 /* Number of rounds */
movdqa (0*16)(PTR1), %xmm0
@@ -283,6 +328,10 @@ offset = offset + 16
pop %esi
pop %ebp
#endif
+#if defined MS_x86_64_ABI
+ pop %rsi
+ pop %rdi
+#endif
ret
ENDPROC(x86_aes_mangle)
@@ -295,6 +344,11 @@ ENTRY(x86_aes_expand_key)
mov %esp, %ebp
movl 8(%ebp), %eax
#endif
+#if defined MS_x86_64_ABI
+ push %rdi
+ push %rsi
+ mov %rcx, %rdi
+#endif
SETPTR(aes_round_keys, PTR1)
movdqu (PTR0), %xmm0
@@ -325,6 +379,10 @@ ENTRY(x86_aes_expand_key)
#ifdef __i386__
pop %ebp
#endif
+#if defined MS_x86_64_ABI
+ pop %rsi
+ pop %rdi
+#endif
ret
1:
@@ -347,12 +405,16 @@ ENDPROC(x86_aes_expand_key)
.balign 64
aes_round_keys:
.space 11*16
+#if defined ELF_DEBUG_INFO
.size aes_round_keys, .-aes_round_keys
+#endif /* ELF_DEBUG_INFO */
#endif /* i386 or x86_64 */
+#if defined ELF_DEBUG_INFO
/*
* This is necessary to keep the whole executable
* from needing a writable stack.
*/
.section .note.GNU-stack,"",%progbits
+#endif /* ELF_DEBUG_INFO */
diff -rup origsrc/rng-tools-5/rngd_linux.c src/rng-tools-5/rngd_linux.c
--- origsrc/rng-tools-5/rngd_linux.c 2012-08-06 19:04:12.000000000 +0200
+++ src/rng-tools-5/rngd_linux.c 2014-08-09 15:09:21.081616358 +0200
@@ -39,8 +39,10 @@
#include <fcntl.h>
#include <sys/time.h>
#include <time.h>
+#ifndef __CYGWIN__
#include <linux/types.h>
#include <linux/random.h>
+#endif
#include <string.h>
#include "rngd.h"
@@ -130,11 +132,19 @@ void random_add_entropy(void *buf, size_
entropy.size = size;
memcpy(entropy.data, buf, size);
+#ifdef __CYGWIN__
+ if (write(random_fd, entropy.data, size) != size) {
+ message(LOG_DAEMON|LOG_ERR, "Add Entropy failed: %s\n",
+ strerror(errno));
+ exit(1);
+ }
+#else
if (ioctl(random_fd, RNDADDENTROPY, &entropy) != 0) {
message(LOG_DAEMON|LOG_ERR, "RNDADDENTROPY failed: %s\n",
strerror(errno));
exit(1);
}
+#endif
}
void random_sleep(void)
--------------010707080406070604070806
Content-Type: text/plain; charset=us-ascii
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
--------------010707080406070604070806--
- Raw text -