* add AES.java additions + Galois.java

* desc

used ECB and ECBExceptionless instead of seperate interfaces. AESECB done

* Twofish ECB developments, moved some files

* twofishecb done

* Update Factories.java

factories.java topology rewrite 👍

* Update Factories.java

fix whitespace + forgot to add AriaGCM + SerpentGCM

* desc

RC6ECB.java placeholders,
LE32.java

* encblk+decblk funcs

* RC6 done

* desc

- move Camellia to seperate
- create CamelliaECB (it sucks, will fix it more after)

* good fixes!

* Rmv 16bfix (#14)

* progress

some progress was made. next commit will be working on Aria.java (its large so may take some time)

* "invalid config"

* Update Aria.java

potential working!

* bugfix

* Sha224 fix (#15)

* Update SHA224.java

potential fix

* Update pom.xml

tested - works now!
the entire fix was adding * 8L to the padding calculator thing xD

* SHA384 is working

LESGO!

* Create SHA512.java

* Sha512 impl (#16)

* desc
* Update SHA512.java

* Update SHA512.java

oookay a bit of opencode and a lot of time later its solved!
This commit is contained in:
Xiao X
2026-06-19 14:44:12 -04:00
committed by GitHub
parent 91586225c5
commit 24053527b1
30 changed files with 791 additions and 164 deletions
@@ -0,0 +1,117 @@
package de.caydenno1.xacrypto.hash.sha384;
import java.util.Arrays;
import static de.caydenno1.xacrypto.misc.Constants.SHA384_H0;
import static de.caydenno1.xacrypto.misc.Constants.SHA384_K;
import static de.caydenno1.xacrypto.hash.ROT.ROTR64;
import static de.caydenno1.xacrypto.hash.sha256.Hex.Byte2Hex;
public class SHA384 {
// digest
// pad
public static byte[] digest(byte[] mesg) {
long[] h = Arrays.copyOf(SHA384_H0, SHA384_H0.length);
byte[] pd = pad(mesg);
int c = pd.length / 128;
long[] w = new long[80];
for (int blk = 0 ; blk < c ; blk++) {
int base = blk * 128;
for (int t = 0 ; t < 16 ; t++) w[t] = BYTE2LONG(pd, base + t * 8);
for (int t = 16 ; t < 80 ; t ++) {
long s0 = ROTR64(w[t - 15], 1)
^ ROTR64(w[t - 15], 8)
^ (w[t - 15] >>> 7);
long s1 = ROTR64(w[t - 2], 19)
^ ROTR64(w[t - 2], 61)
^ w[t - 2] >>> 6;
w[t] = w[t - 16] + s0 + w[t - 7] + s1;
}
// a = h[0]
// b = h[1]
// c = h[2]
// d = h[3]
// e = h[4]
// f = h[5]
// g = h[6]
// h = h[7]
long[] h0 = Arrays.copyOf(h, h.length);
for (int t = 0 ; t < 80 ; t++) {
long S1 = ROTR64(h[4], 14)
^ ROTR64(h[4], 18)
^ ROTR64(h[4], 41);
long ch = (h[4] & h[5]) ^ (~h[4] & h[6]);
long _0 = h[7] + S1 + ch + SHA384_K[t] + w[t];
long S0 = ROTR64(h[0], 28)
^ ROTR64(h[0], 34)
^ ROTR64(h[0], 39);
long maj = (h[0] & h[1]) ^ (h[0] & h[2]) ^ (h[1] & h[2]);
long _1 = S0 + maj;
h[7] = h[6];
h[6] = h[5];
h[5] = h[4];
h[4] = h[3] + _0;
h[3] = h[2];
h[2] = h[1];
h[1] = h[0];
h[0] = _0 + _1;
}
for (int i = 0 ; i < 8 ; i++) h[i] += h0[i];
}
byte[] res = new byte[48];
for (int i = 0 ; i < 6 ; i++) LONG2BYTE(h[i], res, i*8);
return res;
};
public static byte[] pad(byte[] mesg) {
long MLB = (long) mesg.length * 8L;
int mod = mesg.length % 128;
int pLen;
if (mod < 112) {
pLen = 112 - mod;
} else {
pLen = 240 - mod;
}
byte[] pd = new byte[mesg.length + pLen + 16];
System.arraycopy(mesg, 0, pd, 0, mesg.length);
pd[mesg.length] = (byte) 0x80;
int off = pd.length - 16;
LONG2BYTE(0L, pd, off);
LONG2BYTE(MLB, pd, off + 8);
return pd;
}
private static long BYTE2LONG(byte[] bytes, int off) {
long res = 0;
for (int i = 0 ; i < 8 ; i++) res = (res << 8) | (bytes[off + i] & 0xFFL);
return res;
}
private static void LONG2BYTE(long val, byte[] bytes, int off) {
for (int i = 7 ; i >= 0 ; i--) {
bytes[off + i] = (byte) (val & 0xFF);
val >>>= 8;
}
}
}