Skip to content

Commit 2f422bf

Browse files
authored
Merge pull request #6 from yenqileo/release/25.1.1-1
Release/25.1.1 1
2 parents 83ee2a9 + 3ef65b2 commit 2f422bf

File tree

11 files changed

+86
-15
lines changed

11 files changed

+86
-15
lines changed

ServiceCore/src/main/java/com/intel/bkp/core/endianness/StructureField.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public enum StructureField implements IStructureField {
100100
PSG_QEK_INFO_LENGTH,
101101
PSG_QEK_KEY_LENGTH,
102102
PSG_QEK_SHA_LENGTH,
103+
PSG_QEK_KEY_VERSION,
103104
PSG_QEK_KEY_TYPE_MAGIC,
104105
PSG_QEK_MAX_KEY_USES,
105106
PSG_QEK_INTER_KEY_NUM,

ServiceCore/src/main/java/com/intel/bkp/core/endianness/maps/PsgQekEndiannessMapImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_INFO_LENGTH;
3939
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_INTER_KEY_NUM;
4040
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_KEY_LENGTH;
41+
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_KEY_VERSION;
4142
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_KEY_TYPE_MAGIC;
4243
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_MAGIC;
4344
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_MAX_KEY_USES;
@@ -59,6 +60,7 @@ protected void populateFirmwareMap() {
5960
put(PSG_QEK_INFO_LENGTH, CONVERT);
6061
put(PSG_QEK_KEY_LENGTH, CONVERT);
6162
put(PSG_QEK_SHA_LENGTH, CONVERT);
63+
put(PSG_QEK_KEY_VERSION, CONVERT);
6264
put(PSG_QEK_KEY_TYPE_MAGIC, CONVERT);
6365
put(PSG_QEK_MAX_KEY_USES, CONVERT);
6466
put(PSG_QEK_INTER_KEY_NUM, CONVERT);

ServiceCore/src/main/java/com/intel/bkp/core/psgcertificate/PsgQekBuilderHSM.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_INTER_KEY_NUM;
4949
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_KEY_LENGTH;
5050
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_KEY_TYPE_MAGIC;
51+
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_KEY_VERSION;
5152
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_MAGIC;
5253
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_MAX_KEY_USES;
5354
import static com.intel.bkp.core.endianness.StructureField.PSG_QEK_SHA_LENGTH;
@@ -73,7 +74,7 @@ public class PsgQekBuilderHSM extends StructureBuilder<PsgQekBuilderHSM, PsgQekH
7374
private byte[] infoLength = new byte[Integer.BYTES];
7475
private byte[] keyLength = new byte[Integer.BYTES];
7576
private byte[] shaLength = new byte[Integer.BYTES];
76-
private final byte[] reserved = new byte[Integer.BYTES];
77+
private byte[] version = new byte[Integer.BYTES];
7778
private byte[] keyTypeMagic = new byte[Integer.BYTES];
7879
private byte[] maxKeyUses = new byte[Integer.BYTES];
7980
private byte[] interKeyNum = new byte[Integer.BYTES];
@@ -103,7 +104,7 @@ public PsgQekHSM build() {
103104
entry.setInfoLength(convert(infoLength, PSG_QEK_INFO_LENGTH));
104105
entry.setKeyLength(convert(keyLength, PSG_QEK_KEY_LENGTH));
105106
entry.setShaLength(convert(shaLength, PSG_QEK_SHA_LENGTH));
106-
entry.setReserved(reserved);
107+
entry.setVersion(version);
107108
entry.setKeyTypeMagic(convert(keyTypeMagic, PSG_QEK_KEY_TYPE_MAGIC));
108109
entry.setMaxKeyUses(convert(maxKeyUses, PSG_QEK_MAX_KEY_USES));
109110
entry.setInterKeyNum(convert(interKeyNum, PSG_QEK_INTER_KEY_NUM));
@@ -145,8 +146,8 @@ public PsgQekBuilderHSM parse(ByteBufferSafe buffer) throws ParseStructureExcept
145146
throw new ParseStructureException("Invalid SHA length 0x%x, expected 0x%x".formatted(new BigInteger(shaLength).intValue(), SHA_LEN));
146147
}
147148

148-
buffer.get(reserved);
149-
checkIfArrayFilledWithZeros(reserved);
149+
buffer.get(version);
150+
version = convert(version, PSG_QEK_KEY_VERSION);
150151
buffer.get(keyTypeMagic);
151152
keyTypeMagic = convert(keyTypeMagic, PSG_QEK_KEY_TYPE_MAGIC);
152153
if (KEY_TYPE_MAGIC != new BigInteger(keyTypeMagic).intValue()) {

ServiceCore/src/main/java/com/intel/bkp/core/psgcertificate/model/PsgQekHSM.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class PsgQekHSM implements IStructure {
4747
private byte[] infoLength = new byte[0];
4848
private byte[] keyLength = new byte[0];
4949
private byte[] shaLength = new byte[0];
50-
private byte[] reserved = new byte[0];
50+
private byte[] version = new byte[0];
5151
private byte[] keyTypeMagic = new byte[0];
5252
private byte[] maxKeyUses = new byte[0];
5353
private byte[] interKeyNum = new byte[0];
@@ -62,7 +62,7 @@ public class PsgQekHSM implements IStructure {
6262
@Override
6363
public byte[] array() {
6464
final int capacity = magic.length + qekDataLength.length + infoLength.length + keyLength.length
65-
+ shaLength.length + reserved.length + keyTypeMagic.length + maxKeyUses.length + interKeyNum.length
65+
+ shaLength.length + version.length + keyTypeMagic.length + maxKeyUses.length + interKeyNum.length
6666
+ step.length + totalKeyUses.length + reservedNoSalt.length + ivData.length
6767
+ encryptedAESKey.length + encryptedKDK.length + encryptedSHA384.length;
6868

@@ -73,7 +73,7 @@ public byte[] array() {
7373
.put(infoLength)
7474
.put(keyLength)
7575
.put(shaLength)
76-
.put(reserved)
76+
.put(version)
7777
.put(keyTypeMagic)
7878
.put(maxKeyUses)
7979
.put(interKeyNum)
192 Bytes
Binary file not shown.
432 Bytes
Binary file not shown.

Verifier/verifier_third_party_licenses.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
# VERIFIER dependency list
33
## Dependency License Report
4-
_2025-02-21 03:23:35 UTC_
4+
_2025-07-11 02:14:53 UTC_
55
## Apache License 2.0
66

77
**1** **Group:** `io.swagger.core.v3` **Name:** `swagger-annotations` **Version:** `2.2.28`

bkps/bkps_third_party_licenses.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
# BKPS dependency list
33
## Dependency License Report
4-
_2025-02-21 03:23:23 UTC_
4+
_2025-07-11 02:14:53 UTC_
55
## Apache 2
66

77
**1** **Group:** `com.opencsv` **Name:** `opencsv` **Version:** `5.9`

bkps/src/integrationTest/java/com/intel/bkp/bkps/rest/configuration/controller/AesCtrEncryptionKeyTest.java

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@
7373
import org.springframework.transaction.annotation.Transactional;
7474
import javax.crypto.SecretKey;
7575
import javax.crypto.spec.SecretKeySpec;
76-
import java.nio.ByteBuffer;
77-
import java.nio.ByteOrder;
7876
import java.util.Arrays;
7977
import java.util.List;
8078
import static com.intel.bkp.bkps.rest.RestUtil.createFormattingConversionService;
@@ -143,10 +141,16 @@ public class AesCtrEncryptionKeyTest {
143141

144142
private ServiceConfiguration serviceConfiguration;
145143

144+
private ServiceConfiguration serviceConfigurationVer1;
145+
146146
private byte[] qekContent;
147147

148+
private byte[] qekContentVer1;
149+
148150
private byte[] aesKeyContent;
149151

152+
private byte[] aesKeyContentVer1;
153+
150154
@BeforeEach
151155
void setup() {
152156
final ServiceConfigurationController serviceConfigurationResource =
@@ -161,11 +165,18 @@ void setup() {
161165
qek.setKeyName(TestHelper.DEFAULT_KEY_NAME);
162166
qekContent = loadBinary(ResourceDir.ROOT, "aes_testmode1.qek");
163167
qek.setValue(toHex(qekContent));
168+
Qek qekVer1 = new Qek();
169+
qekVer1.setKeyName(TestHelper.DEFAULT_KEY_NAME);
170+
qekContentVer1 = loadBinary(ResourceDir.ROOT, "BKPSAESKey32.qek");
171+
qekVer1.setValue(toHex(qekContentVer1));
164172
byte[] encryptionKeyData = fromHex(loadFile(ResourceDir.ROOT, "aes_key_sdm1_5_ver2.txt"));
165173
ENCRYPTION_KEY = toHex(encryptionKeyData);
166174
aesKeyContent = loadBinary(ResourceDir.ROOT, "signed_UDS_intelpuf_wrapped_aes_testmode1.ccert");
175+
aesKeyContentVer1 = loadBinary(ResourceDir.ROOT, "signed_efuse_wrapped_aes_version_1.ccert");
167176
serviceConfiguration = TestHelper.createServiceConfigurationEntity(
168177
DEFAULT_OVERBUILD_MAX, STORAGE_TYPE, null, false, PUF_TYPE, KEY_WRAPPING_TYPE, qek, aesKeyContent);
178+
serviceConfigurationVer1 = TestHelper.createServiceConfigurationEntity(
179+
DEFAULT_OVERBUILD_MAX, STORAGE_TYPE, null, false, PufType.EFUSE, KeyWrappingType.INTERNAL, qekVer1, aesKeyContentVer1);
169180
}
170181

171182
@Test
@@ -208,6 +219,42 @@ public void getServiceConfiguration() throws Exception {
208219
.value(TestHelper.DEFAULT_EFUSES_PUB_VALUE));
209220
}
210221

222+
@Test
223+
@Transactional
224+
public void createVersion1ServiceConfigurationWithTestProgramFlag() throws Exception {
225+
prepareSealingKey();
226+
prepareAesKey(SecurityKeyType.AES_CTR, TestHelper.DEFAULT_KEY_NAME, ENCRYPTION_KEY, "AES/CTR/NoPadding");
227+
int databaseSizeBeforeCreate = serviceConfigurationRepository.findAll().size();
228+
// Create the ServiceConfiguration
229+
ServiceConfigurationDTO serviceConfigurationDTO = serviceConfigurationMapper.toDto(serviceConfigurationVer1);
230+
serviceConfigurationDTO.getConfidentialData().getAesKey().setTestProgram(true);
231+
restMockMvc.perform(post(CONFIG_NODE + CONFIGURATION)
232+
.contentType(RestUtil.APPLICATION_JSON_UTF8)
233+
.content(RestUtil.convertObjectToJsonBytes(serviceConfigurationDTO)))
234+
.andExpect(status().isCreated());
235+
236+
// Validate the ServiceConfiguration in the database
237+
List<ServiceConfiguration> serviceConfigurationList = serviceConfigurationRepository.findAll();
238+
assertEquals(databaseSizeBeforeCreate + 1, serviceConfigurationList.size());
239+
ServiceConfiguration testServiceConfiguration = serviceConfigurationList.get(
240+
serviceConfigurationList.size() - 1);
241+
assertEquals(TestHelper.DEFAULT_NAME, testServiceConfiguration.getName());
242+
assertEquals(PufType.EFUSE, testServiceConfiguration.getPufType());
243+
assertEquals(DEFAULT_OVERBUILD_MAX, testServiceConfiguration.getOverbuildMax());
244+
245+
final AesKey aesKey = testServiceConfiguration.getConfidentialData().getAesKey();
246+
assertEquals(StorageType.EFUSES, aesKey.getStorage());
247+
assertEquals(KeyWrappingType.INTERNAL, aesKey.getKeyWrappingType());
248+
aesGcmSealingKeyProvider.initialize(securityService.getKeyFromSecurityObject(SEALING_KEYNAME));
249+
final byte[] decryptedAesContent = aesGcmSealingKeyProvider.decrypt(fromHex(aesKey.getValue()));
250+
assert Arrays.equals(aesKeyContentVer1, decryptedAesContent);
251+
assertEquals(false, aesKey.getTestProgram());
252+
final Qek qek = testServiceConfiguration.getConfidentialData().getQek();
253+
assertEquals(TestHelper.DEFAULT_KEY_NAME, qek.getKeyName());
254+
final byte[] decryptedQekValue = aesGcmSealingKeyProvider.decrypt(fromHex(qek.getValue()));
255+
assert Arrays.equals(qekContentVer1, decryptedQekValue);
256+
}
257+
211258
@Test
212259
@Transactional
213260
public void createServiceConfigurationWithTestProgramFlag() throws Exception {

bkps/src/main/java/com/intel/bkp/bkps/rest/configuration/service/ServiceConfigurationService.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import com.intel.bkp.crypto.exceptions.EncryptionProviderException;
6464
import com.intel.bkp.crypto.exceptions.HMacProviderException;
6565
import com.intel.bkp.crypto.hmac.HMacKdfProviderImpl;
66+
import com.intel.bkp.utils.ByteConverter;
6667
import org.apache.commons.codec.digest.DigestUtils;
6768
import lombok.AccessLevel;
6869
import lombok.RequiredArgsConstructor;
@@ -149,18 +150,37 @@ private void validateAESAndQek(Qek qek) {
149150

150151
// Decrypt and extract actual AES root key from QEK data
151152
aesCtrEncryptionKeyProvider.initialize(new AesCtrQekIvProvider(qekBuilderHSM.getIvData()), qek.getKeyName());
152-
byte[] aesRootKey = aesCtrEncryptionKeyProvider.decrypt(qekBuilderHSM.getEncryptedAESKey());
153+
byte[] aesRootKey = new byte[32];
154+
byte[] kdkKey = new byte[32];
155+
byte[] expectedSHA384Hash = new byte[48];
153156

157+
Integer version = ByteConverter.toInt(qekBuilderHSM.getVersion());
154158
// Verify hash of QEK
155-
byte[] kdkKey = aesCtrEncryptionKeyProvider.decrypt(qekBuilderHSM.getEncryptedKDK());
159+
if (version == 1) {
160+
// Decrypt block of AES key, KDK and SHA384 hash
161+
ByteBuffer buffer = ByteBuffer.allocate(0x70);
162+
buffer.order(ByteOrder.LITTLE_ENDIAN);
163+
buffer.put(qekBuilderHSM.getEncryptedAESKey());
164+
buffer.put(qekBuilderHSM.getEncryptedKDK());
165+
buffer.put(qekBuilderHSM.getEncryptedSHA384());
166+
byte[] decodedData = aesCtrEncryptionKeyProvider.decrypt(buffer.array());
167+
ByteBuffer decodedBuffer = ByteBuffer.wrap(decodedData);
168+
decodedBuffer.get(aesRootKey);
169+
decodedBuffer.get(kdkKey);
170+
decodedBuffer.get(expectedSHA384Hash);
171+
} else {
172+
aesRootKey = aesCtrEncryptionKeyProvider.decrypt(qekBuilderHSM.getEncryptedAESKey());
173+
kdkKey = aesCtrEncryptionKeyProvider.decrypt(qekBuilderHSM.getEncryptedKDK());
174+
expectedSHA384Hash = aesCtrEncryptionKeyProvider.decrypt(qekBuilderHSM.getEncryptedSHA384());
175+
}
176+
156177
ByteBuffer bufferCheckHash = ByteBuffer.allocate(0x60);
157178
bufferCheckHash.order(ByteOrder.LITTLE_ENDIAN);
158179
bufferCheckHash.put(qekBuilderHSM.getReservedNoSalt());
159180
bufferCheckHash.put(qekBuilderHSM.getIvData());
160181
bufferCheckHash.put(aesRootKey);
161182
bufferCheckHash.put(kdkKey);
162183
byte[] sha384Hash = DigestUtils.sha384(bufferCheckHash.array());
163-
byte[] expectedSHA384Hash = aesCtrEncryptionKeyProvider.decrypt(qekBuilderHSM.getEncryptedSHA384());
164184
if (!Arrays.equals(sha384Hash, expectedSHA384Hash)) {
165185
throw new IOException("Failed to decrypt QEK data. QEK data is either corrupted or QEK encryption key that associated with the key name is mismatch.");
166186
}

0 commit comments

Comments
 (0)