// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package security

import "v.io/v23/uniqueid"
import "time"

const (
  // ConstCaveat represents a caveat that either always validates or never validates.
  ConstCaveat = CaveatDescriptor{
    ParamType: typeobject(bool), // If true, validation will always succeed. If false, will always fail.
   }

  // ExpiryCaveat represents a caveat that validates iff the current time is no later
  // the specified time.Time.
  ExpiryCaveat = CaveatDescriptor{
    Id:        uniqueid.Id{0xa6, 0x4c, 0x2d, 0x1, 0x19, 0xfb, 0xa3, 0x34, 0x80, 0x71, 0xfe, 0xeb, 0x2f, 0x30, 0x80, 0x0},
    ParamType: typeobject(time.Time),
  }

  // MethodCaveat represents a caveat that validates iff the method being
  // invoked is included in this list. An empty list implies that the caveat is invalid.
  MethodCaveat = CaveatDescriptor{
    Id:        uniqueid.Id{0x54, 0xa6, 0x76, 0x39, 0x81, 0x37, 0x18, 0x7e, 0xcd, 0xb2, 0x6d, 0x2d, 0x69, 0xba, 0x0, 0x3},
    ParamType: typeobject([]string),
  }

  PublicKeyThirdPartyCaveat = CaveatDescriptor{
    Id:        uniqueid.Id{0x79, 0x72, 0xce, 0x17, 0x4a, 0x7b, 0xa9, 0x3f, 0x79, 0x54, 0x7d, 0x76, 0x9c, 0x91, 0x80, 0x0},
    ParamType: typeobject(publicKeyThirdPartyCaveatParam),
  }

  // PeerBlessingsCaveat represents a caveat that validates iff the peer being communicated
  // with (local end of the call) has a blessing name matching at least one of the patterns
  // in the list. An empty list implies that the caveat is invalid.
  PeerBlessingsCaveat = CaveatDescriptor {
    Id:        uniqueid.Id{0x5, 0x77, 0xf8, 0x56, 0x4c, 0x8e, 0x5f, 0xfe, 0xff, 0x8e, 0x2b, 0x1f, 0x4d, 0x6d, 0x80, 0x0},
    ParamType: typeobject([]BlessingPattern),
  }
)

// Error definitions to allow for stable error checking across address spaces.
error (
  CaveatNotRegistered(id uniqueid.Id) {
    "en": "no validation function registered for caveat id {id}",
  }
  CaveatParamAny(id uniqueid.Id) {
    "en": "caveat {id} uses illegal param type any",
  }
  CaveatParamTypeMismatch(id uniqueid.Id, got, want typeobject) {
    "en": "bad param type: caveat {id} got {got}, want {want}",
  }
  CaveatParamCoding(id uniqueid.Id, typ typeobject, err error) {
    "en": "unable to encode/decode caveat param(type={typ}) for caveat {id}: {err}",
  }
  CaveatValidation(err error) {
    "en": "caveat validation failed: {err}",
  }
  ConstCaveatValidation() {
    "en": "false const caveat always fails validation",
  }
  ExpiryCaveatValidation(currentTime, expiryTime time.Time) {
    "en": "now({currentTime}) is after expiry({expiryTime})",
  }
  MethodCaveatValidation(invokedMethod string, permittedMethods []string) {
    "en": "method {invokedMethod} not in list {permittedMethods}",
  }
  PeerBlessingsCaveatValidation(peerBlessings []string, permittedPatterns []BlessingPattern) {
    "en": "patterns in peer blessings caveat {permittedPatterns} not matched by the peer {peerBlessings}",
  }
)


type nonce [16]byte

// publicKeyThirdPartyCaveatParam represents a third-party caveat that requires
// PublicKeyDischarge(s) to be issued by a principal identified by a public key.
//
// The Id of the caveat is base64-encoded:
// hash(hash(Nonce), hash(DischargerKey), hash(Caveats[0]), hash(Caveats[1]), ...)
// where hash is a cryptographic hash function with a security strength
// equivalent to that of the DischargerKey. For example, if DischargerKey
// represents an ECDSA public key with the P384 curve, then hash should be
// SHA384.
type publicKeyThirdPartyCaveatParam struct {
  // Nonce specifies a cryptographically random nonce associated with an
  // instance of the caveat. This prevents discharge replays, where
  // discharges for ThirdPartyCaveats embedded in the certificates for
  // one blessing can be used for another blessing.
  //
  // Whether discharge re-use is a desired or un-desired property is
  // still under debate. Till the debate is settled, we err on the side
  // of discouraging re-use.
  Nonce nonce
  // Caveats specifies the caveats that have to be validated
  // before minting a discharge for a publicKeyCaveat.
  Caveats []Caveat
  // DER-encoded PKIX public key of the principal that can issue discharges.
  DischargerKey []byte
  // Object name where the third-party that can issue discharges can be found.
  DischargerLocation string
  // Information required by the third-party in order to issue a discharge.
  DischargerRequirements ThirdPartyRequirements
}

// PublicKeyDischarge represents a discharge for third party caveats that
// require a signature from a third-party's public key.
//
// The message digest of this structure is computed as follows:
// hash(hash(ThirdPartyCaveatId), hash(Caveats[0]), hash(Caveats[1]), ...),
// where hash is a cryptographic hash function with a security strength
// equivalent to the strength of the public key of the principal issuing the
// discharge.
type PublicKeyDischarge struct {
  ThirdPartyCaveatId string  // Id of the third party caveat for which this discharge was issued.
  Caveats []Caveat           // Caveats on the use of this discharge.
  Signature Signature        // Signature of the content hash of this discharge by the discharger.
}
