nm_datafile 0.0.2 → 0.1.0

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
  SHA1:
3
- metadata.gz: b2e0ec29390c2ebe162f08ef1b29cfb539ed905d
4
- data.tar.gz: 433fa346539ce9b8f3bdc3c191c11b747b810ff3
3
+ metadata.gz: 9f642327532de8791b0c770ac2b7913cda8ebc20
4
+ data.tar.gz: 9d4cbcce8067f1dade4d236ef32c28ac95e1170b
5
5
  SHA512:
6
- metadata.gz: 6f81158867206df6bd21ed0bb20f5cbbb79f0f0fded7ca4b19c48a602f801f0ebc491be55bbb27aaefe334be4f0fb5d3ac066416674adbc228fcd6e8fc2dfba0
7
- data.tar.gz: 0f74419eac0eadf844654df09258e3c904a88020892822fcb6f2e3cc59ba3761ceedef8e063b6908c05f9b7ae074287e6fe19d7c787c704784e54cf813c45fe7
6
+ metadata.gz: 11f77b2b9617260f53c8aff8598ad150f825e3b9797ff68b2d1f077e0e9bd0f582a96b8793fb9ac11ca111828008de7b530a563096cc85e27dff85afa316a6c0
7
+ data.tar.gz: 8f6772c1df00df26f5daa60373012d894298eb2eba438071fed08bdd6b066565e25dddb4d850783cfb3be1d4ccaa5e0a4dc915d72bcbb5dac05ea3ae0a98a580
data/README.md CHANGED
@@ -35,8 +35,7 @@ Or install it yourself as:
35
35
 
36
36
  ## Usage
37
37
 
38
- First define a file Schema.
39
- For instance, if you wanted a file type called 'shippable_file' and you wanted it to have many records of 'sales', 'line_items', etc,
38
+ First define a file Schema. For instance, if you wanted a file type called 'shippable_file' and you wanted it to have many records of 'sales', 'line_items', etc,
40
39
  and you wanted your file to have a string of data named 'ready_for_shipment_batch', then you would define it like so.
41
40
 
42
41
  $nm_datafile_schemas = {
@@ -48,11 +47,48 @@ and you wanted your file to have a string of data named 'ready_for_shipment_batc
48
47
  }
49
48
  }
50
49
 
51
- TODO: Specify encryption type on file as well...
50
+ First define a schema for your NmDatafile. For instance, if you wanted a file called 'data_file' and you just wanted a "strings" attribute where you can store an array of encrypted strings, then you could set the below schema.
52
51
 
53
- Then you'd want to create the NMD file:
52
+ NmDatafile::SCHEMA = {
53
+ schemas: {
54
+ :data_file => {
55
+ data_collections: [:strings], # name the data that is input into the NMDatafile as an array
56
+ data_objects: [:file_owners_name]
57
+ }
58
+ }
59
+ }
54
60
 
55
- And finally save it as shown below:
61
+ That's actually the default schema, so you don't need to set it, it's located in lib/nm_datafile/schema.rb, fyi :)
62
+
63
+ Now that you've got a schema set up, you can start using your data and easily serialize data into an encrypted file format.
64
+
65
+ nmd = NmDatafile.new(:data_file)
66
+ nmd.strings #=> []
67
+ nmd.strings << "hi"
68
+ nmd.file_owners_name = "dsj"
69
+ nmd.save_to_string # This is a binary string for programmers, you can write it to a file
70
+ nmd.save_to_file('/tmp/file.zip') # this saves your strings to a file
71
+
72
+ Ok, you've done all that, but your data is visible as that it's a zip file. So to turn sneaky mode on, you'll want to
73
+
74
+ NmDatafile.Load('/tmp/secret_file')
75
+
76
+
77
+
78
+ # Testing Note
79
+
80
+ Some cyphers are hardcoded in the tests... so if you make changes to the crypto algo, your tests will fail until you fix this...
81
+
82
+
83
+ # TODO
84
+
85
+ * Finish algo so it uses front door keys... encryption needs to be encrypted with the front door key
86
+ * Make it so the rails app sets up the schema file the proper way
87
+ * Specify encryption type in file schema? (symmetric vs asymmetric)
88
+ * Allow exporting data as a stenographic cat.jpg file.
89
+ * Better API for adding a new schema, and better default
90
+ * Bring in tests
91
+ * Allow PGP to be used to encrypt the file
56
92
 
57
93
 
58
94
  ## Contributing
data/changelog.md CHANGED
@@ -1,19 +1,17 @@
1
1
  ### TODO:
2
2
 
3
3
  * Fix the way there's an nm_datafile class... :(
4
- * Define the class methods more clearly...
4
+ * Define the methods as static methods to make more clear where everything is
5
5
 
6
+
7
+ ### 0.1.0
8
+
9
+ * Changed the syntax to accept a symmetric_key
10
+ * Fixed bug where fast_decrypt_string_with_pass doesn't implement any kind of password for encryption/ decryption...
11
+ * Fixed bug in the BF module by replacing it with better code
6
12
  * Handle $FrontDoorKey
7
- - When Crypto::clean_decrypt_string is called... it should be called on an instantiation
8
- that has a symmetric_key set
9
- - it should also raise an exception if that instance variable isn't set
10
- - Crypto::clean_decrypt_string is only used from within the gem!
11
- - data_loading.rb
12
- - nm_datafile.rb
13
-
14
- - It's hard to tell what's an instance method and what's a class method
15
- with all the mixin usage...
16
-
13
+
14
+
17
15
 
18
16
  ### 0.0.2
19
17
 
data/lib/nm_datafile.rb CHANGED
@@ -2,35 +2,24 @@ require 'json'
2
2
  require 'yaml'
3
3
  require 'zip'
4
4
 
5
- # require 'factory_girl'
6
- # require 'pry'; binding.pry
7
- # require File.expand_path('../../spec/factories/sales.rb', __FILE__)
8
-
9
5
  require 'nm_datafile/version'
10
6
  require 'nm_datafile/schema'
11
- require 'nm_datafile/b_f'
7
+ require 'nm_datafile/blowfish'
12
8
  require 'nm_datafile/data_loading'
13
9
  require 'nm_datafile/crypto'
14
10
  require 'nm_datafile/nm_datafile'
15
11
 
16
12
 
17
-
18
13
  module NmDatafile
19
- FRONT_DOOR_KEY = "$FrontDoorKey" # Write to NmDatafile::FRONT_DOOR_KEY to set a symetric key
20
- @@symmetric_key = "$FrontDoorKey"
21
-
22
14
  extend DataLoading
