From 7742f014feea4dbcd8d812821c099b8ee160164f Mon Sep 17 00:00:00 2001 From: joe Date: Mon, 6 Jan 2014 19:34:44 -0500 Subject: Option --show-ssh (works like --show-pem, but ssh-rsa format). --- LengthPrefixedBE.hs | 5 +++-- kiki.hs | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/LengthPrefixedBE.hs b/LengthPrefixedBE.hs index 9d8472d..dd74fe3 100644 --- a/LengthPrefixedBE.hs +++ b/LengthPrefixedBE.hs @@ -10,6 +10,7 @@ import Control.Monad (when) import Data.Bits import Data.Binary import Data.Binary.Get +import Data.Binary.Put (putWord32be, putLazyByteString) import Data.Int {- @@ -41,8 +42,8 @@ newtype LengthPrefixedBE = LengthPrefixedBE Integer instance Binary LengthPrefixedBE where put (LengthPrefixedBE n) = do - put len - put bytes + putWord32be len + putLazyByteString bytes where bytes = encode_bigendian n len = fromIntegral (L.length bytes) :: Word32 diff --git a/kiki.hs b/kiki.hs index ef8986d..e6bc6f1 100644 --- a/kiki.hs +++ b/kiki.hs @@ -77,7 +77,8 @@ import Text.Printf import qualified CryptoCoins as CryptoCoins import qualified Hosts import Network.Socket -- (SockAddr) - +import LengthPrefixedBE +import Data.Binary.Put (putWord32be,runPut,putByteString) -- instance Default S.ByteString where def = S.empty @@ -218,6 +219,13 @@ instance ASN1Object RSAPrivateKey where fromASN1 _ = Left "fromASN1: RSAPrivateKey: unexpected format" +sshrsa :: Integer -> Integer -> Char8.ByteString +sshrsa e n = runPut $ do + putWord32be 7 + putByteString "ssh-rsa" + put (LengthPrefixedBE e) + put (LengthPrefixedBE n) + rsaKeyFromPacket :: Packet -> Maybe RSAPublicKey rsaKeyFromPacket p@(PublicKeyPacket {}) = do n <- lookup 'n' $ key p @@ -1412,6 +1420,16 @@ show_pem keyspec wkgrip db = do putStrLn $ writePEM "PUBLIC KEY" qq -- ("TODO "++show keyspec) +show_ssh keyspec wkgrip db = do + let s = parseSpec wkgrip keyspec + flip (maybe $ warn (keyspec ++ ": not found") >> return ()) + (selectPublicKey s db) + $ \k -> do + let Just (RSAKey (MPI n) (MPI e)) = rsaKeyFromPacket k + bs = sshrsa e n + blob = Base64.encode (L.unpack bs) + putStrLn $ "ssh-rsa " ++ blob + show_key keyspec wkgrip db = do let s = parseSpec "" keyspec let ps = do @@ -2192,6 +2210,7 @@ main = do , ("--show-all",0) , ("--show-key",1) , ("--show-pem",1) + , ("--show-ssh",1) , ("--show-wip",1) , ("--help",0) ] @@ -2440,6 +2459,7 @@ main = do ,("--show-all",const $ show_all) ,("--show-key",\[x] -> show_key x $ maybe "" id grip) ,("--show-pem",\[x] -> show_pem x $ maybe "" id grip) + ,("--show-ssh",\[x] -> show_ssh x $ maybe "" id grip) ,("--show-wip",\[x] -> show_wip x $ maybe "" id grip) ,("--help", \_ _ ->kiki_usage)] shargs = mapMaybe (\(x:xs) -> (,xs) <$> Map.lookup x shspec) sargs -- cgit v1.2.3