Current section
Files
Jump to
Current section
Files
src/xdr_auth.erl
%% Copyright (c) 2000 Sendmail, Inc. All rights reserved.
%%
%% RCP authentication module
%%
%%
-module(xdr_auth).
-compile([verbose, report_errors, report_warnings, trace]).
-export([public_key/1, common_key/2, get_public_key/1, get_secret_key/1]).
-export([generate_secret_key/0, des_key/1, key_to_hex/1, hex_to_key/1]).
-define(BASE, 3).
-define(MODULUS, 16#d4a0ba0250b6fd2ec626e7efd637df76c716e22d0944b88b).
public_key(Secret) ->
pow(?BASE, Secret, ?MODULUS).
common_key(Public, Secrete) ->
pow(Public, Secrete, ?MODULUS).
get_public_key(User) ->
%% read the public key for the user 'User' from key-file
0.
get_secret_key(ID) ->
%% read the encrypted secret key for user 'User' from key-file
0.
generate_secret_key() ->
lists:foldl(
fun(_, Key) ->
(Key bsl 8) + (rand:uniform(256)-1)
end, 0, lists:seq(1,24)).
%%
%% Generate an 8-byte DES key from a 192 bit key
%%
des_key(Key) ->
des_key(Key bsr 64, 8, Key band 1, []).
des_key(X, 0, _, DKs) -> DKs;
des_key(X, N, P, DKs) ->
des_key(X bsr 8, N-1, P, [((X band 16#ff) bxor P) | DKs]).
%% X^N mod M (Fix better version)
pow(X, 1, M) -> X rem M;
pow(X, N, M) when N band 1 == 1 ->
Y = pow(X, N bsr 1, M),
Y*Y*X rem M;
pow(X, N, M) ->
Y = pow(X, N bsr 1, M),
Y*Y rem M.
key_to_hex(X) ->
key_to_hex(X, 24, []).
key_to_hex(X, 0, Ds) -> Ds;
key_to_hex(X, N, Ds) ->
B = X band 16#ff,
key_to_hex(X bsr 8, N-1, [hex((B bsr 4) band 16#f),hex(B band 16#f)|Ds]).
hex(X) when X < 10 -> X + $0;
hex(X) -> (X-10) + $a.
hex_to_key(Cs) ->
hex_to_key(Cs, 0).
hex_to_key([C|Cs], X) when C >= $0, C =< $9 ->
hex_to_key(Cs, (X bsl 4) + (C-$0));
hex_to_key([C|Cs], X) when C >= $a, C =< $f ->
hex_to_key(Cs, (X bsl 4) + (C-$a)+10);
hex_to_key([C|Cs], X) when C >= $A, C =< $F ->
hex_to_key(Cs, (X bsl 4) + (C-$A)+10);
hex_to_key([], X) -> X.