enquo-core 0.3.0 → 0.3.0.1.g08acb85

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: '019495fa89d0d738dcc9a233d4184e8d3cf58cdd9c27969e24ca613eb5a02a66'
4
- data.tar.gz: a8ec7915b1a274cacf663914ee7bca2cbda0bcb92ba32dbd8dd45270069fef79
3
+ metadata.gz: ff9be64dbe69ec736b3fc0e0a15c66b499d42136a85ac88d4842f1d7f0938973
4
+ data.tar.gz: 6da855b9be817b0b124542bfc7c051f74436533f1d8696cf1631a58f21fa4ce1
5
5
  SHA512:
6
- metadata.gz: b10d02c6c60da77891c80b1d1d3992dcbf1eb3fa185632e302c72866f23edd92b1da0aa083012dc2a08c1c3d6e9e490239e6856074d8af3c89741061b18b8fd6
7
- data.tar.gz: 413cb390002789a07e1a0a3b5d1785d662ad59c9d96f43a37be0ded27c0240f5b2b96b2685a8954528ab124400d4b7f68f611d1233c4970403c2a5bdcdce7c1b
6
+ metadata.gz: 40ae1e354032b06be568220c48b340dc3fedb8027e66f5c0abc05a871bef5554ad20f87b318b3271dfe9150016219143b7e91ed5ebb749396988129e379792bf
7
+ data.tar.gz: af2fca1a6c1492db7afae290730653da83e69b3b9df9315c764eb6318051e05eb97d595fef2048a1a40e94e5913d012d0497237ca68937a5af0c90344f8e2f27
data/ext/enquo/src/lib.rs CHANGED
@@ -1,8 +1,8 @@
1
1
  #[macro_use]
2
2
  extern crate rutie;
3
3
 
4
- use enquo_core::{Field, Root, I64};
5
- use rutie::{Class, Integer, Module, Object, RString, Symbol, VerifiedObject, VM};
4
+ use enquo_core::{Date, Field, Root, I64};
5
+ use rutie::{AnyObject, Class, Integer, Module, Object, RString, Symbol, VerifiedObject, VM};
6
6
 
7
7
  class!(EnquoRoot);
8
8
  class!(EnquoRootKeyStatic);
@@ -57,7 +57,8 @@ methods!(
57
57
  EnquoRootKeyStatic,
58
58
  _rbself,
59
59
  fn enquo_root_key_static_new(root_key: RString) -> EnquoRootKeyStatic {
60
- let k = root_key.unwrap().to_vec_u8_unchecked();
60
+ #[allow(clippy::redundant_clone)]
61
+ let k = root_key.unwrap().to_vec_u8_unchecked().to_owned();
61
62
  let klass = Module::from_existing("Enquo")
62
63
  .get_nested_class("RootKey")
63
64
  .get_nested_class("Static");
@@ -78,6 +79,8 @@ impl VerifiedObject for EnquoRootKeyStatic {
78
79
  }
79
80
  }
80
81
 
82
+ // rustfmt fucks this so it doesn't compile
83
+ #[rustfmt::skip]
81
84
  methods!(
82
85
  EnquoField,
83
86
  rbself,
@@ -114,6 +117,58 @@ methods!(
114
117
  "Failed to decrypt i64 value",
115
118
  );
116
119
  Integer::from(value)
120
+ },
121
+ fn enquo_field_encrypt_date(
122
+ y_r: Integer,
123
+ m_r: Integer,
124
+ d_r: Integer,
125
+ context: RString,
126
+ mode: Symbol
127
+ ) -> RString {
128
+ let y = y_r.unwrap().to_i32() as i16;
129
+ let m = m_r.unwrap().to_i32() as u8;
130
+ let d = d_r.unwrap().to_i32() as u8;
131
+ let field = rbself.get_data(&*FIELD_WRAPPER);
132
+ let r_mode = mode.unwrap();
133
+ let s_mode = r_mode.to_str();
134
+
135
+ let mut res = maybe_raise(
136
+ if s_mode == "unsafe" {
137
+ Date::new_with_unsafe_parts(
138
+ (y, m, d),
139
+ &context.unwrap().to_vec_u8_unchecked(),
140
+ field,
141
+ )
142
+ } else {
143
+ Date::new((y, m, d), &context.unwrap().to_vec_u8_unchecked(), field)
144
+ },
145
+ "Failed to create encrypted date",
146
+ );
147
+ if s_mode == "no_query" {
148
+ res.drop_ore_ciphertexts();
149
+ }
150
+
151
+ RString::new_utf8(&serde_json::to_string(&res).unwrap())
152
+ },
153
+ fn enquo_field_decrypt_date(ciphertext: RString, context: RString) -> AnyObject {
154
+ let ct_r = ciphertext.unwrap();
155
+ let ct = ct_r.to_str_unchecked();
156
+ let e_value: Date =
157
+ maybe_raise(serde_json::from_str(ct), "Failed to deserialize ciphertext");
158
+
159
+ let field = rbself.get_data(&*FIELD_WRAPPER);
160
+
161
+ let (y, m, d) = maybe_raise(
162
+ e_value.decrypt(&context.unwrap().to_vec_u8_unchecked(), field),
163
+ "Failed to decrypt date value",
164
+ );
165
+ let klass = Class::from_existing("Date");
166
+ let args: [AnyObject; 3] = [
167
+ Integer::from(y as i32).into(),
168
+ Integer::from(m as i32).into(),
169
+ Integer::from(d as i32).into(),
170
+ ];
171
+ klass.protect_send("new", &args).unwrap()
117
172
  }
118
173
  );
