argon2 0.0.1 → 0.0.2

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.travis.yml +2 -0
  4. data/README.md +25 -9
  5. data/argon2.gemspec +10 -2
  6. data/bin/console +1 -1
  7. data/bin/setup +3 -0
  8. data/ext/argon2_wrap/Makefile +72 -0
  9. data/ext/argon2_wrap/argon_wrap.c +65 -0
  10. data/ext/argon2_wrap/extconf.rb +1 -0
  11. data/ext/argon2_wrap/test.c +67 -0
  12. data/ext/phc-winner-argon2/.gitignore +7 -0
  13. data/ext/phc-winner-argon2/LICENSE +31 -0
  14. data/ext/phc-winner-argon2/Makefile +102 -0
  15. data/ext/phc-winner-argon2/README.md +193 -0
  16. data/ext/phc-winner-argon2/argon2-specs.pdf +0 -0
  17. data/ext/phc-winner-argon2/kats/argon2d +12302 -0
  18. data/ext/phc-winner-argon2/kats/argon2d.shasum +1 -0
  19. data/ext/phc-winner-argon2/kats/argon2i +12302 -0
  20. data/ext/phc-winner-argon2/kats/argon2i.shasum +1 -0
  21. data/ext/phc-winner-argon2/kats/check-sums.sh +13 -0
  22. data/ext/phc-winner-argon2/kats/test.sh +47 -0
  23. data/ext/phc-winner-argon2/src/argon2.c +360 -0
  24. data/ext/phc-winner-argon2/src/argon2.h +298 -0
  25. data/ext/phc-winner-argon2/src/bench.c +111 -0
  26. data/ext/phc-winner-argon2/src/blake2/blake2-impl.h +143 -0
  27. data/ext/phc-winner-argon2/src/blake2/blake2.h +74 -0
  28. data/ext/phc-winner-argon2/src/blake2/blake2b.c +372 -0
  29. data/ext/phc-winner-argon2/src/blake2/blamka-round-opt.h +162 -0
  30. data/ext/phc-winner-argon2/src/blake2/blamka-round-ref.h +39 -0
  31. data/ext/phc-winner-argon2/src/core.c +662 -0
  32. data/ext/phc-winner-argon2/src/core.h +226 -0
  33. data/ext/phc-winner-argon2/src/genkat.c +194 -0
  34. data/ext/phc-winner-argon2/src/genkat.h +45 -0
  35. data/ext/phc-winner-argon2/src/opt.c +173 -0
  36. data/ext/phc-winner-argon2/src/opt.h +49 -0
  37. data/ext/phc-winner-argon2/src/ref.c +175 -0
  38. data/ext/phc-winner-argon2/src/ref.h +49 -0
  39. data/ext/phc-winner-argon2/src/run.c +223 -0
  40. data/ext/phc-winner-argon2/src/thread.c +36 -0
  41. data/ext/phc-winner-argon2/src/thread.h +46 -0
  42. data/lib/argon2.rb +15 -32
  43. data/lib/argon2/constants.rb +6 -0
  44. data/lib/argon2/engine.rb +10 -0
  45. data/lib/argon2/errors.rb +36 -0
  46. data/lib/argon2/ffi_engine.rb +47 -0
  47. data/lib/argon2/version.rb +1 -1
  48. metadata +75 -11
