11 Commits

Author SHA1 Message Date
5bf210dc73 test all features
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2020-06-23 19:15:51 +02:00
0a2a054233 fmt
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2020-06-23 19:10:40 +02:00
c358202a3a drone 2020-06-23 19:01:12 +02:00
86649b56aa cleanup 2020-05-07 01:56:14 +02:00
48604d165b response enum 2020-05-06 23:53:00 +02:00
317f5ebdb4 impl get assertion 2020-04-26 17:52:40 +02:00
33229a0b3c impl make credential 2020-04-26 14:24:39 +02:00
9737a006e7 working cbor deserialize 2020-04-25 21:05:30 +02:00
d6b20d0ba4 provide username 2020-04-24 18:52:55 +02:00
857c3cd955 handle map keys in text form 2020-04-24 18:46:05 +02:00
80c175077f fix timeout = None causing an instant timeout err 2020-04-05 22:42:29 +02:00
8 changed files with 1366 additions and 7 deletions

24
.drone.yml Normal file
View File

@@ -0,0 +1,24 @@
kind: pipeline
name: default
steps:
- name: fmt
image: rust:1.43.0
commands:
- rustup component add rustfmt
- cargo fmt --all -- --check
- name: test
image: rust:1.43.0
commands:
- cargo test --all-features
- name: publish
image: rust:1.43.0
environment:
CARGO_REGISTRY_TOKEN:
from_secret: cargo_tkn
commands:
- grep -E 'version ?= ?"${DRONE_TAG}"' -i Cargo.toml || (printf "incorrect crate/tag version" && exit 1)
- cargo package --all-features
- cargo publish --all-features
when:
event: tag

View File

@@ -23,6 +23,10 @@ rust-crypto = "0.2"
csv-core = "0.1.6"
derive_builder = "0.9.0"
crossbeam = { version = "0.7.3", optional = true }
serde_derive = "1.0.106"
serde = "1.0.106"
serde_cbor = "0.11.1"
serde_bytes = "0.11.3"
[dev-dependencies]
crossbeam = "0.7.3"
hex = "0.4.0"

View File

@@ -24,6 +24,7 @@ fn main() -> ctap::FidoResult<()> {
FidoDevice::new(&h).and_then(|mut dev| {
FidoCredentialRequestBuilder::default()
.rp_id(RP_ID)
.user_name("test")
.build()
.unwrap()
.make_credential(&mut dev)

View File

@@ -597,14 +597,45 @@ impl CoseKey {
let mut cose_key = CoseKey::default();
cose_key.algorithm = -7;
for _ in 0..items {
match generic.borrow_mut().i16()? {
0x01 => cose_key.key_type = generic.borrow_mut().u16()?,
0x02 => cose_key.algorithm = generic.borrow_mut().i32()?,
key if key < 0 => {
cose_key.parameters.insert(key, generic.value()?);
match generic.value()? {
Value::Text(value::Text::Text(text)) => match &text[..] {
"type" => {
cose_key.key_type = match generic.value()? {
Value::Text(value::Text::Text(type_)) if &type_ == "public-key" => 0u16,
Value::U16(i) => i,
Value::U8(i) => i.into(),
_ => {
continue;
}
}
}
"alg" => cose_key.algorithm = generic.borrow_mut().i32()?,
_ => continue,
},
val @ Value::I8(_)
| val @ Value::I16(_)
| val @ Value::U16(_)
| val @ Value::U8(_) => {
let int_val = match val {
Value::I8(i) => i as i32,
Value::I16(i) => i as i32,
Value::U8(i) => i as i32,
Value::U16(i) => i as i32,
_ => unreachable!(),
};
match int_val {
0x01 => cose_key.key_type = generic.borrow_mut().u16()?,
0x02 => cose_key.algorithm = generic.borrow_mut().i32()?,
key if key < 0 => {
cose_key.parameters.insert(key as i16, generic.value()?);
}
unknown => {
(unknown, generic.value()?); // skip unknown parameter
}
}
}
_ => {
generic.value()?; // skip unknown parameter
unknown => {
(unknown, generic.value()?); // skip unknown parameter
}
}
}

1279
src/protocol/cbor.rs Normal file

File diff suppressed because it is too large Load Diff

7
src/protocol/error.rs Normal file
View File

@@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Clone, PartialEq, Eq, Debug)]
pub enum ProtocolError {
CborEncode,
CborDecode { data: Vec<u8> },
}

4
src/protocol/mod.rs Normal file
View File

@@ -0,0 +1,4 @@
mod cbor;
mod error;
pub use self::cbor::*;
pub use self::error::*;

9
src/transport/mod.rs Normal file
View File

@@ -0,0 +1,9 @@
use crate::protocol::{CborRequest, CborResponse};
pub trait CtapTransport {
type Error;
fn cbor<'a>(&mut self, command: &CborRequest<'a>) -> Result<CborResponse, Self::Error>;
}
pub enum CtapCommand {}