119
174
 
@@ -135,6 +190,8 @@ pub extern "C" fn Init_enquo() {
135
190
  .define(|fieldklass| {
136
191
  fieldklass.def_private("_encrypt_i64", enquo_field_encrypt_i64);
137
192
  fieldklass.def_private("_decrypt_i64", enquo_field_decrypt_i64);
193
+ fieldklass.def_private("_encrypt_date", enquo_field_encrypt_date);
194
+ fieldklass.def_private("_decrypt_date", enquo_field_decrypt_date);
138
195
  });
139
196
  topmod.define_nested_module("RootKey").define(|rkmod| {
140
197
  rkmod
data/lib/enquo/field.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require "date"
2
+
1
3
  module Enquo
2
4
  class Field
3
5
  def self.new(*_)
@@ -35,5 +37,37 @@ module Enquo
35
37
 
36
38
  _decrypt_i64(data, ctx)
37
39
  end
40
+
41
+ def encrypt_date(d, ctx, safety: true, no_query: false)
42
+ unless d.is_a?(Date)
43
+ raise ArgumentError, "Enquo::Field#encrypt_date can only encrypt Dates"
44
+ end
45
+
46
+ unless d.year >= -2 ** 15 && d.year < 2 ** 15 - 1
47
+ raise RangeError, "Enquo::Field#encrypt_date can only encrypt dates where the year is between -32,768 and 32,767 (got #{d.year})"
48
+ end
49
+
50
+ unless ctx.is_a?(String)
51
+ raise ArgumentError, "Encryption context must be a string (got a #{ctx.class})"
52
+ end
53
+
54
+ _encrypt_date(d.year, d.month, d.day, ctx, no_query ? :no_query : safety == :unsafe ? :unsafe : :default)
55
+ end
56
+
57
+ def decrypt_date(data, ctx)
58
+ unless data.is_a?(String)
59
+ raise ArgumentError, "Enquo::Field#decrypt_date can only decrypt from a string (got #{data.class})"
60
+ end
61
+
62
+ unless data.encoding == Encoding::UTF_8 && data.valid_encoding?
63
+ raise ArgumentError, "Enquo::Field#decrypt_date can only decrypt validly-encoded UTF-8 strings (got #{data.encoding})"
64
+ end
65
+
66
+ unless ctx.is_a?(String)
67
+ raise ArgumentError, "Encryption context must be a string (got a #{ctx.class})"
68
+ end
69
+
70
+ _decrypt_date(data, ctx)
71
+ end
38
72
  end
39
73
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enquo-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.0.1.g08acb85
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-03 00:00:00.000000000 Z
11
+ date: 2022-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -187,9 +187,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
187
  version: 2.7.0
188
188
  required_rubygems_version: !ruby/object:Gem::Requirement
189
189
  requirements:
190
- - - ">="
190
+ - - ">"
191
191
  - !ruby/object:Gem::Version
192
- version: '0'
192
+ version: 1.3.1
193
193
  requirements: []
194
194
  rubygems_version: 3.1.6
195
195
  signing_key: