...

Source file src/github.com/opencontainers/runc/libcontainer/keys/keyctl.go

Documentation: github.com/opencontainers/runc/libcontainer/keys

     1  package keys
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"golang.org/x/sys/unix"
    10  )
    11  
    12  type KeySerial uint32
    13  
    14  func JoinSessionKeyring(name string) (KeySerial, error) {
    15  	sessKeyID, err := unix.KeyctlJoinSessionKeyring(name)
    16  	if err != nil {
    17  		return 0, fmt.Errorf("unable to create session key: %w", err)
    18  	}
    19  	return KeySerial(sessKeyID), nil
    20  }
    21  
    22  // ModKeyringPerm modifies permissions on a keyring by reading the current permissions,
    23  // anding the bits with the given mask (clearing permissions) and setting
    24  // additional permission bits
    25  func ModKeyringPerm(ringID KeySerial, mask, setbits uint32) error {
    26  	dest, err := unix.KeyctlString(unix.KEYCTL_DESCRIBE, int(ringID))
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	res := strings.Split(dest, ";")
    32  	if len(res) < 5 {
    33  		return errors.New("Destination buffer for key description is too small")
    34  	}
    35  
    36  	// parse permissions
    37  	perm64, err := strconv.ParseUint(res[3], 16, 32)
    38  	if err != nil {
    39  		return err
    40  	}
    41  
    42  	perm := (uint32(perm64) & mask) | setbits
    43  
    44  	return unix.KeyctlSetperm(int(ringID), perm)
    45  }
    46  

View as plain text