LINUX.ORG.RU

кто-нибудь пользуется HsOpenSSL? Почему он мне в SHA-1 возвращает только 15 байт?

 ,


0

1

Допустим у меня сервер получает от клиента его сертификат и хочет посчитать его хэш:

import OpenSSL (withOpenSSL)
import OpenSSL.Session as SSL
import OpenSSL.X509 as X509
import OpenSSL.EVP.Digest as EVP

sslStuff :: SSL.SSL -> IO String
sslStuff ssl = withOpenSSL $ do
  x509   <- liftM fromJust $ SSL.getPeerCertificate ssl
  issuer <- X509.getIssuerName x509 False
  subj   <- X509.getSubjectName x509 False
  putStrLn $ "\tsubject: " ++show subj
  putStrLn $ "\tissuer: " ++show issuer
  dg <- liftM fromJust $ EVP.getDigestByName "SHA1"
  cert <- X509.printX509 x509
  putStrLn cert
  let s = EVP.digest dg cert
  putStrLn $ "After Digest: "++s
  return s

Он мне возвращает строку всего в 15 символов хотя SHA-1 должен вернуть 20 байт. Я не знаю как правильно это сделать, но мне надо сделать то что в openssl называется X509_digest (client_cert, EVP_sha1(), md, &mdlen);

Кто-нибудь подскажет?


Ответ на: комментарий от unC0Rr

какие другие сертификаты? Мне клиент прислал X509 сертификат, он нормальный — сабджект, ишшуер все как надо. X509.printX509 возвращает сертификат в виде строки, там тоже никаких нулевых байтов не, хотя я не уверен что это та строка которую надо дать функции digest. Но в любом случае, для любой строки SHA-1 должен вернуть строку длиной 20, а она только 15.

nokachi
() автор топика

вангую (ночь и мне лень думать), если нужно завтра нормально напишу:

import           Data.ByteString (ByteString)
import qualified Data.ByteString as BS

foreign import ccall unsafe "X509_REQ_digest"
        _X509_digest :: Ptr X509_REQ -> Ptr EVP_PKEY -> Ptr CLen -> IO (Ptr CChar)

digest :: PublicKey key => X509Req -> key -> IO ByteString
digest =
    withX509ReqPtr req  $ \ reqPtr  ->
    withPKeyPtr'   pkey $ \ pkeyPtr ->
    allocaPtr $ \clen ->
        _X509_digest reqPtr pkeyPtr clen >>=
        failIf (==nullPtr) >>= \x ->
        readPtr clen >>= \c ->
        BS.packCStringLen (x,c)

идея: там же написано, что либа не доделана, т.е. нужо добавить функцию

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 2)
Ответ на: комментарий от qnikst

Думаю, справлюсь. На эту уже много зависимостей из других библиотек, так что переходить на tls малореально.

nokachi
() автор топика
Ответ на: комментарий от nokachi

ок, если что могу тоже с этой библиотекой поиграться (если в ближайшее время новых проектов/экзаменов не появится).

qnikst ★★★★★
()

Лол, вот это эпичнейший обсёр! И после этого кто-то будет утверждать, что Цацкель — не игрушечный язык? Только попробовали написать реальную прикладную программу, бац — «либла не доделана, надо дописать функцию» и так далее.

Зато можно двадцатью способами посчитать факториал, а также «переписать стандартную прелюдию так, чтобы по крайней мере все рекурсивные схемы были выражены через комонады», дооо.

anonymous
()
Ответ на: комментарий от anonymous

да фигня это все, дописал функцию за десять минут, ничего там хитрого. Лет через десять будут все либы, а в вашем питоне комонад так и не появится.

nokachi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.