23
15
  extend Crypto
16
+ extend FileEncoding
24
17
 
25
- def self.new(file_type, *args)
26
- NmDatafile.new(file_type, *args)
18
+ #config = {file_type: file_type, symmetric_key: symmetric_key}
19
+ def self.new(config, *args)
20
+ NmDatafile.new(config, *args)
27
21
  end
28
22
 
29
- def self.set_symmetric_key(val)
30
-
31
- end
32
-
33
-
34
23
  end
35
24
 
36
25
 
@@ -0,0 +1,22 @@
1
+ # http://philtoland.com/post/807114394/simple-blowfish-encryption-with-ruby#notes
2
+
3
+ require "openssl"
4
+
5
+ module NmDatafile
6
+
7
+ module Blowfish
8
+ def self.cipher(mode, key, data)
9
+ cipher = OpenSSL::Cipher::Cipher.new('bf-cbc').send(mode)
10
+ cipher.key = Digest::SHA256.digest(key)
11
+ cipher.update(data) << cipher.final
12
+ end
13
+
14
+ def self.encrypt(key, data)
15
+ cipher(:encrypt, key, data)
16
+ end
17
+
18
+ def self.decrypt(key, text)
19
+ cipher(:decrypt, key, text)
20
+ end
21
+ end
22
+ end
@@ -22,10 +22,9 @@ module NmDatafile
22
22
 
23
23
  # TODu: rename to decode_string_as_password_protected
24
24
  def decode_string_as_password_protected(password, decryptable_portion)
25
- #require 'b_f'
26
- bf = BF.new(password, true)
25
+ clear_text = Blowfish.decrypt(password, decryptable_portion)
27
26
 
28
- bf.decrypt(decryptable_portion)
27
+ clear_text
29
28
  end
30
29
 
31
30
 
@@ -78,17 +77,17 @@ module NmDatafile
78
77
 
79
78
  # This method needs to be available on the
80
79
  # NmDatafile module
81
- def clean_decrypt_string(string)
82
- # string = Base64.decode64 string
83
- # decode_password_protected_string(@@unsecure_pass, string)
84
- unsecure_pass = ::NmDatafile::FRONT_DOOR_KEY
85
- fast_decrypt_string_with_pass(unsecure_pass, string)
80
+ def clean_decrypt_string(string, symmetric_key)
81
+ fast_decrypt_string_with_pass(symmetric_key, string)
86
82
  end
87
83
 
88
-
84
+ def clean_encrypt_string(string, symmetric_key)
85
+ fast_encrypt_string_with_pass(symmetric_key, string)
86
+ end
89
87
 
90
88
  def fast_encrypt_string_with_pass(pass, string)
91
- encoded_as_base64 = Base64.encode64(string)
89
+ passworded_string = encode_string_as_password_protected(string, pass)
90
+ encoded_as_base64 = Base64.encode64(passworded_string)
92
91
  rearranged = rearrangement(encoded_as_base64)
93
92
  obfs = obfuscated_ending(rearranged)
94
93
  Base64.encode64(obfs)
@@ -98,9 +97,11 @@ module NmDatafile
98
97
  obfs = Base64.decode64(string)
99
98
  rearranged = obfuscated_ending_undo(obfs)
100
99
  encoded_as_base64 = rearrangement_undo(rearranged)
101
- Base64.decode64(encoded_as_base64)
100
+ passworded_string = Base64.decode64(encoded_as_base64)
101
+ clear_text_string = decode_password_protected_string(pass, passworded_string)
102
102
  end
103
103
 
104
+
104
105
  def rearrangement(s)
105
106
  s = the_last_three_chars(s) + the_string_minus_the_last_three_chars(s)
106
107
  end
@@ -4,17 +4,20 @@ module NmDatafile
4
4
 
5
5
  # (m) Load: loads a file into memory as an NmDatafile
6
6
  # TODO: Make lowercase
7
- def Load(file_path)
7
+ def Load(file_path, symmetric_key)
8
8
  zip_data = File.read(file_path)
9
- LoadBinaryData(zip_data)
9
+ load_binary_data(zip_data, symmetric_key)
10
10
  end
11
11
 
12
12
  # TODO: Make lowercase
13
- def LoadBinaryData(binary_data)
14
- hash = extract_entities_from_binary_data(binary_data)
13
+ def load_binary_data(binary_data, symmetric_key)
14
+ hash = extract_entities_from_binary_data(binary_data, symmetric_key)
15
15
 
16
- file_type = determine_file_type(hash[:attributes])
17
- nmd = NmDatafile.new( file_type )
16
+ config = { file_type: determine_file_type(hash[:attributes]),
17
+ symmetric_key: symmetric_key
18
+ }
19
+
20
+ nmd = NmDatafile.new( config )
18
21
 
19
22
  nmd.load_attributes(hash[:attributes]) unless hash[:attributes].nil?
20
23
  nmd.load_encryption(hash[:encryption])
@@ -28,15 +31,14 @@ module NmDatafile
28
31
  end
29
32
 
30
33
 
31
- def determine_password(hash)
34
+ def determine_password(hash, symmetric_key)
32
35
  d = YAML::load hash[:encryption]
33
-
34
- ::NmDatafile.clean_decrypt_string(d["password"])
36
+ ::NmDatafile.clean_decrypt_string(d["password"], symmetric_key)
35
37
  end
36
38
 
37
39
  # This method peers through a zip binary data blob and returns a hash consisting of
38
40
  # { file_name1: file_data1, etc }
39
- def extract_entities_from_binary_data(binary_data)
41
+ def extract_entities_from_binary_data(binary_data, symmetric_key)
40
42
  binary_data_io = StringIO.new(binary_data)
41
43
 
42
44
  hash = {}
@@ -46,7 +48,7 @@ module NmDatafile
46
48
  end
47
49
  end
48
50
 
49
- password = self.determine_password(hash)
51
+ password = self.determine_password(hash, symmetric_key)
50
52
 
51
53
  decrypt_encryptable_data!(password, hash)
52
54
  hash
@@ -20,6 +20,8 @@ module NmDatafile
20
20
 
21
21
  # creates an address_completion file based on the contents of the current shippable_file object
22
22
  def simulate_address_completion_response(n_shipped)
23
+ symmetric_key = @symmetric_key
24
+
23
25
  raise "can't make an address_completion_response unless it's a shippable_file" if @file_type != :shippable_file
24
26
  setup_object_for_schema # TODu: I put this in, there was a bug in the test where it needs to be run... does it not run on init somehow?
25
27
 
