我正在尝试使用Crypto.Gpgme来检查pgp签名。 我有几个功能:
parseData signedData = do
res <- liftIO $ verifyPlain' "gpghome" (DBL.toStrict signedData) ""
case res of
Left err -> return $ Left $ errorString err
Right ((err, _, fg):xs, msg) -> case errorString err of
"Success" -> return $ Right (fg, msg)
_ -> return $ Left $ errorString err
parseRequest d = do
parsed <- parseData d
case parsed of
Left err -> throw $ UnknownError err
Right (fg, msg) -> return (fg, msg)
从Web.Scotty那里我可以使用(fg, msg) <- parseRequest =<< body
来获取签名密钥的指纹,以及签名的消息(我使用指纹进行身份验证,消息是实际请求)。
该代码不起作用,它是段错误的。 我发现了一些有用的东西:
parseData signedData ctx = do
res <- verifyPlain ctx (DBL.toStrict signedData) ""
case res of
Left err -> return $ Left $ errorString err
Right ((err, _, fg):xs, msg) -> case errorString err of
"Success" -> return $ Right (fg, msg)
_ -> return $ Left $ errorString err
parseRequest d = do
parsed <- liftIO $ withCtx "gpghome" "C" OpenPGP $ parseData d
case parsed of
Left err -> throw $ UnknownError err
Right (fg, msg) -> return (fg, msg)
所以没关系,我猜想errorString出于某种原因访问Ctx,无论如何。 现在我的实际问题是,该代码只能运行一次。如果我尝试两次检查相同的查询,第一个工作正常,第二个给UnknownError“没有公钥”,所以看起来parseRequest得到一个Left没有充分的理由。
我猜测库中有一个错误,它不能在请求之间正确释放某些东西。我尝试在我的主要分配一个ctx,并在任何地方使用那个ctx,但同样的错误。 知道我做错了什么,如果是我的话,或者如果它是图书馆,如何解决或解决它?
由于
答案 0 :(得分:0)
刚刚发现问题,我的代码中的其他地方有一个setCurrentDirectory,路径无效。我猜Ctx必须存储gpghome的路径,而使用SetCurrentDirectory基本上会使Ctx无效。
还存在一个使用verifyPlain导致段错误的错误,但我会在github问题上看到这个错误。