github.com/jcmturner/gokrb5/v8@v8.4.4/types/KerberosFlags.go (about)

     1  package types
     2  
     3  // Reference: https://www.ietf.org/rfc/rfc4120.txt
     4  // Section: 5.2.8
     5  
     6  import (
     7  	"github.com/jcmturner/gofork/encoding/asn1"
     8  )
     9  
    10  // NewKrbFlags returns an ASN1 BitString struct of the right size for KrbFlags.
    11  func NewKrbFlags() asn1.BitString {
    12  	f := asn1.BitString{}
    13  	f.Bytes = make([]byte, 4)
    14  	f.BitLength = len(f.Bytes) * 8
    15  	return f
    16  }
    17  
    18  // SetFlags sets the flags of an ASN1 BitString.
    19  func SetFlags(f *asn1.BitString, j []int) {
    20  	for _, i := range j {
    21  		SetFlag(f, i)
    22  	}
    23  }
    24  
    25  // SetFlag sets a flag in an ASN1 BitString.
    26  func SetFlag(f *asn1.BitString, i int) {
    27  	for l := len(f.Bytes); l < 4; l++ {
    28  		(*f).Bytes = append((*f).Bytes, byte(0))
    29  		(*f).BitLength = len((*f).Bytes) * 8
    30  	}
    31  	//Which byte?
    32  	b := i / 8
    33  	//Which bit in byte
    34  	p := uint(7 - (i - 8*b))
    35  	(*f).Bytes[b] = (*f).Bytes[b] | (1 << p)
    36  }
    37  
    38  // UnsetFlags unsets flags in an ASN1 BitString.
    39  func UnsetFlags(f *asn1.BitString, j []int) {
    40  	for _, i := range j {
    41  		UnsetFlag(f, i)
    42  	}
    43  }
    44  
    45  // UnsetFlag unsets a flag in an ASN1 BitString.
    46  func UnsetFlag(f *asn1.BitString, i int) {
    47  	for l := len(f.Bytes); l < 4; l++ {
    48  		(*f).Bytes = append((*f).Bytes, byte(0))
    49  		(*f).BitLength = len((*f).Bytes) * 8
    50  	}
    51  	//Which byte?
    52  	b := i / 8
    53  	//Which bit in byte
    54  	p := uint(7 - (i - 8*b))
    55  	(*f).Bytes[b] = (*f).Bytes[b] &^ (1 << p)
    56  }
    57  
    58  // IsFlagSet tests if a flag is set in the ASN1 BitString.
    59  func IsFlagSet(f *asn1.BitString, i int) bool {
    60  	//Which byte?
    61  	b := i / 8
    62  	//Which bit in byte
    63  	p := uint(7 - (i - 8*b))
    64  	if (*f).Bytes[b]&(1<<p) != 0 {
    65  		return true
    66  	}
    67  	return false
    68  }