function F(J : Round_Index; X,Y,Z : Word) return Word is
Result: Word; begin if 0 <= J and J <= 15 then Result := X xor Y xor Z; elsif 16 <= J and J <= 31 then Result := (X and Y) or (not X and Z); elsif 32 <= J and J <= 47 then Result := (X ornot Y) xor Z; elsif 48 <= J and J <= 63 then Result := (X and Z) or (Y andnot Z); else Result := X xor (Y ornot Z); endif; return Result; end F;
function K_L(J : Round_Index) return Word is
K: Word; begin if 0 <= J and J <= 15 then K := 16#0000_0000#; elsif 16 <= J and J <= 31 then K := 16#5A82_7999#; elsif 32 <= J and J <= 47 then K := 16#6ED9_EBA1#; elsif 48 <= J and J <= 63 then K := 16#8F1B_BCDC#; else K := 16#A953_FD4E#; endif; return K; end K_L;
function K_R(J : Round_Index) return Word is
K: Word; begin if 0 <= J and J <= 15 then K := 16#50A2_8BE6#; elsif 16 <= J and J <= 31 then K := 16#5C4D_D124#; elsif 32 <= J and J <= 47 then K := 16#6D70_3EF3#; elsif 48 <= J and J <= 63 then K := 16#7A6D_76E9#; else K := 16#0000_0000#; endif; return K; end K_R;
procedure Round(CA, CB, CC, CD, CE : inout Word; X : in Block) is
CLA, CLB, CLC, CLD, CLE, CRA, CRB, CRC, CRD, CRE : Word;
T : Word; begin
CLA := CA;
CLB := CB;
CLC := CC;
CLD := CD;
CLE := CE;
CRA := CA;
CRB := CB;
CRC := CC;
CRD := CD;
CRE := CE; for J in Round_Index range 0..79 loop -- left
T := Wordops.Rotate(S_L(J),
CLA +
F(J, CLB, CLC, CLD) +
X(R_L(J)) +
K_L(J)) +
CLE;
CLA := CLE;
CLE := CLD;
CLD := Wordops.Rotate(10, CLC);
CLC := CLB;
CLB := T; -- right
T := Wordops.Rotate(S_R(J),
CRA +
F(79 - J, CRB, CRC, CRD) +
X(R_R(J)) +
K_R(J)) +
CRE;
CRA := CRE;
CRE := CRD;
CRD := Wordops.Rotate(10, CRC);
CRC := CRB;
CRB := T; --# assert Chain_Pair'(Chain'(CLA, CLB, CLC, CLD, CLE), --# Chain'(CRA, CRB, CRC, CRD, CRE)) = --# steps(Chain_Pair'(Chain'(CA~, CB~, CC~, CD~, CE~), --# Chain'(CA~, CB~, CC~, CD~, CE~)), J + 1, X) --# and CA = CA~ and CB = CB~ and CC = CC~ and CD = CD~ and CE = CE~; endloop;
T := CB + CLC + CRD;
CB := CC + CLD + CRE;
CC := CD + CLE + CRA;
CD := CE + CLA + CRB;
CE := CA + CLB + CRC;
CA := T; end Round;
function Hash(X : Message) return Chain is
CA_Init : constant Word := 16#6745_2301#;
CB_Init : constant Word := 16#EFCD_AB89#;
CC_Init : constant Word := 16#98BA_DCFE#;
CD_Init : constant Word := 16#1032_5476#;
CE_Init : constant Word := 16#C3D2_E1F0#;
CA, CB, CC, CD, CE : Word; begin
CA := CA_Init;
CB := CB_Init;
CC := CC_Init;
CD := CD_Init;
CE := CE_Init; for I in Message_Index range X'First..X'Last loop
Round(CA, CB, CC, CD, CE, X(I)); --# assert Chain'(CA, CB, CC, CD, CE) = rounds( --# Chain'(CA_Init, CB_Init, CC_Init, CD_Init, CE_Init), --# I + 1, --# X); endloop; return Chain'(CA, CB, CC, CD, CE); end Hash;
end RMD;
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.