netmdocm
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
netmdocm [2009/07/11 09:25] – nopsled | netmdocm [2024/05/21 14:50] (current) – nopsled | ||
---|---|---|---|
Line 166: | Line 166: | ||
ASN.1 Sequence with a data structure that is setup and manipulated by functions called through DICT 187 (these functions are in DICT 188). | ASN.1 Sequence with a data structure that is setup and manipulated by functions called through DICT 187 (these functions are in DICT 188). | ||
- | 30 80 | + | |
- | 02 02 03E9 | + | 02 02 03E9 |
- | 04 14 43EA428F71EE7B665D10752E85AB16E5A50C6249 ; MAC | + | 04 14 43EA428F71EE7B665D10752E85AB16E5A50C6249 ; MAC |
- | 04 14 638163B82C4E31810FBEE01B2E7FC25B879586E3 ; Enc(CKEY) ? Offset 0x1E according to Jan (// key is at offset 0x1E! (OMGDecrypter.cpp) | + | 04 14 638163B82C4E31810FBEE01B2E7FC25B879586E3 ; Enc(CKEY) ? Offset 0x1E according to Jan (// key is at offset 0x1E! (OMGDecrypter.cpp) |
- | + | 30 80 02 01 6B ; 17 (some time stamp) | |
- | | + | 02 04 48C2298F |
- | 02 04 48C2298F | + | 02 01 07 ; 7 == creation time of structure |
- | 02 01 07 ; 7 == creation time of structure | + | 02 04 48C2298F |
- | 02 04 48C2298F | + | 02 01 6D ; 109 |
- | 02 01 6D ; 109 | + | 02 01 00 |
- | 02 01 00 | + | 02 01 65 ; 101 |
- | 02 01 65 ; 101 | + | 04 14 C04B513EDE54342D709D0CB8621E646FDDCB345E |
- | 04 14 C04B513EDE54342D709D0CB8621E646FDDCB345E | + | 02 01 00 ; 0 == scrambled form of the maclist id == SalOmgId |
- | 02 01 00 ; 0 == scrambled form of the maclist id == SalOmgId | + | 04 14 010F50000004000000EFF3C3244C602635178457 |
- | 04 14 010F50000004000000EFF3C3244C602635178457 | + | 02 01 68 ; 104 |
- | 02 01 68 ; 104 | + | 02 02 1FD7 |
- | 02 02 1FD7 | + | 02 01 06 ; 6 == source name |
- | 02 01 06 ; 6 == source name | + | 04 15 72617720636F6E74656E7420696D706F7274696E67 |
- | 04 15 72617720636F6E74656E7420696D706F7274696E67 | + | |
- | | + | 02 01 67 ; 103 == flags? |
- | 02 01 67 ; 103 == flags? | + | 02 01 02 |
- | 02 01 02 | + | 02 01 01 ; 1 == max checkout? |
- | 02 01 01 ; 1 == max checkout? | + | 02 01 03 |
- | 02 01 03 | + | 02 01 08 ; 8 == checkout count? |
- | 02 01 08 ; 8 == checkout count? | + | 02 01 03 |
- | 02 01 03 | + | 02 01 05 ; 5 == flags (1|2|4) |
- | 02 01 05 ; 5 == flags (1|2|4) | + | 02 01 04 |
- | 02 01 04 | + | 0000 ; End array |
- | 0000 ; End array | + | 30 80 0000 ; Empty array |
- | 30 80 0000 ; Empty array | + | 0000 ; End array |
- | 0000 ; End array | + | |
===== maclist1.dat ===== | ===== maclist1.dat ===== | ||
Line 203: | Line 202: | ||
unsigned char maclist1_dat[72] = | unsigned char maclist1_dat[72] = | ||
{ | { | ||
- | 0x4D, 0x41, 0x43, 0x4C, 0x49, 0x53, 0x54, 0x00, 0x01, 0x0F, 0x50, 0x00, 0x00, 0x04, 0x00, 0x00, | + | |
- | | + | salomgid <0x01, 0x0F, 0x50, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x24, 0x4C, 0x60, 0x26>, |
- | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, | + | <0x02>, |
- | | + | number-of-mac-ops <0x00, 0x00, 0x00, 0x03>, |
- | | + | number-of-macs <0x00, 0x00, 0x00, 0x00>, |
+ | | ||
+ | extension-type <0x00, 0x00, 0x00, 0x00>, | ||
+ | extension-size <0x00, 0x00, 0x00, 0x18>, | ||
+ | leaf-id <0x00, 0x00, 0x00, 0x02, 0x00, 0x00>, status-code <0x00, 0x01>, | ||
+ | leaf-id <0x00, 0x00, 0x00, 0x01, 0x00, 0x01>, status-code <0x00, 0x03>, | ||
+ | leaf-id <0x00, 0x00, 0x00, 0x02, 0x00, 0x01>, status-code <0x00, 0x01>, | ||
+ | <0x00, 0x00, 0x00>, | ||
} ; | } ; | ||
- | There is a 40-byte header (MACLIST\0, followed by 4 DWORDs with unknown meaning, followed by (DWORD)2, followed by the number of operations done on the maclist (in this case 3), followed by the number of MACs (here: 0), followed by 0 (unknown field). | + | There is a 40-byte header (MACLIST\0, followed by 16 bytes of the SalOmgID (omg_id.dat), followed by (DWORD)2, followed by the number of operations done on the maclist (in this case 3), followed by the number of MACs (here: 0), followed by 0 (unknown field). |
===== maclist2.dat ===== | ===== maclist2.dat ===== | ||
Line 906: | Line 912: | ||
===== maclist(1) ===== | ===== maclist(1) ===== | ||
- | /* | + | XOR the SalOmgId |
- | Procedure prototype: | + | |
- | | + | |
- | + | ||
- | Input: | + | |
- | + | ||
- | SalNonConstPointer const &, | + | |
- | SalPointer const &, | + | |
- | SalOmgId | + | |
- | long, | + | |
- | SalExtrinsicsProg const & | + | |
- | + | ||
- | Output: | + | |
- | + | ||
- | long | + | |
- | + | ||
- | */ | + | |
===== Sample input: ===== | ===== Sample input: ===== | ||
Line 948: | Line 938: | ||
} ; | } ; | ||
- | |||
- | XOR the SalOmgId with a constant key, expand that to a symmetric key and apply to the SHA-1 hash of MACLIST. | ||
===== maclist(8) ===== | ===== maclist(8) ===== | ||
Line 956: | Line 944: | ||
In other words, this extracts the 0-extension of a MACLIST and an encrypted hash of that. | In other words, this extracts the 0-extension of a MACLIST and an encrypted hash of that. | ||
+ | |||
+ | See pcmaclist(6) | ||
/* | /* | ||
Line 1064: | Line 1054: | ||
} ; | } ; | ||
- | ===== nc_omgtomsa(4) ===== | + | ===== nc_omgtomsa(0) ===== |
/* | /* | ||
Line 1104: | Line 1094: | ||
===== querycif(09) - Get KEK encrypted content key ===== | ===== querycif(09) - Get KEK encrypted content key ===== | ||
- | |||
- | /* | ||
- | Procedure prototype: | ||
- | | ||
- | |||
- | Input: | ||
- | |||
- | SalPointer const &, | ||
- | SalPointer const &, | ||
- | long, | ||
- | long, | ||
- | SalPointer const &, | ||
- | SalOmgId const &, | ||
- | SalPointer const &, | ||
- | long, | ||
- | SalExtrinsicsProg const &, | ||
- | |||
- | Output: | ||
- | |||
- | SalAsnSeqBegin, | ||
- | long &, | ||
- | OmgString & | ||
- | querycif(09) | ||
- | |||
- | Process File, SalOmgId, param3, long (3), long (3), Ekb capability table, 00010001_EKB -> Enc(CKEY, KEK) | ||
- | |||
- | */ | ||
- | |||
- | |||
- | unsigned char param3[24] = | ||
- | { | ||
- | 0x46, 0x73, 0xE4, 0x89, 0x6A, 0xA9, 0x0B, 0x96, 0x69, 0x43, 0xAA, 0x39, 0x99, 0xE2, 0x08, 0xC4, | ||
- | 0xF8, 0xCA, 0x19, 0x2E, 0x38, 0xE2, 0x3E, 0x4C, | ||
- | } ; | ||
- | |||
- | unsigned char param6_EkbCapabilityTable[24] = | ||
- | { | ||
- | 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, | ||
- | 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, | ||
- | } ; | ||
- | |||
- | |||
- | /* Return value. TODO: double check */ | ||
- | |||
- | unsigned char return_value[11] = | ||
- | { | ||
- | 0x30, 0x80, 0x02, 0x01, 0x00, 0x04, 0x08, 0x82, 0x19, 0x23, 0xFD, | ||
- | } ; | ||
< | < | ||
Line 1204: | Line 1146: | ||
- | |||
- | |||
- | function GetKekEncCKEY(blob_t OpfImage (arg_2), blob_t EkbCapTableBody (arg_3)) | ||
- | { | ||
- | Array ProcessFile[5]; | ||
- | |||
- | dict[4] = EkbCapTableBody; | ||
- | ProcessFile = decode_asn1(opf_image); | ||
- | dict[3] = OpfImage; | ||
- | |||
- | // | ||
- | // Calculate HMAC for the opf[3] usage information. Check if it matches with the HMAC value in opf[1] | ||
- | // | ||
- | // ProcessFile[1]: | ||
- | |||
- | blob_t dec_pf2 = devicesal_220_decrypt_hook_249(ProcessFile[2], | ||
- | blob_t serialized_opf3 = BCSerialize(ProcessFile[3]); | ||
- | blob_t key = concat ( dec_pf2, serialized_opf3 ); | ||
- | blob_t hasked_key = inline:: | ||
- | blob_t key_pf2 = concat ( dec_pf2, hashed_key ); | ||
- | blob_t hashed_key_pf2 = inline: | ||
- | |||
- | // if( HMAC(opf[3], | ||
- | // | ||
- | // | ||
- | if (compare_blob (hashed_key_pf2, | ||
- | // Test_Small_Int_For_Zero -> 0 (acc) | ||
- | { | ||
- | ... todo | ||
- | } | ||
- | } | ||
</ | </ | ||
Line 1244: | Line 1155: | ||
netmd(0) | netmd(0) | ||
- | Process file, unknown blob, Ekb capability table, 00010002ekb, | + | Process file, unknown blob, Ekb capability table, 00010002ekb, |
+ | |||
+ | status = 0: Success, nonce will be used to authenticate NetMD unit, checkout_context contains all data to continue processing. | ||
+ | status != 0: Error, nonce and checkout_context don't exist | ||
Procedure prototype: | Procedure prototype: | ||
Line 1490: | Line 1404: | ||
- | ===== netmd.ocm Decompiled ===== | ||
- | < | ||
- | |||
- | Dict[0xf9] = {0x63, 0x81, 0x63, 0xB8, 0x2C, 0x4E, 0x31, | ||
- | 0x81, 0x0F, 0xBE, 0xE0, 0x1B, 0x2E, 0x7F, | ||
- | 0xC2, 0x5B, 0x87, 0x95, 0x86, 0xE3}; | ||
- | |||
- | |||
- | // CIPHERTEXT must be a serialized and encrypted blob (see dev_0xd8/ | ||
- | // The PLAINTEXT is appended to that blob and the serialized and encrypted result is returned. | ||
- | blob_t | ||
- | netmd_0x07 (blob_t key, blob_t some_plaintext, | ||
- | { | ||
- | static blob_t pad[16] = { 0x33, 0x4a, 0x18, 0x94, 0xc1, 0xf3, 0x83, 0xf6, | ||
- | 0xd3, 0xeb, 0x6a, 0xc2, 0xad, 0x13, 0x07, 0xca }; | ||
- | blob_t data = dev_0xd8 (some_ciphertext, | ||
- | data = CONCAT (data, some_plaintext); | ||
- | return dev_0xd9 (data, XOR (key, pad)); | ||
- | } | ||
- | </ | ||
- | |||
- | ===== icv.ocm Decompiled ===== | ||
- | |||
- | < | ||
- | |||
- | // | ||
- | // Generate a SalOmgId | ||
- | // | ||
- | // | ||
- | // | ||
- | // < | ||
- | // | ||
- | // Note: When OpenMG is used (trough the UI) for the first time this value is generated, | ||
- | // by calling the salwrap function getSalOmgId. | ||
- | // | ||
- | // const unsigned __int8 *__cdecl getSalOmgId() | ||
- | // | ||
- | blob_t icv(07) | ||
- | { | ||
- | | ||
- | | ||
- | data = BCX_01_Concat(PrefixSalOmgId, | ||
- | Push 1 | ||
- | | ||
- | | ||
- | } | ||
- | </ | ||
- | |||
- | ===== maclist.ocm | ||
- | |||
- | // maclist(1) | ||
- | // | ||
- | // work in progress | ||
- | |||
- | < | ||
- | |||
- | int | ||
- | maclist_0x01(blob_t SalOmgId, blob_t maclist2dat, | ||
- | { | ||
- | static blob_t pad[16] = {0x20, 0xBE, 0xDE, 0x72, 0xA3, 0xB8, 0x62, 0x60, | ||
- | 0x71, 0x44, 0x3A, 0x33, 0xE9, 0xAC, 0x69, 0xCE}; | ||
- | static SHA1state, hash_maclist, | ||
- | |||
- | SHA1state | ||
- | BCX_1A_SHA1AddData(maclist, | ||
- | hash_maclist | ||
- | |||
- | xor_SalOmgId | ||
- | hash_maclist_salomgid = salenc_sha1(SalOmgId_xor, | ||
- | |||
- | hash_maclist == hash_xorSalOmgId? | ||
- | } | ||
- | </ |
netmdocm.1247304322.txt.gz · Last modified: 2009/07/11 09:25 by nopsled