base58 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec389588355af34bfc88dd2fcf6e8c551461c546a8bf532413536885d6c0bf5e
4
- data.tar.gz: 38755386088de0e65513c6ed888f4a6185cecc2168ba28145d207b4c71f80fb2
3
+ metadata.gz: 33ccbcef765a46e1e856bc882fc45b75b727de51da69e5bece5e097bc39d1dbd
4
+ data.tar.gz: 7eb54e225d04709b747c16b1d741b645d7c42b2911dd5da83a4111104b00b26e
5
5
  SHA512:
6
- metadata.gz: c5bfb539ec0b97fddb1c5ac616461959532fbfffdec768c30ba2c810795984a0a563c3f0fff83447ce1b0bb52d5dad1a6751905f9bee9a2d0bef13248a6b02e3
7
- data.tar.gz: 4a2e0bbcbb5d1b95cd70b089080257d49666525d07666f415ae1641d047424cbb60096b1aa06f2dfd115ccd538b037337dae95d5a95877f707601f5b2141b192
6
+ metadata.gz: d6cb74b302d8f367860fb85bfd0bdc842bb57064a2c852bd03e4fafe215fc850deb3efc4ae98ca21380c8f2939eb92f17886a4a29bcde37b77524292cdbd80fa
7
+ data.tar.gz: cb77134f325a5ed494727f1f2c5662e1332f57666ee824d74db8929ea7d04990823531b666c4cca3877633a30bc56b8ee75cf1b2d57a72c448c1ec268e57fd47
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ = 0.2.1 [2017-01-08]
2
+ - Bitcoin-style leading-zeroes encoding. Thanks to @joelnordell.
3
+
1
4
  = 0.2.0 [2017-01-05]
2
5
  - Bitcoin and Ripple alphabet support. Thanks to @joelnordell.
3
6
  - Binary encoding and decoding support. Thanks to @joelnordell.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 - 2017 Douglas F Shearer
