Skip to content

fix(main): bump org.bouncycastle:bcprov-jdk18on from 1.84 to 1.85 - #408

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/maven/org.bouncycastle-bcprov-jdk18on-1.85
Open

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/maven/org.bouncycastle-bcprov-jdk18on-1.85

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Bumps org.bouncycastle:bcprov-jdk18on from 1.84 to 1.85.

Changelog

Sourced from org.bouncycastle:bcprov-jdk18on's changelog.

Bouncy Castle Crypto Package - Release Notes

1.0 Introduction

The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. The package is organised so that it contains a light-weight API suitable for use in any environment (including the J2ME) with the additional infrastructure to conform the algorithms to the JCE framework.

2.0 Release History

2.1.1 Version

Release: 1.87
Date: 2026, TBD

2.1.2 Defects Fixed

  • The DANE SMIMEA support in org.bouncycastle.cert.dane had three defects. JndiDANEFetcherFactory, when asked for every entry under a bare domain name, removed the first and last characters of the owner name the JNDI DNS provider reports for each listed record, assuming a quoted name; the provider returns the name unquoted with a trailing root dot, so the first hex digit of the hash label was lost and the lookup that followed could never find the record. It now removes only the root dot. DANEEntryStore kept one entry per owner name, so an address with more than one SMIMEA record (a signing and an encryption certificate, say) only ever showed its last; every entry is now kept. DANEEntrySelectorFactory split an address at its first '@', mis-handling a quoted local-part containing one, and threw StringIndexOutOfBoundsException rather than DANEException for an address with none; it now splits at the last '@', removes enclosing quotes and backslash quoting from the local-part before hashing as RFC 8162 sec. 3 describes, and rejects an address with no '@'. The DANEEntry(String, byte[]) constructor also now rejects, with an IOException, a record whose flags do not describe a full certificate entry rather than parsing whatever follows the flags as a certificate.

  • TimeStampToken accepted a token whose signing-time signed attribute disagreed with the genTime in its TSTInfo. Both are the TSA's statement of when the token was produced, and the disagreement is what distinguishes an RFC 3161 token from a signature a TSA has put over a supplied TSTInfo through another service using the same key, such as a legacy countersignature endpoint, which some TSAs still offer. The constructor now rejects a token whose signing-time, when present, is further from genTime than the token's accuracy plus one minute; the check can be switched off with the org.bouncycastle.tsp.allow_inconsistent_signing_time property. TimeStampTokenGenerator now sets a signing-time attribute from the genTime it is given rather than the clock, so its tokens are consistent whatever genTime is passed.

  • TimeStampToken.validate() accepted a token whose message imprint was calculated with MD5, for which collisions can be computed, and TSPAlgorithms.ALLOWED, the set the request side is typically checked against, included MD5. MD5 has been removed from TSPAlgorithms.ALLOWED, and validate() now rejects a token whose imprint algorithm is not in it (failure code badAlg). The new TSPAlgorithms.LEGACY is ALLOWED plus MD5; validate(SignerInformationVerifier, Set) takes the set of acceptable imprint algorithms, and the org.bouncycastle.tsp.allowed_imprint_algorithms property, a comma separated list of digest names or OIDs, replaces ALLOWED as the default for validate(SignerInformationVerifier). TSPAlgorithms.ALLOWED and LEGACY are now unmodifiable.

  • CRL-based revocation checking (the PKIX CertPathValidator and the pkix X509RevocationChecker) tracked a CRL entry's reasonCode in the same field as its own status markers and did not range-check it, so a CRL entry whose reasonCode was outside the RFC 5280 sec. 5.3.1 set was mishandled: 11 left the certificate unrevoked, other out-of-range values threw an unchecked exception out of validation. The revocation date and the reason code are now kept separately; an undefined reasonCode is processed as unspecified and reported as "(unknown code: N)".

  • OERDefinition.enumItem(label, value) discarded the explicit enumerand value: Builder.enumValue() set it on the builder it had just copied and returned the copy without it, so every item was numbered by its position in the definition instead. The value is now kept, and the items without one are numbered as X.680 sec. 20.3 and 20.6 specify: a root item takes the successive integers from 0, skipping any explicit root number, and an extension item takes the smallest value not defined in the root and greater than every preceding extension item (the old loop restarted its count after an explicit number, so an explicit 0 followed by an unnumbered item was a duplicate). The three ETSI TS 102 941 response-code definitions that use explicit values give "ok" the value 0 at position 0, so their encodings are unchanged.

  • OERInputStream read the two length-prefixed INTEGER forms and BIT STRING with Streams.readFully and did not check its best-effort return, so a stream that ended inside the value decoded the zero-padded buffer as a value rather than failing. Every length-driven read in the decoder now goes through Streams.readLenBytesFully, which fails with EOFException at the real end of input and, for a long length, does not allocate the full array until the stream has delivered a fair part of it - so a hostile length that is within the decoder's allocation cap, or a cap a caller has raised, cannot drive a large allocation from a short input.

  • The OER codec gave a signed INTEGER whose upper bound is exactly the maximum of a fixed-size word the next word up: X.696 sec. 10.4 a)-d) make both bounds inclusive, but the upper-bound comparison was strict, so INTEGER (-128..127) was a two-octet word rather than one, and likewise at the 16-, 32- and 64-bit boundaries. The two signed ranges shipped with the library, NinetyDegreeInt and OneEightyDegreeInt, lie inside the four-octet word and are unaffected.

  • The ETSI TS 102 941 response code wrappers AuthorizationResponseCode, AuthorizationValidationResponseCode and EnrolmentResponseCode checked their range on BigInteger.intValue(), which truncates, so a value past the int range whose low 32 bits were in range was accepted - 2^32 as "ok". The check now rejects a negative value or one over 31 bits before consulting intValue().

  • OERInputStream accepted an empty group of octets as the value zero in four places where X.696 requires at least one: a variable-size INTEGER with a length determinant of 0 (sec. 3.7.11 and 3.7.12 define the number forms as one or more octets), an ENUMERATED long form with 0 subsequent octets (sec. 11.4 says 1 to 127), a length determinant long form with 0 subsequent octets (sec. 8.6.5, likewise) and a sequence-of quantity of 0 octets (sec. 17.2). Each now fails with an IOException; the one-octet encodings of zero decode as before.

  • OEROutputStream could not encode a CHOICE whose chosen alternative has a tag number of 63 or more. X.696 sec. 8.7.2.2 keeps a tag number below 63 in the first octet and sec. 8.7.2.3 continues one of 63 or more in 7-bit groups, most significant first, with bit 8 as the continuation flag; the encoder used the single octet up to and including 63, so 63 went out as the continuation escape with nothing after it, and BitBuilder.write7BitBytes took its groups from bit 31 downward rather than from the low end, so 63 encoded as 83 78, which decodes as 504. Both forms of write7BitBytes now write the fewest 7-bit groups of the value, and the boundary is at 63. No CHOICE in the shipped ITS definitions has that many alternatives.

  • OEROutputStream rejected a required SEQUENCE component as absent whenever it arrived wrapped in an OEROptional, the form the ITS classes' toASN1Primitive methods produce for present values, rather than only when the wrapper is the undefined ABSENT. A defined wrapper at a required position is now unwrapped and written like the bare value.

  • OERInputStream, for an absent optional SEQUENCE component selected through a switch, tested the selected alternative for a default value but then took the default from the switch itself, which has none, so the alternative's default was added as null and the decode failed with NullPointerException. The default now comes from the selected alternative. No definition shipped with the library has a switched component with a default.

  • OERInputStream read a SEQUENCE OF count through BigInteger.intValue(), which keeps only the low 32 bits, so a count of 2^32 + 3 decoded as 3 elements and the rest of the input was left in place for the next field. A count that does not fit in 31 bits is now rejected as out of range, and the fixed sizes taken from a definition go through BigIntegers.intValueExact() rather than silently truncating.

  • OERInputStream rejected a valid SEQUENCE OF as "out of range" on any stream whose available() reported fewer bytes than the element count: available() is an estimate of what can be read without blocking, 0 from the base InputStream and from wrappers such as CipherInputStream, and the decoder had been using it as a bound on the count. The count is now bounded by the decoder's allocation ceiling (maxByteAllocation, 1 MiB by default) instead, and a count within it over a short input fails at the first element that is not there.

  • OERInputStream could not decode a variable-size BIT STRING. X.696 sec. 13.3 encodes one as a length determinant covering an initial octet, which gives the number of unused bits in the final octet, and the octets of the value, which is what OEROutputStream writes; the decoder read the determinant as a bit count, divided it by 8 and never read the initial octet, so it took no data at all for a two-octet value, and a stray third branch keyed on a negative size bound threw NullPointerException for an unbounded schema. The decoder now has the two forms of clause 13: a fixed size reads the whole octets the size occupies and derives the unused bits from it (a 12-bit string is two octets with four unused bits, where it was one octet), and any other size reads the determinant, the initial octet (rejected over 7, or non-zero for an empty value, 13.3.4) and the data, carrying the unused-bit count into the DERBitString. OERDefinition gains bitString() and bitString(lower, upper) alongside bitString(size). The single BIT STRING in the shipped ITS definitions is a fixed 8 bits and decodes as before.

  • OEROutputStream wrote a negative INTEGER value under a type whose lower bound is zero or more through the unsigned encodings, so it went out as a different, positive value: -1 under INTEGER (0..255) as FF, the encoding of 255, and under INTEGER (0..MAX) as 01 FF. A negative value is now rejected with IllegalArgumentException on both unsigned paths.

  • OERInputStream.uint64() read its eight octets as a signed number, so a value with the top bit set came back negative; the other uintN readers were unsigned. It now reads unsigned.

  • The OER codec treated an INTEGER with a positive lower bound as signed. X.696 sec. 10.2 a) gives the unsigned encodings to an integer whose lower bound is zero or positive; OERInputStream and OEROutputStream tested for a lower bound of exactly zero, so INTEGER (1..255) went out as a two-octet signed word rather than one unsigned octet and INTEGER (1..MAX) as a variable-size signed number, where 128 is 00 80 rather than 80. No OER definition shipped with the library puts a positive lower bound on an INTEGER.

  • The OER codec encoded and decoded a negative ENUMERATED value wrongly. X.696 sec. 11.4 reserves the one-octet short form for the values 0 to 127 and puts every other value, negative ones included, in the long form as a two's-complement signed integer; OEROutputStream chose the long form only for values above 127, so a negative value went out in the short form masked to seven bits (-1 as 7F, the encoding of 127), and OERInputStream read a long-form value as unsigned (81 FF, the encoding of -1, as 255). Both now follow sec. 11.4. No OER definition shipped with the library declares a negative enumerand.

  • ASN1Enumerated rejected negative values, although an ENUMERATED is an integer (X.680 sec. 20) and may be negative: the int and BigInteger constructors threw "enumerated must be non-negative", the byte array constructor rejected a leading sign bit, and a parsed ENUMERATED with a negative value failed to decode. The checks are removed, ASN1Enumerated gains isNegative() and longValueExact() alongside the existing intValueExact(), and a zero-length ENUMERATED is now reported as "malformed enumerated", as a zero-length INTEGER is reported as "malformed integer", rather than "ENUMERATED has zero length". ASN1Enumerated.valueOf(int) and valueOf(long) return shared instances for the values 0 to 15, as ASN1Integer.valueOf() does, and a parsed single-byte ENUMERATED in that range is returned as the shared instance.

  • A PBEKey stored in a BCFKS KeyStore was not reported as a key entry: isKeyEntry() returned false for it, so KeyStore.getEntry() returned null rather than a SecretKeyEntry, although getKey() recovered it. The PBE key entry type added for github #2164 was missing from engineIsKeyEntry, and is now included.

  • The CMS content-type decoders SignedData, EnvelopedData, AuthenticatedData, AuthEnvelopedData and EncryptedData read their mandatory fields by index or enumeration with no lower-bound size check, so a ContentInfo whose inner content was an empty or too-short SEQUENCE - malformed but DER-parseable - left the decode as an unchecked NoSuchElementException or ArrayIndexOutOfBoundsException rather than the CMSException the CMSSignedData, CMSEnvelopedData, CMSAuthenticatedData and CMSAuthEnvelopedData constructors declare (the IllegalArgumentException CMSEncryptedData documents). Each now rejects a short sequence with IllegalArgumentException before reading, as the sibling content types CompressedData and DigestedData already did, so the wrappers surface it as their declared exception; the case that claims an OPTIONAL field and then truncates the mandatory ones after it is covered too. The streaming parsers CMSSignedDataParser, CMSEnvelopedDataParser, CMSAuthenticatedDataParser, CMSAuthEnvelopedDataParser and CMSCompressedDataParser had the same gap and more: an absent or truncated inner SEQUENCE, a mandatory field of the wrong type, or absent encapsulated or encrypted content escaped as NullPointerException, ClassCastException, IllegalArgumentException or IllegalStateException. The asn1.cms stream parsers now report a missing mandatory field as an IOException, and the CMS parsers report malformed content as CMSException ("Malformed content." / "Missing content.") or the IOException they declare.

  • A KeyAgreement asked for its shared secret before doPhase returned data rather than refusing. javax.crypto.KeyAgreement specifies IllegalStateException for that state, but nothing in the provider tracked it, so each SPI handed back whatever its result field held: for Diffie-Hellman that was the private value itself - engineInit seeded result with x, so generateSecret() returned the private exponent padded to the prime's length and generateSecret("AES") an all-zero key taken from that padding - while ECDH returned null and its named-algorithm overload raised NullPointerException. BaseAgreementSpi now records whether a doPhase has completed the agreement since the last init and refuses the request with an IllegalStateException naming the algorithm, so every family in the provider - DH, ECDH and ECMQV, the SM2 exchange, both ECGOST families, XDH, SM9 and NewHope - answers the same way, and the DH SPI no longer holds the private value in that field at all.

  • Mac.getInstance and KeyGenerator.getInstance by the HMAC SHA-512/224 and SHA-512/256 object identifiers (1.2.840.113549.2.12 and .13) failed, although the same algorithms resolved by name and the matching SecretKeyFactory aliases were registered: the SHA512 mappings called addHMACAlgorithm for the two truncated variants without the addHMACAlias that registers their OIDs against Mac and KeyGenerator. Both are now aliased, as every other HMAC in that class already was.

  • A KTSParameterSpec naming an HKDF key-derivation function with a parameters field - a form the provider does not service - was accepted at Cipher init and then failed out of wrap or unwrap with an unchecked IllegalStateException neither method declares. The KTS key-wrapping Ciphers (ML-KEM, Classic McEliece, FrodoKEM, the composite KEM and RSA-KEM) now validate the spec's KDF when they take it, reporting an unserviceable one as the InvalidAlgorithmParameterException engineInit declares, which is what the javax.crypto.KEM services already did through KdfUtil.resolveKemSpec.

  • A DTLS handshake deadlocked when a handshake message ahead of the peer's ChangeCipherSpec (a client's CertificateVerify, say) was lost while the ChangeCipherSpec and Finished behind it arrived: the record layer moved its read epoch on at the ChangeCipherSpec and then discarded every retransmission of the lost message as belonging to the old epoch, whose records are only accepted once the handshake has completed. Each side then waited on the other until a handshake timeout, if one was configured, ended it. Every client-authenticated handshake, and every handshake in which the server issues a NewSessionTicket, was exposed. Until the handshake completes, handshake records from the current epoch are now still accepted after the read epoch has moved on, and each message is checked against the epoch of the record that carried it. The DTLS loopback tests now run their handshakes at 10% datagram loss in each direction, with a client-authenticated handshake at 25%.

  • The lightweight SubjectPublicKeyInfoFactory and PrivateKeyInfoFactory encoded a GOST R 34.10-2012 key on one of the legacy CryptoPro curves under id-GostR3410-2001, although RFC 9215 sec. 4.2 permits those curves for 2012 keys. The digestParamSet now decides: a GOST R 34.11-94 parameter set means 2001 (RFC 4491 sec. 2.3.2), a GOST R 34.11-2012 digest or none means 2012 with 256/512 taken from the curve field size, and any other value is rejected. GOST3410PublicKeyAlgParameters treats digestParamSet as OPTIONAL on both read and write per RFC 9215, and PrivateKeyInfoFactory now passes attributes through for ECGOST3410 keys (bc-csharp github #707).

  • The name-constraint host canonicalisation removed a single RFC 1034 root-label dot, the only empty label a name may legally carry, but nothing refused the ones that are not legal: a dNSName, rfc822Name host or uniformResourceIdentifier host such as "example.com.." kept a phantom empty label after the strip and so matched no constraint at all, escaping an excluded subtree naming the host it appears to carry. A tested name whose host carries an empty label - a second trailing dot, a doubled dot or a leading dot - is now refused outright wherever a constraint of that type is in force, rather than canonicalised into a name it is not: removing the extra dots would decide on the caller's behalf that "example.com.." names example.com, which is not how a consumer resolving or comparing the name reads it, and refusing fails closed in both directions where canonicalising would newly admit such a name under a permitted subtree. The single trailing dot is canonicalised as before, a bare "." remains the root label rather than an empty one, and the guard is scoped to the host, so the doubled dot a quoted local part may legally carry is unaffected. Constraints are untouched - one may still begin with a dot, which is how this implementation spells "subdomains only" (github PR #2436).

  • SSLContext.createSSLEngine() from the BCJSSE provider in the 1.86 bctls jar failed with NoSuchMethodError on every JDK from 9 up, leaving engine-based users of the provider (Netty, Vert.x and the like) unable to open a connection. The jdk1.5 and jdk1.9 copies of the package-private SSLEngineUtil had declared create(ContextData) with different return types since 2019 - SSLEngine and ProvSSLEngine - and the root ProvSSLContextSpi, compiled against the first, is paired at runtime with the versions/9 copy on any modern JDK. Until 1.86 the java9 compile had hidden this by implicitly recompiling the whole base tree into META-INF/versions/9 (447 classes, ProvSSLContextSpi among them); the -implicit:none added in 1.86 to stop that duplication exposed the mismatch. The jdk1.9 copy now declares the same return type as the root one, a JDK 25 test creates engines against the built jar, and a new multiReleaseCheck Gradle task on every distributed jar reads the constant pool of each class in the jar and in the sibling BC jars it depends on and fails the build when a member reference does not resolve against the copy of its target that a JDK would pair it with, so the class of defect cannot ship again; the same check runs on arbitrary jars, a published release included, as multiReleaseCheckJar (github #2448).

  • The BCFKS key store derived its scrypt keys with the block size r in place of the parallelization parameter p, while writing the p the caller configured out to the store: BcFKSKeyStoreSpi passed getBlockSize() to SCrypt.generate for both arguments and never read the encoded parallelization parameter at all, so every store whose ScryptConfig gave a p other than its r encoded parameters that do not derive its own keys. The store was self-consistent - BC read back what BC wrote - but a conformant RFC 7914 reader computed a different key and so failed the integrity check and the store decryption, and BC could not open such a store written by anyone else. Derivation now follows RFC 7914. A store written by 1.86 or earlier is still read: the integrity check is retried under the old convention, and where a signature check leaves no MAC to settle it the store decryption is retried instead, in both cases reporting the failure of the encoded parameters rather than of the fallback. The write side is governed by org.bouncycastle.bcfks.scrypt_p_eq_r, default true, which writes p equal to r whatever the ScryptConfig asked for: the two conventions then agree, so a store written here is both RFC 7914 correct and readable by 1.86 and earlier. Clearing the property honours the configured p, which those releases cannot read unless p already equals r; the default is intended to become false in a later release, once enough of the installed base is writing parameters that describe themselves. Loading with a BCFKSLoadStoreParameter carrying a ScryptConfig accepts an encoded p equal to either the configured p or the block size, so a store round trips under the configuration that wrote it whichever way the property was set; every other parameter is compared as before. The parallelization parameter is now bounded alongside the cost parameter before the derivation, as the PKCS#8 and PKCS#12 scrypt paths already bound it.

  • Building an evidence record was cubic in the number of data objects: SortedHashList and SortedIndexedHashList held their hashes in a LinkedList and found each insertion point by walking it with get(index), so a single add() was quadratic in the position it inserted at and building a list of n hashes cubic, and both lists sit on the generation path - the reduced hash tree of ERSArchiveTimeStampGenerator, the Merkle tree of BinaryTreeRootCalculator.computeRootHash(), and the hash list of every ERSDataGroup. Each now collects its hashes and sorts them once, in toList(); the sort is stable and the old insertion placed a hash after the last one comparing equal to it, which is where a stable sort puts it, so the order of the leaves and every root hash are unchanged. getFirst() answers with a scan rather than a sort and toList() sorts a copy, so neither accessor disturbs what has been added. Generating a time-stamp request over 8,000 data objects goes from about 210 seconds to under a tenth of a second, and 100,000 objects, which the old code could not reach in any practical time, takes about 0.2 seconds (github #2456).

  • An ERSDataGroup recomputed its hash on every request rather than taking it from the cache ERSCachingData exists to provide: the group overrode getHash(), which left the calculateHash() the cache calls unreachable - and wrong, as it copied the member hashes with a loop bounded by the size of the empty list it was copying into, so it would have digested nothing had anything reached it. The computation is back in calculateHash() and the override is gone, so a group's hash is computed once per digest algorithm and previous-chain hash, as every other ERSData's is. The value itself is unchanged.

... (truncated)

Commits

@dependabot dependabot Bot added dependencies Pull requests that update a dependency file java Pull requests that update java code labels Sep 18, 2026
@dependabot
dependabot Bot requested review from a team as code owners September 18, 2026 20:57
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file java Pull requests that update java code labels Sep 18, 2026
@coderabbitai

coderabbitai Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6bffe9f4-7b81-4520-b4bc-7bdc6c55374a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

@dependabot
dependabot Bot force-pushed the dependabot/maven/org.bouncycastle-bcprov-jdk18on-1.85 branch from d12bffc to 403f51a Compare September 25, 2026 18:23
@github-actions

Copy link
Copy Markdown
Contributor

@dependabot
dependabot Bot force-pushed the dependabot/maven/org.bouncycastle-bcprov-jdk18on-1.85 branch from 403f51a to 1fa963a Compare October 1, 2026 17:06
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

@dependabot
dependabot Bot force-pushed the dependabot/maven/org.bouncycastle-bcprov-jdk18on-1.85 branch from 1fa963a to 7bddedd Compare October 15, 2026 18:36
@github-actions

Copy link
Copy Markdown
Contributor

dmihalcik-virtru added a commit that referenced this pull request Oct 21, 2026
## Summary

- **checks.yaml / mavenverify:** pass `-Dsonar.skip=true` when
`SONAR_TOKEN` is empty. Pushes to `main` and same-repo PRs still run the
Sonar analysis.
- **codeql.yaml:** pass `github_token` to `buf-setup-action`, as
`checks.yaml` already does.

## Rationale

Dependabot and fork PRs can't read Actions secrets. On #408, #407 and
#387, `mavenverify` gets through the build and all tests, then fails in
the Sonar goal:

> [ERROR] Not authorized. Please check the 'sonar.token' property or the
'SONAR_TOKEN' environment variable ...

`sonar-maven-plugin` checks `sonar.skip` before it starts the scanner
([source](https://github.com/SonarSource/sonar-scanner-maven/blob/master/sonar-maven-plugin/src/main/java/org/sonarsource/scanner/maven/SonarQubeMojo.java)),
so the job now passes or fails on the build and tests alone. I put the
change in the workflow instead of `pom.xml` because it depends on the CI
environment.

CodeQL on #407 failed with `API rate limit exceeded` inside the buf
setup step. Without a token, that step calls the GitHub API
unauthenticated and shares the runner IP's rate limit.

## Test plan

- [x] YAML parses; checked the skip logic for empty and non-empty
`SONAR_TOKEN`
- [ ] This PR's own `mavenverify` still runs Sonar (token available)
- [ ] After merge, the recreated Dependabot PRs show `sonar.skip = true:
Skipping analysis` and `mavenverify` passes

Companion PR: #425 (Dependabot PR titles).

Signed-off-by: Dave Mihalcik <dmihalcik@virtru.com>
dmihalcik-virtru added a commit that referenced this pull request Oct 21, 2026
## Summary

Adds `.github/dependabot.yml` so Dependabot PR titles pass the
conventional commit check.

- Runtime dependency bumps → `fix(main): bump ...` (release-please cuts
a patch release)
- Development/test-scoped bumps → `chore(ci): bump ...`
- `open-pull-requests-limit: 0` keeps version updates off. Dependabot
keeps opening security-update PRs only, as it does today, and those now
use the prefixes too.

## Rationale

All three open Dependabot PRs (#408, #407, #387) fail **Validate PR
title**:

> Unknown scope "deps" found in pull request title "chore(deps): bump
org.bouncycastle:bcprov-jdk18on from 1.84 to 1.85". Scope must match one
of: ci, cmdline, docs, main, sdk, tests, examples, release/v0\.\d+.

Dependabot adds the `:` after a prefix ending in `)`
([docs](https://docs.github.com/code-security/dependabot/working-with-dependabot/dependabot-options-reference#commit-message--)).

## Caveat

Dependabot decides what counts as a development dependency. It labeled
`bc-fips` as `deps-dev` (it's `test` scope in `sdk/pom.xml`) even though
`sdk-fips-bc` depends on it at compile scope. So `bc-fips` bumps will be
titled `chore(ci)`, and release-please won't cut a release for them.
Retitle those PRs to `fix(main)` before merging.

## Test plan

- [x] YAML parses
- [ ] After merge, comment `@dependabot recreate` on #408, #407, #387
and check the new titles pass the PR-title check

Companion PR: skip the Sonar scan when `SONAR_TOKEN` is unavailable.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

- **Chores**
- Added automated weekly dependency update checks across Maven-based
project areas.
- Security updates remain enabled, while routine non-security version
updates are not opened automatically.
- Automated dependency changes now follow consistent commit message
conventions.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Dave Mihalcik <dmihalcik@virtru.com>
@dmihalcik-virtru

Copy link
Copy Markdown
Member

@dependabot recreate

Bumps [org.bouncycastle:bcprov-jdk18on](https://github.com/bcgit/bc-java) from 1.84 to 1.85.
- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.md)
- [Commits](https://github.com/bcgit/bc-java/commits)

---
updated-dependencies:
- dependency-name: org.bouncycastle:bcprov-jdk18on
  dependency-version: '1.85'
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot changed the title chore(deps): bump org.bouncycastle:bcprov-jdk18on from 1.84 to 1.85 fix(main): bump org.bouncycastle:bcprov-jdk18on from 1.84 to 1.85 Oct 21, 2026
@dependabot
dependabot Bot force-pushed the dependabot/maven/org.bouncycastle-bcprov-jdk18on-1.85 branch from 7bddedd to 85debd1 Compare October 21, 2026 00:46
@github-actions

Copy link
Copy Markdown
Contributor

X-Test Failure Report

@github-actions

Copy link
Copy Markdown
Contributor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file java Pull requests that update java code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants