rb_mumble_protocol 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '018b963b35ca6d2d984d41e36fccf3fca5462abbf440e35bf97fa024522b18c4'
4
- data.tar.gz: a866d553b02c66764552b94b1e5328ba6f72702c053358cda933e2a39d0c6256
3
+ metadata.gz: e6cca0049d733675e76feeb5e9b480a5659167d2f474f199b21084f98528ab14
4
+ data.tar.gz: 7e4dba7a96babe8076628d53a30890629862c305630e16d02670b307cf110afb
5
5
  SHA512:
6
- metadata.gz: 7fd9a9a1063dcb487e8e0a7dd0b0a2c2dcf39b48aecd046661eca1f0ce1b3a96ef228878b052ae0ae29f39d8cad40d80f6542a49b4c499422473507b06c95020
7
- data.tar.gz: e4aebd2af6cfe8a78db205e4f535389515c99b3fa505c58b15f2ac6b0593089e1bd5bef506df7d1674fe8cad7c1f4441f4f77403fa0479c08e758afec9537eb9
6
+ metadata.gz: 28ee61c56fc114226de2f8aca41b8b8ad75fdd9d3c6bd4c2fea94e235dbc8f5d83f8dde716b113a12b5b307401d7a750c2afc3e7b0f22a834b7d347cb89a4cbb
7
+ data.tar.gz: b28c087c5ed16fe69d5e6b07d24bd3d0f95e7b8224974ef3c0d346ff90c9fcb8d10c8a2b53cb9559d4ce52f03a585ccc7db21183e506d660e6b0678c36597df4
data/Cargo.lock CHANGED
@@ -13,22 +13,22 @@ dependencies = [
13
13
 
14
14
  [[package]]
15
15
  name = "bindgen"
16
- version = "0.62.0"
16
+ version = "0.69.4"
17
17
  source = "registry+https://github.com/rust-lang/crates.io-index"
18
- checksum = "c6720a8b7b2d39dd533285ed438d458f65b31b5c257e6ac7bb3d7e82844dd722"
18
+ checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0"
19
19
  dependencies = [
20
- "bitflags",
20
+ "bitflags 2.4.2",
21
21
  "cexpr",
22
22
  "clang-sys",
23
+ "itertools",
23
24
  "lazy_static",
24
25
  "lazycell",
25
- "peeking_take_while",
26
26
  "proc-macro2",
27
27
  "quote",
28
28
  "regex",
29
29
  "rustc-hash",
30
30
  "shlex",
31
- "syn 1.0.109",
31
+ "syn",
32
32
  ]
33
33
 
34
34
  [[package]]
@@ -37,6 +37,12 @@ version = "1.3.2"
37
37
  source = "registry+https://github.com/rust-lang/crates.io-index"
38
38
  checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
39
39
 
40
+ [[package]]
41
+ name = "bitflags"
42
+ version = "2.4.2"
43
+ source = "registry+https://github.com/rust-lang/crates.io-index"
44
+ checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
45
+
40
46
  [[package]]
41
47
  name = "bytes"
42
48
  version = "1.4.0"
@@ -75,6 +81,12 @@ dependencies = [
75
81
  "libloading",
76
82
  ]
77
83
 
84
+ [[package]]
85
+ name = "either"
86
+ version = "1.9.0"
87
+ source = "registry+https://github.com/rust-lang/crates.io-index"
88
+ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
89
+
78
90
  [[package]]
79
91
  name = "foreign-types"
80
92
  version = "0.3.2"
@@ -96,6 +108,15 @@ version = "0.3.1"
96
108
  source = "registry+https://github.com/rust-lang/crates.io-index"
97
109
  checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
98
110
 
111
+ [[package]]
112
+ name = "itertools"
113
+ version = "0.12.1"
114
+ source = "registry+https://github.com/rust-lang/crates.io-index"
115
+ checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
116
+ dependencies = [
117
+ "either",
118
+ ]
119
+
99
120
  [[package]]
100
121
  name = "lazy_static"
101
122
  version = "1.4.0"
@@ -126,24 +147,25 @@ dependencies = [
126
147
 
127
148
  [[package]]
128
149
  name = "magnus"
129
- version = "0.4.4"
150
+ version = "0.6.2"
130
151
  source = "registry+https://github.com/rust-lang/crates.io-index"
131
- checksum = "fc87660cd7daa49fddbfd524c836de54d5c927d520cd163f43700c5087c57d6c"
152
+ checksum = "4778544796676e8428e9c622460ebf284bea52d8b10db3aeb449d8b5e61b3a13"
132
153
  dependencies = [
133
154
  "magnus-macros",
134
155
  "rb-sys",
135
156
  "rb-sys-env",
157
+ "seq-macro",
136
158
  ]
137
159
 
138
160
  [[package]]
139
161
  name = "magnus-macros"
140
- version = "0.3.0"
162
+ version = "0.6.0"
141
163
  source = "registry+https://github.com/rust-lang/crates.io-index"
142
- checksum = "206cb23bfeea05180c97522ef6a3e52a4eb17b0ed2f30ee3ca9c4f994d2378ae"
164
+ checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3"
143
165
  dependencies = [
144
166
  "proc-macro2",
145
167
  "quote",
146
- "syn 1.0.109",
168
+ "syn",
147
169
  ]
148
170
 
149
171
  [[package]]
@@ -180,7 +202,7 @@ version = "0.10.55"
180
202
  source = "registry+https://github.com/rust-lang/crates.io-index"
181
203
  checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d"
182
204
  dependencies = [
183
- "bitflags",
205
+ "bitflags 1.3.2",
184
206
  "cfg-if",
185
207
  "foreign-types",
186
208
  "libc",
@@ -197,7 +219,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
197
219
  dependencies = [
198
220
  "proc-macro2",
199
221
  "quote",
200
- "syn 2.0.27",
222
+ "syn",
201
223
  ]
202
224
 
203
225
  [[package]]
@@ -212,12 +234,6 @@ dependencies = [
212
234
  "vcpkg",
213
235
  ]
214
236
 
215
- [[package]]
216
- name = "peeking_take_while"
217
- version = "0.1.2"
218
- source = "registry+https://github.com/rust-lang/crates.io-index"
219
- checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
220
-
221
237
  [[package]]
222
238
  name = "pkg-config"
223
239
  version = "0.3.27"
@@ -244,18 +260,18 @@ dependencies = [
244
260
 
245
261
  [[package]]
246
262
  name = "rb-sys"
247
- version = "0.9.79"
263
+ version = "0.9.87"
248
264
  source = "registry+https://github.com/rust-lang/crates.io-index"
249
- checksum = "939fb78db3e4f26665c1d4c7b91ca66d3578335a19aba552d4a6445811d07072"
265
+ checksum = "225103e3d69bbfe8831f9fd0d2461335f3a9dd06aa6e88bcb6d6970383494d06"
250
266
  dependencies = [
251
267
  "rb-sys-build",
252
268
  ]
253
269
 
254
270
  [[package]]
255
271
  name = "rb-sys-build"
256
- version = "0.9.79"
272
+ version = "0.9.87"
257
273
  source = "registry+https://github.com/rust-lang/crates.io-index"
258
- checksum = "335a95eb0420d52fa94ef12019df3c2c250c6b19cbb3c60bd05cb7e9c362072c"
274
+ checksum = "bacce8095a5167d5ede618bbd9353e9d9e2f32ddaf54be911106f0ee6baacf09"
259
275
  dependencies = [
260
276
  "bindgen",
261
277
  "lazy_static",
@@ -263,7 +279,7 @@ dependencies = [
263
279
  "quote",
264
280
  "regex",
265
281
  "shell-words",
266
- "syn 1.0.109",
282
+ "syn",
267
283
  ]
268
284
 
269
285
  [[package]]
@@ -274,7 +290,7 @@ checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
274
290
 
275
291
  [[package]]
276
292
  name = "rb_mumble_protocol"
277
- version = "0.1.0"
293
+ version = "0.2.0"
278
294
  dependencies = [
279
295
  "bytes",
280
296
  "magnus",
@@ -316,6 +332,12 @@ version = "1.1.0"
316
332
  source = "registry+https://github.com/rust-lang/crates.io-index"
317
333
  checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
318
334
 
335
+ [[package]]
336
+ name = "seq-macro"
337
+ version = "0.3.5"
338
+ source = "registry+https://github.com/rust-lang/crates.io-index"
339
+ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
340
+
319
341
  [[package]]
320
342
  name = "shell-words"
321
343
  version = "1.1.0"
@@ -328,17 +350,6 @@ version = "1.1.0"
328
350
  source = "registry+https://github.com/rust-lang/crates.io-index"
329
351
  checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
330
352
 
331
- [[package]]
332
- name = "syn"
333
- version = "1.0.109"
334
- source = "registry+https://github.com/rust-lang/crates.io-index"
335
- checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
336
- dependencies = [
337
- "proc-macro2",
338
- "quote",
339
- "unicode-ident",
340
- ]
341
-
342
353
  [[package]]
343
354
  name = "syn"
344
355
  version = "2.0.27"
data/Cargo.toml CHANGED
@@ -4,4 +4,4 @@
4
4
 
5
5
  [workspace]
6
6
  members = ["./ext/rb_mumble_protocol"]
7
- # resolver = "2"
7
+ resolver = "1"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rb_mumble_protocol"
3
- version = "0.1.0"
3
+ version = "0.2.0"
4
4
  edition = "2021"
5
5
  authors = ["Mikhail Odebe <derpiranha@gmail.com>"]
6
6
  publish = false
@@ -9,6 +9,6 @@ publish = false
9
9
  crate-type = ["cdylib"]
10
10
 
11
11
  [dependencies]
12
- magnus = { version = "0.4" }
12
+ magnus = { version = "0.6" }
13
13
  bytes = "1.0"
14
14
  openssl = { version = "0.10" }
@@ -3,15 +3,31 @@ use std::cell::RefCell;
3
3
  use magnus::{
4
4
  class, define_module,
5
5
  method, function, prelude::*,
6
- Error, RHash,
7
- value::{QTRUE, QFALSE}, Value
6
+ Error, RHash, RModule, Ruby,
7
+ value::{Lazy},
8
+ exception::ExceptionClass,
9
+ gc::register_mark_object,
8
10
  };
9
11
 
10
12
  use bytes::BytesMut;
11
13
 
14
+ static BASE_ERROR: Lazy<ExceptionClass> = Lazy::new(|ruby| {
15
+ let ex = ruby
16
+ .class_object()
17
+ .const_get::<_, RModule>("RbMumbleProtocol")
18
+ .unwrap()
19
+ .const_get("Error")
20
+ .unwrap();
21
+
22
+ // ensure `ex` is never garbage collected (e.g. if constant is
23
+ // redefined) and also not moved under compacting GC.
24
+ register_mark_object(ex);
25
+ ex
26
+ });
27
+
12
28
  pub mod crypt_state;
13
29
 
14
- #[magnus::wrap(class = "RbMumbleProtocol::CryptState", free_immediatly, size)]
30
+ #[magnus::wrap(class = "RbMumbleProtocol::CryptState")]
15
31
  struct CryptStateRef(RefCell<crypt_state::CryptState>);
16
32
 
17
33
  impl CryptStateRef {
@@ -48,43 +64,88 @@ impl CryptStateRef {
48
64
  Self(RefCell::new(new_state))
49
65
  }
50
66
 
51
- pub fn key(&self) -> Vec<u8> { self.0.try_borrow_mut().unwrap().get_key().to_vec() }
52
- pub fn encrypt_nonce(&self) -> Vec<u8> { self.0.try_borrow_mut().unwrap().get_encrypt_nonce().to_vec() }
53
- pub fn decrypt_nonce(&self) -> Vec<u8> { self.0.try_borrow_mut().unwrap().get_decrypt_nonce().to_vec() }
54
-
55
- pub fn stats(&self) -> RHash {
56
- let hash = RHash::new();
57
- let state = self.0.try_borrow_mut().unwrap();
67
+ pub fn key(&self) -> Result<Vec<u8>, Error> {
68
+ match self.0.try_borrow() {
69
+ Ok(ref_) => { Ok(ref_.get_key().to_vec()) },
70
+ Err(_e) => { Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error")) }
71
+ }
72
+ }
58
73
 
59
- let _ = hash.aset("good", state.get_good());
60
- let _ = hash.aset("late", state.get_late());
61
- let _ = hash.aset("lost", state.get_lost());
74
+ pub fn encrypt_nonce(&self) -> Result<Vec<u8>, Error> {
75
+ match self.0.try_borrow() {
76
+ Ok(ref_) => { Ok(ref_.get_encrypt_nonce().to_vec()) },
77
+ Err(_e) => { Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error")) }
78
+ }
79
+ }
62
80
 
63
- hash
81
+ pub fn decrypt_nonce(&self) -> Result<Vec<u8>, Error> {
82
+ match self.0.try_borrow() {
83
+ Ok(ref_) => { Ok(ref_.get_decrypt_nonce().to_vec()) },
84
+ Err(_e) => { Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error")) }
85
+ }
64
86
  }
65
87
 
66
- pub fn encrypt(&self, src: Vec<u8>) -> Vec<u8> {
67
- let mut buffer = BytesMut::new();
88
+ pub fn stats(&self) -> Result<RHash, Error> {
89
+ match self.0.try_borrow() {
90
+ Ok(state) => {
91
+ let hash = RHash::new();
68
92
 
69
- self.0.try_borrow_mut().unwrap().encrypt(src, &mut buffer);
93
+ let _ = hash.aset("good", state.get_good());
94
+ let _ = hash.aset("late", state.get_late());
95
+ let _ = hash.aset("lost", state.get_lost());
70
96
 
71
- buffer.to_vec()
97
+ Ok(hash)
98
+ },
99
+ Err(_e) => {
100
+ Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error"))
101
+ }
102
+ }
72
103
  }
73
104
 
74
- pub fn decrypt(&self, encrypted: Vec<u8>) -> (Value, Vec<u8>) {
75
- let mut buffer = BytesMut::new();
76
- buffer.extend_from_slice(&encrypted);
105
+ pub fn encrypt(&self, src: Vec<u8>) -> Result<Vec<u8>, Error> {
106
+ match self.0.try_borrow_mut() {
107
+ Ok(mut state) => {
108
+ let mut buffer = BytesMut::new();
109
+ state.encrypt(src, &mut buffer);
77
110
 
78
- let result = self.0.try_borrow_mut().unwrap().decrypt(&mut buffer);
111
+ Ok(buffer.to_vec())
112
+ },
113
+ Err(_e) => { Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error")) }
114
+ }
115
+ }
79
116
 
80
- // TODO: raise error
81
- match result {
82
- Ok(_) => (*QTRUE, buffer.to_vec()),
83
- Err(_) => (*QFALSE, vec![]),
117
+ pub fn decrypt(&self, encrypted: Vec<u8>) -> Result<Vec<u8>, Error> {
118
+ match self.0.try_borrow_mut() {
119
+ Ok(mut state) => {
120
+ let mut buffer = BytesMut::new();
121
+ buffer.extend_from_slice(&encrypted);
122
+
123
+ match state.decrypt(&mut buffer) {
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
+ }
138
+ },
139
+ Err(_e) => { Err(Error::new(get_ruby().get_inner(&BASE_ERROR), "borrow error")) }
84
140
  }
85
141
  }
86
142
  }
87
143
 
144
+ #[inline]
145
+ fn get_ruby() -> Ruby {
146
+ unsafe { Ruby::get_unchecked() }
147
+ }
148
+
88
149
  #[magnus::init]
89
150
  fn init() -> Result<(), Error> {
90
151
  let module = define_module("RbMumbleProtocol")?;
@@ -103,20 +164,3 @@ fn init() -> Result<(), Error> {
103
164
 
104
165
  Ok(())
105
166
  }
106
-
107
- #[test]
108
- fn encrypt_and_decrypt_are_inverse() {
109
- let server_state = CryptStateRef::new();
110
- // swap nonce vectors side to side
111
- let client_state = CryptStateRef::new_from(
112
- server_state.key(),
113
- server_state.decrypt_nonce(),
114
- server_state.encrypt_nonce()
115
- );
116
-
117
- let src= "test".as_bytes().to_vec();
118
- let encrypted= server_state.encrypt(src.clone());
119
- let result= client_state.decrypt(encrypted.clone());
120
-
121
- assert_eq!(src, result);
122
- }
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RbMumbleProtocol
4
+ class Error < StandardError
5
+ end
6
+
4
7
  class CryptState
5
8
  end
6
9
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RbMumbleProtocol
4
- VERSION = "0.1.1"
4
+ VERSION = "0.2.1"
5
5
  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.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Odebe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-23 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2024-02-09 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