@@ -0,0 +1,36 @@
1
+ #include "thread.h"
2
+ #if defined(_WIN32)
3
+ #include <Windows.h>
4
+ #endif
5
+
6
+ int argon2_thread_create(argon2_thread_handle_t *handle,
7
+ argon2_thread_func_t func, void *args) {
8
+ if (NULL == handle || func == NULL) {
9
+ return -1;
10
+ }
11
+ #if defined(_WIN32)
12
+ *handle = _beginthreadex(NULL, 0, func, args, 0, NULL);
13
+ return *handle != 0 ? 0 : -1;
14
+ #else
15
+ return pthread_create(handle, NULL, func, args);
16
+ #endif
17
+ }
18
+
19
+ int argon2_thread_join(argon2_thread_handle_t handle) {
20
+ #if defined(_WIN32)
21
+ if (WaitForSingleObject((HANDLE)handle, INFINITE) == WAIT_OBJECT_0) {
22
+ return CloseHandle((HANDLE)handle) != 0 ? 0 : -1;
23
+ }
24
+ return -1;
25
+ #else
26
+ return pthread_join(handle, NULL);
27
+ #endif
28
+ }
29
+
30
+ void argon2_thread_exit(void) {
31
+ #if defined(_WIN32)
32
+ _endthreadex(0);
33
+ #else
34
+ pthread_exit(NULL);
35
+ #endif
36
+ }
@@ -0,0 +1,46 @@
1
+ #ifndef ARGON2_THREAD_H
2
+ #define ARGON2_THREAD_H
3
+ /*
4
+ Here we implement an abstraction layer for the simpĺe requirements
5
+ of the Argon2 code. We only require 3 primitives---thread creation,
6
+ joining, and termination---so full emulation of the pthreads API
7
+ is unwarranted. Currently we wrap pthreads and Win32 threads.
8
+
9
+ The API defines 2 types: the function pointer type,
10
+ argon2_thread_func_t,
11
+ and the type of the thread handle---argon2_thread_handle_t.
12
+ */
13
+ #if defined(_WIN32)
14
+ #include <process.h>
15
+ typedef unsigned(__stdcall *argon2_thread_func_t)(void *);
16
+ typedef uintptr_t argon2_thread_handle_t;
17
+ #else
18
+ #include <pthread.h>
19
+ typedef void *(*argon2_thread_func_t)(void *);
20
+ typedef pthread_t argon2_thread_handle_t;
21
+ #endif
22
+
23
+ /* Creates a thread
24
+ * @param handle pointer to a thread handle, which is the output of this
25
+ * function. Must not be NULL.
26
+ * @param func A function pointer for the thread's entry point. Must not be
27
+ * NULL.
28
+ * @param args Pointer that is passed as an argument to @func. May be NULL.
29
+ * @return 0 if @handle and @func are valid pointers and a thread is successfuly
30
+ * created.
31
+ */
32
+ int argon2_thread_create(argon2_thread_handle_t *handle,
33
+ argon2_thread_func_t func, void *args);
34
+
35
+ /* Waits for a thread to terminate
36
+ * @param handle Handle to a thread created with argon2_thread_create.
37
+ * @return 0 if @handle is a valid handle, and joining completed successfully.
38
+ */
39
+ int argon2_thread_join(argon2_thread_handle_t handle);
40
+
41
+ /* Terminate the current thread. Must be run inside a thread created by
42
+ * argon2_thread_create.
43
+ */
44
+ void argon2_thread_exit(void);
45
+
46
+ #endif
@@ -1,38 +1,21 @@
1
- require "argon2/version"
2
- require 'ffi'
1
+ require 'argon2/constants'
2
+ require 'argon2/ffi_engine'
3
+ require 'argon2/version'
4
+ require 'argon2/errors'
5
+ require 'argon2/engine.rb'
3
6
 
4
7
  module Argon2
5
- module Ext
6
- extend FFI::Library
7
- ffi_lib './ext/phc-winner-argon2/libargon2.so'
8
- #/**
9
- # * Function to hash the inputs in the memory-hard fashion (uses Argon2i)
10
- # * @param out Pointer to the memory where the hash digest will be written
11
- # * @param outlen Digest length in bytes
12
- # * @param in Pointer to the input (password)
13
- # * @param inlen Input length in bytes
14
- # * @param salt Pointer to the salt
15
- # * @param saltlen Salt length in bytes
16
- # * @pre @a out must have at least @a outlen bytes allocated
17
- # * @pre @a in must be at least @inlen bytes long
18
- # * @pre @a saltlen must be at least @saltlen bytes long
19
- # * @return Zero if successful, 1 otherwise.
20
- # */
21
- #int hash_argon2i(void *out, size_t outlen, const void *in, size_t inlen,
22
- # const void *salt, size_t saltlen, unsigned int t_cost,
23
- # unsigned int m_cost);
24
-
25
- attach_function :hash_argon2i, [:pointer, :size_t, :pointer, :size_t,
26
- :pointer, :size_t, :uint, :uint ], :int, :blocking => true
27
- end
8
+ class Password
9
+ def initialize(options = {})
10
+ #TODO: Verify inputs
11
+ @t_cost = options[:t_cost] || 2
12
+ @m_cost = options[:m_cost] || 16
13
+ @salt = options[:salt_do_not_supply] || Engine.saltgen
14
+ end
28
15
 
29
- def Argon2.hash_argon2i(password, salt)
30
- result = ''
31
- FFI::MemoryPointer.new(:char, 32) do |buffer|
32
- ret = Ext.hash_argon2i(buffer, 32, password, password.length, salt, salt.length, 2, (1<<16))
33
- fail "Hash failed" unless ret == 0
34
- result = buffer.read_string(32)
16
+ def hash(pass)
17
+ Argon2::Engine.hash_argon2i_encode(
18
+ pass, @salt, @t_cost, @m_cost)
35
19
  end
36
- result.unpack('H*').join
37
20
  end
38
21
  end