@@ -32,10 +34,10 @@ module NmDatafile
32
34
  erroneous_addresses << { "id" => sale["id"] }
33
35
  end
34
36
  end
35
-
37
+
36
38
  simulated_response = [shipped_sales, erroneous_addresses, ready_for_shipment_batch]
37
-
38
- nmd_address_completion = NmDatafile.new(:address_completion_file, *simulated_response)
39
+ config = { file_type: :address_completion_file, symmetric_key: symmetric_key}
40
+ nmd_address_completion = NmDatafile.new(config, *simulated_response)
39
41
  end
40
42
 
41
43
  def generate_upload_params(action = "upload_shippable_file")
@@ -51,21 +51,15 @@ module NmDatafile
51
51
  binary_output = `#{alt}`
52
52
  end
53
53
 
54
+ # TODu: rename to encode_password_protected_string
54
55
  def encode_string_as_password_protected(encryptable_portion, pass = nil)
55
- #require 'b_f'
56
-
57
56
  pish = @password
58
57
  pish = pass unless pass.nil?
59
58
  raise "error, password given was too long, must be 56 or less chars" if pish.length > 56
60
59
 
61
- bf = BF.new(pish, true)
60
+ encrypted = Blowfish.encrypt(pish, encryptable_portion)
62
61
 
63
- encrypted = bf.encrypt(encryptable_portion)
64
- end
65
-
66
-
67
- def decode_password_protected_string(password, decryptable_portion)
68
- ::NmDatafile.decode_password_protected_string(password, decryptable_portion)
62
+ encrypted
69
63
  end
70
64
 
71
65
  def obfuscate_file_format
@@ -77,16 +71,5 @@ module NmDatafile
77
71
  end
78
72
 
79
73
 
80
- def clean_encrypt_string(string)
81
- # Base64.encode64(encode_string_as_password_protected(string, @@unsecure_pass))
82
- ::NmDatafile.fast_encrypt_string_with_pass(::NmDatafile::FRONT_DOOR_KEY, string)
83
- end
84
-
85
- # This redirects to the mixin used by Crypto
86
- # ughhh.....
87
- def clean_decrypt_string(string)
88
- ::NmDatafile.clean_decrypt_string(string)
89
- end
90
-
91
74
  end
92
75
  end
@@ -91,13 +91,15 @@ module NmDatafile
91
91
  # (m)
92
92
  # aNonyMousDatafile
93
93
  class NmDatafile
94
- @@schemas = ::NmDatafile::SCHEMA[:schemas] # TODO: move to initialize
95
94
  @@clear_text_path = "clear_text_protected_nmd" # used for using system calls to decrypt and encrypt using a zip password
96
- attr_reader :file_type, :password
95
+
96
+ attr_reader :file_type, :password, :symmetric_key
97
+ attr_accessor :schemas
97
98
 
98
99
  # include Crypto
99
100
  include Debug
100
101
  include FileEncoding
102
+ include Crypto
101
103
 
102
104
  ###############################
103
105
  # Loading and Dumping Methods #
@@ -105,7 +107,10 @@ module NmDatafile
105
107
 
106
108
  # notice migration to loading.rb
107
109
 
108
- def initialize(file_type, *args)
110
+ def initialize(config, *args)
111
+ file_type = config[:file_type]
112
+ @symmetric_key = config[:symmetric_key]
113
+ @schemas = ::NmDatafile::SCHEMA[:schemas]
109
114
  set_file_type(file_type)
110
115
 
111
116
  load_data(args)
@@ -122,7 +127,7 @@ module NmDatafile
122
127
  def load_encryption(encryption_data)
123
128
  d = YAML::load encryption_data
124
129
  @integrity_hash = d["integrity_hash"] unless d["integrity_hash"].nil?
125
- @password = clean_decrypt_string(d["password"]) unless d["password"].nil?
130
+ @password = ::NmDatafile.clean_decrypt_string(d["password"], @symmetric_key) unless d["password"].nil?
126
131
  end
127
132
 
128
133
  # (m) load_data: loads array of data into memory as an NmDatafile object
@@ -199,7 +204,7 @@ module NmDatafile
199
204
 
200
205
  def build_encryption
201
206
  hash = { integrity_hash: integrity_hash,
202
- password: clean_encrypt_string(@password)
207
+ password: clean_encrypt_string(@password, @symmetric_key)
203
208
  }.to_json
204
209
  end
205
210
 
@@ -216,7 +221,7 @@ module NmDatafile
216
221
  #######################
217
222
 
218
223
  def schema
219
- @@schemas[@file_type]
224
+ @schemas[@file_type]
220
225
  end
221
226
 
222
227
  def data_collection_names
@@ -2,15 +2,15 @@
2
2
  # something more generic
3
3
  module NmDatafile
4
4
  SCHEMA = { schemas:
5
- { :shippable_file => {
6
- data_collections: [:sales, :line_items, :discounts, :addresses, :ubws, :encryption_pairs], # name the data that is input into the NMDatafile as an array
7
- data_objects: [:ready_for_shipment_batch]
8
- },
9
-
10
- :address_completion_file => {
11
- data_collections: [:sales, :erroneous_sales],
12
- data_objects: [:ready_for_shipment_batch]
13
- }
14
- }
15
- }
5
+ { :shippable_file => {
6
+ data_collections: [:sales, :line_items, :discounts, :addresses, :ubws, :encryption_pairs], # name the data that is input into the NMDatafile as an array
7
+ data_objects: [:ready_for_shipment_batch]
8
+ },
9
+
10
+ :address_completion_file => {
11
+ data_collections: [:sales, :erroneous_sales],
12
+ data_objects: [:ready_for_shipment_batch]
13
+ }
14
+ }
15
+ }
16
16
  end
@@ -1,3 +1,3 @@
1
1
  module NmDatafile
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -6,13 +6,36 @@ describe "nm_datafile" do
6
6
  #@sample_data = get_sample_data
7
7
  @sales = [{"address_id"=>1, "created_at"=>"2015-03-08T03:54:51Z", "currency_used"=>"BTC"}]
8
8
  @sample_data = [ @sales ]
