{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE OverloadedStrings #-}

module Network.Octohat.Keys (fingerprintFor) where

import qualified Data.List as L
import qualified Data.ByteString.Base64 as B64
import qualified Data.ByteString.Base16 as B16
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Crypto.Hash.MD5 as MD5 -- eww

import Network.Octohat.Types

type RSAPublicKey = T.Text
type Fingerprint  = T.Text

-- | Computes a fingerprint from its Base 64 encoded representation. Assumes leading @ssh-rsa @ (mind the space)
--   prefix and no user@hostname suffix
fingerprintFor :: PublicKey -> PublicKeyFingerprint
fingerprintFor PublicKey{..} = PublicKeyFingerprint publicKeyId (digestToHex publicKey)

digestToHex :: RSAPublicKey -> Fingerprint
digestToHex = T.concat          .
              L.intersperse ":" .
              T.chunksOf 2      .
              T.toLower         .
              TE.decodeUtf8     .
              B16.encode        .
              MD5.hash          .
              B64.decodeLenient .
              TE.encodeUtf8     .
              T.replace "ssh-rsa " ""