/* * * Copyright 2018 gRPC authors. * * 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 conn import core "google.golang.org/grpc/credentials/alts/internal" // NewOutCounter returns an outgoing counter initialized to the starting sequence // number for the client/server side of a connection. func NewOutCounter(s core.Side, overflowLen int) (c Counter) { c.overflowLen = overflowLen if s == core.ServerSide { // Server counters in ALTS record have the little-endian high bit // set. c.value[counterLen-1] = 0x80 } return } // NewInCounter returns an incoming counter initialized to the starting sequence // number for the client/server side of a connection. This is used in ALTS record // to check that incoming counters are as expected, since ALTS record guarantees // that messages are unwrapped in the same order that the peer wrapped them. func NewInCounter(s core.Side, overflowLen int) (c Counter) { c.overflowLen = overflowLen if s == core.ClientSide { // Server counters in ALTS record have the little-endian high bit // set. c.value[counterLen-1] = 0x80 } return } // CounterFromValue creates a new counter given an initial value. func CounterFromValue(value []byte, overflowLen int) (c Counter) { c.overflowLen = overflowLen copy(c.value[:], value) return } // CounterSide returns the connection side (client/server) a sequence counter is // associated with. func CounterSide(c []byte) core.Side { if c[counterLen-1]&0x80 == 0x80 { return core.ServerSide } return core.ClientSide }