@@ -0,0 +1,6 @@
1
+ module Argon2
2
+ module Constants
3
+ SALT_LEN = 16
4
+ OUT_LEN = 32 #Binary, unencoded output
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ require 'securerandom'
2
+
3
+ module Argon2
4
+ class Engine
5
+ def self.saltgen
6
+ SecureRandom.random_bytes(Argon2::Constants::SALT_LEN)
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,36 @@
1
+ module Argon2
2
+ class ArgonHashFail < StandardError; end
3
+ ERRORS = [
4
+ 'ARGON2_OK',
5
+ 'ARGON2_OUTPUT_PTR_NULL',
6
+ 'ARGON2_OUTPUT_TOO_SHORT',
7
+ 'ARGON2_OUTPUT_TOO_LONG',
8
+ 'ARGON2_PWD_TOO_SHORT',
9
+ 'ARGON2_PWD_TOO_LONG',
10
+ 'ARGON2_SALT_TOO_SHORT',
11
+ 'ARGON2_SALT_TOO_LONG',
12
+ 'ARGON2_AD_TOO_SHORT',
13
+ 'ARGON2_AD_TOO_LONG',
14
+ 'ARGON2_SECRET_TOO_SHORT',
15
+ 'ARGON2_SECRET_TOO_LONG',
16
+ 'ARGON2_TIME_TOO_SMALL',
17
+ 'ARGON2_TIME_TOO_LARGE',
18
+ 'ARGON2_MEMORY_TOO_LITTLE',
19
+ 'ARGON2_MEMORY_TOO_MUCH',
20
+ 'ARGON2_LANES_TOO_FEW',
21
+ 'ARGON2_LANES_TOO_MANY',
22
+ 'ARGON2_PWD_PTR_MISMATCH',
23
+ 'ARGON2_SALT_PTR_MISMATCH',
24
+ 'ARGON2_SECRET_PTR_MISMATCH',
25
+ 'ARGON2_AD_PTR_MISMATCH',
26
+ 'ARGON2_MEMORY_ALLOCATION_ERROR',
27
+ 'ARGON2_FREE_MEMORY_CBK_NULL',
28
+ 'ARGON2_ALLOCATE_MEMORY_CBK_NULL',
29
+ 'ARGON2_INCORRECT_PARAMETER',
30
+ 'ARGON2_INCORRECT_TYPE',
31
+ 'ARGON2_OUT_PTR_MISMATCH',
32
+ 'ARGON2_THREADS_TOO_FEW',
33
+ 'ARGON2_THREADS_TOO_MANY',
34
+ 'ARGON2_MISSING_ARGS'
35
+ ]
36
+ end
@@ -0,0 +1,47 @@
1
+ require 'ffi'
2
+ require 'ffi-compiler/loader'
3
+
4
+ module Argon2
5
+ module Ext
6
+ extend FFI::Library
7
+ ffi_lib FFI::Compiler::Loader.find('argon2_wrap')
8
+ #int hash_argon2i(void *out, size_t outlen, const void *in, size_t inlen,
9
+ # const void *salt, size_t saltlen, unsigned int t_cost,
10
+ # unsigned int m_cost);
11
+
12
+ attach_function :hash_argon2i, [:pointer, :size_t, :pointer, :size_t,
13
+ :pointer, :size_t, :uint, :uint ], :int, :blocking => true
14
+
15
+ #void argon2_wrap(uint8_t *out, char *pwd, uint8_t *salt, uint32_t t_cost,
16
+ # uint32_t m_cost, uint32_t lanes);
17
+ attach_function :argon2_wrap, [:pointer, :pointer, :pointer, :uint, :uint, :uint], :uint, :blocking => true
18
+
19
+ end
20
+
21
+ class Engine
22
+ # The engine class shields users from the FFI interface.
23
+ # It is generally not advised to directly use this class.
24
+ def self.hash_argon2i(password, salt, t_cost, m_cost)
25
+ result = ''
26
+ FFI::MemoryPointer.new(:char, Constants::OUT_LEN) do |buffer|
27
+ ret = Ext.hash_argon2i(buffer, Constants::OUT_LEN, password, password.length, salt, salt.length, t_cost, (1<<m_cost))
28
+ raise ArgonHashFail.new(ERRORS[ret]) unless ret == 0
29
+ result = buffer.read_string(Constants::OUT_LEN)
30
+ end
31
+ result.unpack('H*').join
32
+ end
33
+
34
+ def self.hash_argon2i_encode(password, salt, t_cost, m_cost)
35
+ result = ''
36
+ if salt.length != Constants::SALT_LEN
37
+ raise ArgonHashFail.new("Invalid salt size")
38
+ end
39
+ FFI::MemoryPointer.new(:char, 300) do |buffer|
40
+ ret = Ext.argon2_wrap(buffer, password, salt, t_cost, (1<<m_cost), 1)
41
+ raise ArgonHashFail.new(ERRORS[ret]) unless ret == 0
42
+ result = buffer.read_string(300)
43
+ end
44
+ result.gsub("\0", '')
45
+ end
46
+ end
47
+ end
@@ -1,4 +1,4 @@
1
1
  module Argon2
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: argon2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Technion
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-04 00:00:00.000000000 Z
11
+ date: 2015-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: ffi-compiler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
- - - ">="
31
+ - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '0'
33
+ version: '0.1'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - ">="
38
+ - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '0'
40
+ version: '0.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,21 +70,22 @@ dependencies:
56
70
  name: minitest
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0'
75
+ version: '5'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0'
82
+ version: '5'
69
83
  description: Not remotely finished Argon2 binding
