netmdocm
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| netmdocm [2010/06/08 06:28] – add info to netmd(0) megadiscman | 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 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 1493: | 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.1275978507.txt.gz · Last modified: 2010/06/08 06:28 by megadiscman