1
+ Copyright (c) 2009 - 2018 Douglas F Shearer
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -86,6 +86,8 @@ The alphabet used by the [Bitcoin](https://en.wikipedia.org/wiki/Bitcoin) protoc
86
86
 
87
87
  123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
88
88
 
89
+ See the "Leading Zeros" section for enabling full Bitcoin-style leading-zeros support.
90
+
89
91
 
90
92
  ### Ripple
91
93
 
@@ -96,6 +98,17 @@ The alphabet used by the [Ripple protocol](https://en.wikipedia.org/wiki/Ripple_
96
98
  rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
97
99
 
98
100
 
101
+ ## Leading Zeroes
102
+
103
+ Some protocols, such as Bitcoin, require that leading zeros be encoded. Passing `true` to the third argument of binary_to_base58()` will enable this behaviour.
104
+
105
+ ```ruby
106
+ bitcoin_address_hex = '00000000000000000000123456789ABCDEF0'
107
+ bitcoin_address_bin = [bitcoin_address_hex].pack('H*')
108
+
109
+ Base58.binary_to_base58(bitcoin_address_bin, :bitcoin, true) # => 111111111143c9JGph3DZ
110
+ ```
111
+
99
112
  ## Contributing
100
113
 
101
114
  Source repository is on [Github](https://github.com/dougal/base58), please file issues and pull requests there.
@@ -114,13 +127,13 @@ rake rdoc
114
127
 
115
128
  ## Credits
116
129
 
117
- * [Joel Nordell](https://github.com/joelnordell) for Bitcoin and Ripple alphabet support. Also binary encoding support.
130
+ * [Joel Nordell](https://github.com/joelnordell) for various Bitcoin/Ripple support features.
118
131
  * [Jim Myhrberg](https://github.com/jimeh) for argument checking and method aliases.
119
132
 
120
133
 
121
134
  ## Copyright and Licence
122
135
 
123
- Copyright (c) 2009-2018, Douglas F Shearer.
136
+ Copyright (c) 2009 - 2018, Douglas F Shearer.
124
137
 
125
138
  Base58 is licensed under the MIT Licence.
126
139
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: base58 0.2.0 ruby lib
5
+ # stub: base58 0.2.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "base58".freeze
9
- s.version = "0.2.0"
9
+ s.version = "0.2.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Douglas F Shearer".freeze]
14
- s.date = "2018-01-05"
14
+ s.date = "2018-01-08"
15
15
  s.description = "Base58 is a Ruby library for converting ints or binaries to and from base58.".freeze
16
16
  s.email = "dougal.s@gmail.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -1,5 +1,5 @@
1
1
  # Base58
2
- # Copyright (c) 2009 - 2017 Douglas F Shearer.
2
+ # Copyright (c) 2009 - 2018 Douglas F Shearer.
3
3
  # http://douglasfshearer.com
4
4
  # Distributed under the MIT license as included with this plugin.
5
5
 
@@ -40,17 +40,30 @@ class Base58
40
40
  end
41
41
 
42
42
  # Converts a ASCII-8BIT (binary) encoded string to a base58 string.
43
- def self.binary_to_base58(binary_val, alphabet = :flickr)
43
+ def self.binary_to_base58(binary_val, alphabet = :flickr, include_leading_zeroes = true)
44
44
  raise ArgumentError, 'Value passed is not a String.' unless binary_val.is_a?(String)
45
45
  raise ArgumentError, 'Value passed is not binary.' unless binary_val.encoding == Encoding::BINARY
46
46
  raise ArgumentError, 'Invalid alphabet selection.' unless ALPHABETS.include?(alphabet)
47
- int_to_base58(binary_val.bytes.inject{|a,b|(a<<8)+b}, alphabet)
47
+ return int_to_base58(0, alphabet) if binary_val.empty?
48
+
49
+ if include_leading_zeroes
50
+ nzeroes = binary_val.bytes.find_index{|b| b != 0} || binary_val.length-1
51
+ prefix = ALPHABETS[alphabet][0] * nzeroes
52
+ else
53
+ prefix = ''
54
+ end
55
+
56
+ prefix + int_to_base58(binary_val.bytes.inject{|a,b|(a<<8)+b}, alphabet)
48
57
  end
49
58
 
50
59
  # Converts a base58 string to an ASCII-8BIT (binary) encoded string.
60
+ # All leading zeroes in the base58 input are preserved and converted to
61
+ # "\x00" in the output.
51
62
  def self.base58_to_binary(base58_val, alphabet = :flickr)
52
63
  raise ArgumentError, 'Invalid alphabet selection.' unless ALPHABETS.include?(alphabet)
53
- [base58_to_int(base58_val, alphabet).to_s(16)].pack('H*')
64
+ nzeroes = base58_val.chars.find_index{|c| c != ALPHABETS[alphabet][0]} || base58_val.length-1
65
+ prefix = nzeroes < 0 ? '' : '00' * nzeroes
66
+ [prefix + base58_to_int(base58_val, alphabet).to_s(16)].pack('H*')
54
67
  end
55
68
 
56
69
  class << self
@@ -551,6 +551,147 @@ EXAMPLES = {
551
551
  }
552
552
  }
553
553
 
554
+ LEADING_ZEROES_EXAMPLES = {
555
+ :bitcoin => [
556
+ {
557
+ :hex => "00000000000000000000123456789ABCDEF0",
558
+ :b58 => "111111111143c9JGph3DZ",
559
+ :b58_no_zeroes => "43c9JGph3DZ"
560
+ },
561
+ {
562
+ :hex => "00000000000000000000",
563
+ :b58 => "1111111111",
564
+ :b58_no_zeroes => "1"
565
+ },
566
+ {
567
+ :hex => "00",
568
+ :b58 => "1",
569
+ :b58_no_zeroes => "1"
570
+ },
571
+ {
572
+ :hex => "",
573
+ :b58 => "1",
574
+ :b58_no_zeroes => "1"
575
+ },
576
+ ],
577
+ :flickr => [
578
+ {
579
+ :hex => "00000000000000000000123456789ABCDEF0",
580
+ :b58 => "111111111143B9igPG3dy",
581
+ :b58_no_zeroes => "43B9igPG3dy"
582
+ },
583
+ {
584
+ :hex => "00000000000000000000",
585
+ :b58 => "1111111111",
586
+ :b58_no_zeroes => "1"
587
+ },
588
+ {
589
+ :hex => "00",
590
+ :b58 => "1",
591
+ :b58_no_zeroes => "1"
592
+ },
593
+ {
594
+ :hex => "",
595
+ :b58 => "1",
596
+ :b58_no_zeroes => "1"
597
+ },
598
+ ],
599
+ :ripple => [
600
+ {
601
+ :hex => "00000000000000000000123456789ABCDEF0",
602
+ :b58 => "rrrrrrrrrrhsc9JGF6sDZ",
603
+ :b58_no_zeroes => "hsc9JGF6sDZ"
604
+ },
605
+ {
606
+ :hex => "00000000000000000000",
607
+ :b58 => "rrrrrrrrrr",
608
+ :b58_no_zeroes => "r"
609
+ },
610
+ {
611
+ :hex => "00",
612
+ :b58 => "r",
613
+ :b58_no_zeroes => "r"
614
+ },
615
+ {
616
+ :hex => "",
617
+ :b58 => "r",
618
+ :b58_no_zeroes => "r"
619
+ }
620
+ ]
621
+ }
622
+
623
+ HEX_TO_BIN = ->hex { [hex].pack('H*') }
624
+ HEX_TO_INT = ->hex { hex.to_i(16) }
625
+
626
+ STRIP_LEADING = ->char { ->str { str.gsub(/^#{char}*/, '') } }
627
+ STRIP_BINARY = STRIP_LEADING["\x00"]
628
+
629
+ LEADING_ZEROES_EXAMPLES.each do |alphabet, examples|
630
+ examples.each do |example|
631
+ define_method("test_binary_to_base58_leading_zeroes_#{alphabet}_#{example[:hex]}") do
632
+ bin = HEX_TO_BIN[example[:hex]]
633
+ bin_no_zeroes = STRIP_BINARY[bin]
634
+
635
+ assert_equal example[:b58], Base58.binary_to_base58(bin, alphabet) # Default behavior is to include leading zeroes
636
+ assert_equal example[:b58], Base58.binary_to_base58(bin, alphabet, true)
637
+ assert_equal example[:b58_no_zeroes], Base58.binary_to_base58(bin, alphabet, false) # Optionally, leading zeroes may be omitted
638
+
639
+ # If there are no zeroes in the input, there are never zeroes in the output
640
+ assert_equal example[:b58_no_zeroes], Base58.binary_to_base58(bin_no_zeroes, alphabet)
641
+ assert_equal example[:b58_no_zeroes], Base58.binary_to_base58(bin_no_zeroes, alphabet, true)
642
+ assert_equal example[:b58_no_zeroes], Base58.binary_to_base58(bin_no_zeroes, alphabet, false)
643
+ end
644
+ end
645
+ end
646
+
647
+ LEADING_ZEROES_EXAMPLES.each do |alphabet, examples|
648
+ examples.each do |example|
649
+ define_method("test_base58_to_binary_leading_zeroes_#{alphabet}_#{example[:hex]}") do
650
+ bin = HEX_TO_BIN[example[:hex]]
651
+ bin_no_zeroes = STRIP_BINARY[bin]
652
+
653
+ # When converting from base58, an empty string will never be produced.
654
+ bin_no_zeroes = "\x00" if bin_no_zeroes.empty?
655
+ bin = "\x00" if bin.empty?
656
+
657
+ assert_equal bin, Base58.base58_to_binary(example[:b58], alphabet)
658
+ assert_equal bin_no_zeroes, Base58.base58_to_binary(example[:b58_no_zeroes], alphabet)
659
+ end
660
+ end
661
+ end
662
+
663
+ LEADING_ZEROES_EXAMPLES.each do |alphabet, examples|
664
+ examples.each do |example|
665
+ define_method("test_int_to_base58_leading_zeroes_#{alphabet}_#{example[:hex]}") do
666
+ assert_equal example[:b58_no_zeroes], Base58.int_to_base58(HEX_TO_INT[example[:hex]], alphabet)
667
+ end
668
+ end
669
+ end
670
+
671
+ LEADING_ZEROES_EXAMPLES.each do |alphabet, examples|
672
+ examples.each do |example|
673
+ define_method("test_base58_to_int_leading_zeroes_#{alphabet}_#{example[:hex]}") do
674
+ assert_equal HEX_TO_INT[example[:hex]], Base58.base58_to_int(example[:b58], alphabet)
675
+ assert_equal HEX_TO_INT[example[:hex]], Base58.base58_to_int(example[:b58_no_zeroes], alphabet)
676
+ end
677
+ end
678
+ end
679
+
680
+ def test_base58_to_binary_empty_input
681
+ assert_equal "\x00", Base58.base58_to_binary("")
682
+ end
683
+
684
+ def test_base58_to_int_leading_zeroes_other_examples
685
+ # All other examples, when prepended with varying amounts of leading zeroes, should work properly.
686
+ EXAMPLES.each do |alphabet, examples|
687
+ examples.each do |base_58, expected|
688
+ (0..50).each do |n|
689
+ assert_equal expected, Base58.base58_to_int( (Base58::ALPHABETS[alphabet][0] * n) + base_58, alphabet )
690
+ end
691
+ end
692
+ end
693
+ end
694
+
554
695
  def test_binary_to_base58_all_alphabets
555
696
  BINARY_STRING_EXAMPLES.each do |alphabet, examples|
556
697
  examples.each do |expected, integer|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: base58
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Douglas F Shearer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-05 00:00:00.000000000 Z
11
+ date: 2018-01-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Base58 is a Ruby library for converting ints or binaries to and from
14
14
  base58.