11use jsonwebtoken:: {
2- Algorithm , DecodingKey , EncodingKey , Header , Validation ,
2+ Algorithm , AlgorithmFamily , DecodingKey , EncodingKey , Error as SigError , Header , Signer ,
3+ Validation , Verifier ,
34 crypto:: { CryptoProvider , JwkUtils , JwtSigner , JwtVerifier } ,
45 decode, encode,
5- errors:: Error ,
6+ errors:: { Error , ErrorKind } ,
67} ;
78use serde:: { Deserialize , Serialize } ;
8- use signature:: { Signer , Verifier } ;
99
1010fn new_signer ( algorithm : & Algorithm , key : & EncodingKey ) -> Result < Box < dyn JwtSigner > , Error > {
1111 let jwt_signer = match algorithm {
12- Algorithm :: EdDSA => Box :: new ( CustomEdDSASigner :: new ( key) ?) as Box < dyn JwtSigner > ,
12+ Algorithm :: EdDSA => Box :: new ( EdDSASigner :: new ( key) ?) as Box < dyn JwtSigner > ,
1313 _ => unimplemented ! ( ) ,
1414 } ;
1515
@@ -18,49 +18,71 @@ fn new_signer(algorithm: &Algorithm, key: &EncodingKey) -> Result<Box<dyn JwtSig
1818
1919fn new_verifier ( algorithm : & Algorithm , key : & DecodingKey ) -> Result < Box < dyn JwtVerifier > , Error > {
2020 let jwt_verifier = match algorithm {
21- Algorithm :: EdDSA => Box :: new ( CustomEdDSAVerifier :: new ( key) ?) as Box < dyn JwtVerifier > ,
21+ Algorithm :: EdDSA => Box :: new ( EdDSAVerifier :: new ( key) ?) as Box < dyn JwtVerifier > ,
2222 _ => unimplemented ! ( ) ,
2323 } ;
2424
2525 Ok ( jwt_verifier)
2626}
2727
28- pub struct CustomEdDSASigner ;
28+ struct EdDSASigner ( botan :: Privkey ) ;
2929
30- impl CustomEdDSASigner {
31- fn new ( _: & EncodingKey ) -> Result < Self , Error > {
32- Ok ( CustomEdDSASigner )
30+ impl EdDSASigner {
31+ fn new ( encoding_key : & EncodingKey ) -> Result < Self , Error > {
32+ if encoding_key. family ( ) != AlgorithmFamily :: Ed {
33+ return Err ( ErrorKind :: InvalidKeyFormat . into ( ) ) ;
34+ }
35+
36+ Ok ( Self (
37+ botan:: Privkey :: load_der ( encoding_key. inner ( ) )
38+ . map_err ( |_| ErrorKind :: InvalidEddsaKey ) ?,
39+ ) )
3340 }
3441}
3542
36- // WARNING: This is obviously not secure at all and should NEVER be done in practice!
37- impl Signer < Vec < u8 > > for CustomEdDSASigner {
38- fn try_sign ( & self , _: & [ u8 ] ) -> Result < Vec < u8 > , signature:: Error > {
39- Ok ( vec ! [ 0 ; 16 ] )
43+ impl Signer < Vec < u8 > > for EdDSASigner {
44+ fn try_sign ( & self , msg : & [ u8 ] ) -> std:: result:: Result < Vec < u8 > , SigError > {
45+ let mut rng = botan:: RandomNumberGenerator :: new_system ( ) . map_err ( SigError :: from_source) ?;
46+ let mut signer = botan:: Signer :: new ( & self . 0 , "Pure" ) . map_err ( SigError :: from_source) ?;
47+ signer. update ( msg) . map_err ( SigError :: from_source) ?;
48+ signer. finish ( & mut rng) . map_err ( SigError :: from_source)
4049 }
4150}
4251
43- impl JwtSigner for CustomEdDSASigner {
52+ impl JwtSigner for EdDSASigner {
4453 fn algorithm ( & self ) -> Algorithm {
4554 Algorithm :: EdDSA
4655 }
4756}
4857
49- pub struct CustomEdDSAVerifier ;
58+ struct EdDSAVerifier ( botan:: Pubkey ) ;
59+
60+ impl EdDSAVerifier {
61+ fn new ( decoding_key : & DecodingKey ) -> Result < Self , Error > {
62+ if decoding_key. family ( ) != AlgorithmFamily :: Ed {
63+ return Err ( ErrorKind :: InvalidKeyFormat . into ( ) ) ;
64+ }
5065
51- impl CustomEdDSAVerifier {
52- fn new ( _: & DecodingKey ) -> Result < Self , Error > {
53- Ok ( CustomEdDSAVerifier )
66+ Ok ( Self (
67+ botan:: Pubkey :: load_ed25519 ( decoding_key. as_bytes ( ) )
68+ . map_err ( |_| ErrorKind :: InvalidEddsaKey ) ?,
69+ ) )
5470 }
5571}
5672
57- impl Verifier < Vec < u8 > > for CustomEdDSAVerifier {
58- fn verify ( & self , _: & [ u8 ] , signature : & Vec < u8 > ) -> Result < ( ) , signature:: Error > {
59- if signature == & vec ! [ 0 ; 16 ] { Ok ( ( ) ) } else { Err ( signature:: Error :: new ( ) ) }
73+ impl Verifier < Vec < u8 > > for EdDSAVerifier {
74+ fn verify ( & self , msg : & [ u8 ] , signature : & Vec < u8 > ) -> std:: result:: Result < ( ) , SigError > {
75+ let mut verifier = botan:: Verifier :: new ( & self . 0 , "Pure" ) . map_err ( SigError :: from_source) ?;
76+ verifier. update ( msg) . map_err ( SigError :: from_source) ?;
77+ verifier
78+ . finish ( signature)
79+ . map_err ( SigError :: from_source) ?
80+ . then_some ( ( ) )
81+ . ok_or ( SigError :: new ( ) )
6082 }
6183}
6284
63- impl JwtVerifier for CustomEdDSAVerifier {
85+ impl JwtVerifier for EdDSAVerifier {
6486 fn algorithm ( & self ) -> Algorithm {
6587 Algorithm :: EdDSA
6688 }
@@ -82,21 +104,30 @@ fn main() {
82104 } ;
83105 my_crypto_provider. install_default ( ) . unwrap ( ) ;
84106
85- // for an actual EdDSA implementation, this would be some private key
86- let key = b"secret" ;
107+ // generate a new key
108+ let ( privkey, pubkey) = {
109+ let key = botan:: Privkey :: create (
110+ "Ed25519" ,
111+ "" ,
112+ & mut botan:: RandomNumberGenerator :: new_system ( ) . unwrap ( ) ,
113+ )
114+ . unwrap ( ) ;
115+ ( key. pem_encode ( ) . unwrap ( ) , key. pubkey ( ) . unwrap ( ) . pem_encode ( ) . unwrap ( ) )
116+ } ;
87117 let my_claims = Claims { sub : "me" . to_owned ( ) , exp : 10000000000 } ;
88118
89119 // our crypto provider only supports EdDSA
90120 let header = Header :: new ( Algorithm :: EdDSA ) ;
91121
92- let token = match encode ( & header, & my_claims, & EncodingKey :: from_ed_der ( key) ) {
93- Ok ( t) => t,
94- Err ( _) => panic ! ( ) , // in practice you would return an error
95- } ;
122+ let token =
123+ match encode ( & header, & my_claims, & EncodingKey :: from_ed_pem ( privkey. as_bytes ( ) ) . unwrap ( ) ) {
124+ Ok ( t) => t,
125+ Err ( _) => panic ! ( ) , // in practice you would return an error
126+ } ;
96127
97128 let claims = match decode :: < Claims > (
98129 token,
99- & DecodingKey :: from_ed_der ( key ) ,
130+ & DecodingKey :: from_ed_pem ( pubkey . as_bytes ( ) ) . unwrap ( ) ,
100131 & Validation :: new ( Algorithm :: EdDSA ) ,
101132 ) {
102133 Ok ( c) => c. claims ,
0 commit comments