argon2 0.0.1 → 0.0.2

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