Kotlin conversion: SessionKey

This commit is contained in:
Paul Schaub 2023-10-31 11:33:15 +01:00
parent 0f5270c28d
commit 567571cf6c
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
2 changed files with 48 additions and 80 deletions

View file

@ -1,80 +0,0 @@
// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package sop;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import sop.util.HexUtil;
public class SessionKey {
private static final Pattern PATTERN = Pattern.compile("^(\\d):([0-9A-F]+)$");
private final byte algorithm;
private final byte[] sessionKey;
public SessionKey(byte algorithm, byte[] sessionKey) {
this.algorithm = algorithm;
this.sessionKey = sessionKey;
}
/**
* Return the symmetric algorithm octet.
*
* @return algorithm id
*/
public byte getAlgorithm() {
return algorithm;
}
/**
* Return the session key.
*
* @return session key
*/
public byte[] getKey() {
return sessionKey;
}
@Override
public int hashCode() {
return getAlgorithm() * 17 + Arrays.hashCode(getKey());
}
@Override
public boolean equals(Object other) {
if (other == null) {
return false;
}
if (this == other) {
return true;
}
if (!(other instanceof SessionKey)) {
return false;
}
SessionKey otherKey = (SessionKey) other;
return getAlgorithm() == otherKey.getAlgorithm() && Arrays.equals(getKey(), otherKey.getKey());
}
public static SessionKey fromString(String string) {
string = string.trim().toUpperCase().replace("\n", "");
Matcher matcher = PATTERN.matcher(string);
if (!matcher.matches()) {
throw new IllegalArgumentException("Provided session key does not match expected format.");
}
byte algorithm = Byte.parseByte(matcher.group(1));
String key = matcher.group(2);
return new SessionKey(algorithm, HexUtil.hexToBytes(key));
}
@Override
public String toString() {
return Integer.toString(getAlgorithm()) + ':' + HexUtil.bytesToHex(sessionKey);
}
}

View file

@ -0,0 +1,48 @@
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package sop
import sop.util.HexUtil
/**
* Class representing a symmetric session key.
*
* @param algorithm symmetric key algorithm ID
* @param key [ByteArray] containing the session key
*/
data class SessionKey(val algorithm: Byte, val key: ByteArray) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as SessionKey
if (algorithm != other.algorithm) return false
if (!key.contentEquals(other.key)) return false
return true
}
override fun hashCode(): Int {
var hashCode = algorithm.toInt()
hashCode = 31 * hashCode + key.contentHashCode()
return hashCode
}
override fun toString(): String = "$algorithm:${HexUtil.bytesToHex(key)}"
companion object {
@JvmStatic private val PATTERN = "^(\\d):([0-9A-F]+)$".toPattern()
@JvmStatic
fun fromString(string: String): SessionKey {
val matcher = PATTERN.matcher(string.trim().uppercase().replace("\n", ""))
require(matcher.matches()) { "Provided session key does not match expected format." }
return SessionKey(matcher.group(1).toByte(), HexUtil.hexToBytes(matcher.group(2)))
}
}
}