001/* 002 * nimbus-jose-jwt 003 * 004 * Copyright 2012-2016, Connect2id Ltd. 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use 007 * this file except in compliance with the License. You may obtain a copy of the 008 * License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software distributed 013 * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 014 * CONDITIONS OF ANY KIND, either express or implied. See the License for the 015 * specific language governing permissions and limitations under the License. 016 */ 017 018package com.nimbusds.jose.crypto.bc; 019 020 021import org.bouncycastle.jce.provider.BouncyCastleProvider; 022 023import java.security.Provider; 024 025 026/** 027 * BouncyCastle JCA provider singleton, intended to prevent memory leaks by 028 * ensuring a single instance is loaded at all times. Application code that 029 * needs a BouncyCastle JCA provider should use the {@link #getInstance()} 030 * method to obtain an instance. 031 * 032 * <p>Requires the following optional dependency: 033 * 034 * <pre> 035 * <dependency> 036 * <groupId>org.bouncycastle</groupId> 037 * <artifactId>bcprov-jdk15on</artifactId> 038 * <version>[1.68,2.0.0)</version> 039 * <optional>true</optional> 040 * </dependency> 041 * </pre> 042 * 043 * <p><strong>Important:</strong> The BouncyCastle FIPS JCA provider dependency 044 * must not be present to prevent class conflicts! 045 * 046 * @author Vladimir Dzhuvinov 047 * @version 2025-01-02 048 */ 049public final class BouncyCastleProviderSingleton { 050 051 052 /** 053 * The BouncyCastle provider, lazily instantiated. 054 */ 055 private static Provider bouncyCastleProvider; 056 057 058 /** 059 * Prevents external instantiation. 060 */ 061 private BouncyCastleProviderSingleton() { } 062 063 064 /** 065 * Returns a BouncyCastle JCA provider instance. 066 * 067 * @return The BouncyCastle JCA provider instance. 068 */ 069 public static Provider getInstance() { 070 071 if (bouncyCastleProvider == null) { 072 bouncyCastleProvider = new BouncyCastleProvider(); 073 } 074 return bouncyCastleProvider; 075 } 076}