9
- @binary_nmd_path = 'spec/data/nmd_binary_string_w_2s_2li_2a_1ubws_1ep.zip'
9
+ # binary_nmd_info:
10
+ # decrypted password should be: "@(OfMLpCe@pV(GGLuEvj(Tup$BaFodP3!6^5%5pTW"
11
+ #
12
+ # if you change the encryption algo, recreate this file with the help of the first test
13
+ @binary_nmd_path = 'spec/data/nmd_binary_string_w_2s_2li_2a_1ubws_1ep.zip'
14
+
15
+ @symmetric_key = "this_is_a_keythis_is_a_keythis_is_a_keythis_is_a_key"
16
+ end
17
+
18
+ it "should be able to create an nmd_file out of complicated data hashes and save it" do
19
+ sales = [{"address_id"=>1, "created_at"=>"2015-03-23T01:55:04Z", "currency_used"=>"BTC", "delivery_acknowledged"=>nil, "id"=>1, "original_id"=>nil, "prepped"=>true, "ready_for_shipment_batch_id"=>1, "receipt_confirmed"=>"2015-03-23T01:55:04Z", "sale_amount"=>"4500000.0", "shipped"=>nil, "shipping_amount"=>0.0, "total_amount"=>"4500000.0", "updated_at"=>"2015-03-23T01:55:04Z", "user_id"=>1, "utilized_bitcoin_wallet_id"=>1}, {"address_id"=>5, "created_at"=>"2015-03-23T01:55:04Z", "currency_used"=>"BTC", "delivery_acknowledged"=>nil, "id"=>2, "original_id"=>nil, "prepped"=>true, "ready_for_shipment_batch_id"=>1, "receipt_confirmed"=>"2015-03-23T01:55:04Z", "sale_amount"=>"4500000.0", "shipped"=>nil, "shipping_amount"=>0.0, "total_amount"=>"4500000.0", "updated_at"=>"2015-03-23T01:55:04Z", "user_id"=>2, "utilized_bitcoin_wallet_id"=>1}]
20
+ line_items = [{"created_at"=>"2015-03-23T01:55:04Z", "currency_used"=>"BTC", "description"=>nil, "discount"=>nil, "discounted_amount"=>nil, "discounted_item_id"=>nil, "id"=>1, "original_id"=>nil, "price"=>"4500000.0", "price_after_product_discounts"=>nil, "price_extend"=>"4500000.0", "product_sku"=>"0001", "qty"=>1, "sale_id"=>1, "shipping_cost"=>"0.0", "shipping_cost_btc"=>0, "shipping_cost_usd"=>"0.0", "updated_at"=>"2015-03-23T01:55:04Z"}, {"created_at"=>"2015-03-23T01:55:04Z", "currency_used"=>"BTC", "description"=>nil, "discount"=>nil, "discounted_amount"=>nil, "discounted_item_id"=>nil, "id"=>2, "original_id"=>nil, "price"=>"4500000.0", "price_after_product_discounts"=>nil, "price_extend"=>"4500000.0", "product_sku"=>"0001", "qty"=>1, "sale_id"=>2, "shipping_cost"=>"0.0", "shipping_cost_btc"=>0, "shipping_cost_usd"=>"0.0", "updated_at"=>"2015-03-23T01:55:04Z"}]
21
+ discounts = []
22
+ addresses = [{"address1"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAkkLLYWOzmHDrknH9NWLjTz7cmMN6Da7Oqz57WFQS\n3vdFb/72BrdpHnzZRmZNIWBH4Vj7sUcKv0X2Q+WL45qQSELEdOawpgGVvS9A\nXrqzAJxbTBKTpyqszqfD/Q8pTMnCIXo0S1zJERBpqLvxQF2rO+sytMn6x9xZ\n2ZFKWtpSfcYxR89itnCK3tCBNHH9hJG+ej/oFsXwJgddVuSnRRSPPW6Ea/W2\n9G4xuOVnDwpfOLGj7wfP6+AlMuJCGTN6Urd18eGyFiYP+WaPvk51yS4jkzOi\nkqRbRLTIvsEiK2KcVyEd6F/NxqTLD7Nw5ADxHyVZzOiNPJKTmwf7diaP8mdm\nyqQzC8c5mfPzWhop3DYJXzL2Y4Mgk7qxR08RKIewTR/SWLtlRnFOwT+itBQN\nN4nD1x19T0Wp\n=dsyQ\n-----END PGP MESSAGE-----\n", "address2"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf6AloPtxXYB+OGv+MnFgQofqs6CEMbKoSf45c+hk6c\nZMpqr9/R/ZK6I7Nbla/FCbKmAtttZ0T6I1GAS/6ivFDJ8J7Y7bhag2tueP86\ntMfyTL6j6VQGOEu7AoMrx58vk76bC2DYG8BAw42y6lHifz8X9IJAzrccyjT4\nHzYmUmoM2sma3qHuN1PZp24qZJqHEOGr8XhpTzaDXuIp00P3+X0NVoLzaZUS\ncgxObRImRzHyRSzSHKRnnbTKHg7SKn43J2lpkJV07bqP8HLNTGYG1YzUigjp\nPydGX0l1sLjo4I3KTmBetjs5s4sJTH3QqqYq/Dfqfch5/MqE92LrNlxzCtgc\ncKQwpTllOo0smnSBLrTnixgEy0mfhUlmVjasEoG9DxD0yinJR+9TeCeskPQk\nKdXI8L/O\n=Mx2r\n-----END PGP MESSAGE-----\n", "apt"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf/QWtqnGOuYOQqhdv9rot0N8altMdgso71Deub2YqH\nyVSrrLhzpvT6mPmNJXHOuS0AtamnNjeMbiJRmkf3m6l56BMYlz904GIbG3Zr\nzzJcr8A+N30afhMO/kmZZfK5mjLfKHiyPA71HN5Kd3J8N9aWYwj9HDm3tCSB\ndsOvcZ5QXkXwzIj+jtOV1201PvwMyShmTgZqCM7c0OwR/sFKBOhx33tcZKWx\nW+k0jbfZJb0RUv95jPuQIeS180O5BRWSUC2tOXaCkgT9u6pC41sRjTZnuH+3\nv/DIhV7uyf46f00sCcwpxPedtrchydh+Daww7sPpdQpRKWtk19a+iIIo8Rvt\n7KQkA0Y5WuvhTQbdfq8deJzUwqUKJtGVGPcps1PMeIMe6ZTLi0ru\n=Gmsg\n-----END PGP MESSAGE-----", "city"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAqPKhl8LbI8Fs+zasPS3a61CWCS8Aus7UgR8Bf3Eu\n4UBPOA7B3U4YQXhMoxMYGl/JN0C6IctjkP6PwyKXvNTgpKG1WKuki8/hKKZg\njPLhiDwZeFggzCTqC0GxublCrQOPZjHNUufShCY5D1g/iTKTO3VCuilUDyBj\nt3ExgO8k/SgdfbzzrKNe3TktJTOFMOenwr0QQg51B3XrBLih5/ssHWVnrs06\nmBlC6jucHY/tuPIAiQj7xJBpncUHJZbqbvkm0xsb8QFFzSoNyCV+3rekpil5\nYlbb9i3Vtr7BIwEowHvqjKaubEy58bxk7F+P5XrLj+yabV9vzUH1xeqFkEwY\n3KQq1wOGUHMqR9hmZZfkT70jIo3/+7Wxd8g+RZnH6Sh0jQ6E8i4wTtVgjoCV\n\n=ZHnk\n-----END PGP MESSAGE-----\n", "code_name"=>"My House 5", "country"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgArZZDnWPNSpRwVLfzAuhcOXN0CpX8X70ZeN7pUkUS\nQomf5LpvQ+31dVgCdOpkcf/NgL5fnr7CaJLQ7ovC3f9tz+oxirfRT/SueGL5\nhDqQIPE23y0UPoLeNBh8krzhz72o9fQAa3fHG50KCgJpizyUHXaOxo8i8+eA\nkzcGTaL12jeTrDSxoy8xGj/xZyS/m1HbcJ7ZdVSChZt72xe/Cj4epgC1SD4b\nvm7Ki90EOcY8NylRBeR8/yFKsY3YSE+kF7snD94N2M2O9or+wgT61iXZMYf0\ntKeK1woU4C+SnBIo+H+Aa6X4s3OGiFH0GyTxfr+C0r4FzSTO1LcioIq5m6GS\nWqQiVhyzg6XScDqB3Je7CGEEjA6oFzOmQmn3Rsa2ZnYNHaqP6g==\n=RvKD\n-----END PGP MESSAGE-----\n", "created_at"=>"2015-03-23T01:55:04Z", "encryption_pair_id"=>1, "erroneous"=>false, "first_name"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf/UTM9RsZfkWBG3PzkHzm6GtCBmjXAwbHeSg00rKIe\nMdikzxnm464wG1sM0WDJeQCVQGzGIAkxfvOPU4rnfhq6x/NJpI7WuC4X1uJw\niyxiZnpT/A2PEYdlWbUZQWeeadEgAMdI+yiPJ/SHbQrmWDwLEhpKtwCqjMYi\nhtJt1W1l+lhAMdGvXh6nIVyQWiqm9+pQrEvewWIAKsxcFk2OGKSfMRRtivWl\nECNCI8z8h0WdIythAVHTJ8CzmEszYuMWRG7LUMhUs3IHNAtCWkoRojISY1/4\nKqSqQlhpMwJmYGebPhGiAarpmjtltZA/Dy7ERFfctoLxjE7BkRK7HXnq13XW\n4qQk0lyBxx/TadYmlCzDu/B6riOUsbCHJQiwQPpv9+D/CPdK9NWI\n=Awa8\n-----END PGP MESSAGE-----\n", "id"=>1, "last_name"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf+O6lcxOYNW9a4E46TUfcYm4dSoUeEMXKjdk9RmWvj\no49h2EOWbjR+LoyAYFah9GF8ydBwkrI47dyeokZDJq9lnHQrZdO3BEPzEfd3\nxZ7bPAH7kVennN4kkon/uh5cnwQdFcIQufkUWPePIOTM37GVEMwiUWSAk6Tv\nsd/hC11UraLgJV/iQ1PKYrQ1k9JFab4qYMNg3vdJCS2i5EmVUldlhxhw2odq\nU0e03FM0zjA6oe7/zoci7tYRsvMbDIr7gnNk75s4xKHmA73879uiEgCUXisd\nEJtAiCoAi357VJvIGM9p/rLAzBiL3Q8K3LWKWVzjvPp5tIIQZMAF50FF/f9u\nA6Qjh6R1leS5aGd6NwEzd6udN4hM+ORUDMUrKNgjGcFhzwFnTrE=\n=bbtQ\n-----END PGP MESSAGE-----\n", "original_id"=>nil, "phone"=>nil, "state"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAwSy1/X1hRxDkEgX0WTe8EWKCyacxW2J4jvv5/kDM\nZBpOLi78KCCVokrp2hmdkTzM0aJQl45/dkImVOYOpXb9ulnCJXbmpyF6398d\nvbGTvjtLXQSaJ41LbCGxu32L1bCQsrBUIORqqL/+C9gdqrMmYItWDXwN2do5\nWfVhJShOJEWULSUrhYOC40BuRLKNrv2ruk48bh7Mdn7DQbaBa0jT4iV6flK7\nmFvZfAULPOM40UBJ9aCF/GQGBR7lPM3SiaUHfi3rWQihjpUEmHE1l/ui7FWw\n+FiaKvKWhvECAIo5iV9V/sUPGj3Zw5JEDFX9J4GS6zry2G9/sU1Ka7nOQx3F\nOqQnazqWUIMO9WCMZRV/6gnw7rbOr897ikGXvOdoMY4scVb8dz8bbLT9\n=s04T\n-----END PGP MESSAGE-----\n", "updated_at"=>"2015-03-23T01:55:04Z", "user_id"=>1, "zip"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAqyLtfr8yy9aRSNCKy9UTNVhVFFs1ABozP2QUUKVJ\nfA/oUeAntTmeFz1Ga7HC1g8iyefE1G/Y2PEaHCSj1JFqczOJS13XgRYO45AK\nd9dTLLjl+qElVx78M06mIoXUaeSuaex0X/3qNXauCIeGJpaBf9xMLMlYbxH8\nzW3Q1j15VnQz6MFuwoYNXfABc2ekLve076UvUCxbn0G598VmCHHCD28u+Oec\nsuuxebOcjQWbFNsLoGTpKS+OecilkQ98H1cPkLD7qZHluGWP+0WCOCkg1Ttq\nvW+ibdmGW30fq/1EKprJchayANgGdMd/ynbduG0Nn0pGYUk+y5WBucMDINGS\nZKQlHHtkqVBbH14dmx81aGg2gblp6PVaa/fmFw/2FP385ARJ1mRT3w==\n=PlFx\n-----END PGP MESSAGE-----\n"}, {"address1"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAkkLLYWOzmHDrknH9NWLjTz7cmMN6Da7Oqz57WFQS\n3vdFb/72BrdpHnzZRmZNIWBH4Vj7sUcKv0X2Q+WL45qQSELEdOawpgGVvS9A\nXrqzAJxbTBKTpyqszqfD/Q8pTMnCIXo0S1zJERBpqLvxQF2rO+sytMn6x9xZ\n2ZFKWtpSfcYxR89itnCK3tCBNHH9hJG+ej/oFsXwJgddVuSnRRSPPW6Ea/W2\n9G4xuOVnDwpfOLGj7wfP6+AlMuJCGTN6Urd18eGyFiYP+WaPvk51yS4jkzOi\nkqRbRLTIvsEiK2KcVyEd6F/NxqTLD7Nw5ADxHyVZzOiNPJKTmwf7diaP8mdm\nyqQzC8c5mfPzWhop3DYJXzL2Y4Mgk7qxR08RKIewTR/SWLtlRnFOwT+itBQN\nN4nD1x19T0Wp\n=dsyQ\n-----END PGP MESSAGE-----\n", "address2"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf6AloPtxXYB+OGv+MnFgQofqs6CEMbKoSf45c+hk6c\nZMpqr9/R/ZK6I7Nbla/FCbKmAtttZ0T6I1GAS/6ivFDJ8J7Y7bhag2tueP86\ntMfyTL6j6VQGOEu7AoMrx58vk76bC2DYG8BAw42y6lHifz8X9IJAzrccyjT4\nHzYmUmoM2sma3qHuN1PZp24qZJqHEOGr8XhpTzaDXuIp00P3+X0NVoLzaZUS\ncgxObRImRzHyRSzSHKRnnbTKHg7SKn43J2lpkJV07bqP8HLNTGYG1YzUigjp\nPydGX0l1sLjo4I3KTmBetjs5s4sJTH3QqqYq/Dfqfch5/MqE92LrNlxzCtgc\ncKQwpTllOo0smnSBLrTnixgEy0mfhUlmVjasEoG9DxD0yinJR+9TeCeskPQk\nKdXI8L/O\n=Mx2r\n-----END PGP MESSAGE-----\n", "apt"=>"", "city"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAqPKhl8LbI8Fs+zasPS3a61CWCS8Aus7UgR8Bf3Eu\n4UBPOA7B3U4YQXhMoxMYGl/JN0C6IctjkP6PwyKXvNTgpKG1WKuki8/hKKZg\njPLhiDwZeFggzCTqC0GxublCrQOPZjHNUufShCY5D1g/iTKTO3VCuilUDyBj\nt3ExgO8k/SgdfbzzrKNe3TktJTOFMOenwr0QQg51B3XrBLih5/ssHWVnrs06\nmBlC6jucHY/tuPIAiQj7xJBpncUHJZbqbvkm0xsb8QFFzSoNyCV+3rekpil5\nYlbb9i3Vtr7BIwEowHvqjKaubEy58bxk7F+P5XrLj+yabV9vzUH1xeqFkEwY\n3KQq1wOGUHMqR9hmZZfkT70jIo3/+7Wxd8g+RZnH6Sh0jQ6E8i4wTtVgjoCV\n\n=ZHnk\n-----END PGP MESSAGE-----\n", "code_name"=>"My House 9", "country"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgArZZDnWPNSpRwVLfzAuhcOXN0CpX8X70ZeN7pUkUS\nQomf5LpvQ+31dVgCdOpkcf/NgL5fnr7CaJLQ7ovC3f9tz+oxirfRT/SueGL5\nhDqQIPE23y0UPoLeNBh8krzhz72o9fQAa3fHG50KCgJpizyUHXaOxo8i8+eA\nkzcGTaL12jeTrDSxoy8xGj/xZyS/m1HbcJ7ZdVSChZt72xe/Cj4epgC1SD4b\nvm7Ki90EOcY8NylRBeR8/yFKsY3YSE+kF7snD94N2M2O9or+wgT61iXZMYf0\ntKeK1woU4C+SnBIo+H+Aa6X4s3OGiFH0GyTxfr+C0r4FzSTO1LcioIq5m6GS\nWqQiVhyzg6XScDqB3Je7CGEEjA6oFzOmQmn3Rsa2ZnYNHaqP6g==\n=RvKD\n-----END PGP MESSAGE-----\n", "created_at"=>"2015-03-23T01:55:04Z", "encryption_pair_id"=>1, "erroneous"=>false, "first_name"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf/UTM9RsZfkWBG3PzkHzm6GtCBmjXAwbHeSg00rKIe\nMdikzxnm464wG1sM0WDJeQCVQGzGIAkxfvOPU4rnfhq6x/NJpI7WuC4X1uJw\niyxiZnpT/A2PEYdlWbUZQWeeadEgAMdI+yiPJ/SHbQrmWDwLEhpKtwCqjMYi\nhtJt1W1l+lhAMdGvXh6nIVyQWiqm9+pQrEvewWIAKsxcFk2OGKSfMRRtivWl\nECNCI8z8h0WdIythAVHTJ8CzmEszYuMWRG7LUMhUs3IHNAtCWkoRojISY1/4\nKqSqQlhpMwJmYGebPhGiAarpmjtltZA/Dy7ERFfctoLxjE7BkRK7HXnq13XW\n4qQk0lyBxx/TadYmlCzDu/B6riOUsbCHJQiwQPpv9+D/CPdK9NWI\n=Awa8\n-----END PGP MESSAGE-----\n", "id"=>5, "last_name"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQf+O6lcxOYNW9a4E46TUfcYm4dSoUeEMXKjdk9RmWvj\no49h2EOWbjR+LoyAYFah9GF8ydBwkrI47dyeokZDJq9lnHQrZdO3BEPzEfd3\nxZ7bPAH7kVennN4kkon/uh5cnwQdFcIQufkUWPePIOTM37GVEMwiUWSAk6Tv\nsd/hC11UraLgJV/iQ1PKYrQ1k9JFab4qYMNg3vdJCS2i5EmVUldlhxhw2odq\nU0e03FM0zjA6oe7/zoci7tYRsvMbDIr7gnNk75s4xKHmA73879uiEgCUXisd\nEJtAiCoAi357VJvIGM9p/rLAzBiL3Q8K3LWKWVzjvPp5tIIQZMAF50FF/f9u\nA6Qjh6R1leS5aGd6NwEzd6udN4hM+ORUDMUrKNgjGcFhzwFnTrE=\n=bbtQ\n-----END PGP MESSAGE-----\n", "original_id"=>nil, "phone"=>nil, "state"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAwSy1/X1hRxDkEgX0WTe8EWKCyacxW2J4jvv5/kDM\nZBpOLi78KCCVokrp2hmdkTzM0aJQl45/dkImVOYOpXb9ulnCJXbmpyF6398d\nvbGTvjtLXQSaJ41LbCGxu32L1bCQsrBUIORqqL/+C9gdqrMmYItWDXwN2do5\nWfVhJShOJEWULSUrhYOC40BuRLKNrv2ruk48bh7Mdn7DQbaBa0jT4iV6flK7\nmFvZfAULPOM40UBJ9aCF/GQGBR7lPM3SiaUHfi3rWQihjpUEmHE1l/ui7FWw\n+FiaKvKWhvECAIo5iV9V/sUPGj3Zw5JEDFX9J4GS6zry2G9/sU1Ka7nOQx3F\nOqQnazqWUIMO9WCMZRV/6gnw7rbOr897ikGXvOdoMY4scVb8dz8bbLT9\n=s04T\n-----END PGP MESSAGE-----\n", "updated_at"=>"2015-03-23T01:55:04Z", "user_id"=>2, "zip"=>"-----BEGIN PGP MESSAGE-----\nVersion: haneWIN JavascriptPG v2.0\n\nhQEMAxi+vIcfDgArAQgAqyLtfr8yy9aRSNCKy9UTNVhVFFs1ABozP2QUUKVJ\nfA/oUeAntTmeFz1Ga7HC1g8iyefE1G/Y2PEaHCSj1JFqczOJS13XgRYO45AK\nd9dTLLjl+qElVx78M06mIoXUaeSuaex0X/3qNXauCIeGJpaBf9xMLMlYbxH8\nzW3Q1j15VnQz6MFuwoYNXfABc2ekLve076UvUCxbn0G598VmCHHCD28u+Oec\nsuuxebOcjQWbFNsLoGTpKS+OecilkQ98H1cPkLD7qZHluGWP+0WCOCkg1Ttq\nvW+ibdmGW30fq/1EKprJchayANgGdMd/ynbduG0Nn0pGYUk+y5WBucMDINGS\nZKQlHHtkqVBbH14dmx81aGg2gblp6PVaa/fmFw/2FP385ARJ1mRT3w==\n=PlFx\n-----END PGP MESSAGE-----\n"}]
23
+ ubws = [{"created_at"=>"2015-03-23T01:55:04Z", "id"=>1, "original_id"=>nil, "updated_at"=>"2015-03-23T01:55:04Z", "wallet_address"=>"1FWNSL4HZy7pW2zRHanR2t72nvw7VdLVuB"}]
24
+ encryption_pairs = [{"created_at"=>"2015-03-23T01:55:04Z", "id"=>1, "original_id"=>nil, "private_key"=>nil, "public_key"=>"-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1.4.12 (GNU/Linux)\n\nmQENBFLm15sBCADGEjoJw/ATyPYC+3er/XiZsCCht6t1Kr8p6fXVI9h7cyvoTulM\n31iug8kFvIr/dggNtEVYjnzuk6ervf2mit5uw3wgs8BBDGOj7BLg6kfuEUjsRaRO\nlCNKKneuscCBvyDbilsnc9jOdc7Nz4wpa8nwLh9iM6GqcM90pClaGYsDAYSFL7Kz\nHiTkBeDeo6pQS2p7G7p+Fg498OrpvythBtwhNiVL01X8f2zaGhlkTaDThJm5qofG\nlal552FitRtJuwu6Tim2Fef2jqJoEb0Hxc4o59/kKm+hqYlW0p5qleKm/hNWDSp1\nFA4VlUP7IPqPa5mzrIIrpRhDRZaIkdGAqWchABEBAAG0EWFiY2RlIChhKSA8YUBi\nLmM+iQE4BBMBAgAiBQJS5tebAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRAdhYud6iaPu+yoB/4lyX2WTLFQWKCYavU4OzSiRSwSg33LAa/hj9as4jDUErg0\nIPl2dm3QMpf57jny1stqEDAVBQ3eyff5LqmJnhf6YyfroyfCMuTbY4woNyaY2IC0\nXJlBdMlUAOoWcHZCfl4ud97vW+XfRky/uZsmjUBh5DymL2f0fVFxwIeXl/k0hOti\n0FY6l7EGl0I9MQp5dPdqJonsAv1KnjdclsqmLDu7cFWHNF+BHCTb3xkDs0kqShvs\nA8o8HrD/9kUxdRSVdO+VQrZaimI6XdNWHzI4pEYQHQtnZ0IA1aOyzcqWpyTSlyy8\n1QzyNAvXQ4gzrpqRwdrdqUjuEwUTJoLKRSyYQ8yCuQENBFLm15sBCADI6MESgCQH\nf2JIjsHk2owRMpEhjyr25pEktjTpf8zLy5LYwHgwZXwpc6zDnwMBV6PcaPI6ZTRF\nGfwY4GsL9DBLefbiZuvYghYi++cevG11V87XhoRx8u8FGPukjRyKs4gCTrHW2g9q\n8IES46GZalCkC4x8WDM68yWutO/22ie7eALjMU+Ju9lbrwUI4/uy6a9dQJLMPdXN\ncYnWQO/q/CpkcngnoKEjreJ9FszrdSFtd+cBoItknsX668Euf4IIPwCW/KUfGZMm\n/Js/3pZRQpqq+OryuKcB03YsMd5E/JE+DySUo19rPeA2xwXLlW5goA9JL0YCvqW/\ntmEwvwDoVlW5ABEBAAGJAR8EGAECAAkFAlLm15sCGwwACgkQHYWLneomj7tfowgA\ngKRy023Oa6rYKwEZlQRWc7gL27Z8V9vCFgBaMM4cNFqrKqY97VezZ6ldjYqd6AGJ\nGWbrG8SqVZ4ZyoksyWnweMYKqoRGIcX7LEuL97mc6W7bB5MRGL9zQRIxu0/KHVik\nVZ8PL3f4j4XdPuF0gRLPBIDOOZVGqf86NpnKLx1XEIaS/z3OqxyWkRR47oOquqpd\nNd4Gn1hDZlTgiSsaSf6aFdS6O2eDLaseZ2l0WgrWoUMjD5bzmKgpmaJAJ+CcfuvB\nP1O44KOH9l+pRzKCbr6nlfd8rbQ4kehjIaGchdehvLFv9WQWMH9uDkKgIu3BGGkp\nJ1TdTyeCX++qX0MtJ79GDw==\n=ToNu\n-----END PGP PUBLIC KEY BLOCK-----\n", "test_value"=>nil, "tested"=>nil, "updated_at"=>"2015-03-23T01:55:04Z"}]
25
+ rfsb = {"acf_integrity_hash"=>nil, "batch_stamp"=>"2015-03-23_01.55.042", "created_at"=>"2015-03-23T01:55:04Z", "id"=>1, "original_id"=>nil, "sale_id"=>nil, "sf_integrity_hash"=>"c39c2be15b918842604261d8daf9ef1535842a7d558d0b6f2114a9404dd453d8", "updated_at"=>"2015-03-23T01:55:04Z"}
26
+
27
+ config = {file_type: :shippable_file, symmetric_key: @symmetric_key}
28
+ nm_data = NmDatafile.new(config, sales, line_items, discounts, addresses, ubws, encryption_pairs, rfsb)
29
+ nm_data.sales.count.should eq 2
30
+
31
+ # uncomment to update file
32
+ #nm_data.save_to_file(@binary_nmd_path)
10
33
  end
