// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.handler.codec.quic;

import io.netty.util.NetUtil;
import io.netty.util.CharsetUtil;
import io.netty.buffer.Unpooled;
import java.net.InetSocketAddress;
import io.netty.buffer.ByteBuf;

public final class InsecureQuicTokenHandler implements QuicTokenHandler
{
    private static final String SERVER_NAME = "netty";
    private static final byte[] SERVER_NAME_BYTES;
    private static final ByteBuf SERVER_NAME_BUFFER;
    static final int MAX_TOKEN_LEN;
    public static final InsecureQuicTokenHandler INSTANCE;
    
    private InsecureQuicTokenHandler() {
        Quic.ensureAvailability();
    }
    
    @Override
    public boolean writeToken(final ByteBuf out, final ByteBuf dcid, final InetSocketAddress address) {
        final byte[] addr = address.getAddress().getAddress();
        out.writeBytes(InsecureQuicTokenHandler.SERVER_NAME_BYTES).writeBytes(addr).writeBytes(dcid, dcid.readerIndex(), dcid.readableBytes());
        return true;
    }
    
    @Override
    public int validateToken(final ByteBuf token, final InetSocketAddress address) {
        final byte[] addr = address.getAddress().getAddress();
        final int minLength = InsecureQuicTokenHandler.SERVER_NAME_BYTES.length + address.getAddress().getAddress().length;
        if (token.readableBytes() <= InsecureQuicTokenHandler.SERVER_NAME_BYTES.length + addr.length) {
            return -1;
        }
        if (!InsecureQuicTokenHandler.SERVER_NAME_BUFFER.equals(token.slice(0, InsecureQuicTokenHandler.SERVER_NAME_BYTES.length))) {
            return -1;
        }
        final ByteBuf addressBuffer = Unpooled.wrappedBuffer(addr);
        try {
            if (!addressBuffer.equals(token.slice(InsecureQuicTokenHandler.SERVER_NAME_BYTES.length, addr.length))) {
                return -1;
            }
        }
        finally {
            addressBuffer.release();
        }
        return minLength;
    }
    
    @Override
    public int maxTokenLength() {
        return InsecureQuicTokenHandler.MAX_TOKEN_LEN;
    }
    
    static {
        SERVER_NAME_BYTES = "netty".getBytes(CharsetUtil.US_ASCII);
        SERVER_NAME_BUFFER = Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(InsecureQuicTokenHandler.SERVER_NAME_BYTES)).asReadOnly();
        MAX_TOKEN_LEN = 20 + NetUtil.LOCALHOST6.getAddress().length + InsecureQuicTokenHandler.SERVER_NAME_BYTES.length;
        INSTANCE = new InsecureQuicTokenHandler();
    }
}
