{"record":{"id":"368001d5da86707a","repo":"ory/hydra","slug":"jwksx-key-size-must-be-at-least-256-bit-for-algor","errorCode":null,"errorMessage":"jwksx: key size must be at least 256 bit for algorithm \"%s\"","messagePattern":"jwksx: key size must be at least 256 bit for algorithm \"(.+?)\"","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"oryx/jwksx/generator.go","lineNumber":79,"sourceCode":"\t\t\tjose.ES512: 521, // sic!\n\t\t\tjose.EdDSA: 256,\n\t\t}\n\t\tif bits != 0 && bits != keylen[alg] {\n\t\t\treturn nil, errors.Errorf(`jwksx: \"%s\" does not support arbitrary key length`, alg)\n\t\t}\n\tcase jose.RS256, jose.RS384, jose.RS512, jose.PS256, jose.PS384, jose.PS512:\n\t\tif bits == 0 {\n\t\t\tbits = 2048\n\t\t}\n\t\tif bits < 2048 {\n\t\t\treturn nil, errors.Errorf(`jwksx: key size must be at least 2048 bit for algorithm \"%s\"`, alg)\n\t\t}\n\tcase jose.HS256:\n\t\tif bits == 0 {\n\t\t\tbits = 256\n\t\t}\n\t\tif bits < 256 {\n\t\t\treturn nil, errors.Errorf(`jwksx: key size must be at least 256 bit for algorithm \"%s\"`, alg)\n\t\t}\n\tcase jose.HS384:\n\t\tif bits == 0 {\n\t\t\tbits = 384\n\t\t}\n\t\tif bits < 384 {\n\t\t\treturn nil, errors.Errorf(`jwksx: key size must be at least 2038448 bit for algorithm \"%s\"`, alg)\n\t\t}\n\tcase jose.HS512:\n\t\tif bits == 0 {\n\t\t\tbits = 1024\n\t\t}\n\t\tif bits < 512 {\n\t\t\treturn nil, errors.Errorf(`jwksx: key size must be at least 512 bit for algorithm \"%s\"`, alg)\n\t\t}\n\t}\n\n\tswitch alg {","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/ory/hydra/blob/4174065ffb052799890f7480f5360a877a67ffc1/oryx/jwksx/generator.go#L61-L97","documentation":"generate() requires HMAC key material for HS256 to be at least 256 bits (32 bytes), matching the algorithm's key strength. If a smaller bits value is passed for HS256, the library rejects it so signing keys are never weaker than the algorithm intends. bits=0 defaults to 256.","triggerScenarios":"Calling GenerateSigningKeys(id, \"HS256\", bits) with a non-zero bits value less than 256, e.g. 128.","commonSituations":"Copying a 128-bit secret length from a legacy config; confusing bits with bytes and passing small numbers; downscaling key sizes in test fixtures.","solutions":["Pass bits=0 or 256 (or any value >= 256) for HS256","Use the algorithm-appropriate default: HS256=256, HS384=384, HS512=1024 default but >=512 accepted","Ensure the value is the size in bits, not bytes"],"exampleFix":"// before\njwks, err := jwksx.GenerateSigningKeys(\"kid\", \"HS256\", 128)\n// after\njwks, err := jwksx.GenerateSigningKeys(\"kid\", \"HS256\", 256)","handlingStrategy":"validation","validationCode":"func validHSBits(alg string, bits int) error {\n\tmin := map[string]int{\"HS256\": 256, \"HS384\": 384, \"HS512\": 512}\n\tif m, ok := min[alg]; ok && bits != 0 && bits < m {\n\t\treturn fmt.Errorf(\"%s needs >= %d bits, got %d\", alg, m, bits)\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"jwks, err := jwksx.GenerateSigningKeys(id, \"HS256\", bits)\nif err != nil && strings.Contains(err.Error(), \"at least 256 bit\") {\n\treturn fmt.Errorf(\"HS256 key size must be >= 256 bits, got %d\", bits)\n}","preventionTips":["Size HMAC keys to match the digest: 256 bits for HS256","Remember values are bits, not bytes (256 bits = 32 bytes)","Use bits=0 for the algorithm default","Share one validated key-size config across HS* algorithms with per-algorithm minimums"],"tags":["jwks","go","crypto","hmac","security"],"backgroundTag":"invalid-key-size","analyzedSha":"4174065ffb052799890f7480f5360a877a67ffc1","analyzedAt":"2026-09-03T14:52:41.581Z","contentChangedAt":"2026-09-03T14:52:41.581Z","schemaVersion":2},"datasetVersion":"2026-09-10T17:17:09.494Z"}