#cose #rfc #serde #format #serialization #8152

serde_cose

COSE (RFC #8152)序列化格式

3个版本

0.1.4 2020年10月26日
0.1.3 2020年10月20日
0.1.0 2020年9月22日

#2032编码


用于 dcc-decode

MIT/Apache

95KB
361

包含(压缩文件,11KB)what-do-i-have.xlsx

Serde COSE


COSE (RFC #8152) 支持 Serde

项目状态

目前serde_cose仅支持解码 ed25519 Sign1 消息。没有计划进行未来的工作,但添加签名格式应该是相当直接的。

用法

将此添加到您的Cargo.toml

serde_cose = "0.1.0"

使用 serde_cose::from_slice 解码COSE消息

use ed25519_dalek::PublicKey;

struct User {
    public_key: ed25519_dalek::PublicKey,
}

fn main() {
    let cose_message = hex::decode("D28445A201270300A10442313154546869732069732074686520636F6E74656E742E58407142FD2FF96D56DB85BEE905A76BA1D0B7321A95C8C4D3607C5781932B7AFB8711497DFA751BF40B58B3BCC32300B1487F3DB34085EEF013BF08F4A44D6FEF0D").unwrap();

    // First decode the `Sign1` message type
    // https://tools.ietf.org/html/rfc8152#section-4.2
    let sign1 = serde_cose::from_slice(&cose_message);

    // Next Lookup the user using the key id (`kid`) field
    // https://tools.ietf.org/html/rfc8152#section-3.1
    let user = lookup_user(&sign1.kid());

    // Convert the users public key into a COSE key
    let key: serde_cose::Key = user.public_key.into();
    
    // Verify the signature
    if key.verify(&sign1) {
        println!("Valid Signature!")
    } else {
        println!("Invalid Signature :(")
    }
}

fn lookup_user(user_id: &[u8]) -> User {
    match std::str::from_utf8(&user_id).unwrap() {
        "11" => User {
            public_key: PublicKey::from_bytes(
                &hex::decode(&"d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a")
                    .unwrap(),
            )
            .unwrap(),
        },
        id => panic!(format!("user {} not found", id)),
    }
}

贡献

想要加入我们吗?查看指南中的 "贡献" 部分 并查看一些这些问题

行为准则

Serde COSE项目遵循 贡献者公约行为准则。这描述了所有贡献者应遵守的最小行为。

许可协议

许可协议为以下之一

任选其一。

贡献

除非您明确表示,否则根据Apache-2.0许可协议定义的,您有意提交的任何贡献,包括在您的工作中,均应按上述方式双许可,不附加任何额外的条款或条件。

依赖项

~3.5MB
~74K SLoC