70
84
  email:
71
85
  - technion@lolware.net
72
86
  executables: []
73
- extensions: []
87
+ extensions:
88
+ - ext/argon2_wrap/extconf.rb
74
89
  extra_rdoc_files: []
75
90
  files:
76
91
  - ".gitignore"
@@ -83,7 +98,56 @@ files:
83
98
  - argon2.gemspec
84
99
  - bin/console
85
100
  - bin/setup
101
+ - ext/argon2_wrap/Makefile
102
+ - ext/argon2_wrap/argon_wrap.c
103
+ - ext/argon2_wrap/extconf.rb
104
+ - ext/argon2_wrap/libargon2_wrap.so
105
+ - ext/argon2_wrap/test.c
106
+ - ext/argon2_wrap/tests
107
+ - ext/phc-winner-argon2/.git
108
+ - ext/phc-winner-argon2/.gitignore
109
+ - ext/phc-winner-argon2/LICENSE
110
+ - ext/phc-winner-argon2/Makefile
111
+ - ext/phc-winner-argon2/README.md
112
+ - ext/phc-winner-argon2/argon2
113
+ - ext/phc-winner-argon2/argon2-specs.pdf
114
+ - ext/phc-winner-argon2/kats/argon2d
115
+ - ext/phc-winner-argon2/kats/argon2d.shasum
116
+ - ext/phc-winner-argon2/kats/argon2i
117
+ - ext/phc-winner-argon2/kats/argon2i.shasum
118
+ - ext/phc-winner-argon2/kats/check-sums.sh
119
+ - ext/phc-winner-argon2/kats/test.sh
120
+ - ext/phc-winner-argon2/libargon2.a
121
+ - ext/phc-winner-argon2/libargon2.so
122
+ - ext/phc-winner-argon2/src/argon2.c
123
+ - ext/phc-winner-argon2/src/argon2.h
124
+ - ext/phc-winner-argon2/src/argon2.o
125
+ - ext/phc-winner-argon2/src/bench.c
126
+ - ext/phc-winner-argon2/src/blake2/blake2-impl.h
127
+ - ext/phc-winner-argon2/src/blake2/blake2.h
128
+ - ext/phc-winner-argon2/src/blake2/blake2b.c
129
+ - ext/phc-winner-argon2/src/blake2/blake2b.o
130
+ - ext/phc-winner-argon2/src/blake2/blamka-round-opt.h
131
+ - ext/phc-winner-argon2/src/blake2/blamka-round-ref.h
132
+ - ext/phc-winner-argon2/src/core.c
133
+ - ext/phc-winner-argon2/src/core.h
134
+ - ext/phc-winner-argon2/src/core.o
135
+ - ext/phc-winner-argon2/src/genkat.c
136
+ - ext/phc-winner-argon2/src/genkat.h
137
+ - ext/phc-winner-argon2/src/opt.c
138
+ - ext/phc-winner-argon2/src/opt.h
139
+ - ext/phc-winner-argon2/src/ref.c
140
+ - ext/phc-winner-argon2/src/ref.h
141
+ - ext/phc-winner-argon2/src/ref.o
142
+ - ext/phc-winner-argon2/src/run.c
143
+ - ext/phc-winner-argon2/src/thread.c
144
+ - ext/phc-winner-argon2/src/thread.h
145
+ - ext/phc-winner-argon2/src/thread.o
86
146
  - lib/argon2.rb
147
+ - lib/argon2/constants.rb
148
+ - lib/argon2/engine.rb
149
+ - lib/argon2/errors.rb
150
+ - lib/argon2/ffi_engine.rb
87
151
  - lib/argon2/version.rb
88
152
  homepage: https://github.com/technion/ruby-argon2
89
153
  licenses: