rb_mumble_protocol 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Cargo.toml +1 -1
- data/ext/rb_mumble_protocol/src/lib.rs +64 -26
- data/lib/rb_mumble_protocol/crypt_state.rb +13 -2
- data/lib/rb_mumble_protocol/version.rb +1 -1
- metadata +45 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7389a940b90f092d9f0b0450ed5ae3237e93f3c6d9400a799e6f6221a63e330a
|
4
|
+
data.tar.gz: 7332e0fec01c75d7845ac315d05a0b018fbadbb248b3553aa1b12ff2cf3a70eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09a342f7767ac3e1410bbb05c4bf38b6450052d6656c64697d49e1b1b980e426263c899247c3c6364a60ce4bdd61e758a290fa3d640c7c39a6b95a724ac0488d'
|
7
|
+
data.tar.gz: 43b4a05ac99e5ef55db0c7c53e723fe40ee22ba2a7e69b86cf373435b6785cf30a089e17a33ebcecde6eac314448b0ae84b4161eba1a9cb219533da6b2f32461
|
data/Cargo.toml
CHANGED
@@ -27,9 +27,55 @@ static BASE_ERROR: Lazy<ExceptionClass> = Lazy::new(|ruby| {
|
|
27
27
|
|
28
28
|
pub mod crypt_state;
|
29
29
|
|
30
|
-
|
30
|
+
use crypt_state::{DecryptError};
|
31
|
+
|
32
|
+
impl Into<u8> for DecryptError {
|
33
|
+
fn into(self: DecryptError) -> u8 {
|
34
|
+
match self {
|
35
|
+
DecryptError::Repeat => 1,
|
36
|
+
DecryptError::Late => 2,
|
37
|
+
DecryptError::Mac => 3,
|
38
|
+
DecryptError::Eof => 4
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
#[magnus::wrap(class = "RbMumbleProtocol::CryptState", size)]
|
31
44
|
struct CryptStateRef(RefCell<crypt_state::CryptState>);
|
32
45
|
|
46
|
+
#[magnus::wrap(class = "RbMumbleProtocol::DecryptResult", free_immediately, size)]
|
47
|
+
struct DecryptResult {
|
48
|
+
buffer: RefCell<Vec<u8>>,
|
49
|
+
reason_raw: u8
|
50
|
+
}
|
51
|
+
|
52
|
+
impl DecryptResult {
|
53
|
+
pub fn new(buffer: Vec<u8>, result: Result<(), DecryptError>) -> Self {
|
54
|
+
let reason_raw =
|
55
|
+
match result {
|
56
|
+
Ok(()) => 0,
|
57
|
+
Err(e) => e.into()
|
58
|
+
};
|
59
|
+
|
60
|
+
Self {
|
61
|
+
buffer: RefCell::new(buffer),
|
62
|
+
reason_raw: reason_raw.into()
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
pub fn is_success(&self) -> bool {
|
67
|
+
self.reason_raw == 0
|
68
|
+
}
|
69
|
+
|
70
|
+
pub fn data(&self) -> Vec<u8> {
|
71
|
+
self.buffer.borrow().to_vec()
|
72
|
+
}
|
73
|
+
|
74
|
+
pub fn reason_raw_value(&self) -> u8 {
|
75
|
+
self.reason_raw
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
33
79
|
impl CryptStateRef {
|
34
80
|
pub fn new() -> Self {
|
35
81
|
Self(RefCell::new(crypt_state::CryptState::generate_new()))
|
@@ -114,27 +160,14 @@ impl CryptStateRef {
|
|
114
160
|
}
|
115
161
|
}
|
116
162
|
|
117
|
-
pub fn decrypt(&self, encrypted: Vec<u8>) -> Result<
|
163
|
+
pub fn decrypt(&self, encrypted: Vec<u8>) -> Result<DecryptResult, Error> {
|
118
164
|
match self.0.try_borrow_mut() {
|
119
165
|
Ok(mut state) => {
|
120
166
|
let mut buffer = BytesMut::new();
|
121
167
|
buffer.extend_from_slice(&encrypted);
|
168
|
+
let result = state.decrypt(&mut buffer);
|
122
169
|
|
123
|
-
|
124
|
-
Ok(_) => Ok(buffer.to_vec()),
|
125
|
-
Err(crypt_state::DecryptError::Repeat) => {
|
126
|
-
Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "DecryptError::Repeat"))
|
127
|
-
},
|
128
|
-
Err(crypt_state::DecryptError::Late) => {
|
129
|
-
Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "DecryptError::Late"))
|
130
|
-
},
|
131
|
-
Err(crypt_state::DecryptError::Mac) => {
|
132
|
-
Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "DecryptError::Mac"))
|
133
|
-
},
|
134
|
-
Err(crypt_state::DecryptError::Eof) => {
|
135
|
-
Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "DecryptError::Eof"))
|
136
|
-
}
|
137
|
-
}
|
170
|
+
Ok(DecryptResult::new(buffer.to_vec(), result))
|
138
171
|
},
|
139
172
|
Err(_e) => { Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error")) }
|
140
173
|
}
|
@@ -149,18 +182,23 @@ fn get_ruby() -> Ruby {
|
|
149
182
|
#[magnus::init]
|
150
183
|
fn init() -> Result<(), Error> {
|
151
184
|
let module = define_module("RbMumbleProtocol")?;
|
152
|
-
let
|
185
|
+
let class1 = module.define_class("CryptState", class::object())?;
|
186
|
+
|
187
|
+
class1.define_singleton_method("new", function!(CryptStateRef::new, 0))?;
|
188
|
+
class1.define_singleton_method("new_from", function!(CryptStateRef::new_from, 3))?;
|
153
189
|
|
154
|
-
|
155
|
-
|
190
|
+
class1.define_method("key", method!(CryptStateRef::key, 0))?;
|
191
|
+
class1.define_method("encrypt_nonce", method!(CryptStateRef::encrypt_nonce, 0))?;
|
192
|
+
class1.define_method("decrypt_nonce", method!(CryptStateRef::decrypt_nonce, 0))?;
|
193
|
+
class1.define_method("stats", method!(CryptStateRef::stats, 0))?;
|
156
194
|
|
157
|
-
|
158
|
-
|
159
|
-
class.define_method("decrypt_nonce", method!(CryptStateRef::decrypt_nonce, 0))?;
|
160
|
-
class.define_method("stats", method!(CryptStateRef::stats, 0))?;
|
195
|
+
class1.define_method("encrypt", method!(CryptStateRef::encrypt, 1))?;
|
196
|
+
class1.define_method("decrypt", method!(CryptStateRef::decrypt, 1))?;
|
161
197
|
|
162
|
-
|
163
|
-
|
198
|
+
let class2 = module.define_class("DecryptResult", class::object())?;
|
199
|
+
class2.define_method("success?", method!(DecryptResult::is_success, 0))?;
|
200
|
+
class2.define_method("data", method!(DecryptResult::data, 0))?;
|
201
|
+
class2.define_method("reason_raw_value", method!(DecryptResult::reason_raw_value, 0))?;
|
164
202
|
|
165
203
|
Ok(())
|
166
204
|
}
|
@@ -1,9 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module RbMumbleProtocol
|
4
|
-
class
|
4
|
+
class CryptState
|
5
5
|
end
|
6
6
|
|
7
|
-
class
|
7
|
+
class DecryptResult
|
8
|
+
REASONS = {
|
9
|
+
0 => :ok,
|
10
|
+
1 => :repeat,
|
11
|
+
2 => :late,
|
12
|
+
3 => :mac,
|
13
|
+
4 => :eof
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
def reason
|
17
|
+
REASONS[reason_raw_value]
|
18
|
+
end
|
8
19
|
end
|
9
20
|
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rb_mumble_protocol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikhail Odebe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-02-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.21'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.21'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
13
55
|
description: Gem that providing classes for implementing Mumble-related projects.
|
14
56
|
email:
|
15
57
|
- derpiranha@gmail.com
|