Skip to content
This repository has been archived by the owner on Feb 7, 2025. It is now read-only.

Use SHA3-512 #1594

Merged
merged 18 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataMessageType;
import gov.hhs.cdc.trustedintermediary.etor.ruleengine.transformation.TransformationRuleEngine;
import gov.hhs.cdc.trustedintermediary.etor.utils.security.HashHelper;
import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import gov.hhs.cdc.trustedintermediary.wrappers.MetricMetadata;
import javax.inject.Inject;

/** The overall logic to receive, convert to OML, and subsequently send a lab order. */
public class SendOrderUseCase implements SendMessageUseCase<Order<?>> {
private static final SendOrderUseCase INSTANCE = new SendOrderUseCase();
private final HashHelper hashHelper = new HashHelper();
@Inject TransformationRuleEngine transformationEngine;
@Inject OrderSender sender;
@Inject MetricMetadata metadata;
Expand All @@ -29,10 +31,12 @@ public static SendOrderUseCase getInstance() {
public void convertAndSend(final Order<?> order, String receivedSubmissionId)
throws UnableToSendMessageException {

String hashedOrder = hashHelper.generateHash(order);

PartnerMetadata partnerMetadata =
new PartnerMetadata(
receivedSubmissionId,
String.valueOf(order.hashCode()),
hashedOrder,
PartnerMetadataMessageType.ORDER,
order.getSendingApplicationDetails(),
order.getSendingFacilityDetails(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata;
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataMessageType;
import gov.hhs.cdc.trustedintermediary.etor.ruleengine.transformation.TransformationRuleEngine;
import gov.hhs.cdc.trustedintermediary.etor.utils.security.HashHelper;
import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import javax.inject.Inject;

/** Use case for converting and sending a lab result message. */
public class SendResultUseCase implements SendMessageUseCase<Result<?>> {
private static final SendResultUseCase INSTANCE = new SendResultUseCase();
private final HashHelper hashHelper = new HashHelper();

@Inject TransformationRuleEngine transformationEngine;
@Inject ResultSender sender;
Expand All @@ -30,10 +32,12 @@ public static SendResultUseCase getInstance() {
public void convertAndSend(Result<?> result, String receivedSubmissionId)
throws UnableToSendMessageException {

String hashedResult = hashHelper.generateHash(result);

PartnerMetadata partnerMetadata =
new PartnerMetadata(
receivedSubmissionId,
String.valueOf(result.hashCode()),
hashedResult,
PartnerMetadataMessageType.RESULT,
result.getSendingApplicationDetails(),
result.getSendingFacilityDetails(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package gov.hhs.cdc.trustedintermediary.etor.utils.security;

import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.HexFormat;
import javax.inject.Inject;

public class HashHelper implements SecureHash {
pluckyswan marked this conversation as resolved.
Show resolved Hide resolved
@Inject Logger logger;

@Override
public <T> String generateHash(T input) {
Fixed Show fixed Hide fixed
pluckyswan marked this conversation as resolved.
Show resolved Hide resolved
try {
MessageDigest digest = MessageDigest.getInstance("SHA3-512", "BC");
Fixed Show fixed Hide fixed
byte[] objBytes = input.toString().getBytes(StandardCharsets.UTF_8);
byte[] hashBytes = digest.digest(objBytes);
return HexFormat.of().formatHex(hashBytes);
} catch (NoSuchAlgorithmException e) {
logger.logError("Algorithm does not exist!", e);
throw new RuntimeException(e);
pluckyswan marked this conversation as resolved.
Show resolved Hide resolved
} catch (NoSuchProviderException e) {
logger.logError("Provider does not exist!", e);
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package gov.hhs.cdc.trustedintermediary.etor.utils.security;

import java.security.NoSuchAlgorithmException;

public interface SecureHash {
pluckyswan marked this conversation as resolved.
Show resolved Hide resolved
<T> String generateHash(T hash) throws NoSuchAlgorithmException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package gov.hhs.cdc.trustedintermediary.etor.utils.security
import gov.hhs.cdc.trustedintermediary.context.TestApplicationContext
import gov.hhs.cdc.trustedintermediary.etor.orders.Order
import gov.hhs.cdc.trustedintermediary.etor.results.Result
import gov.hhs.cdc.trustedintermediary.wrappers.Logger
import spock.lang.Specification

class HashHelperTest extends Specification {
def mockLogger = Mock(Logger)
def hashHelper = new HashHelper()

def setup() {
TestApplicationContext.reset()
TestApplicationContext.init()
TestApplicationContext.register(Logger, mockLogger)
TestApplicationContext.injectRegisteredImplementations()
}

def "generateHash generates hash for an order"() {
given:
def mockOrder = Mock(Order)

when:
String mockHash = hashHelper.generateHash(mockOrder)

then:
mockHash !== ""
0 * mockLogger.logError(_, _)
}

def "generateHash generates the same hash for the same object"() {
given:
def mockResult = Mock(Result)
def mockResult2 = mockResult

when:
String mockHash = hashHelper.generateHash(mockResult)
String mockHash2 = hashHelper.generateHash(mockResult2)

then:
mockHash !== ""
mockHash == mockHash2
0 * mockLogger.logError(_, _)
}
}
Loading