{"record":{"id":"aef5c650d8341235","repo":"eclipse-vertx/vert.x","slug":"invalid-oid","errorCode":null,"errorMessage":"Invalid OID","messagePattern":"Invalid OID","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"vertx-core/src/main/java/io/vertx/core/net/impl/pkcs1/PrivateKeyParser.java","lineNumber":58,"sourceCode":"   */\n  private static final byte[] OID_RSA_PUBLIC_KEY = { 0x2A, (byte) 0x86, 0x48, (byte) 0x86, (byte) 0xF7, 0x0D, 0x01,\n          0x01, 0x01 };\n  /**\n   * ASN.1 OID for EC public key.\n   */\n  private static final byte[] OID_EC_PUBLIC_KEY = { 0x2A, (byte) 0x86, 0x48, (byte) 0xCE, 0x3D, 0x02, 0x01 };\n\n  private static String oidToString(byte[] oid) {\n    StringBuilder result = new StringBuilder();\n    int value = oid[0] & 0xff;\n    result.append(value / 40).append(\".\").append(value % 40);\n    for (int index = 1; index < oid.length; ++index) {\n      byte bValue = oid[index];\n      if (bValue < 0) {\n        value = (bValue & 0b01111111);\n        ++index;\n        if (index == oid.length) {\n          throw new IllegalArgumentException(\"Invalid OID\");\n        }\n        value <<= 7;\n        value |= (oid[index] & 0b01111111);\n        result.append(\".\").append(value);\n      } else {\n        result.append(\".\").append(bValue);\n      }\n    }\n    return result.toString();\n  }\n\n  private static ECParameterSpec getECParameterSpec(String curveName) throws VertxException {\n    try {\n      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(\"EC\");\n      keyPairGenerator.initialize(new ECGenParameterSpec(curveName));\n      ECPublicKey publicKey = (ECPublicKey) keyPairGenerator.generateKeyPair().getPublic();\n      return publicKey.getParams();\n    } catch (GeneralSecurityException e) {","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/eclipse-vertx/vert.x/blob/fb308bd8c3f12c79f4ae89bef67fadf6c80d036e/vertx-core/src/main/java/io/vertx/core/net/impl/pkcs1/PrivateKeyParser.java#L40-L76","documentation":"PrivateKeyParser.oidToString decodes DER-encoded Object Identifiers; when an OID sub-identifier's multi-byte encoding is truncated (the last byte has the continuation bit set but no following byte exists), it throws IllegalArgumentException('Invalid OID'). The OID bytes in the parsed private key are malformed.","triggerScenarios":"Parsing a PKCS#1/PKCS#8 private key whose AlgorithmIdentifier OID is truncated or corrupt — typically a corrupted key file, a wrongly base64-decoded key, or a key whose PEM body was concatenated/altered.","commonSituations":"PEM files damaged by copy/paste (truncated lines), keys re-encoded incorrectly by other tools, reading a DER key with the wrong offset.","solutions":["Regenerate or re-export the key file from the original source","Verify the base64 body decodes cleanly and has correct DER length fields (openssl asn1parse -in key.pem)","Ensure the PEM file is complete (BEGIN/END lines, no truncated base64)"],"exampleFix":"// before\nbyte[] der = Base64.getDecoder().decode(manuallyTrimmedPemBody);\nString alg = PrivateKeyParser.getPKCS8EncodedKeyAlgorithm(der);\n// after\n// validate first: openssl asn1parse -in key.pem\nbyte[] der = readIntactPemDer(keyFile);\nString alg = PrivateKeyParser.getPKCS8EncodedKeyAlgorithm(der);","handlingStrategy":"validation","validationCode":"// validate DER before parsing\ntry {\n  new DerParser(der).read();\n} catch (Exception e) {\n  throw new IllegalStateException(\"corrupt key file\");\n}\n// or: openssl asn1parse -in key.pem","typeGuard":null,"tryCatchPattern":"try {\n  String alg = PrivateKeyParser.getPKCS8EncodedKeyAlgorithm(der);\n} catch (IllegalArgumentException | VertxException e) {\n  // key file corrupt: re-export/regenerate\n}","preventionTips":["Never hand-edit or concatenate PEM bodies","Verify keys with openssl asn1parse before use","Read PEM files with a proper reader (MIME base64, all lines)"],"tags":["asn1","oid","pki"],"backgroundTag":"invalid-argument-format","analyzedSha":"fb308bd8c3f12c79f4ae89bef67fadf6c80d036e","analyzedAt":"2026-09-06T11:37:12.241Z","contentChangedAt":"2026-09-06T11:37:12.241Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}