____ _ _______ __
/ __ \ | /| / / __/ |/ /
/ /_/ / |/ |/ / _// /
\____/|__/|__/___/_||_/
owenclave / app/src/main/java/io/nekohasekai/sagernet/fmt/wireguard/WireGuardBean.java
/******************************************************************************
* Copyright (C) 2021 by nekohasekai *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
******************************************************************************/
package io.nekohasekai.sagernet.fmt.wireguard;
import androidx.annotation.NonNull;
import com.esotericsoftware.kryo.io.ByteBufferInput;
import com.esotericsoftware.kryo.io.ByteBufferOutput;
import org.jetbrains.annotations.NotNull;
import io.nekohasekai.sagernet.fmt.AbstractBean;
import io.nekohasekai.sagernet.fmt.KryoConverters;
public class WireGuardBean extends AbstractBean {
public String localAddress;
public String privateKey;
public String peerPublicKey;
public String peerPreSharedKey;
public Integer mtu;
public String reserved;
public Integer keepaliveInterval;
@Override
public void initializeDefaultValues() {
super.initializeDefaultValues();
if (localAddress == null) localAddress = "";
if (privateKey == null) privateKey = "";
if (peerPublicKey == null) peerPublicKey = "";
if (peerPreSharedKey == null) peerPreSharedKey = "";
// wireguard default mtu
if (mtu == null) mtu = 1420;
if (reserved == null) reserved = "";
if (keepaliveInterval == null) keepaliveInterval = 0;
}
@Override
public void serialize(ByteBufferOutput output) {
output.writeInt(4);
super.serialize(output);
output.writeString(localAddress);
output.writeString(privateKey);
output.writeString(peerPublicKey);
output.writeString(peerPreSharedKey);
output.writeInt(mtu);
output.writeString(reserved);
output.writeInt(keepaliveInterval);
}
@Override
public void deserialize(ByteBufferInput input) {
int version = input.readInt();
super.deserialize(input);
localAddress = input.readString();
privateKey = input.readString();
peerPublicKey = input.readString();
peerPreSharedKey = input.readString();
if (version <= 2) {
// On earlier versions, the code copied from Xray accepts non-standard addresses and keys.
// https://github.com/XTLS/Xray-core/blob/d8934cf83946e88210b6bb95d793bc06e12b6db8/infra/conf/wireguard.go#L75
// https://github.com/XTLS/Xray-core/blob/d8934cf83946e88210b6bb95d793bc06e12b6db8/infra/conf/wireguard.go#L126-L148
if (localAddress.isEmpty()) {
localAddress = "10.0.0.1/32\nfd59:7153:2388:b5fd:0000:0000:0000:0001/128";
}
if (!privateKey.isEmpty()) {
privateKey = String.format("%-44s", privateKey.replace('_', '/').replace('-', '+')).replace(' ', '=');
}
if (!peerPublicKey.isEmpty()) {
peerPublicKey = String.format("%-44s", peerPublicKey.replace('_', '/').replace('-', '+')).replace(' ', '=');
}
if (!peerPreSharedKey.isEmpty()) {
peerPreSharedKey = String.format("%-44s", peerPreSharedKey.replace('_', '/').replace('-', '+')).replace(' ', '=');
}
}
if (version >= 1) {
mtu = input.readInt();
}
if (version >= 2) {
reserved = input.readString();
}
if (version >= 4) {
keepaliveInterval = input.readInt();
}
}
@Override
public void applyFeatureSettings(AbstractBean other) {
if (!(other instanceof WireGuardBean bean)) return;
bean.mtu = mtu;
}
@NotNull
@Override
public WireGuardBean clone() {
return KryoConverters.deserialize(new WireGuardBean(), KryoConverters.serialize(this));
}
public static final Creator CREATOR = new CREATOR<>() {
@NonNull
@Override
public WireGuardBean newInstance() {
return new WireGuardBean();
}
@Override
public WireGuardBean[] newArray(int size) {
return new WireGuardBean[size];
}
};
}