ssh_dsa.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 93 行

ERL
93
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%%%% Description: dsa public-key sign and verify-module(ssh_dsa).-export([verify/3]).-export([sign/2]).-export([alg_name/0]).-include("ssh.hrl").%% start() ->%%     crypto:start().%% sign_file(File, Opts) ->%%     start(),%%     {ok,Bin} = file:read_file(File),%%     {ok,Key} = ssh_file:private_host_dsa_key(user, Opts),%%     sign(Key, Bin).%% verify_file(File, Sig) ->%%     start(),%%     {ok,Bin} = file:read_file(File),%%     {ok,Key} = ssh_file:public_host_key(user, dsa),%%     verify(Key, Bin, Sig).sign(_Private=#ssh_key { private={P,Q,G,X} },Mb) ->    K = ssh_bits:irandom(160) rem Q,    R = ssh_math:ipow(G, K, P) rem Q,    Ki = ssh_math:invert(K, Q),    <<M:160/big-unsigned-integer>> = crypto:sha(Mb),    S = (Ki * (M + X*R)) rem Q,    <<R:160/big-unsigned-integer, S:160/big-unsigned-integer>>.%% the paramiko client sends a bad sig sometimes, %% instead of crashing, we nicely return error, the%% typcally manifests itself as Sb being 39 bytes%% instead of 40.verify(Public, Mb, Sb) ->    case catch xverify(Public, Mb, Sb) of	{'EXIT', _Reason} ->            %store({Public, Mb, Sb, _Reason}),	    {error, inconsistent_key};	ok ->  	    %store({Public, Mb, Sb, ok})	    ok    end.%% store(Term) ->%%     {ok, Fd} = file:open("/tmp/dsa", [append]),%%     io:format(Fd, "~p~n~n~n", [Term]),%%     file:close(Fd).xverify(_Public=#ssh_key { public={P,Q,G,Y} },Mb,Sb) ->    <<R0:160/big-unsigned-integer, S0:160/big-unsigned-integer>> = Sb,    ?ssh_assert(R0 >= 0 andalso R0 < Q andalso		S0 >= 0 andalso S0 < Q, out_of_range),    W = ssh_math:invert(S0,Q),    <<M0:160/big-unsigned-integer>> = crypto:sha(Mb),    U1 = (M0*W) rem Q,    U2 = (R0*W) rem Q,    T1 = ssh_math:ipow(G,U1,P),    T2 = ssh_math:ipow(Y,U2,P),    V = ((T1*T2) rem P) rem Q,    if V == R0 ->	    ok;       true ->	    {error, inconsistent_key}    end.alg_name() ->    "ssh-dss".

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?