/* * Copyright 2017-present Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.lisp.msg.protocols; import com.google.common.base.Objects; import io.netty.buffer.ByteBuf; import org.onlab.packet.DeserializationException; import org.onosproject.lisp.msg.exceptions.LispParseError; import org.onosproject.lisp.msg.exceptions.LispReaderException; import org.onosproject.lisp.msg.exceptions.LispWriterException; import static com.google.common.base.MoreObjects.toStringHelper; /** * Default LISP signature class. */ public final class DefaultLispSignature implements LispSignature { private final int recordTtl; private final int sigExpiration; private final int sigInception; private final short keyTag; private final short sigLength; private final byte sigAlgorithm; private final int signature; /** * A private constructor that protects object instantiation from external. * * @param recordTtl record time-to-live value * @param sigExpiration signature expiration * @param sigInception signature inception * @param keyTag key tag * @param sigLength signature length * @param sigAlgorithm signature algorithm * @param signature signature */ private DefaultLispSignature(int recordTtl, int sigExpiration, int sigInception, short keyTag, short sigLength, byte sigAlgorithm, int signature) { this.recordTtl = recordTtl; this.sigExpiration = sigExpiration; this.sigInception = sigInception; this.keyTag = keyTag; this.sigLength = sigLength; this.sigAlgorithm = sigAlgorithm; this.signature = signature; } @Override public int getRecordTtl() { return recordTtl; } @Override public int getSigExpiration() { return sigExpiration; } @Override public int getSigInception() { return sigInception; } @Override public short getKeyTag() { return keyTag; } @Override public short getSigLength() { return sigLength; } @Override public byte getSigAlgorithm() { return sigAlgorithm; } @Override public int getSignature() { return signature; } @Override public void writeTo(ByteBuf byteBuf) throws LispWriterException { } @Override public String toString() { return toStringHelper(this) .add("record TTL", recordTtl) .add("signature expiration", sigExpiration) .add("signature inception", sigInception) .add("key tag", keyTag) .add("signature length", sigLength) .add("signature algorithm", sigAlgorithm) .add("signature", signature) .toString(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } DefaultLispSignature that = (DefaultLispSignature) o; return Objects.equal(recordTtl, that.recordTtl) && Objects.equal(sigExpiration, that.sigExpiration) && Objects.equal(sigInception, that.sigInception) && Objects.equal(keyTag, that.keyTag) && Objects.equal(sigLength, that.sigLength) && Objects.equal(sigAlgorithm, that.sigAlgorithm) && Objects.equal(signature, that.signature); } @Override public int hashCode() { return Objects.hashCode(recordTtl, sigExpiration, sigInception, keyTag, sigLength, sigAlgorithm, signature); } public static final class DefaultSignatureBuilder implements LispSignature.SignatureBuilder { private int recordTtl; private int sigExpiration; private int sigInception; private short keyTag; private short sigLength; private byte sigAlgorithm; private int signature; @Override public SignatureBuilder withRecordTtl(int recordTtl) { this.recordTtl = recordTtl; return this; } @Override public SignatureBuilder withSigExpiration(int sigExpiration) { this.sigExpiration = sigExpiration; return this; } @Override public SignatureBuilder withSigInception(int sigInception) { this.sigInception = sigInception; return this; } @Override public SignatureBuilder withKeyTag(short keyTag) { this.keyTag = keyTag; return this; } @Override public SignatureBuilder withSigLength(short sigLength) { this.sigLength = sigLength; return this; } @Override public SignatureBuilder withSigAlgorithm(byte sigAlgorithm) { this.sigAlgorithm = sigAlgorithm; return this; } @Override public SignatureBuilder withSignature(int signature) { this.signature = signature; return this; } @Override public LispSignature build() { return new DefaultLispSignature(recordTtl, sigExpiration, sigInception, keyTag, sigLength, sigAlgorithm, signature); } } /** * A LISP reader for Signature section. */ public static final class SignatureReader implements LispMessageReader<LispSignature> { private static final int RESERVED_SKIP_LENGTH = 3; @Override public LispSignature readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException, DeserializationException { // record TTL -> 32 bits int recordTtl = byteBuf.readInt(); // signature expiration -> 32 bits int sigExpiration = byteBuf.readInt(); // signature inception -> 32 bits int sigInception = byteBuf.readInt(); // key tag -> 16 bits short keyTag = byteBuf.readShort(); // signature length -> 16 bits short sigLength = byteBuf.readShort(); // signature algorithm -> 8 bits byte sigAlgorithm = byteBuf.readByte(); byteBuf.skipBytes(RESERVED_SKIP_LENGTH); // TODO: the size of signature should be determined by sigAlgorithm int signature = byteBuf.readInt(); return new DefaultSignatureBuilder() .withRecordTtl(recordTtl) .withSigExpiration(sigExpiration) .withSigInception(sigInception) .withKeyTag(keyTag) .withSigLength(sigLength) .withSigAlgorithm(sigAlgorithm) .withSignature(signature) .build(); } } /** * A LISP writer for Signature section. */ public static final class SignatureWriter implements LispMessageWriter<LispSignature> { private static final int UNUSED_ZERO = 0; @Override public void writeTo(ByteBuf byteBuf, LispSignature message) throws LispWriterException { // record TTL byteBuf.writeInt(message.getRecordTtl()); // signature expiration byteBuf.writeInt(message.getSigExpiration()); // signature inception byteBuf.writeInt(message.getSigInception()); // key tag byteBuf.writeShort(message.getKeyTag()); // signature length byteBuf.writeShort(message.getSigLength()); // signature algorithm byteBuf.writeByte(message.getSigAlgorithm()); byteBuf.writeByte(UNUSED_ZERO); byteBuf.writeShort(UNUSED_ZERO); // signature // TODO: the size of signature should be determined by sigAlgorithm byteBuf.writeInt(message.getSignature()); } } }