{"record":{"id":"ce671e34490956ec","repo":"ory/hydra","slug":"jwksx-key-size-must-be-at-least-2048-bit-for-algo","errorCode":null,"errorMessage":"jwksx: key size must be at least 2048 bit for algorithm \"%s\"","messagePattern":"jwksx: key size must be at least 2048 bit for algorithm \"(.+?)\"","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"oryx/jwksx/generator.go","lineNumber":72,"sourceCode":"// generate generates keypair for corresponding SignatureAlgorithm.\nfunc generate(alg jose.SignatureAlgorithm, bits int) (crypto.PrivateKey, error) {\n\tswitch alg {\n\tcase jose.ES256, jose.ES384, jose.ES512, jose.EdDSA:\n\t\tkeylen := map[jose.SignatureAlgorithm]int{\n\t\t\tjose.ES256: 256,\n\t\t\tjose.ES384: 384,\n\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","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/ory/hydra/blob/4174065ffb052799890f7480f5360a877a67ffc1/oryx/jwksx/generator.go#L54-L90","documentation":"generate() enforces a minimum key size of 2048 bits for all RSA signature algorithms (RS256/RS384/RS512 and PS256/PS384/PS512). If the caller requests a smaller RSA key, the library refuses to generate it because RSA keys below 2048 bits are considered insecure. Omitting bits (0) defaults to 2048.","triggerScenarios":"Calling GenerateSigningKeys(id, \"RS256\"|\"RS384\"|\"RS512\"|\"PS256\"|\"PS384\"|\"PS512\", bits) with a non-zero bits value less than 2048, e.g. 1024 or 512.","commonSituations":"Legacy configs still specifying 1024-bit RSA keys; migrating old key generation code that predates the 2048-bit baseline; testers choosing small keys to speed up rsa.GenerateKey.","solutions":["Increase the bits parameter to at least 2048 (2048 is the default when bits=0)","Pass bits=0 to let the library use its secure default of 2048","For faster generation in tests, use an EC algorithm (ES256) instead of shrinking RSA size"],"exampleFix":"// before\njwks, err := jwksx.GenerateSigningKeys(\"kid\", \"RS256\", 1024)\n// after\njwks, err := jwksx.GenerateSigningKeys(\"kid\", \"RS256\", 2048)","handlingStrategy":"validation","validationCode":"func validRSABits(alg string, bits int) error {\n\tswitch alg {\n\tcase \"RS256\", \"RS384\", \"RS512\", \"PS256\", \"PS384\", \"PS512\":\n\t\tif bits != 0 && bits < 2048 {\n\t\t\treturn fmt.Errorf(\"%s needs >= 2048 bits, got %d\", alg, bits)\n\t\t}\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"jwks, err := jwksx.GenerateSigningKeys(id, alg, bits)\nif err != nil && strings.Contains(err.Error(), \"at least 2048 bit\") {\n\treturn fmt.Errorf(\"configured RSA key size %d too small; use 2048 or 4096\", bits)\n}","preventionTips":["Never configure RSA keys below 2048 bits; prefer 2048 or 4096","Use bits=0 to accept the secure default","Reject legacy 1024-bit RSA settings during config migration","Prefer ES256 when generation speed matters in tests"],"tags":["jwks","go","crypto","rsa","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"}