Top Description Inners Fields Constructors Methods
com.oracle.bmc.http.signing.internal

public Class RequestSignerImpl

extends Object
implements RequestSigner
Class Inheritance
All Implemented Interfaces
com.oracle.bmc.http.signing.RequestSigner
Imports
com.oracle.bmc.http.client.Serializer, com.oracle.bmc.http.client.io.DuplicatableInputStream, com.oracle.bmc.http.signing.RequestSigner, .RequestSignerException, .SigningStrategy, com.oracle.bmc.io.internal.KeepOpenInputStream, com.oracle.bmc.retrier.Retriers, com.oracle.bmc.util.StreamUtils, .VisibleForTesting, com.oracle.bmc.util.internal.StringUtils, .Validate, jakarta.annotation.Nonnull, .Nullable, java.io.IOException, .InputStream, java.net.URI, java.nio.charset.StandardCharsets, java.security.MessageDigest, .NoSuchAlgorithmException, java.security.interfaces.RSAPrivateKey, java.text.SimpleDateFormat, java.util.ArrayList, .Arrays, .Base64, .Collections, .Date, .HashMap, .List, .Locale, .Map, .Map.Entry, .Optional, .TimeZone, java.util.function.Supplier

Implementation of the RequestSigner interface

This contains the main code that is used for signing a request

Class is immutable. @Immutable

Nested and Inner Type Summary

Modifier and TypeClass and Description
public static class
RequestSignerImpl.SigningConfiguration

Basic configuration of what headers to sign.

Field Summary

Modifier and TypeField and Description
private final Supplier<String>
private final KeySupplier<RSAPrivateKey>
private static final Logger
private static final SignatureSigner
private final RequestSignerImpl.SigningConfiguration

Constructor Summary

AccessConstructor and Description
public
RequestSignerImpl(final KeySupplier<RSAPrivateKey>
A key supplier that will be used for signing the request
keySupplier
,
final SigningStrategy
The signing strategy to determine what headers to use
signingStrategy
,
final Supplier<String>
A keyId supplier that will be used for signing the request
keyIdSupplier
)

Construct the RequestSigner with the specified KeySupplier.

public
RequestSignerImpl(final KeySupplier<RSAPrivateKey>
A key supplier that will be used for signing the request
keySupplier
,
final RequestSignerImpl.SigningConfiguration
The signing configuration to determine what headers to use
signingConfiguration
,
final Supplier<String>
A keyId supplier that will be used for signing the request
keyIdSupplier
)

Construct the RequestSigner with the specified KeySupplier.

Method Summary

Modifier and TypeMethod and Description
pack-priv static String
base64Encode(byte[] bytes)

private static String
calculateAuthorizationHeader(final String keyId, final String httpMethod, final String signature, final Algorithm algorithm, final String version, final List<String> requiredHeaders, final List<String> optionalHeaders)

private static String
calculateBodySHA256(final byte[] body)

pack-priv static Map<String, String>
calculateMissingHeaders(final String httpMethod, final URI uri, final Map<String, List<String>> existingHeaders, final Object body, final List<String> requiredHeaders, final RequestSignerImpl.SigningConfiguration signingConfiguration)

pack-priv static String
calculateStringToSign(String httpMethod, String path, Map<String, List<String>> allHeaders, List<String> requiredHeaders, Map<String, List<String>> originalHeaders)

private static SimpleDateFormat
private static String
private static List<String>
private static List<String>
getOptionalSigningHeaders(final String httpMethod, final RequestSignerImpl.SigningConfiguration signingConfiguration)

private static RSAPrivateKey
private static List<String>
getRequiredSigningHeaders(final String httpMethod, final RequestSignerImpl.SigningConfiguration signingConfiguration)

pack-priv static Map<String, List<String>>
ignoreCaseHeaders(final Map<String, List<String>> originalHeaders)

private static boolean
isRequiredHeaderMissing(String headerName, List<String> requiredHeaders, Map<String, ?> existingHeaders)

private static byte[]
private static String
sign(RSAPrivateKey key, Algorithm algorithm, String stringToSign)

