// Package etypeID provides Kerberos 5 encryption type assigned numbers.
package etypeID

// Kerberos encryption type assigned numbers.
const (
	//RESERVED : 0
	DES_CBC_CRC                  int32 = 1
	DES_CBC_MD4                  int32 = 2
	DES_CBC_MD5                  int32 = 3
	DES_CBC_RAW                  int32 = 4
	DES3_CBC_MD5                 int32 = 5
	DES3_CBC_RAW                 int32 = 6
	DES3_CBC_SHA1                int32 = 7
	DES_HMAC_SHA1                int32 = 8
	DSAWITHSHA1_CMSOID           int32 = 9
	MD5WITHRSAENCRYPTION_CMSOID  int32 = 10
	SHA1WITHRSAENCRYPTION_CMSOID int32 = 11
	RC2CBC_ENVOID                int32 = 12
	RSAENCRYPTION_ENVOID         int32 = 13
	RSAES_OAEP_ENV_OID           int32 = 14
	DES_EDE3_CBC_ENV_OID         int32 = 15
	DES3_CBC_SHA1_KD             int32 = 16
	AES128_CTS_HMAC_SHA1_96      int32 = 17
	AES256_CTS_HMAC_SHA1_96      int32 = 18
	AES128_CTS_HMAC_SHA256_128   int32 = 19
	AES256_CTS_HMAC_SHA384_192   int32 = 20
	//UNASSIGNED : 21-22
	RC4_HMAC             int32 = 23
	RC4_HMAC_EXP         int32 = 24
	CAMELLIA128_CTS_CMAC int32 = 25
	CAMELLIA256_CTS_CMAC int32 = 26
	//UNASSIGNED : 27-64
	SUBKEY_KEYMATERIAL int32 = 65
	//UNASSIGNED : 66-2147483647
)

// ETypesByName is a map of EncType names to their assigned EncType number.
var ETypesByName = map[string]int32{
	"des-cbc-crc":                  DES_CBC_CRC,
	"des-cbc-md4":                  DES_CBC_MD4,
	"des-cbc-md5":                  DES_CBC_MD5,
	"des-cbc-raw":                  DES_CBC_RAW,
	"des3-cbc-md5":                 DES3_CBC_MD5,
	"des3-cbc-raw":                 DES3_CBC_RAW,
	"des3-cbc-sha1":                DES3_CBC_SHA1,
	"des3-hmac-sha1":               DES_HMAC_SHA1,
	"des3-cbc-sha1-kd":             DES3_CBC_SHA1_KD,
	"des-hmac-sha1":                DES_HMAC_SHA1,
	"dsaWithSHA1-CmsOID":           DSAWITHSHA1_CMSOID,
	"md5WithRSAEncryption-CmsOID":  MD5WITHRSAENCRYPTION_CMSOID,
	"sha1WithRSAEncryption-CmsOID": SHA1WITHRSAENCRYPTION_CMSOID,
	"rc2CBC-EnvOID":                RC2CBC_ENVOID,
	"rsaEncryption-EnvOID":         RSAENCRYPTION_ENVOID,
	"rsaES-OAEP-ENV-OID":           RSAES_OAEP_ENV_OID,
	"des-ede3-cbc-Env-OID":         DES_EDE3_CBC_ENV_OID,
	"aes128-cts-hmac-sha1-96":      AES128_CTS_HMAC_SHA1_96,
	"aes128-cts":                   AES128_CTS_HMAC_SHA1_96,
	"aes128-sha1":                  AES128_CTS_HMAC_SHA1_96,
	"aes256-cts-hmac-sha1-96":      AES256_CTS_HMAC_SHA1_96,
	"aes256-cts":                   AES128_CTS_HMAC_SHA1_96,
	"aes256-sha1":                  AES128_CTS_HMAC_SHA1_96,
	"aes128-cts-hmac-sha256-128":   AES128_CTS_HMAC_SHA256_128,
	"aes128-sha2":                  AES128_CTS_HMAC_SHA256_128,
	"aes256-cts-hmac-sha384-192":   AES256_CTS_HMAC_SHA384_192,
	"aes256-sha2":                  AES256_CTS_HMAC_SHA384_192,
	"arcfour-hmac":                 RC4_HMAC,
	"rc4-hmac":                     RC4_HMAC,
	"arcfour-hmac-md5":             RC4_HMAC,
	"arcfour-hmac-exp":             RC4_HMAC_EXP,
	"rc4-hmac-exp":                 RC4_HMAC_EXP,
	"arcfour-hmac-md5-exp":         RC4_HMAC_EXP,
	"camellia128-cts-cmac":         CAMELLIA128_CTS_CMAC,
	"camellia128-cts":              CAMELLIA128_CTS_CMAC,
	"camellia256-cts-cmac":         CAMELLIA256_CTS_CMAC,
	"camellia256-cts":              CAMELLIA256_CTS_CMAC,
	"subkey-keymaterial":           SUBKEY_KEYMATERIAL,
}

// EtypeSupported resolves the etype name string to the etype ID.
// If zero is returned the etype is not supported by gokrb5.
func EtypeSupported(etype string) int32 {
	// Slice of supported enctype IDs
	s := []int32{
		AES128_CTS_HMAC_SHA1_96,
		AES256_CTS_HMAC_SHA1_96,
		AES128_CTS_HMAC_SHA256_128,
		AES256_CTS_HMAC_SHA384_192,
		DES3_CBC_SHA1_KD,
		RC4_HMAC,
	}
	id := ETypesByName[etype]
	if id == 0 {
		return id
	}
	for _, sid := range s {
		if id == sid {
			return id
		}
	}
	return 0
}
