@@ -351,6 +351,7 @@ mod test {
351351 use std:: rand:: RngUtil ;
352352 use std:: vec;
353353
354+ use cryptoutil:: { add_bytes_to_bits, add_bytes_to_bits_tuple} ;
354355 use digest:: Digest ;
355356
356357 /// Feed 1,000,000 'a's into the digest with varying input sizes and check that the result is
@@ -375,4 +376,50 @@ mod test {
375376
376377 assert ! ( expected == result_str) ;
377378 }
379+
380+ // A normal addition - no overflow occurs
381+ #[ test]
382+ fn test_add_bytes_to_bits_ok ( ) {
383+ assert ! ( add_bytes_to_bits:: <u64 >( 100 , 10 ) == 180 ) ;
384+ }
385+
386+ // A simple failure case - adding 1 to the max value
387+ #[ test]
388+ #[ should_fail]
389+ fn test_add_bytes_to_bits_overflow ( ) {
390+ add_bytes_to_bits :: < u64 > ( Bounded :: max_value ( ) , 1 ) ;
391+ }
392+
393+ // A normal addition - no overflow occurs (fast path)
394+ #[ test]
395+ fn test_add_bytes_to_bits_tuple_ok ( ) {
396+ assert ! ( add_bytes_to_bits_tuple:: <u64 >( ( 5 , 100 ) , 10 ) == ( 5 , 180 ) ) ;
397+ }
398+
399+ // The low order value overflows into the high order value
400+ #[ test]
401+ fn test_add_bytes_to_bits_tuple_ok2 ( ) {
402+ assert ! ( add_bytes_to_bits_tuple:: <u64 >( ( 5 , Bounded :: max_value( ) ) , 1 ) == ( 6 , 7 ) ) ;
403+ }
404+
405+ // The value to add is too large to be converted into bits without overflowing its type
406+ #[ test]
407+ fn test_add_bytes_to_bits_tuple_ok3 ( ) {
408+ assert ! ( add_bytes_to_bits_tuple:: <u64 >( ( 5 , 0 ) , 0x4000000000000001 ) == ( 7 , 8 ) ) ;
409+ }
410+
411+ // A simple failure case - adding 1 to the max value
412+ #[ test]
413+ #[ should_fail]
414+ fn test_add_bytes_to_bits_tuple_overflow ( ) {
415+ add_bytes_to_bits_tuple :: < u64 > ( ( Bounded :: max_value ( ) , Bounded :: max_value ( ) ) , 1 ) ;
416+ }
417+
418+ // The value to add is too large to convert to bytes without overflowing its type, but the high
419+ // order value from this conversion overflows when added to the existing high order value
420+ #[ test]
421+ #[ should_fail]
422+ fn test_add_bytes_to_bits_tuple_overflow2 ( ) {
423+ add_bytes_to_bits_tuple :: < u64 > ( ( Bounded :: max_value :: < u64 > ( ) - 1 , 0 ) , 0x8000000000000000 ) ;
424+ }
378425}
0 commit comments