11
34
 
12
35
  it "should be able to load data from a binary string" do
13
36
  nmd_binary_string = File.read(@binary_nmd_path)
14
37
 
15
- nmd_file = NmDatafile::LoadBinaryData nmd_binary_string
38
+ nmd_file = NmDatafile::load_binary_data nmd_binary_string, @symmetric_key
16
39
 
17
40
  sales = nmd_file.sales
18
41
  line_items = nmd_file.line_items
@@ -22,7 +45,8 @@ describe "nm_datafile" do
22
45
  encryption_pairs = nmd_file.encryption_pairs
23
46
  rfsb = nmd_file.ready_for_shipment_batch
24
47
 
25
- nm_data = NmDatafile.new(:shippable_file, sales, line_items, discounts, addresses, ubws, encryption_pairs, rfsb)
48
+ config = {file_type: :shippable_file, symmetric_key: @symmetric_key}
49
+ nm_data = NmDatafile.new(config, sales, line_items, discounts, addresses, ubws, encryption_pairs, rfsb)
26
50
 
27
51
  nm_data.sales.count.should eq 2
28
52
  nm_data.ready_for_shipment_batch["batch_stamp"].should eq rfsb["batch_stamp"]
@@ -30,26 +54,60 @@ describe "nm_datafile" do
30
54
 
