enquo-core 0.3.0 → 0.3.0.1.g08acb85

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: '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: