优化代码
diff --git a/Makefile b/Makefile
index 643a3dc..7a824c5 100644
--- a/Makefile
+++ b/Makefile
@@ -8,8 +8,8 @@
$(CARGO) build --release
android:
- $(CARGO) build --target aarch64-linux-android --release -- -C prefer-dynamic
- $(CARGO) build --target armv7-linux-androideabi --release -- -C prefer-dynamic
+ $(CARGO) build --target aarch64-linux-android --release
+ $(CARGO) build --target armv7-linux-androideabi --release
clean:
$(RM) -rf target
diff --git a/dlqrcode/src/lib.rs b/dlqrcode/src/lib.rs
index fdcad91..a28a70d 100644
--- a/dlqrcode/src/lib.rs
+++ b/dlqrcode/src/lib.rs
@@ -41,11 +41,11 @@
#[allow(dead_code)]
fn new() -> Self {
Self {
- uid: String::from(""),
- cardno: String::from(""),
- cardtype: String::from(""),
- totp: String::from(""),
- nonce: String::from(""),
+ uid: Default::default(),
+ cardno: Default::default(),
+ cardtype: Default::default(),
+ totp: Default::default(),
+ nonce: Default::default(),
sign: Vec::new(),
}
}
@@ -128,31 +128,20 @@
return Err(DecodeError::new("IV size must be 16 bytes"));
}
- let step = if let Some(s) = step { s } else { TOTP_STEP };
-
- let skew = if let Some(s) = skew { s } else { TOTP_SKEW };
-
- let seed = if let Some(s) = seed {
- s
- } else {
- hex::decode("125ea2f97689988b6501").unwrap()
- };
+ let totp_step = step.unwrap_or(TOTP_STEP);
+ let totp_skew = skew.unwrap_or(TOTP_SKEW);
+ let totp_seed = seed.unwrap_or(hex::decode("125ea2f97689988b6501").unwrap());
Ok(Self {
master_key: key,
- iv: iv,
- totp_seed: seed,
- totp_skew: skew,
- totp_step: step,
+ iv,
+ totp_seed,
+ totp_skew,
+ totp_step,
})
}
- pub fn decode(&self, qrcode: *const u8, len: usize, secs_offset: i32) -> Result<DaliQrData> {
- let qrcode = match self.decode_qrcode(qrcode, len) {
- Ok(q) => q,
- Err(e) => return Err(e),
- };
- let mut qr_fields: Vec<Vec<u8>> = Vec::new();
+ fn split_qrdata(&self, qrcode: &Vec<u8>, qrdata: &mut Vec<Vec<u8>>) -> Result<()> {
let v = QR_FIELD_DILIMITER.as_bytes()[0];
let mut j = 0;
for i in 0..qrcode.len() {
@@ -160,7 +149,7 @@
if i > j {
let mut s = Vec::new();
s.extend_from_slice(&qrcode[j..i]);
- qr_fields.push(s);
+ qrdata.push(s);
}
j = i + 1;
}
@@ -168,19 +157,24 @@
if j < qrcode.len() {
let mut s = Vec::new();
s.extend_from_slice(&qrcode[j..]);
- qr_fields.push(s);
+ qrdata.push(s);
}
- let qr_data = match DaliQrData::from_qrcode(&qr_fields) {
- Ok(d) => d,
- Err(e) => return Err(e),
- };
+ Ok(())
+ }
- match self.check_qrcode_sign(&qr_data) {
- Ok(result) if !result => return Err(DecodeError::new("invalidate qrcode")),
- Ok(_) => (),
- Err(e) => return Err(e),
+ pub fn decode(&self, qrcode: *const u8, len: usize, secs_offset: i32) -> Result<DaliQrData> {
+ let qrcode = self.decode_qrcode(qrcode, len)?;
+ let mut qr_fields: Vec<Vec<u8>> = Vec::new();
+
+ self.split_qrdata(&qrcode, &mut qr_fields)?;
+
+ let qr_data = DaliQrData::from_qrcode(&qr_fields)?;
+ if qr_data.uid.len() < 16 {
+ return Err(DecodeError::new("uid must grater than 16"));
}
+ self.check_qrcode_sign(&qr_data)?;
+
let totp = self.new_totp();
let time = self.totp_time(secs_offset);
if totp.check(&qr_data.totp, time) {
@@ -190,12 +184,12 @@
}
}
- fn check_qrcode_sign(&self, qr_data: &DaliQrData) -> Result<bool> {
+ fn check_qrcode_sign(&self, qr_data: &DaliQrData) -> Result<()> {
let sign = self.calc_sign(qr_data);
if qr_data.sign == sign {
- Ok(true)
+ Ok(())
} else {
- Ok(false)
+ Err(DecodeError::new("sign is invalid"))
}
}
@@ -203,7 +197,7 @@
&self,
qrcode: *const u8,
len: usize,
- ) -> std::result::Result<Vec<u8>, DecodeError> {
+ ) -> Result<Vec<u8>> {
let cipher = match Aes256Cbc::new_var(&self.master_key, &self.iv) {
Ok(c) => c,
Err(e) => return Err(DecodeError::new(&format!("aes key error {:?}", e))),
@@ -211,7 +205,6 @@
let qrcode = unsafe {
let s = slice::from_raw_parts(qrcode, len);
- // println!("qr input : {}", String::from_utf8_lossy(s));
if let Ok(code) = base64_url::decode(s) {
code
} else {
@@ -219,10 +212,6 @@
}
};
- if qrcode.len() % 16 != 0 {
- return Err(DecodeError::new("Input data length error"));
- }
-
match cipher.decrypt_vec(&qrcode) {
Ok(data) => Ok(data),
Err(e) => Err(DecodeError::new(&format!("block error {:?}", e))),
@@ -382,7 +371,7 @@
qr_data.cardno = String::from("00001252");
qr_data.cardtype = String::from("80");
- let dali_qrcode = DaliQrCode::new(key, Some(iv), None, None, None).unwrap();
+ let dali_qrcode = DaliQrCode::new(key, Some(iv), Some(60u64), Some(5u8), None).unwrap();
match dali_qrcode.encode(&mut qr_data, 0) {
Ok(qrcode) => {
diff --git a/dlsmk/Cargo.toml b/dlsmk/Cargo.toml
index 76c2eaa..48e7107 100644
--- a/dlsmk/Cargo.toml
+++ b/dlsmk/Cargo.toml
@@ -13,7 +13,7 @@
crate-type = ["cdylib"]
[dependencies]
-jni = "0.18.0"
+jni = { version = "0.18.0", default-features = false }
dlqrcode = { path = "../dlqrcode" }
libc = "0.2.80"
hex = "0.4.2"
diff --git a/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java b/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java
index e9ee765..257ba7b 100644
--- a/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java
+++ b/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java
@@ -6,5 +6,13 @@
static {
System.loadLibrary("dlsmk");
}
- public static native boolean decode(String keyHex,String qrcodeBase64, Long offset, Map<Object, Object> result);
+ /**
+ * @param keyHex - 主密钥, HEX 格式
+ * @param qrcodeBase64 - 二维码数据
+ * @param secsOffset - 市民卡平台与App的时间差,单位秒,可以为负数
+ * @param result - 结果 , key in [cardno, cardtype, error]
+ * @return - true 成功,false 失败
+ */
+ public static native boolean decode(String keyHex,String qrcodeBase64,
+ Long secsOffset, Map<Object, Object> result);
}