31
55
  it "should be able to load data from a path to a zip" do
32
56
 
33
- nmd_string_loaded = NmDatafile::LoadBinaryData File.read(@binary_nmd_path)
57
+ nmd_string_loaded = NmDatafile::load_binary_data File.read(@binary_nmd_path), @symmetric_key
34
58
 
35
- nmd_path_loaded = NmDatafile::Load @binary_nmd_path
59
+ nmd_path_loaded = NmDatafile::Load @binary_nmd_path, @symmetric_key
36
60
 
37
61
  nmd_string_loaded.sales.should eq nmd_path_loaded.sales
38
62
  end
39
63
 
40
64
  it "should be able to save data as a zip string" do
41
- nmd_shippable = NmDatafile.new(:shippable_file, *@sample_data)
65
+ config = {file_type: :shippable_file, symmetric_key: @symmetric_key}
66
+ nmd_shippable = NmDatafile.new(config, *@sample_data)
42
67
 
43
- nmd = NmDatafile::LoadBinaryData nmd_shippable.save_to_string
68
+ nmd = NmDatafile::load_binary_data nmd_shippable.save_to_string, @symmetric_key
44
69
 
45
70
  nmd.sales.should eq @sample_data.first
46
71
  end
47
72
 
48
73
  it "should be able to load in the attributes" do
49
- nmd = NmDatafile::Load @binary_nmd_path
74
+ nmd = NmDatafile::Load @binary_nmd_path, @symmetric_key
50
75
 
51
76
  nmd.file_type.should eq :shippable_file
52
77
  end
78
+
79
+ it "fast_encrypt_string_with_pass and fast_decrypt_string_with_pass reverse" do
80
+ original_string = "hello"
81
+
82
+ pass = @symmetric_key
83
+
84
+ encrypted_string = NmDatafile::fast_encrypt_string_with_pass(pass, original_string)
85
+
86
+ clear_text = NmDatafile::fast_decrypt_string_with_pass(pass, encrypted_string)
87
+
88
+ clear_text.should eq original_string
89
+ end
90
+
91
+ it "should test simulate_address_completion_response(n_shipped)" do
92
+ nmd_file = NmDatafile::Load @binary_nmd_path, @symmetric_key
93
+
94
+ x = nmd_file.simulate_address_completion_response(5)
95
+
96
+ x.sales.count.should eq 2
97
+ end
98
+
99
+ it "should test generate_upload_params" do
100
+ nmd_file = NmDatafile::Load @binary_nmd_path, @symmetric_key
101
+ end
102
+
103
+ it "should fail when the wrong symmetric key is used" do
104
+ encrypted = ::NmDatafile.clean_encrypt_string("encrypt this string please", "this_is_a_keythi")
105
+
106
+ expect {
107
+ clear_text = ::NmDatafile.clean_decrypt_string(encrypted, "this_is_a_keythasdf")
108
+ }.to raise_error
109
+ end
110
+
53
111
 
