code: func (c *Config) KeyRingAndId() (keyRing, keyId string, err error) {
  	prefixes := c.jconf.RequiredObject("prefixes")
  	if len(prefixes) == 0 {
  		return "", "", fmt.Errorf("no prefixes object in config")
  	}
  	sighelper := prefixes.OptionalObject("/sighelper/")
  	if len(sighelper) == 0 {
  		return "", "", fmt.Errorf("no sighelper object in prefixes")
  	}
  	handlerArgs := sighelper.OptionalObject("handlerArgs")
  	if len(handlerArgs) == 0 {
  		return "", "", fmt.Errorf("no handlerArgs object in sighelper")
  	}
  	keyId = handlerArgs.OptionalString("keyId", "")
  	if keyId == "" {
  		return "", "", fmt.Errorf("no keyId in sighelper")
  	}
  	keyRing = handlerArgs.OptionalString("secretRing", "")
  	if keyRing == "" {
  		return "", "", fmt.Errorf("no secretRing in sighelper")
  	}
  	return keyRing, keyId, nil
  }
docs: // KeyRingAndId returns the GPG identity keyring path and the user's
  // GPG keyID (TODO: length/case), if configured. TODO: which error
  // value if not configured?