base58 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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.