54
112
 
55
113
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nm_datafile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dsj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-23 00:00:00.000000000 Z
11
+ date: 2015-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -97,7 +97,7 @@ files:
97
97
  - Rakefile
98
98
  - changelog.md
99
99
  - lib/nm_datafile.rb
100
- - lib/nm_datafile/b_f.rb
100
+ - lib/nm_datafile/blowfish.rb
101
101
  - lib/nm_datafile/crypto.rb
102
102
  - lib/nm_datafile/data_loading.rb
103
103
  - lib/nm_datafile/debug.rb
@@ -1,33 +0,0 @@
1
- # https://gist.github.com/nono/2995118
2
-
3
- require "openssl"
4
-
5
- module NmDatafile
6
-
7
- class BF < Struct.new(:key, :pad_with_spaces)
8
- def encrypt(str)
9
- cipher = OpenSSL::Cipher.new('bf-ecb').encrypt
10
- if pad_with_spaces
11
- str += " " until str.bytesize % 8 == 0
12
- cipher.padding = 0
13
- end
14
- cipher.key = key
15
- binary_data = cipher.update(str) << cipher.final
16
- hex_encoded = binary_data.unpack('H*').first
17
- end
18
-
19
- def decrypt(hex_encoded)
20
- cipher = OpenSSL::Cipher.new('bf-ecb').decrypt
21
- cipher.padding = 0 if pad_with_spaces
22
- cipher.key = key
23
- binary_data = [hex_encoded].pack('H*')
24
- str = cipher.update(binary_data) << cipher.final
25
- str.force_encoding(Encoding::UTF_8)
26
- str
27
- end
28
- end
29
-
30
- end
31
-
32
-
33
-