gitee.com/ks-custle/core-gm@v0.0.0-20230922171213-b83bdd97b62c/grpc/credentials/alts/internal/conn/counter.go (about) 1 /* 2 * 3 * Copyright 2018 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package conn 20 21 import ( 22 "errors" 23 ) 24 25 const counterLen = 12 26 27 var ( 28 errInvalidCounter = errors.New("invalid counter") 29 ) 30 31 // Counter is a 96-bit, little-endian counter. 32 type Counter struct { 33 value [counterLen]byte 34 invalid bool 35 overflowLen int 36 } 37 38 // Value returns the current value of the counter as a byte slice. 39 func (c *Counter) Value() ([]byte, error) { 40 if c.invalid { 41 return nil, errInvalidCounter 42 } 43 return c.value[:], nil 44 } 45 46 // Inc increments the counter and checks for overflow. 47 func (c *Counter) Inc() { 48 // If the counter is already invalid, there is no need to increase it. 49 if c.invalid { 50 return 51 } 52 i := 0 53 for ; i < c.overflowLen; i++ { 54 c.value[i]++ 55 if c.value[i] != 0 { 56 break 57 } 58 } 59 if i == c.overflowLen { 60 c.invalid = true 61 } 62 }