public Map<String, String>
signRequest(final URI
the request uri
uri
,
final String
the request method
httpMethod
,
final Map<String, List<String>>
the request headers
headers
,
final Object
the request body (if this is a PUT or POST method)
body
)

Implements com.oracle.bmc.http.signing.RequestSigner.signRequest.

Sign a request.

private Map<String, String>
signRequest(final Algorithm algorithm, final URI uri, final String httpMethod, final Map<String, List<String>> headers, final Object body, final String versionName)

public static Map<String, String>
signRequest(final Algorithm algorithm, final URI uri, final String httpMethod, final Map<String, List<String>> headers, final Object body, final String versionName, final String keyId, final KeySupplier<RSAPrivateKey> keySupplier, final RequestSignerImpl.SigningConfiguration signingConfiguration)

private static RequestSignerImpl.SigningConfiguration
private static String
private static Version
validateVersion(String version, Algorithm algorithm)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

keyIdSupplierback to summary
private final Supplier<String> keyIdSupplier
keySupplierback to summary
private final KeySupplier<RSAPrivateKey> keySupplier
LOGback to summary
private static final Logger LOG
SIGNERback to summary
private static final SignatureSigner SIGNER
signingConfigurationback to summary
private final RequestSignerImpl.SigningConfiguration signingConfiguration

Constructor Detail

RequestSignerImplback to summary
public RequestSignerImpl(final KeySupplier<RSAPrivateKey> keySupplier, final SigningStrategy signingStrategy, final Supplier<String> keyIdSupplier)

Construct the RequestSigner with the specified KeySupplier. This will be used to get keys for doing the signing.

Parameters
keySupplier:KeySupplier<RSAPrivateKey>

A key supplier that will be used for signing the request

signingStrategy:SigningStrategy

The signing strategy to determine what headers to use

keyIdSupplier:Supplier<String>

A keyId supplier that will be used for signing the request

RequestSignerImplback to summary
public RequestSignerImpl(final KeySupplier<RSAPrivateKey> keySupplier, final RequestSignerImpl.SigningConfiguration signingConfiguration, final Supplier<String> keyIdSupplier)

Construct the RequestSigner with the specified KeySupplier. This will be used to get keys for doing the signing.

Parameters
keySupplier:KeySupplier<RSAPrivateKey>

A key supplier that will be used for signing the request

signingConfiguration:RequestSignerImpl.SigningConfiguration

The signing configuration to determine what headers to use

keyIdSupplier:Supplier<String>

A keyId supplier that will be used for signing the request

Method Detail

base64Encodeback to summary
pack-priv static String base64Encode(byte[] bytes)
calculateAuthorizationHeaderback to summary
private static String calculateAuthorizationHeader(final String keyId, final String httpMethod, final String signature, final Algorithm algorithm, final String version, final List<String> requiredHeaders, final List<String> optionalHeaders)
calculateBodySHA256back to summary
private static String calculateBodySHA256(final byte[] body)
calculateMissingHeadersback to summary
pack-priv static Map<String, String> calculateMissingHeaders(final String httpMethod, final URI uri, final Map<String, List<String>> existingHeaders, final Object body, final List<String> requiredHeaders, final RequestSignerImpl.SigningConfiguration signingConfiguration) throws IOException
calculateStringToSignback to summary
pack-priv static String calculateStringToSign(String httpMethod, String path, Map<String, List<String>> allHeaders, List<String> requiredHeaders, Map<String, List<String>> originalHeaders)
Annotations
@VisibleForTesting
createFormatterback to summary
private static SimpleDateFormat createFormatter()
extractPathback to summary
private static String extractPath(URI uri)
getIgnoreCaseHeadersback to summary
private static List<String> getIgnoreCaseHeaders(List<String> headerNames)
getOptionalSigningHeadersback to summary
private static List<String> getOptionalSigningHeaders(final String httpMethod, final RequestSignerImpl.SigningConfiguration signingConfiguration)
getPrivateKeyback to summary
private static RSAPrivateKey getPrivateKey(String keyId, KeySupplier<RSAPrivateKey> keySupplier)
getRequiredSigningHeadersback to summary
private static List<String> getRequiredSigningHeaders(final String httpMethod, final RequestSignerImpl.SigningConfiguration signingConfiguration)
ignoreCaseHeadersback to summary
pack-priv static Map<String, List<String>> ignoreCaseHeaders(final Map<String, List<String>> originalHeaders)
Annotations
@VisibleForTesting
isRequiredHeaderMissingback to summary
private static boolean isRequiredHeaderMissing(String headerName, List<String> requiredHeaders, Map<String, ?> existingHeaders)
readBodyBytesback to summary
private static byte[] readBodyBytes(Object body) throws IOException
signback to summary
private static String sign(RSAPrivateKey key, Algorithm algorithm, String stringToSign)
signRequestback to summary
public Map<String, String> signRequest(final URI uri, final String httpMethod, final Map<String, List<String>> headers, final Object body)

