diff options
| -rw-r--r-- | services/core/java/com/android/server/PersistentDataBlockService.java | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index e336b6bafac4..16645dfd386d 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -375,15 +375,38 @@ public class PersistentDataBlockService extends SystemService { try { FileChannel channel = getBlockOutputChannel(); + // Format the data selectively. + // + // 1. write header, set length = 0 int header_size = DIGEST_SIZE_BYTES + HEADER_SIZE; ByteBuffer buf = ByteBuffer.allocate(header_size); buf.put(new byte[DIGEST_SIZE_BYTES]); buf.putInt(PARTITION_TYPE_MARKER); buf.putInt(0); + buf.flip(); channel.write(buf); - // corrupt the payload explicitly + channel.force(true); + + // 2. corrupt the legacy FRP data explicitly int payload_size = (int) getBlockDeviceSize() - header_size; - buf = ByteBuffer.allocate(payload_size); + buf = ByteBuffer.allocate(payload_size + - TEST_MODE_RESERVED_SIZE - FRP_CREDENTIAL_RESERVED_SIZE - 1); + channel.write(buf); + channel.force(true); + + // 3. skip the test mode data and leave it unformat + // This is for a feature that enables testing. + channel.position(channel.position() + TEST_MODE_RESERVED_SIZE); + + // 4. wipe the FRP_CREDENTIAL explicitly + buf = ByteBuffer.allocate(FRP_CREDENTIAL_RESERVED_SIZE); + channel.write(buf); + channel.force(true); + + // 5. set unlock = 0 because it's a formatPartitionLocked + buf = ByteBuffer.allocate(FRP_CREDENTIAL_RESERVED_SIZE); + buf.put((byte)0); + buf.flip(); channel.write(buf); channel.force(true); } catch (IOException e) { |