082193ef2b
This patch fixes two issues in the ia32 RDRAND assembly code that result in a (possibly significant) loss of entropy. The first, less significant, issue is that, by returning success as 0 from OPENSSL_ia32_rdrand() and OPENSSL_ia32_rdseed(), a subtle bias was introduced. Specifically, because the assembly routine copied the remaining number of retries over the result when RDRAND/RDSEED returned 'successful but zero', a bias towards values 1-8 (primarily 8) was introduced. The second, more worrying issue was that, due to a mixup in registers, when a buffer that was not size 0 or 1 mod 8 was passed to OPENSSL_ia32_rdrand_bytes or OPENSSL_ia32_rdseed_bytes, the last (n mod 8) bytes were all the same value. This issue impacts only the 64-bit variant of the assembly. This change fixes both issues by first eliminating the only use of OPENSSL_ia32_rdrand, replacing it with OPENSSL_ia32_rdrand_bytes, and fixes the register mixup in OPENSSL_ia32_rdrand_bytes. It also adds a sanity test for OPENSSL_ia32_rdrand_bytes and OPENSSL_ia32_rdseed_bytes to help catch problems of this nature in the future. Reviewed-by: Andy Polyakov <appro@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/5342)
25 lines
830 B
Perl
25 lines
830 B
Perl
#! /usr/bin/perl
|
|
|
|
# Copyright 2018-2018 The OpenSSL Project Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the OpenSSL license (the "License"). You may not use
|
|
# this file except in compliance with the License. You can obtain a copy
|
|
# in the file LICENSE in the source distribution or at
|
|
# https://www.openssl.org/source/license.html
|
|
|
|
use strict;
|
|
|
|
use OpenSSL::Test; # get 'plan'
|
|
use OpenSSL::Test::Simple;
|
|
use OpenSSL::Test::Utils;
|
|
|
|
setup("test_rdrand_sanity");
|
|
|
|
plan skip_all => "This test is unsupported in a shared library build on Windows"
|
|
if $^O eq 'MSWin32' && !disabled("shared");
|
|
|
|
# We also need static builds to be enabled even on linux
|
|
plan skip_all => "This test is unsupported if static builds are not enabled"
|
|
if disabled("static");
|
|
|
|
simple_test("test_rdrand_sanity", "rdrand_sanitytest");
|