|
1 | 1 | # coding: us-ascii
|
2 | 2 | # frozen_string_literal: true
|
3 | 3 | require_relative 'utils'
|
4 |
| -require "prime" |
5 | 4 |
|
6 | 5 | if defined?(OpenSSL)
|
7 | 6 |
|
@@ -131,6 +130,27 @@ def test_unary_plus_minus
|
131 | 130 | assert_equal(-999, +@e2)
|
132 | 131 | assert_equal(-999, -@e1)
|
133 | 132 | assert_equal(+999, -@e2)
|
| 133 | + |
| 134 | + # These methods create new BN instances due to BN mutability |
| 135 | + # Ensure that the instance isn't the same |
| 136 | + e1_plus = +@e1 |
| 137 | + e1_minus = -@e1 |
| 138 | + assert_equal(false, @e1.equal?(e1_plus)) |
| 139 | + assert_equal(true, @e1 == e1_plus) |
| 140 | + assert_equal(false, @e1.equal?(e1_minus)) |
| 141 | + end |
| 142 | + |
| 143 | + def test_abs |
| 144 | + assert_equal(@e1, @e2.abs) |
| 145 | + assert_equal(@e3, @e4.abs) |
| 146 | + assert_not_equal(@e2, @e2.abs) |
| 147 | + assert_not_equal(@e4, @e4.abs) |
| 148 | + assert_equal(false, @e2.abs.negative?) |
| 149 | + assert_equal(false, @e4.abs.negative?) |
| 150 | + assert_equal(true, (-@e1.abs).negative?) |
| 151 | + assert_equal(true, (-@e2.abs).negative?) |
| 152 | + assert_equal(true, (-@e3.abs).negative?) |
| 153 | + assert_equal(true, (-@e4.abs).negative?) |
134 | 154 | end
|
135 | 155 |
|
136 | 156 | def test_mod
|
@@ -228,25 +248,35 @@ def test_random
|
228 | 248 | r5 = OpenSSL::BN.rand_range(256)
|
229 | 249 | assert_include(0..255, r5)
|
230 | 250 | }
|
| 251 | + |
| 252 | + # Aliases |
| 253 | + assert_include(128..255, OpenSSL::BN.pseudo_rand(8)) |
| 254 | + assert_include(0..255, OpenSSL::BN.pseudo_rand_range(256)) |
231 | 255 | end
|
232 | 256 |
|
233 |
| - def test_prime |
234 |
| - p1 = OpenSSL::BN.generate_prime(32) |
235 |
| - assert_include(0...2**32, p1) |
236 |
| - assert_equal(true, Prime.prime?(p1.to_i)) |
237 |
| - p2 = OpenSSL::BN.generate_prime(32, true) |
238 |
| - assert_equal(true, Prime.prime?((p2.to_i - 1) / 2)) |
239 |
| - p3 = OpenSSL::BN.generate_prime(32, false, 4) |
240 |
| - assert_equal(1, p3 % 4) |
241 |
| - p4 = OpenSSL::BN.generate_prime(32, false, 4, 3) |
242 |
| - assert_equal(3, p4 % 4) |
243 |
| - |
244 |
| - assert_equal(true, p1.prime?) |
245 |
| - assert_equal(true, p2.prime?) |
246 |
| - assert_equal(true, p3.prime?) |
247 |
| - assert_equal(true, p4.prime?) |
248 |
| - assert_equal(true, @e3.prime?) |
249 |
| - assert_equal(true, @e3.prime_fasttest?) |
| 257 | + begin |
| 258 | + require "prime" |
| 259 | + |
| 260 | + def test_prime |
| 261 | + p1 = OpenSSL::BN.generate_prime(32) |
| 262 | + assert_include(0...2**32, p1) |
| 263 | + assert_equal(true, Prime.prime?(p1.to_i)) |
| 264 | + p2 = OpenSSL::BN.generate_prime(32, true) |
| 265 | + assert_equal(true, Prime.prime?((p2.to_i - 1) / 2)) |
| 266 | + p3 = OpenSSL::BN.generate_prime(32, false, 4) |
| 267 | + assert_equal(1, p3 % 4) |
| 268 | + p4 = OpenSSL::BN.generate_prime(32, false, 4, 3) |
| 269 | + assert_equal(3, p4 % 4) |
| 270 | + |
| 271 | + assert_equal(true, p1.prime?) |
| 272 | + assert_equal(true, p2.prime?) |
| 273 | + assert_equal(true, p3.prime?) |
| 274 | + assert_equal(true, p4.prime?) |
| 275 | + assert_equal(true, @e3.prime?) |
| 276 | + assert_equal(true, @e3.prime_fasttest?) |
| 277 | + end |
| 278 | + rescue LoadError |
| 279 | + # prime is the bundled gems at Ruby 3.1 |
250 | 280 | end
|
251 | 281 |
|
252 | 282 | def test_num_bits_bytes
|
@@ -281,6 +311,54 @@ def test_argument_error
|
281 | 311 | bug15760 = '[ruby-core:92231] [Bug #15760]'
|
282 | 312 | assert_raise(ArgumentError, bug15760) { OpenSSL::BN.new(nil, 2) }
|
283 | 313 | end
|
| 314 | + |
| 315 | + def test_get_flags_and_set_flags |
| 316 | + e = OpenSSL::BN.new(999) |
| 317 | + |
| 318 | + assert_equal(0, e.get_flags(OpenSSL::BN::CONSTTIME)) |
| 319 | + |
| 320 | + e.set_flags(OpenSSL::BN::CONSTTIME) |
| 321 | + assert_equal(OpenSSL::BN::CONSTTIME, e.get_flags(OpenSSL::BN::CONSTTIME)) |
| 322 | + |
| 323 | + b = OpenSSL::BN.new(2) |
| 324 | + m = OpenSSL::BN.new(99) |
| 325 | + assert_equal("17", b.mod_exp(e, m).to_s) |
| 326 | + |
| 327 | + # mod_exp fails when m is even and any argument has CONSTTIME flag |
| 328 | + m = OpenSSL::BN.new(98) |
| 329 | + assert_raise(OpenSSL::BNError) do |
| 330 | + b.mod_exp(e, m) |
| 331 | + end |
| 332 | + |
| 333 | + # It looks like flags cannot be removed once enabled |
| 334 | + e.set_flags(0) |
| 335 | + assert_equal(4, e.get_flags(OpenSSL::BN::CONSTTIME)) |
| 336 | + end |
| 337 | + |
| 338 | + if respond_to?(:ractor) |
| 339 | + ractor |
| 340 | + def test_ractor |
| 341 | + assert_equal(@e1, Ractor.new { OpenSSL::BN.new("999") }.take) |
| 342 | + assert_equal(@e3, Ractor.new { OpenSSL::BN.new("\a\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 2) }.take) |
| 343 | + assert_equal("999", Ractor.new(@e1) { |e1| e1.to_s }.take) |
| 344 | + assert_equal("07FFFFFFFFFFFFFFFFFFFFFFFFFF", Ractor.new(@e3) { |e3| e3.to_s(16) }.take) |
| 345 | + assert_equal(2**107-1, Ractor.new(@e3) { _1.to_i }.take) |
| 346 | + assert_equal([1000, -999], Ractor.new(@e2) { _1.coerce(1000) }.take) |
| 347 | + assert_equal(false, Ractor.new { 1.to_bn.zero? }.take) |
| 348 | + assert_equal(true, Ractor.new { 1.to_bn.one? }.take) |
| 349 | + assert_equal(true, Ractor.new(@e2) { _1.negative? }.take) |
| 350 | + assert_equal("-03E7", Ractor.new(@e2) { _1.to_s(16) }.take) |
| 351 | + assert_equal(2**107-1, Ractor.new(@e3) { _1.to_i }.take) |
| 352 | + assert_equal([1000, -999], Ractor.new(@e2) { _1.coerce(1000) }.take) |
| 353 | + assert_equal(true, Ractor.new { 0.to_bn.zero? }.take) |
| 354 | + assert_equal(true, Ractor.new { 1.to_bn.one? }.take ) |
| 355 | + assert_equal(false,Ractor.new { 2.to_bn.odd? }.take) |
| 356 | + assert_equal(true, Ractor.new(@e2) { _1.negative? }.take) |
| 357 | + assert_include(128..255, Ractor.new { OpenSSL::BN.rand(8)}.take) |
| 358 | + assert_include(0...2**32, Ractor.new { OpenSSL::BN.generate_prime(32) }.take) |
| 359 | + assert_equal(0, Ractor.new { OpenSSL::BN.new(999).get_flags(OpenSSL::BN::CONSTTIME) }.take) |
| 360 | + end |
| 361 | + end |
284 | 362 | end
|
285 | 363 |
|
286 | 364 | end
|
0 commit comments