keyctl.go 1.0 KB

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