crypt_checkpass 1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 189e02218459b7aa4eeb3ff0b6efbecfa49fe612
4
+ data.tar.gz: 403f8ca9c8a0e0dec7caff6767b7f5075c56ce8c
5
+ SHA512:
6
+ metadata.gz: 5b0c2eb040e52fa190fc04089e42c6d3d1f971be6d925ea10d5bb036ea0685607d3b7702eee8b3b579b5a4afd287860a0bad1fae22153837bc2149952e3b42b6
7
+ data.tar.gz: 5fd897d06a1651e583ebaaf39a66a2d76817fb6a2fe26742c5e77ddf6f378222f371a354e1866c6a9e9ca6593d257a96084ee264b3231a2ca932e04055ad902e
@@ -0,0 +1,32 @@
1
+ # Copyright (c) 2018 Urabe, Shyouhei
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be
11
+ # included in all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ *.bundle
22
+ .DS_Store
23
+ /.byebug_history
24
+ /.ruby-version
25
+ /.yardoc/
26
+ /_yardoc/
27
+ /coverage/
28
+ /doc/
29
+ /pkg/
30
+ /tmp/
31
+ /vendor/
32
+ Gemfile.lock
@@ -0,0 +1,96 @@
1
+ #! /your/favourite/path/to/rubocop
2
+ # -*- mode: yaml; coding: utf-8 -*-
3
+
4
+ # Copyright (c) 2018 Urabe, Shyouhei
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+
24
+ AllCops:
25
+ DisabledByDefault: false
26
+ DisplayCopNames: true
27
+ Exclude:
28
+ - 'vendor/**/*'
29
+ - 'test/**/*'
30
+ - 'ext/**/*'
31
+ - '*.gemspec'
32
+ TargetRubyVersion: 2.0
33
+
34
+ Layout:
35
+ Enabled: false
36
+
37
+ Lint/AmbiguousBlockAssociation:
38
+ Enabled: false
39
+
40
+ Lint/AssignmentInCondition:
41
+ Enabled: false
42
+
43
+ Lint/EmptyWhen:
44
+ Enabled: false
45
+
46
+ Lint/ScriptPermission:
47
+ Enabled: false
48
+
49
+ Lint/UselessAccessModifier:
50
+ # I think this cop is buggy as of 0.49
51
+ Enabled: false
52
+
53
+ Lint/UnderscorePrefixedVariableName:
54
+ Enabled: false
55
+
56
+ Lint/UnusedMethodArgument:
57
+ Enabled: false
58
+
59
+ Metrics/AbcSize:
60
+ Enabled: false
61
+
62
+ Metrics/BlockLength:
63
+ Enabled: false
64
+
65
+ Metrics/ClassLength:
66
+ Enabled: false
67
+
68
+ Metrics/CyclomaticComplexity:
69
+ Enabled: false
70
+
71
+ Metrics/MethodLength:
72
+ Enabled: false
73
+
74
+ Metrics/PerceivedComplexity:
75
+ # What the f* is this thing?
76
+ Enabled: false
77
+
78
+ Performance:
79
+ Enabled: false
80
+
81
+ Rails:
82
+ Enabled: false
83
+
84
+ Security/Eval:
85
+ Enabled: false
86
+
87
+ Security/MarshalLoad:
88
+ Enabled: false
89
+
90
+ Style:
91
+ Enabled: false
92
+
93
+ Metrics/LineLength:
94
+ Enabled: false
95
+ AllowURI: true
96
+ Max: 80
@@ -0,0 +1,5 @@
1
+ --markup-provider=redcarpet
2
+ --markup=markdown
3
+ --charset utf-8
4
+ --readme README.md
5
+ lib/**/*.rb
data/Gemfile ADDED
@@ -0,0 +1,41 @@
1
+ #! /your/favourite/path/to/bundler
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level: 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2018 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ source 'https://rubygems.org'
27
+ gemspec
28
+
29
+ group :test do
30
+ gem 'argon2'
31
+ gem 'bcrypt'
32
+ gem 'scrypt'
33
+ gem 'unix-crypt'
34
+ if RUBY_VERSION >= '2.1.0'
35
+ gem 'stackprof'
36
+ end
37
+ if RUBY_VERSION >= '2.3.0'
38
+ gem 'fiddle'
39
+ gem 'openssl'
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2018 Urabe, Shyouhei
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be
11
+ included in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,114 @@
1
+ Provides Unix crypt_checkpass(3)-compatible routines.
2
+
3
+ ### What's good with this API?
4
+
5
+ - It supports vast majority of hash verifications, including those
6
+ which are not generated by us (see below). This enables smooth
7
+ migration of password algorithm; you can mix multiple algorithms to
8
+ verify. This is practically very important because from time to
9
+ time, current best practice moves from one thing to another.
10
+ - Generates a variety of hash strings using current-best-practice hash
11
+ functions.
12
+
13
+ ### Tell me the usage?
14
+
15
+ Verification:
16
+
17
+ ```ruby
18
+ require 'crypt_checkpass'
19
+ actual = 'p455w0rd'
20
+ expected = '$5$$D1W6NDlv302WsleruXoUN279B87yf6dFN4ZZhFqV6DD'
21
+ crypt_checkpass(actual, expected) or raise 'NG'
22
+ ```
23
+
24
+ Generation:
25
+
26
+ ```ruby
27
+ require 'crypt_checkpass'
28
+ crypt_newhash('p455w0rd',
29
+ id: 'argon2i',
30
+ m_cost: 4096,
31
+ t_cost: 3) # => "$argon2i$v=19$m=4096,t=3,p=1$cXdlc..."
32
+ ```
33
+
34
+ Or, if you are a real OpenBSD fan, you can also do this:
35
+
36
+ ```ruby
37
+ require 'crypt_checkpass'
38
+ crypt_newhash('p455w0rd', 'bcrypt,12') # => "$2b$12$gCDJbfcg..."
39
+ ```
40
+
41
+ ### Which hash function is supported?
42
+
43
+ |prefix |id |supported| depends |
44
+ |:-------- |:---------------- |:-------:|:-------- |
45
+ |(none) |DES(traditional) |NO |(1) |
46
+ |`_` |DES(BSDi extended)|NO |(2) |
47
+ |`$1$` |MD5 |NO |(2) |
48
+ |`$2` |bcrypt |YES|`bcrypt` gem |
49
+ |`$3$` |BSD NThash |NO |(2) |
50
+ |`$5$` |SHA256 |YES|`unix-crypt` gem|
51
+ |`$6$` |SHA512 |YES|`unix-crypt` gem|
52
+ |`$argon2` |argon2 |YES|`argon2` gem |
53
+ |`$pbkdf2` |PBKFD2 |YES|`openssl` gem |
54
+ |(3) |scrypt |YES|`scrypt` gem |
55
+
56
+ - note (1): instead of falling back to traditional mode which is
57
+ considered absolutely insecure, this library prohibits this kind of
58
+ input and renders errors.
59
+ - note (2): These formats are considered archaic.
60
+ - note (3): scypt gem generates password string that is not prefixed.
61
+
62
+ ### Too many functions are there! What is the current best practice?
63
+
64
+ If in doubt use argon2. It was designed to establish "standard to
65
+ fulfill the needs of modern applications and to best protect against
66
+ attackers". As of writing there are no known flaws.
67
+
68
+ ### What's wrong with the stdlib `String#crypt` ?
69
+
70
+ Please never use `String#crypt` any longer. It is legacy; provided
71
+ only for backward compatibility with ruby scripts in earlier days. It
72
+ is bad to use in contemporary programs for several reasons:
73
+
74
+ - Behaviour of C's `crypt(3)`, which is under the hood of
75
+ `String#crypt`, depends on the OS it is run. The generated digest
76
+ lacks data portability.
77
+ - On some OSes such as Mac OS, this function never fails (i.e.
78
+ silently ends up in unexpected results).
79
+ - On some OSes such as Mac OS, It is not thread safe.
80
+ - So-called "traditional" usage of `crypt(3)` is very very very weak.
81
+ According to its manpage, Linux's traditional `crypt(3)` output only
82
+ has 2**56 variations; too easy to blute force today. And this is
83
+ the default behaviour.
84
+ - In order to make things robust some OSes implement so-called
85
+ "modular" usage. To go through, you have to do a complex build-up of
86
+ the parameter(salt), by hand. Failure in generation of a proper
87
+ salt string tends not to yield any errors; for instance typo in
88
+ parameters are normally not detectable.
89
+ - For instance, in the following example, second invokation of
90
+ `String#crypt` is wrong; it has typo in "round=" (lacks "s").
91
+ However the call does not fail and something unexpected is
92
+ generated.
93
+
94
+ ```ruby
95
+ "foo".crypt("$5$rounds=1000$salt$") # OK, proper usage
96
+ "foo".crypt("$5$round=1000$salt$") # Typo not detected
97
+ ```
98
+
99
+ - Even in the "modular" mode, some hash functions are considered
100
+ archaic and no longer recommended at all; for instance module `$1$`
101
+ is officially abondoned by its author:
102
+ http://phk.freebsd.dk/sagas/md5crypt_eol.html, for another instance
103
+ module `$3$` is consodered completely broken: see the manpage of
104
+ FreeBSD.
105
+ - On some OS such as Mac OS, there is no modular mode. Yet, as written
106
+ above, `String#crypt` on Mac OS never fails. This means even if you
107
+ build up a proper salt string it generates a traditional DES hash
108
+ anyways, and there is no way for you to be aware of.
109
+
110
+ ```ruby
111
+ "foo".crypt("$5$rounds=1000$salt$") # => "$5fNPQMxC5j6."
112
+ ```
113
+
114
+ The API this library provides is better. Use ours instead.
@@ -0,0 +1,46 @@
1
+ #! /your/favourite/path/to/rake
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level: 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2018 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ require 'bundler/gem_tasks'
27
+ require 'bundler/gem_helper'
28
+ require 'rake/testtask'
29
+ require 'rubocop/rake_task'
30
+ require 'yard/rake/yardoc_task'
31
+ require 'yard'
32
+
33
+ YARD::Rake::YardocTask.new
34
+ RuboCop::RakeTask.new
35
+ Rake::TestTask.new do |t|
36
+ t.test_files = FileList['test/**/*.rb'] - %w'test/test_helper.rb'
37
+ t.warning = true
38
+ end
39
+
40
+ task default: :test
41
+ task spec: :test
42
+
43
+ task :pry do
44
+ sh 'bundle exec ruby bin/console', verbose: true
45
+ end
46
+ task console: :pry
@@ -0,0 +1,29 @@
1
+ #! /your/favourite/path/to/ruby
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level: 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2017 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ require 'bundler/setup'
27
+ require 'crypt_checkpass'
28
+ require 'pry'
29
+ Pry.start
@@ -0,0 +1,24 @@
1
+ #!/bin/sh
2
+ # -*- mode: sh; coding: utf-8; indent-tabs-mode: nil -*-
3
+
4
+ # Copyright (c) 2018 Urabe, Shyouhei
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+
24
+ bundle install
@@ -0,0 +1,55 @@
1
+ #! /your/favourite/path/to/gem
2
+ # -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level: 2 -*-
3
+ # -*- frozen_string_literal: true -*-
4
+ # -*- warn_indent: true -*-
5
+
6
+ # Copyright (c) 2018 Urabe, Shyouhei
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be
16
+ # included in all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ Gem::Specification.new do |spec|
27
+ spec.name = 'crypt_checkpass'
28
+ spec.version = 1
29
+ spec.author = 'Urabe, Shyouhei'
30
+ spec.email = 'shyouhei@ruby-lang.org'
31
+ spec.summary = 'provides crypt_checkpass / crypt_newhash'
32
+ spec.description = <<-"end".gsub(/\s+/, ' ').strip
33
+ Check password hash, like OpenBSD's crypt_checkpass(3) / PHP's
34
+ password_verify()
35
+ end
36
+ spec.homepage = 'https://github.com/shyouhei/crypt_checkpass'
37
+ spec.license = 'MIT'
38
+ spec.files = `git ls-files -z`.split("\x0").reject { |f|
39
+ f.match(%r'^(test|spec|features|samples)/')
40
+ }
41
+ spec.require_paths = %w'lib'
42
+
43
+ spec.add_development_dependency 'bundler'
44
+ spec.add_development_dependency 'pry-byebug'
45
+ spec.add_development_dependency 'rake'
46
+ spec.add_development_dependency 'rdoc'
47
+ spec.add_development_dependency 'redcarpet'
48
+ spec.add_development_dependency 'rubocop', '~> 0.49.0' # support for 2.0
49
+ spec.add_development_dependency 'simplecov'
50
+ # spec.add_development_dependency 'stackprof' # needs ruby 2.1+
51
+ spec.add_development_dependency 'test-unit', '>= 3'
52
+ spec.add_development_dependency 'yard'
53
+ spec.required_ruby_version = '>= 2.0.0'
54
+ spec.add_runtime_dependency 'consttime_memequal'
55
+ end