rb_mumble_protocol 0.1.1 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '018b963b35ca6d2d984d41e36fccf3fca5462abbf440e35bf97fa024522b18c4'
4
- data.tar.gz: a866d553b02c66764552b94b1e5328ba6f72702c053358cda933e2a39d0c6256
3
+ metadata.gz: 3cb4a478bc0cc5d8928902a1d4905d59182051d8c5666f70b6ae31f393b06d91
4
+ data.tar.gz: 26b9deba5193c57621d82665857702b15c19ba61fa4960983dddecd04cca2b94
5
5
  SHA512:
6
- metadata.gz: 7fd9a9a1063dcb487e8e0a7dd0b0a2c2dcf39b48aecd046661eca1f0ce1b3a96ef228878b052ae0ae29f39d8cad40d80f6542a49b4c499422473507b06c95020
7
- data.tar.gz: e4aebd2af6cfe8a78db205e4f535389515c99b3fa505c58b15f2ac6b0593089e1bd5bef506df7d1674fe8cad7c1f4441f4f77403fa0479c08e758afec9537eb9
6
+ metadata.gz: 397a5909f8ab0cca9fd0c303dc832e8888850811df1228eb0330c0430da1c568367da96d470271b36b243e82b5801ef2aa44e9f4e6b2cdf808659822bda8ccaf
7
+ data.tar.gz: 030e4c96656cbb4ac7f4401275dde69633ac0d0ff648478b62b7409b84f1b957ec37259d4db79f25073d75dc9bd808d96de96bf3d800e536f29fc7cc2185c9f4
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"
@@ -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.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
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.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: 2023-07-23 00:00:00.000000000 Z
11
+ date: 2024-02-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Gem that providing classes for implementing Mumble-related projects.
14
14
  email: