All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bdware.dogp.codec.DOGPMessageToEnvelop Maven / Gradle / Ivy

There is a newer version: 1.5.4
Show newest version
package org.bdware.dogp.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bdware.doip.codec.MessageEnvelopeCodec;
import org.bdware.doip.codec.doipMessage.MessageEnvelope;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.Blake2sDigest;

import java.nio.charset.StandardCharsets;
import java.util.List;

//USED In DoipClient And DoipServer
public class DOGPMessageToEnvelop extends MessageToMessageCodec {
    static Logger LOGGER = LogManager.getLogger(DOGPMessageToEnvelop.class);
    private final boolean accordToDOGPSender;

    public DOGPMessageToEnvelop(boolean accordToDOGPSender) {
        this.accordToDOGPSender = accordToDOGPSender;
    }

    @Override
    protected void encode(ChannelHandlerContext ctx, MessageEnvelope msg, List out) {
        try {
            String cachedID = msg.cachedID;
            String spaceName = null;
            String originalID = cachedID;
            int pos = cachedID.indexOf(':');
            if (pos < 0) {
                spaceName = "irp";
            } else {
                spaceName = cachedID.substring(0, pos);
                originalID = cachedID.substring(pos + 1);
            }
            DOGPMessage dogpMessage = new DOGPMessage(msg.getSender());
            dogpMessage.opcode = 0;
            dogpMessage.dataSpaceAddress = blake2sHash(spaceName);
            dogpMessage.dataAddress = blake2sHash(originalID);
            dogpMessage.contentLength = msg.contentLength + 24;
            ByteBuf bf = Unpooled.directBuffer();
            MessageEnvelopeCodec.envelopeToBytes(msg, bf);
            dogpMessage.content = bf.retainedSlice(0, bf.writerIndex());
            bf.release();
            out.add(dogpMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public byte[] blake2sHash(String content) {
        byte[] input = content.getBytes(StandardCharsets.UTF_8);
        // 创建Blake2s哈希函数实例
        Digest digest = new Blake2sDigest(128);
        // 输入数据
        digest.update(input, 0, input.length);
        // 计算哈希值
        byte[] hash = new byte[digest.getDigestSize()];
        digest.doFinal(hash, 0);
        return hash;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, DOGPMessage msg, List out) throws Exception {
        MessageEnvelope envelope = new MessageEnvelope(msg.getSender());
        if (accordToDOGPSender && InetAddressUtil.notEmpty(msg.getSrc())) {
            envelope.setSender(InetAddressUtil.convertBytesToInetSocketAddress(msg.getSrc()));
        }
        MessageEnvelopeCodec.byteBufToEnvelope(msg.content, envelope);
        msg.content.release();
        out.add(envelope);
    }
}