@@ -27,6 +27,54 @@ pub struct CertX509<'a> {
27
27
_marker : marker:: PhantomData < & ' a raw:: git_cert > ,
28
28
}
29
29
30
+ /// The SSH host key type.
31
+ #[ derive( Copy , Clone , Debug ) ]
32
+ #[ non_exhaustive]
33
+ pub enum SshHostKeyType {
34
+ /// Unknown key type
35
+ Unknown = raw:: GIT_CERT_SSH_RAW_TYPE_UNKNOWN as isize ,
36
+ /// RSA key type
37
+ Rsa = raw:: GIT_CERT_SSH_RAW_TYPE_RSA as isize ,
38
+ /// DSS key type
39
+ Dss = raw:: GIT_CERT_SSH_RAW_TYPE_DSS as isize ,
40
+ /// ECDSA 256 key type
41
+ Ecdsa256 = raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256 as isize ,
42
+ /// ECDSA 384 key type
43
+ Ecdsa384 = raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384 as isize ,
44
+ /// ECDSA 521 key type
45
+ Ecdsa521 = raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521 as isize ,
46
+ /// ED25519 key type
47
+ Ed255219 = raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ED25519 as isize ,
48
+ }
49
+
50
+ impl SshHostKeyType {
51
+ /// The name of the key type as encoded in the known_hosts file.
52
+ pub fn name ( & self ) -> & ' static str {
53
+ match self {
54
+ SshHostKeyType :: Unknown => "unknown" ,
55
+ SshHostKeyType :: Rsa => "ssh-rsa" ,
56
+ SshHostKeyType :: Dss => "ssh-dss" ,
57
+ SshHostKeyType :: Ecdsa256 => "ecdsa-sha2-nistp256" ,
58
+ SshHostKeyType :: Ecdsa384 => "ecdsa-sha2-nistp384" ,
59
+ SshHostKeyType :: Ecdsa521 => "ecdsa-sha2-nistp521" ,
60
+ SshHostKeyType :: Ed255219 => "ssh-ed25519" ,
61
+ }
62
+ }
63
+
64
+ /// A short name of the key type, the colloquial form used as a human-readable description.
65
+ pub fn short_name ( & self ) -> & ' static str {
66
+ match self {
67
+ SshHostKeyType :: Unknown => "Unknown" ,
68
+ SshHostKeyType :: Rsa => "RSA" ,
69
+ SshHostKeyType :: Dss => "DSA" ,
70
+ SshHostKeyType :: Ecdsa256 => "ECDSA" ,
71
+ SshHostKeyType :: Ecdsa384 => "ECDSA" ,
72
+ SshHostKeyType :: Ecdsa521 => "ECDSA" ,
73
+ SshHostKeyType :: Ed255219 => "ED25519" ,
74
+ }
75
+ }
76
+ }
77
+
30
78
impl < ' a > Cert < ' a > {
31
79
/// Attempt to view this certificate as an SSH hostkey.
32
80
///
@@ -87,6 +135,39 @@ impl<'a> CertHostkey<'a> {
87
135
}
88
136
}
89
137
}
138
+
139
+ /// Returns the raw host key.
140
+ pub fn hostkey ( & self ) -> Option < & [ u8 ] > {
141
+ unsafe {
142
+ if ( * self . raw ) . kind & raw:: GIT_CERT_SSH_RAW == 0 {
143
+ return None ;
144
+ }
145
+ Some ( slice:: from_raw_parts (
146
+ ( * self . raw ) . hostkey as * const u8 ,
147
+ ( * self . raw ) . hostkey_len as usize ,
148
+ ) )
149
+ }
150
+ }
151
+
152
+ /// Returns the type of the host key.
153
+ pub fn hostkey_type ( & self ) -> Option < SshHostKeyType > {
154
+ unsafe {
155
+ if ( * self . raw ) . kind & raw:: GIT_CERT_SSH_RAW == 0 {
156
+ return None ;
157
+ }
158
+ let t = match ( * self . raw ) . raw_type {
159
+ raw:: GIT_CERT_SSH_RAW_TYPE_UNKNOWN => SshHostKeyType :: Unknown ,
160
+ raw:: GIT_CERT_SSH_RAW_TYPE_RSA => SshHostKeyType :: Rsa ,
161
+ raw:: GIT_CERT_SSH_RAW_TYPE_DSS => SshHostKeyType :: Dss ,
162
+ raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256 => SshHostKeyType :: Ecdsa256 ,
163
+ raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384 => SshHostKeyType :: Ecdsa384 ,
164
+ raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521 => SshHostKeyType :: Ecdsa521 ,
165
+ raw:: GIT_CERT_SSH_RAW_TYPE_KEY_ED25519 => SshHostKeyType :: Ed255219 ,
166
+ t => panic ! ( "unexpected host key type {:?}" , t) ,
167
+ } ;
168
+ Some ( t)
169
+ }
170
+ }
90
171
}
91
172
92
173
impl < ' a > CertX509 < ' a > {
0 commit comments