@@ -7,16 +7,27 @@ use deno_core::{
77} ;
88use elliptic_curve:: pkcs8:: PrivateKeyInfo ;
99use p256:: pkcs8:: der:: Decode as _;
10- use ring:: signature:: Ed25519KeyPair ;
10+ use ring:: signature:: {
11+ Ed25519KeyPair ,
12+ KeyPair ,
13+ } ;
1114use spki:: {
1215 der:: {
16+ asn1:: BitString ,
1317 AnyRef ,
1418 Decode ,
19+ Encode ,
1520 } ,
1621 SubjectPublicKeyInfo ,
1722} ;
1823
19- use super :: CryptoOps ;
24+ use super :: {
25+ shared:: {
26+ custom_error,
27+ AnyError ,
28+ } ,
29+ CryptoOps ,
30+ } ;
2031
2132// id-Ed25519 OBJECT IDENTIFIER ::= { 1 3 101 112 }
2233pub const ED25519_OID : const_oid:: ObjectIdentifier =
@@ -79,4 +90,46 @@ impl CryptoOps {
7990 }
8091 Some ( pk_info. private_key [ 2 ..] . to_vec ( ) . into ( ) )
8192 }
93+
94+ pub fn export_spki_ed25519 ( pubkey : & [ u8 ] ) -> Result < ToJsBuffer , AnyError > {
95+ let key_info = spki:: SubjectPublicKeyInfo {
96+ algorithm : spki:: AlgorithmIdentifierOwned {
97+ // id-Ed25519
98+ oid : ED25519_OID ,
99+ parameters : None ,
100+ } ,
101+ subject_public_key : BitString :: from_bytes ( pubkey) ?,
102+ } ;
103+ Ok ( key_info
104+ . to_der ( )
105+ . map_err ( |_| custom_error ( "DOMExceptionOperationError" , "Failed to export key" ) ) ?
106+ . into ( ) )
107+ }
108+
109+ pub fn export_pkcs8_ed25519 ( pkey : & [ u8 ] ) -> Result < ToJsBuffer , AnyError > {
110+ // This should probably use OneAsymmetricKey instead
111+ let pk_info = rsa:: pkcs8:: PrivateKeyInfo {
112+ public_key : None ,
113+ algorithm : rsa:: pkcs8:: AlgorithmIdentifierRef {
114+ // id-Ed25519
115+ oid : ED25519_OID ,
116+ parameters : None ,
117+ } ,
118+ private_key : pkey, // OCTET STRING
119+ } ;
120+
121+ let mut buf = Vec :: new ( ) ;
122+ pk_info. encode_to_vec ( & mut buf) ?;
123+ Ok ( buf. into ( ) )
124+ }
125+
126+ // 'x' from Section 2 of RFC 8037
127+ // https://www.rfc-editor.org/rfc/rfc8037#section-2
128+ pub fn jwk_x_ed25519 ( pkey : & [ u8 ] ) -> Result < String , AnyError > {
129+ let pair = Ed25519KeyPair :: from_seed_unchecked ( pkey) . map_err ( |e| anyhow:: anyhow!( e) ) ?;
130+ Ok ( base64:: encode_config (
131+ pair. public_key ( ) . as_ref ( ) ,
132+ base64:: URL_SAFE_NO_PAD ,
133+ ) )
134+ }
82135}
0 commit comments