Implements com.oracle.bmc.http.signing.RequestSigner.signRequest.

Doc from com.oracle.bmc.http.signing.RequestSigner.signRequest.

Sign a request.

Parameters
uri:URI

the request uri

httpMethod:String

the request method

headers:Map<String, List<String>>

the request headers

body:Object

the request body (if this is a PUT or POST method)

Returns:Map<String, String>

a map that contains the signature Authorization header, and any headers that were signed when generating the signature. You MUST include the exact values of the returned headers when making requests.

Annotations
@Override
signRequestback to summary
private Map<String, String> signRequest(final Algorithm algorithm, final URI uri, final String httpMethod, final Map<String, List<String>> headers, final Object body, final String versionName)
signRequestback to summary
public static Map<String, String> signRequest(final Algorithm algorithm, final URI uri, final String httpMethod, final Map<String, List<String>> headers, final Object body, final String versionName, final String keyId, final KeySupplier<RSAPrivateKey> keySupplier, final RequestSignerImpl.SigningConfiguration signingConfiguration)
toSigningConfigurationback to summary
private static RequestSignerImpl.SigningConfiguration toSigningConfiguration(SigningStrategy signingStrategy)
transformHeadersToJsonStringback to summary
private static String transformHeadersToJsonString(final Map<String, List<String>> headers)
validateVersionback to summary
private static Version validateVersion(String version, Algorithm algorithm)
com.oracle.bmc.http.signing.internal back to summary

public Class RequestSignerImpl.SigningConfiguration

extends Object
Class Inheritance
  • java.lang.Object
  • com.oracle.bmc.http.signing.internal.RequestSignerImpl.SigningConfiguration

Basic configuration of what headers to sign.

Field Summary

Modifier and TypeField and Description
private final Map<String, List<String>>
headersToSign

Map of HTTP method to list of headers to sign.

private final Map<String, List<String>>
optionalHeadersToSign

Map of HTTP method to list of headers to sign, if they are present.

private final boolean
skipContentHeadersForStreamingPutRequests

Flag indicating whether InputStreams in PUT requests are allowed to skip content headers.

Constructor Summary

AccessConstructor and Description
public
SigningConfiguration(final Map<String, List<String>> headersToSign, final Map<String, List<String>> optionalHeadersToSign, final boolean skipContentHeadersForStreamingPutRequests)

Method Summary

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

headersToSignback to summary
private final Map<String, List<String>> headersToSign

Map of HTTP method to list of headers to sign.

optionalHeadersToSignback to summary
private final Map<String, List<String>> optionalHeadersToSign

Map of HTTP method to list of headers to sign, if they are present.

skipContentHeadersForStreamingPutRequestsback to summary
private final boolean skipContentHeadersForStreamingPutRequests

Flag indicating whether InputStreams in PUT requests are allowed to skip content headers.

Constructor Detail

SigningConfigurationback to summary
public SigningConfiguration(final Map<String, List<String>> headersToSign, final Map<String, List<String>> optionalHeadersToSign, final boolean skipContentHeadersForStreamingPutRequests)
Annotations
@java.beans.ConstructorProperties