rbnacl 3.4.0 → 4.0.0.pre
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 +4 -4
- data/.rspec +1 -0
- data/.rubocop.yml +23 -18
- data/.ruby-version +1 -0
- data/.travis.yml +8 -17
- data/CHANGES.md +21 -2
- data/Gemfile +1 -1
- data/README.md +29 -18
- data/Rakefile +1 -0
- data/lib/rbnacl.rb +11 -1
- data/lib/rbnacl/aead/aead.rb +143 -0
- data/lib/rbnacl/aead/chacha20poly1305.rb +42 -0
- data/lib/rbnacl/aead/chacha20poly1305_ietf.rb +44 -0
- data/lib/rbnacl/auth.rb +2 -0
- data/lib/rbnacl/boxes/curve25519xsalsa20poly1305.rb +5 -1
- data/lib/rbnacl/boxes/curve25519xsalsa20poly1305/private_key.rb +1 -0
- data/lib/rbnacl/boxes/curve25519xsalsa20poly1305/public_key.rb +1 -0
- data/lib/rbnacl/group_elements/curve25519.rb +2 -0
- data/lib/rbnacl/hash.rb +2 -0
- data/lib/rbnacl/hash/blake2b.rb +2 -0
- data/lib/rbnacl/hash/sha256.rb +2 -0
- data/lib/rbnacl/hash/sha512.rb +2 -0
- data/lib/rbnacl/hmac/sha256.rb +2 -0
- data/lib/rbnacl/hmac/sha512.rb +2 -0
- data/lib/rbnacl/hmac/sha512256.rb +2 -0
- data/lib/rbnacl/init.rb +2 -0
- data/lib/rbnacl/key_comparator.rb +2 -0
- data/lib/rbnacl/one_time_auths/poly1305.rb +2 -0
- data/lib/rbnacl/password_hash.rb +55 -4
- data/lib/rbnacl/password_hash/argon2.rb +202 -0
- data/lib/rbnacl/password_hash/scrypt.rb +5 -1
- data/lib/rbnacl/random.rb +4 -1
- data/lib/rbnacl/secret_boxes/xsalsa20poly1305.rb +2 -0
- data/lib/rbnacl/self_test.rb +3 -2
- data/lib/rbnacl/serializable.rb +2 -0
- data/lib/rbnacl/signatures/ed25519.rb +2 -0
- data/lib/rbnacl/signatures/ed25519/signing_key.rb +2 -0
- data/lib/rbnacl/signatures/ed25519/verify_key.rb +2 -0
- data/lib/rbnacl/simple_box.rb +2 -0
- data/lib/rbnacl/sodium.rb +11 -0
- data/lib/rbnacl/sodium/version.rb +14 -4
- data/lib/rbnacl/test_vectors.rb +47 -1
- data/lib/rbnacl/util.rb +4 -1
- data/lib/rbnacl/version.rb +2 -1
- data/rbnacl.gemspec +20 -20
- data/spec/rbnacl/aead/chacha20poly1305_ietf_spec.rb +16 -0
- data/spec/rbnacl/aead/chacha20poly1305_orig_spec.rb +14 -0
- data/spec/rbnacl/authenticators/poly1305_spec.rb +1 -1
- data/spec/rbnacl/boxes/curve25519xsalsa20poly1305/private_key_spec.rb +1 -1
- data/spec/rbnacl/boxes/curve25519xsalsa20poly1305/public_key_spec.rb +1 -1
- data/spec/rbnacl/boxes/curve25519xsalsa20poly1305_spec.rb +1 -1
- data/spec/rbnacl/group_element_spec.rb +1 -1
- data/spec/rbnacl/hash/blake2b_spec.rb +2 -2
- data/spec/rbnacl/hash_spec.rb +1 -1
- data/spec/rbnacl/hmac/sha256_spec.rb +1 -1
- data/spec/rbnacl/hmac/sha512256_spec.rb +1 -1
- data/spec/rbnacl/hmac/sha512_spec.rb +1 -1
- data/spec/rbnacl/password_hash/argon2_spec.rb +44 -0
- data/spec/rbnacl/password_hash/scrypt_spec.rb +1 -1
- data/spec/rbnacl/random_spec.rb +2 -0
- data/spec/rbnacl/secret_box_spec.rb +1 -1
- data/spec/rbnacl/signatures/ed25519/signing_key_spec.rb +1 -1
- data/spec/rbnacl/signatures/ed25519/verify_key_spec.rb +2 -0
- data/spec/rbnacl/simple_box_spec.rb +1 -1
- data/spec/rbnacl/util_spec.rb +5 -3
- data/spec/shared/aead.rb +82 -0
- data/spec/shared/authenticator.rb +2 -0
- data/spec/shared/box.rb +1 -0
- data/spec/shared/key_equality.rb +2 -0
- data/spec/shared/serializable.rb +1 -0
- data/spec/spec_helper.rb +3 -0
- data/tasks/rspec.rake +3 -0
- data/tasks/rubocop.rake +3 -0
- metadata +25 -43
- data/bascule.asc +0 -449
- data/bascule.cert +0 -21
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c2f871a780f690af1d6c71ee6ac966a31c04e955
|
|
4
|
+
data.tar.gz: efb865e57cce84746c469fe9a5aba80e825fac3f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5f6d7c58f9873cc194eca83fc1acae8554dba2624d98d7bc5c505ed99071119c9af40d77038f7c4ab015465fcdeda22c33910258bfb235d9335b53d4740be7e2
|
|
7
|
+
data.tar.gz: 471154df784020f8762d7ef3c41f4ae026764f87b720be581e9e0d8efc26c6ba41944d532015b54423f74b411b264c633ebac39065c18fa6843f216f2481c7f6
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,10 +1,31 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
DisplayCopNames: true
|
|
3
|
+
Include:
|
|
4
|
+
- '**/Rakefile'
|
|
5
|
+
Exclude:
|
|
6
|
+
- 'spec/**/*'
|
|
7
|
+
- 'vendor/**/*'
|
|
8
|
+
- 'lib/rbnacl/test_vectors.rb'
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# Metrics
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
Metrics/AbcSize:
|
|
15
|
+
Max: 20
|
|
16
|
+
|
|
17
|
+
Metrics/ClassLength:
|
|
18
|
+
Max: 150
|
|
19
|
+
|
|
20
|
+
Metrics/MethodLength:
|
|
21
|
+
Max: 25
|
|
22
|
+
|
|
1
23
|
#
|
|
2
24
|
# Style
|
|
3
25
|
#
|
|
4
26
|
|
|
5
|
-
# TODO: turn this down
|
|
6
27
|
LineLength:
|
|
7
|
-
Max:
|
|
28
|
+
Max: 128
|
|
8
29
|
|
|
9
30
|
Style/StringLiterals:
|
|
10
31
|
EnforcedStyle: double_quotes
|
|
@@ -14,19 +35,3 @@ Style/SpaceBeforeFirstArg:
|
|
|
14
35
|
|
|
15
36
|
Style/GlobalVars:
|
|
16
37
|
Enabled: false
|
|
17
|
-
|
|
18
|
-
#
|
|
19
|
-
# Metrics
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
Metrics/MethodLength:
|
|
23
|
-
Max: 22
|
|
24
|
-
|
|
25
|
-
Metrics/AbcSize:
|
|
26
|
-
Max: 20
|
|
27
|
-
|
|
28
|
-
AllCops:
|
|
29
|
-
Include:
|
|
30
|
-
- '**/Rakefile'
|
|
31
|
-
Exclude:
|
|
32
|
-
- 'spec/**/*'
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.3.3
|
data/.travis.yml
CHANGED
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
sudo: false
|
|
3
|
+
cache: bundler
|
|
3
4
|
script: bundle exec rake ci
|
|
5
|
+
bundler_args: --without development
|
|
6
|
+
|
|
4
7
|
branches:
|
|
5
8
|
only:
|
|
6
9
|
- master
|
|
7
10
|
|
|
8
|
-
bundler_args: --without development
|
|
9
|
-
|
|
10
11
|
rvm:
|
|
11
|
-
-
|
|
12
|
-
- 2.
|
|
13
|
-
- 2.
|
|
14
|
-
- 2.3.1
|
|
15
|
-
- ruby-head
|
|
16
|
-
- jruby
|
|
17
|
-
- jruby-9.0.5.0
|
|
18
|
-
- jruby-head
|
|
19
|
-
- rbx-2
|
|
12
|
+
- jruby-9.1.6.0
|
|
13
|
+
- 2.2.6
|
|
14
|
+
- 2.3.3
|
|
20
15
|
|
|
21
16
|
env:
|
|
22
|
-
- LIBSODIUM_VERSION=1.0.0
|
|
23
|
-
- LIBSODIUM_VERSION=1.0.
|
|
17
|
+
- LIBSODIUM_VERSION=1.0.0 # Minimum supported
|
|
18
|
+
- LIBSODIUM_VERSION=1.0.11 # Latest released
|
|
24
19
|
|
|
25
20
|
matrix:
|
|
26
21
|
fast_finish: true
|
|
27
|
-
allow_failures:
|
|
28
|
-
- rvm: ruby-head
|
|
29
|
-
- rvm: jruby-head
|
|
30
|
-
- rvm: rbx-2
|
|
31
22
|
|
|
32
23
|
notifications:
|
|
33
24
|
irc: "irc.freenode.org#cryptosphere"
|
data/CHANGES.md
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
|
+
4.0.0.pre (2016-12-04)
|
|
2
|
+
----------------------
|
|
3
|
+
|
|
4
|
+
* [#141](https://github.com/cryptosphere/rbnacl/pull/141)
|
|
5
|
+
Add wrappers for ChaCha20Poly1305 AEAD ciphers.
|
|
6
|
+
([@aadavids])
|
|
7
|
+
|
|
8
|
+
* [#142](https://github.com/cryptosphere/rbnacl/pull/142)
|
|
9
|
+
Added support for Argon2 password hash.
|
|
10
|
+
([@elijh])
|
|
11
|
+
|
|
12
|
+
* [#143](https://github.com/cryptosphere/rbnacl/pull/143)
|
|
13
|
+
Require Ruby 2.2.6+.
|
|
14
|
+
([@tarcieri])
|
|
15
|
+
|
|
1
16
|
3.4.0 (2015-05-07)
|
|
2
17
|
------------------
|
|
3
18
|
* [#135](https://github.com/cryptosphere/rbnacl/pull/135)
|
|
4
19
|
Expose RbNaCl::Signatures::Ed25519#keypair_bytes.
|
|
5
|
-
(@grempe)
|
|
20
|
+
([@grempe])
|
|
6
21
|
|
|
7
22
|
* [#137](https://github.com/cryptosphere/rbnacl/pull/137)
|
|
8
23
|
Expose HMAC-SHA512 (with 64-byte keys)
|
|
9
|
-
(@mwpastore)
|
|
24
|
+
([@mwpastore])
|
|
10
25
|
|
|
11
26
|
3.3.0 (2015-12-29)
|
|
12
27
|
------------------
|
|
@@ -82,3 +97,7 @@
|
|
|
82
97
|
|
|
83
98
|
[@namelessjon]: https://github.com/namelessjon
|
|
84
99
|
[@tarcieri]: https://github.com/tarcieri
|
|
100
|
+
[@aadavids]: https://github.com/aadavids
|
|
101
|
+
[@grempe]: https://github.com/grempe
|
|
102
|
+
[@mwpastore]: https://github.com/mwpastore
|
|
103
|
+
[@elijh]: https://github.com/elijh
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
[](https://coveralls.io/r/cryptosphere/rbnacl)
|
|
7
7
|
[](https://github.com/cryptosphere/rbnacl/blob/master/LICENSE.txt)
|
|
8
8
|
|
|
9
|
+
_NOTE: This is the 4.x **development** branch of RbNaCl. For the 3.x **stable**
|
|
10
|
+
branch, please see:_
|
|
11
|
+
|
|
12
|
+
https://github.com/cryptosphere/rbnacl/tree/3-x-stable
|
|
13
|
+
|
|
9
14
|
A Ruby binding to the state-of-the-art [Networking and Cryptography][nacl]
|
|
10
15
|
library by [Daniel J. Bernstein][djb]. This is **NOT** Google Native Client.
|
|
11
16
|
This is a crypto library.
|
|
@@ -53,11 +58,29 @@ For more information on NaCl's goals, see Dan Bernstein's presentation
|
|
|
53
58
|
|
|
54
59
|
## Supported platforms
|
|
55
60
|
|
|
56
|
-
You can use RbNaCl
|
|
57
|
-
|
|
61
|
+
You can use RbNaCl on platforms libsodium is supported (see below).
|
|
62
|
+
|
|
63
|
+
This library aims to support and is [tested against][travis] the following Ruby
|
|
64
|
+
versions:
|
|
65
|
+
|
|
66
|
+
* Ruby 2.2.6+
|
|
67
|
+
* Ruby 2.3.0+
|
|
68
|
+
* JRuby 9.1.6.0+
|
|
69
|
+
|
|
70
|
+
If something doesn't work on one of these versions, it's a bug.
|
|
71
|
+
|
|
72
|
+
This library may inadvertently work (or seem to work) on other Ruby versions,
|
|
73
|
+
however support will only be provided for the versions listed above.
|
|
58
74
|
|
|
59
|
-
|
|
60
|
-
|
|
75
|
+
If you would like this library to support another Ruby version or
|
|
76
|
+
implementation, you may volunteer to be a maintainer. Being a maintainer
|
|
77
|
+
entails making sure all tests run and pass on that implementation. When
|
|
78
|
+
something breaks on your implementation, you will be responsible for providing
|
|
79
|
+
patches in a timely fashion. If critical issues for a particular implementation
|
|
80
|
+
exist at the time of a major release, support for that Ruby version may be
|
|
81
|
+
dropped.
|
|
82
|
+
|
|
83
|
+
[travis]: http://travis-ci.org/cryptosphere/rbnacl
|
|
61
84
|
|
|
62
85
|
## Installation
|
|
63
86
|
|
|
@@ -72,7 +95,7 @@ To use RbNaCl, you will need to install libsodium:
|
|
|
72
95
|
|
|
73
96
|
https://github.com/jedisct1/libsodium
|
|
74
97
|
|
|
75
|
-
At least version `1.0.0` is
|
|
98
|
+
At least version `1.0.0` is required.
|
|
76
99
|
|
|
77
100
|
For OS X users, libsodium is available via homebrew and can be installed with:
|
|
78
101
|
|
|
@@ -139,19 +162,6 @@ information.
|
|
|
139
162
|
[hashes]: https://github.com/cryptosphere/rbnacl/wiki/Hash-Functions
|
|
140
163
|
[rdoc]: http://rubydoc.info/github/cryptosphere/rbnacl/master/frames
|
|
141
164
|
|
|
142
|
-
## Reporting Security Problems
|
|
143
|
-
|
|
144
|
-
If you have discovered a bug in RbNaCl of a sensitive nature, i.e.
|
|
145
|
-
one which can compromise the security of RbNaCl users, you can
|
|
146
|
-
report it securely by sending a GPG encrypted message. Please use
|
|
147
|
-
the following key:
|
|
148
|
-
|
|
149
|
-
https://raw.github.com/cryptosphere/rbnacl/master/bascule.asc
|
|
150
|
-
|
|
151
|
-
The key fingerprint is (or should be):
|
|
152
|
-
|
|
153
|
-
`9148 85A2 6242 1628 B6AA AB45 4CB9 B3D0 BACC 8B71`
|
|
154
|
-
|
|
155
165
|
## Learn More
|
|
156
166
|
|
|
157
167
|
While NaCl has designed to be easier-than-usual to use for a crypto
|
|
@@ -163,6 +173,7 @@ interested in learning more about how NaCl works, it's recommended
|
|
|
163
173
|
that you read them:
|
|
164
174
|
|
|
165
175
|
* [Cryptography in NaCl](http://cr.yp.to/highspeed/naclcrypto-20090310.pdf)
|
|
176
|
+
* [Salsa20 Design](https://cr.yp.to/snuffle/design.pdf)
|
|
166
177
|
* [Curve25519: new Diffie-Hellman speed records](http://cr.yp.to/ecdh/curve25519-20060209.pdf)
|
|
167
178
|
* [Ed25519: High-speed high-security signatures](http://ed25519.cr.yp.to/ed25519-20110926.pdf)
|
|
168
179
|
|
data/Rakefile
CHANGED
data/lib/rbnacl.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# encoding: binary
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
2
4
|
require "rbnacl/version"
|
|
3
5
|
require "rbnacl/sodium"
|
|
4
6
|
require "rbnacl/sodium/version"
|
|
@@ -10,6 +12,7 @@ require "rbnacl/random"
|
|
|
10
12
|
require "rbnacl/simple_box"
|
|
11
13
|
require "rbnacl/test_vectors"
|
|
12
14
|
require "rbnacl/init"
|
|
15
|
+
require "rbnacl/aead/aead"
|
|
13
16
|
|
|
14
17
|
# NaCl/libsodium for Ruby
|
|
15
18
|
module RbNaCl
|
|
@@ -63,15 +66,22 @@ module RbNaCl
|
|
|
63
66
|
require "rbnacl/hash/sha512"
|
|
64
67
|
require "rbnacl/hash/blake2b"
|
|
65
68
|
|
|
66
|
-
# Password hash
|
|
69
|
+
# Password hash functions
|
|
67
70
|
require "rbnacl/password_hash"
|
|
68
71
|
require "rbnacl/password_hash/scrypt"
|
|
72
|
+
if RbNaCl::Sodium::Version::ARGON2_SUPPORTED
|
|
73
|
+
require "rbnacl/password_hash/argon2"
|
|
74
|
+
end
|
|
69
75
|
|
|
70
76
|
# HMAC: SHA256/512 and SHA512256
|
|
71
77
|
require "rbnacl/hmac/sha256"
|
|
72
78
|
require "rbnacl/hmac/sha512256"
|
|
73
79
|
require "rbnacl/hmac/sha512"
|
|
74
80
|
|
|
81
|
+
# AEAD: ChaCha20-Poly1305
|
|
82
|
+
require "rbnacl/aead/chacha20poly1305"
|
|
83
|
+
require "rbnacl/aead/chacha20poly1305_ietf"
|
|
84
|
+
|
|
75
85
|
#
|
|
76
86
|
# Bind aliases used by the public API
|
|
77
87
|
#
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# encoding: binary
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module RbNaCl
|
|
5
|
+
module AEAD
|
|
6
|
+
# Authenticated Encryption with Additional Data
|
|
7
|
+
#
|
|
8
|
+
# This construction encrypts a message, and computes an authentication
|
|
9
|
+
# tag for the encrypted message and some optional additional data
|
|
10
|
+
#
|
|
11
|
+
# RbNaCl provides wrappers for both ChaCha20-Poly1305 AEAD implementations
|
|
12
|
+
# in libsodium: the original, and the IETF version.
|
|
13
|
+
class GenericAEAD
|
|
14
|
+
# Number of bytes in a valid key
|
|
15
|
+
KEYBYTES = 0
|
|
16
|
+
|
|
17
|
+
# Number of bytes in a valid nonce
|
|
18
|
+
NPUBBYTES = 0
|
|
19
|
+
|
|
20
|
+
attr_reader :key
|
|
21
|
+
private :key
|
|
22
|
+
|
|
23
|
+
# Create a new AEAD using the IETF chacha20poly1305 construction
|
|
24
|
+
#
|
|
25
|
+
# Sets up AEAD with a secret key for encrypting and decrypting messages.
|
|
26
|
+
#
|
|
27
|
+
# @param key [String] The key to encrypt and decrypt with
|
|
28
|
+
#
|
|
29
|
+
# @raise [RbNaCl::LengthError] on invalid keys
|
|
30
|
+
#
|
|
31
|
+
# @return [RbNaCl::AEAD::Chacha20Poly1305IETF] The new AEAD construct, ready to use
|
|
32
|
+
def initialize(key)
|
|
33
|
+
@key = Util.check_string(key, key_bytes, "Secret key")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Encrypts and authenticates a message with additional authenticated data
|
|
37
|
+
#
|
|
38
|
+
# @param nonce [String] An 8-byte string containing the nonce.
|
|
39
|
+
# @param message [String] The message to be encrypted.
|
|
40
|
+
# @param additional_data [String] The additional authenticated data
|
|
41
|
+
#
|
|
42
|
+
# @raise [RbNaCl::LengthError] If the nonce is not valid
|
|
43
|
+
# @raise [RbNaCl::CryptoError] If the ciphertext cannot be authenticated.
|
|
44
|
+
#
|
|
45
|
+
# @return [String] The encrypted message with the authenticator tag appended
|
|
46
|
+
def encrypt(nonce, message, additional_data)
|
|
47
|
+
Util.check_length(nonce, nonce_bytes, "Nonce")
|
|
48
|
+
|
|
49
|
+
ciphertext_len = Util.zeros(1)
|
|
50
|
+
ciphertext = Util.zeros(data_len(message) + tag_bytes)
|
|
51
|
+
|
|
52
|
+
success = do_encrypt(ciphertext, ciphertext_len, nonce, message, additional_data)
|
|
53
|
+
raise CryptoError, "Encryption failed" unless success
|
|
54
|
+
ciphertext
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Decrypts and verifies an encrypted message with additional authenticated data
|
|
58
|
+
#
|
|
59
|
+
# @param nonce [String] An 8-byte string containing the nonce.
|
|
60
|
+
# @param ciphertext [String] The message to be decrypted.
|
|
61
|
+
# @param additional_data [String] The additional authenticated data
|
|
62
|
+
#
|
|
63
|
+
# @raise [RbNaCl::LengthError] If the nonce is not valid
|
|
64
|
+
# @raise [RbNaCl::CryptoError] If the ciphertext cannot be authenticated.
|
|
65
|
+
#
|
|
66
|
+
# @return [String] The decrypted message
|
|
67
|
+
def decrypt(nonce, ciphertext, additional_data)
|
|
68
|
+
Util.check_length(nonce, nonce_bytes, "Nonce")
|
|
69
|
+
|
|
70
|
+
message_len = Util.zeros(1)
|
|
71
|
+
message = Util.zeros(data_len(ciphertext) - tag_bytes)
|
|
72
|
+
|
|
73
|
+
success = do_decrypt(message, message_len, nonce, ciphertext, additional_data)
|
|
74
|
+
raise CryptoError, "Decryption failed. Ciphertext failed verification." unless success
|
|
75
|
+
message
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# The crypto primitive for this aead instance
|
|
79
|
+
#
|
|
80
|
+
# @return [Symbol] The primitive used
|
|
81
|
+
def primitive
|
|
82
|
+
self.class.primitive
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# The nonce bytes for the AEAD class
|
|
86
|
+
#
|
|
87
|
+
# @return [Integer] The number of bytes in a valid nonce
|
|
88
|
+
def self.nonce_bytes
|
|
89
|
+
self::NPUBBYTES
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# The nonce bytes for the AEAD instance
|
|
93
|
+
#
|
|
94
|
+
# @return [Integer] The number of bytes in a valid nonce
|
|
95
|
+
def nonce_bytes
|
|
96
|
+
self.class.nonce_bytes
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# The key bytes for the AEAD class
|
|
100
|
+
#
|
|
101
|
+
# @return [Integer] The number of bytes in a valid key
|
|
102
|
+
def self.key_bytes
|
|
103
|
+
self::KEYBYTES
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# The key bytes for the AEAD instance
|
|
107
|
+
#
|
|
108
|
+
# @return [Integer] The number of bytes in a valid key
|
|
109
|
+
def key_bytes
|
|
110
|
+
self.class.key_bytes
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# The number bytes in the tag or authenticator from this AEAD class
|
|
114
|
+
#
|
|
115
|
+
# @return [Integer] number of tag bytes
|
|
116
|
+
def self.tag_bytes
|
|
117
|
+
self::ABYTES
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# The number of bytes in the tag or authenticator for this AEAD instance
|
|
121
|
+
#
|
|
122
|
+
# @return [Integer] number of tag bytes
|
|
123
|
+
def tag_bytes
|
|
124
|
+
self.class.tag_bytes
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
private
|
|
128
|
+
|
|
129
|
+
def data_len(data)
|
|
130
|
+
return 0 if data.nil?
|
|
131
|
+
data.bytesize
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def do_encrypt(_ciphertext, _ciphertext_len, _nonce, _message, _additional_data)
|
|
135
|
+
raise NotImplementedError
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def do_decrypt(_message, _message_len, _nonce, _ciphertext, _additional_data)
|
|
139
|
+
raise NotImplementedError
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: binary
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module RbNaCl
|
|
5
|
+
module AEAD
|
|
6
|
+
# This class contains wrappers for the original libsodium implementation of
|
|
7
|
+
# Authenticated Encryption with Additional Data using ChaCha20-Poly1305
|
|
8
|
+
class Chacha20Poly1305 < GenericAEAD
|
|
9
|
+
extend Sodium
|
|
10
|
+
|
|
11
|
+
sodium_type :aead
|
|
12
|
+
sodium_primitive :chacha20poly1305
|
|
13
|
+
sodium_constant :KEYBYTES
|
|
14
|
+
sodium_constant :NPUBBYTES
|
|
15
|
+
sodium_constant :ABYTES
|
|
16
|
+
|
|
17
|
+
sodium_function :aead_chacha20poly1305_encrypt,
|
|
18
|
+
:crypto_aead_chacha20poly1305_encrypt,
|
|
19
|
+
[:pointer, :pointer, :pointer, :ulong_long, :pointer, :ulong_long, :pointer, :pointer, :pointer]
|
|
20
|
+
|
|
21
|
+
sodium_function :aead_chacha20poly1305_decrypt,
|
|
22
|
+
:crypto_aead_chacha20poly1305_decrypt,
|
|
23
|
+
[:pointer, :pointer, :pointer, :pointer, :ulong_long, :pointer, :ulong_long, :pointer, :pointer]
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def do_encrypt(ciphertext, ciphertext_len, nonce, message, additional_data)
|
|
28
|
+
self.class.aead_chacha20poly1305_encrypt(ciphertext, ciphertext_len,
|
|
29
|
+
message, data_len(message),
|
|
30
|
+
additional_data, data_len(additional_data),
|
|
31
|
+
nil, nonce, @key)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def do_decrypt(message, message_len, nonce, ciphertext, additional_data)
|
|
35
|
+
self.class.aead_chacha20poly1305_decrypt(message, message_len, nil,
|
|
36
|
+
ciphertext, data_len(ciphertext),
|
|
37
|
+
additional_data, data_len(additional_data),
|
|
38
|
+
nonce, @key)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|