90 lines
2.8 KiB
Java
90 lines
2.8 KiB
Java
package okio;
|
|
|
|
import java.io.IOException;
|
|
import java.security.InvalidKeyException;
|
|
import java.security.MessageDigest;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import javax.crypto.Mac;
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class HashingSink extends ForwardingSink {
|
|
private final Mac mac;
|
|
private final MessageDigest messageDigest;
|
|
|
|
private HashingSink(Sink sink, String str) {
|
|
super(sink);
|
|
try {
|
|
this.messageDigest = MessageDigest.getInstance(str);
|
|
this.mac = null;
|
|
} catch (NoSuchAlgorithmException unused) {
|
|
throw new AssertionError();
|
|
}
|
|
}
|
|
|
|
public static HashingSink hmacSha1(Sink sink, ByteString byteString) {
|
|
return new HashingSink(sink, byteString, "HmacSHA1");
|
|
}
|
|
|
|
public static HashingSink hmacSha256(Sink sink, ByteString byteString) {
|
|
return new HashingSink(sink, byteString, "HmacSHA256");
|
|
}
|
|
|
|
public static HashingSink hmacSha512(Sink sink, ByteString byteString) {
|
|
return new HashingSink(sink, byteString, "HmacSHA512");
|
|
}
|
|
|
|
public static HashingSink md5(Sink sink) {
|
|
return new HashingSink(sink, "MD5");
|
|
}
|
|
|
|
public static HashingSink sha1(Sink sink) {
|
|
return new HashingSink(sink, "SHA-1");
|
|
}
|
|
|
|
public static HashingSink sha256(Sink sink) {
|
|
return new HashingSink(sink, "SHA-256");
|
|
}
|
|
|
|
public static HashingSink sha512(Sink sink) {
|
|
return new HashingSink(sink, "SHA-512");
|
|
}
|
|
|
|
public ByteString hash() {
|
|
MessageDigest messageDigest = this.messageDigest;
|
|
return ByteString.of(messageDigest != null ? messageDigest.digest() : this.mac.doFinal());
|
|
}
|
|
|
|
@Override // okio.ForwardingSink, okio.Sink
|
|
public void write(Buffer buffer, long j) throws IOException {
|
|
Util.checkOffsetAndCount(buffer.size, 0L, j);
|
|
Segment segment = buffer.head;
|
|
long j2 = 0;
|
|
while (j2 < j) {
|
|
int min = (int) Math.min(j - j2, segment.limit - segment.pos);
|
|
MessageDigest messageDigest = this.messageDigest;
|
|
if (messageDigest != null) {
|
|
messageDigest.update(segment.data, segment.pos, min);
|
|
} else {
|
|
this.mac.update(segment.data, segment.pos, min);
|
|
}
|
|
j2 += min;
|
|
segment = segment.next;
|
|
}
|
|
super.write(buffer, j);
|
|
}
|
|
|
|
private HashingSink(Sink sink, ByteString byteString, String str) {
|
|
super(sink);
|
|
try {
|
|
this.mac = Mac.getInstance(str);
|
|
this.mac.init(new SecretKeySpec(byteString.toByteArray(), str));
|
|
this.messageDigest = null;
|
|
} catch (InvalidKeyException e) {
|
|
throw new IllegalArgumentException(e);
|
|
} catch (NoSuchAlgorithmException unused) {
|
|
throw new AssertionError();
|
|
}
|
|
}
|
|
}
|