{"record":{"id":"4f6048608cf4de07","repo":"OpenNHP/opennhp","slug":"unknown-mode-d","errorCode":null,"errorMessage":"unknown mode: %d","messagePattern":"unknown mode: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nhp/core/ztdo/noise.go","lineNumber":225,"sourceCode":"func NewDataKeyPairECCModeWithName(mode string) (DataKeyPairECCMode, error) {\n\tswitch mode {\n\tcase \"CURVE25519\":\n\t\treturn CURVE25519, nil\n\tcase \"SM2\":\n\t\treturn SM2, nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unknown mode: %s\", mode)\n\t}\n}\n\nfunc NewDataKeyPairECCMode(eccMode core.EccTypeEnum) (DataKeyPairECCMode, error) {\n\tswitch eccMode {\n\tcase core.ECC_CURVE25519:\n\t\treturn CURVE25519, nil\n\tcase core.ECC_SM2:\n\t\treturn SM2, nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unknown mode: %d\", eccMode)\n\t}\n}\n\nfunc (d DataKeyPairECCMode) ECDHFromKey(prk []byte) core.Ecdh {\n\treturn core.ECDHFromKey(d.ToEccType(), prk)\n}\n\nfunc (d DataKeyPairECCMode) PublicKeyFromKey(prk []byte) []byte {\n\treturn core.ECDHFromKey(d.ToEccType(), prk).PublicKey()\n}\n\n// MessagePattern defines a set of tokens which are used during symmetric key agreement\ntype MessagePattern int\n\nconst (\n\tMessagePatternS MessagePattern = iota\n\tMessagePatternE\n\tMessagePatternRS","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/OpenNHP/opennhp/blob/6e04ca5ff03222a699c24205cd4bf8fee9af7ffe/nhp/core/ztdo/noise.go#L207-L243","documentation":"NewDataKeyPairECCMode converts a core.EccTypeEnum into a DataKeyPairECCMode. Only ECC_CURVE25519 and ECC_SM2 are accepted; any other enum value returns this error. Guards against invalid or zero-valued enum inputs when constructing data key pairs.","triggerScenarios":"Calling NewDataKeyPairECCMode with an EccTypeEnum other than core.ECC_CURVE25519 or core.ECC_SM2 (e.g. 0 / uninitialized) (nhp/core/ztdo/noise.go:225).","commonSituations":"Uninitialized EccTypeEnum fields in config structs (zero value), deserialized enum values from other systems, future enum members added upstream but not mapped here.","solutions":["Pass core.ECC_CURVE25519 or core.ECC_SM2 explicitly","Check that the EccTypeEnum field is initialized, not the zero value","Update mapping code if a new EccTypeEnum was introduced upstream"],"exampleFix":"// before\nvar ecc core.EccTypeEnum // zero value -> unknown mode: 0\nmode, err := NewDataKeyPairECCMode(ecc)\n// after\nmode, err := NewDataKeyPairECCMode(core.ECC_CURVE25519)","handlingStrategy":"type-guard","validationCode":"if eccMode != core.ECC_CURVE25519 && eccMode != core.ECC_SM2 {\n\treturn fmt.Errorf(\"unsupported EccTypeEnum: %d\", eccMode)\n}","typeGuard":"func validEccType(e core.EccTypeEnum) bool { return e == core.ECC_CURVE25519 || e == core.ECC_SM2 }","tryCatchPattern":"mode, err := NewDataKeyPairECCMode(eccMode)\nif err != nil {\n\tmode, err = NewDataKeyPairECCMode(core.ECC_CURVE25519)\n}","preventionTips":["Initialize EccTypeEnum fields explicitly; never rely on zero values","Validate enums from external sources before conversion","Keep the mapping switch in sync with upstream enum additions"],"tags":["go","crypto","ecc","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"6e04ca5ff03222a699c24205cd4bf8fee9af7ffe","analyzedAt":"2026-09-07T15:44:59.941Z","contentChangedAt":"2026-09-07T15:44:59.941Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}