summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2014-08-04 19:25:43 -0400
committerjoe <joe@jerkface.net>2014-08-04 19:25:43 -0400
commitf75dc8570a347896093a88e482780d6969488cbf (patch)
treea6eccd7558d6cef4c72927e605563ee51a4d378d
parentd546f22c6ee3d88eca6b01b4e7debae56cfda649 (diff)
Refactored ssh key blob serialization into independent module.
-rw-r--r--SSHKey.hs51
-rw-r--r--kiki.hs37
2 files changed, 57 insertions, 31 deletions
diff --git a/SSHKey.hs b/SSHKey.hs
new file mode 100644
index 0000000..6e92e43
--- /dev/null
+++ b/SSHKey.hs
@@ -0,0 +1,51 @@
1{-# LANGUAGE OverloadedStrings #-}
2module SSHKey where
3
4import qualified Data.ByteString.Lazy.Char8 as L8
5import qualified Data.ByteString.Lazy as L
6import qualified Codec.Binary.Base64 as Base64
7import Data.Binary.Get ( runGet )
8import Data.Binary.Put ( putWord32be, runPut, putByteString )
9import Data.Binary ( get, put )
10import Data.Monoid ( (<>) )
11import Data.Maybe ( fromMaybe, listToMaybe )
12import Data.Char ( isSpace )
13import Control.Monad ( guard )
14import LengthPrefixedBE
15
16type Key = (Integer,Integer)
17
18keyblob :: Key -> L.ByteString
19keyblob (n,e) = "ssh-rsa " <> blob
20 where
21 bs = sshrsa e n
22 blob = L8.pack $ Base64.encode (L.unpack bs)
23
24 sshrsa :: Integer -> Integer -> L.ByteString
25 sshrsa e n = runPut $ do
26 putWord32be 7
27 putByteString "ssh-rsa"
28 put (LengthPrefixedBE e)
29 put (LengthPrefixedBE n)
30
31blobkey :: L8.ByteString -> Key
32blobkey bs = fromMaybe er $ do
33 let (pre,bs1) = L8.splitAt 7 bs
34 guard $ pre == "ssh-rsa"
35 let (sp,bs2) = L8.span isSpace bs1
36 guard $ not (L8.null sp)
37 bs3 <- listToMaybe $ L8.words bs2
38 qq <- L.pack `fmap` Base64.decode (L8.unpack bs3)
39 decode_sshrsa qq
40 where
41 er = error "Unsupported key format"
42
43 decode_sshrsa :: L8.ByteString -> Maybe Key
44 decode_sshrsa bs = do
45 let (pre,bs1) = L8.splitAt 11 bs
46 guard $ pre == runPut (putWord32be 7 >> putByteString "ssh-rsa")
47 let rsakey = flip runGet bs1 $ do
48 LengthPrefixedBE e <- get
49 LengthPrefixedBE n <- get
50 return (n,e)
51 return rsakey
diff --git a/kiki.hs b/kiki.hs
index 9619971..98ac4c7 100644
--- a/kiki.hs
+++ b/kiki.hs
@@ -36,8 +36,6 @@ import qualified Data.ByteString.Lazy as L
36import qualified Data.ByteString.Lazy.Char8 as Char8 36import qualified Data.ByteString.Lazy.Char8 as Char8
37import qualified Data.Map as Map 37import qualified Data.Map as Map
38import Control.Arrow (first,second) 38import Control.Arrow (first,second)
39import Data.Binary.Get (runGet)
40import Data.Binary.Put (putWord32be,runPut,putByteString)
41import Data.Time.Clock.POSIX ( posixSecondsToUTCTime ) 39import Data.Time.Clock.POSIX ( posixSecondsToUTCTime )
42import Data.Monoid ( (<>) ) 40import Data.Monoid ( (<>) )
43 41
@@ -45,12 +43,12 @@ import Data.OpenPGP.Util (verify,fingerprint)
45import ScanningParser 43import ScanningParser
46import PEM 44import PEM
47import DotLock 45import DotLock
48import LengthPrefixedBE
49import KeyRing 46import KeyRing
50import Base58 47import Base58
51import qualified CryptoCoins 48import qualified CryptoCoins
52-- import Chroot 49-- import Chroot
53import ProcessUtils 50import ProcessUtils
51import qualified SSHKey as SSH
54 52
55-- {-# ANN module ("HLint: ignore Eta reduce"::String) #-} 53-- {-# ANN module ("HLint: ignore Eta reduce"::String) #-}
56-- {-# ANN module ("HLint: ignore Use camelCase"::String) #-} 54-- {-# ANN module ("HLint: ignore Use camelCase"::String) #-}
@@ -114,22 +112,6 @@ import ProcessUtils
114 112
115warn str = hPutStrLn stderr str 113warn str = hPutStrLn stderr str
116 114
117sshrsa :: Integer -> Integer -> Char8.ByteString
118sshrsa e n = runPut $ do
119 putWord32be 7
120 putByteString "ssh-rsa"
121 put (LengthPrefixedBE e)
122 put (LengthPrefixedBE n)
123
124decode_sshrsa :: Char8.ByteString -> Maybe RSAPublicKey
125decode_sshrsa bs = do
126 let (pre,bs1) = Char8.splitAt 11 bs
127 guard $ pre == runPut (putWord32be 7 >> putByteString "ssh-rsa")
128 let rsakey = flip runGet bs1 $ do
129 LengthPrefixedBE e <- get
130 LengthPrefixedBE n <- get
131 return $ RSAKey (MPI n) (MPI e)
132 return rsakey
133 115
134isCertificationSig (CertificationSignature {}) = True 116isCertificationSig (CertificationSignature {}) = True
135isCertificationSig _ = True 117isCertificationSig _ = True
@@ -240,16 +222,9 @@ modifyUID other = other
240-} 222-}
241 223
242readPublicKey :: Char8.ByteString -> RSAPublicKey 224readPublicKey :: Char8.ByteString -> RSAPublicKey
243readPublicKey bs = fromMaybe er $ do 225readPublicKey bs = RSAKey (MPI n) (MPI e)
244 let (pre,bs1) = Char8.splitAt 7 bs
245 guard $ pre == "ssh-rsa"
246 let (sp,bs2) = Char8.span isSpace bs1
247 guard $ not (Char8.null sp)
248 bs3 <- listToMaybe $ Char8.words bs2
249 qq <- L.pack `fmap` Base64.decode (Char8.unpack bs3)
250 decode_sshrsa qq
251 where 226 where
252 er = error "Unsupported key format" 227 (n,e) = SSH.blobkey bs
253 228
254-- | Returns the given list with its last element modified. 229-- | Returns the given list with its last element modified.
255toLast :: (x -> x) -> [x] -> [x] 230toLast :: (x -> x) -> [x] -> [x]
@@ -312,9 +287,9 @@ show_ssh' keyspec wkgrip db = do
312 (selectPublicKey s db) 287 (selectPublicKey s db)
313 $ \k -> do 288 $ \k -> do
314 let Just (RSAKey (MPI n) (MPI e)) = rsaKeyFromPacket k 289 let Just (RSAKey (MPI n) (MPI e)) = rsaKeyFromPacket k
315 bs = sshrsa e n 290 bs = SSH.keyblob (n,e)
316 blob = Base64.encode (L.unpack bs) 291 blob = Char8.unpack bs
317 return $ "ssh-rsa " ++ blob 292 return blob
318 293
319show_id keyspec wkgrip db = do 294show_id keyspec wkgrip db = do
320 let s = parseSpec "" keyspec 295 let s = parseSpec "" keyspec