@@ -7,16 +7,27 @@ use deno_core::{
7
7
} ;
8
8
use elliptic_curve:: pkcs8:: PrivateKeyInfo ;
9
9
use p256:: pkcs8:: der:: Decode as _;
10
- use ring:: signature:: Ed25519KeyPair ;
10
+ use ring:: signature:: {
11
+ Ed25519KeyPair ,
12
+ KeyPair ,
13
+ } ;
11
14
use spki:: {
12
15
der:: {
16
+ asn1:: BitString ,
13
17
AnyRef ,
14
18
Decode ,
19
+ Encode ,
15
20
} ,
16
21
SubjectPublicKeyInfo ,
17
22
} ;
18
23
19
- use super :: CryptoOps ;
24
+ use super :: {
25
+ shared:: {
26
+ custom_error,
27
+ AnyError ,
28
+ } ,
29
+ CryptoOps ,
30
+ } ;
20
31
21
32
// id-Ed25519 OBJECT IDENTIFIER ::= { 1 3 101 112 }
22
33
pub const ED25519_OID : const_oid:: ObjectIdentifier =
@@ -79,4 +90,46 @@ impl CryptoOps {
79
90
}
80
91
Some ( pk_info. private_key [ 2 ..] . to_vec ( ) . into ( ) )
81
92
}
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
+ }
82
135
}
0 commit comments