crypto:dss_sign() fails with bad argument

Kaiduan Xie kaiduanx@REDACTED
Sat May 8 01:18:09 CEST 2010


Hi,

I am playing with erlang's crypto module for DSS sign/verification,
and encountered the following failure,

kaiduanx@REDACTED:~/test$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe]
[kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> {ok, [Key1]} = public_key:pem_to_der("./privkey.pem").
{ok,[{dsa_private_key,<<48,130,3,61,2,1,0,2,130,1,1,0,130,
                        155,217,13,154,35,30,61,35,193,
                        177,89,...>>,
                      not_encrypted}]}
2> {ok, DSAPrivKey} = public_key:decode_private_key(Key1).
{ok,{'DSAPrivateKey',0,

16487831091520780258476244829269954905068453299919937468122754367555025389255228167104813916584427117132491697333745898571447582288126735030379964082170022817274086858448078061001221776403199146387597678984540700662102497749323871708629057309007645527617512892347216241068519054813731565592382595863130859729188869666097096597640296820469239977991443749290028015703576616678053020176398097226185345390078018458880065671569994747328759201284973167049924181380228215122295761433727402740292339377060448621018652887515687347119246401586369278290721630262294672892581614282203303348001277520129700110248972612083036183823,
                     1069445346270440656593824092073657983328499138457,

7214566675159847510543550105259613160453301579561623377843203423614163319395145087833198636004278609701319277802567885081948001327800441061451495445964179176778711411229815801134094069049261847343045298683209010702015484647378262734006939008757875094544682692811028223303902447231625138361611541322285116859770078463180719920891946211261933346941519603064902060705607105259990741513856339667300139111109012511141655066131159463312192937454414940901992301247028509228326669147276129260865537192028595304014436739105124361395299086087865530512935899515885409929656072537826761802885019421821204505764703508239164324041,

7633100674515027235650509950891694304003982881440195652180376335259908594946224965667327027587338158513959931360517774019595393102978917235479651037021972646784210191530035858681332371458695842841098509902898010434270664893194727388258476377361344595538044057461379480170807524999310663741254536687833627343418977980237734999549443057990979136155378902597245536582084684912096597468826612905623557372778470587564770314993903695513057146844763692020381754294541184291650680501093631643506634398260717309523197216269415879496293970907691201898118313013181084633883085546050181063797462116224600567526013743839898981226,
                     495667775549172824486294937719319801999514557700}}
3> {_, 0, P, Q, G, Y, X} = DSAPrivKey.
{'DSAPrivateKey',0,

16487831091520780258476244829269954905068453299919937468122754367555025389255228167104813916584427117132491697333745898571447582288126735030379964082170022817274086858448078061001221776403199146387597678984540700662102497749323871708629057309007645527617512892347216241068519054813731565592382595863130859729188869666097096597640296820469239977991443749290028015703576616678053020176398097226185345390078018458880065671569994747328759201284973167049924181380228215122295761433727402740292339377060448621018652887515687347119246401586369278290721630262294672892581614282203303348001277520129700110248972612083036183823,
                 1069445346270440656593824092073657983328499138457,

7214566675159847510543550105259613160453301579561623377843203423614163319395145087833198636004278609701319277802567885081948001327800441061451495445964179176778711411229815801134094069049261847343045298683209010702015484647378262734006939008757875094544682692811028223303902447231625138361611541322285116859770078463180719920891946211261933346941519603064902060705607105259990741513856339667300139111109012511141655066131159463312192937454414940901992301247028509228326669147276129260865537192028595304014436739105124361395299086087865530512935899515885409929656072537826761802885019421821204505764703508239164324041,

7633100674515027235650509950891694304003982881440195652180376335259908594946224965667327027587338158513959931360517774019595393102978917235479651037021972646784210191530035858681332371458695842841098509902898010434270664893194727388258476377361344595538044057461379480170807524999310663741254536687833627343418977980237734999549443057990979136155378902597245536582084684912096597468826612905623557372778470587564770314993903695513057146844763692020381754294541184291650680501093631643506634398260717309523197216269415879496293970907691201898118313013181084633883085546050181063797462116224600567526013743839898981226,
                 495667775549172824486294937719319801999514557700}
4>
4> crypto:start().
ok
5> crypto:dss_sign(list_to_binary("Welcome to erlang land"),
[crypto:mpint(P), crypto:mpint(Q), crypto:mpint(G), crypto:mpint(X)]).
** exception error: bad argument
     in function  port_control/3
        called as port_control(crypto_drv02,38,
                               [<<"Welcome to erlang land">>,
                                [<<0,0,1,1,0,130,155,217,13,154,35,30,61,35,
                                   193,177,89,67,155,111,87,191,198,...>>,
                                 <<0,0,0,21,0,187,83,150,127,162,157,203,222,
                                   11,119,150,240,120,83,23,248,64,...>>,
                                 <<0,0,1,0,57,38,127,21,93,84,216,239,141,178,
                                   131,95,23,15,1,197,166,...>>,
                                 <<0,0,0,20,86,210,131,3,27,84,85,4,140,24,
                                   92,36,218,245,126,21,...>>]])
     in call from crypto:control/2
     in call from crypto:dss_sign/2
6> crypto:dss_sign(list_to_binary("Welcome to erlang land"), [P, Q, G,
X]).     ** exception error: bad argument
     in function  port_control/3
        called as port_control(crypto_drv02,38,
                               [<<"Welcome to erlang land">>,

[16487831091520780258476244829269954905068453299919937468122754367555025389255228167104813916584427117132491697333745898571447582288126735030379964082170022817274086858448078061001221776403199146387597678984540700662102497749323871708629057309007645527617512892347216241068519054813731565592382595863130859729188869666097096597640296820469239977991443749290028015703576616678053020176398097226185345390078018458880065671569994747328759201284973167049924181380228215122295761433727402740292339377060448621018652887515687347119246401586369278290721630262294672892581614282203303348001277520129700110248972612083036183823,

1069445346270440656593824092073657983328499138457,

7214566675159847510543550105259613160453301579561623377843203423614163319395145087833198636004278609701319277802567885081948001327800441061451495445964179176778711411229815801134094069049261847343045298683209010702015484647378262734006939008757875094544682692811028223303902447231625138361611541322285116859770078463180719920891946211261933346941519603064902060705607105259990741513856339667300139111109012511141655066131159463312192937454414940901992301247028509228326669147276129260865537192028595304014436739105124361395299086087865530512935899515885409929656072537826761802885019421821204505764703508239164324041,

495667775549172824486294937719319801999514557700]])
     in call from crypto:control/2
     in call from crypto:dss_sign/2
7>

9> crypto:info_lib().
[{<<"OpenSSL">>,9470079,<<"OpenSSL 0.9.8g 19 Oct 2007">>}]

The privkey.pem is generated by openssl as below,
openssl dsaparam -out dsaparam.pem 2048
openssl gendsa -out privkey.pem dsaparam.pem

Can someone point out what is going wrong? Thanks for help,

Kaiduan


More information about the erlang-questions mailing list