Forum: PS3 Technical Development - Topics relating to Playstation 3 Technical development ONLY! Read and discuss the latest Cobra USB updates, tutorials and explanations or find out about bluray drive bypass firmwares plus much more.


The above video goes away if you are a member and logged in, so log in now!




 
Would you like to get all the new info from
PSX-Scene in your email each day?




Want to learn more about the team keeping you up to date with the latest scene news?

Read about them now!

Check out our Developer bios, too!

 


User Tag List

Thread: NPDRM Self algorithm
  

Results 1 to 4 of 4
  1. #1 NPDRM Self algorithm 
    Beelzeboss's Avatar
    Beelzeboss is offline Member
    Join Date
    Sep 2010
    Location
    Croatia
    Posts
    122
    Downloads
    3
    Uploads
    0
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Likes Given
    4
    Likes Received
    4
    THIS DOES NOT ALLOW TO OBTAIN 3.60+ keys

    On NPDRM self decryption all the security levels of the PS3 are involved: user space (vsh), kernel space(lv2), hypervisor( lv1) and isolated SPU (metldr + appldr)

    The process start on vsh.elf...

    VSH:

    Once the vsh detects that user is trying to start a self, it looks for the appinfo header type. If the type is 8, then the control digest element type 3 (NPD element) is located. From this NPD header the vsh gets the license type (free, local or network license).

    If a free content(type 3) is detected then a generic klicense will be use for further steps (go to LV2). That klicensee is already public (see geohot npdrm_omac_key_1).

    However if a paid content is to be loaded the vsh loads the act.dat and the rif associated to the content (if local it will locate a file with the same titleid on NPD element, if remote it will download to vsh process memory)

    Then the signature is checked (last 0x28 bytes of both RIF and act.dat). The curves used are on vsh.self. It is a 3 element table, having the first curve nulled. The curve index for rif/act is 2. The curve values are negated as in the apploader and has the following structure

    struct curve {
    uint8_t p[0x14];
    uint8_t a[0x14];
    uint8_t b[0x14];
    uint8_t N[0x14];
    uint8_t Gx[0x14];
    uint8_t Gy[0x14];
    }

    If the curve checks then vsh will process the rif:

    struct rif {
    uint8_t unk1[0x10]; //version, license type and user number
    uint8_t titleid[0x30]; //Content ID
    uint8 padding[0xC]; //Padding for randomness
    uint32_t actDatIndex; //Key index on act.dat between 0x00 and 0x7F
    uint8 key[0x10]; //encrypted klicensee
    uint64_t unk2; //timestamp??
    uint64_t unk3; //Always 0
    uint8_t rs[0x28];
    };

    struct ACTDAT {
    uint8_t unk1[0x10]; //Version, User number
    uint8_t keyTable[0x800]; //Key Table
    ......
    uint8_t signature[0x28];
    }

    Using the RIF_KEY it will obtain the actdatIndex:

    AES_KEY rifKey;
    int result = AES_set_decrypt_key(RIF_KEY, 0x80, &rifKey);
    AES_decrypt(&rif->padding, &rif->padding, &rifKey);

    And finally having the actDat key index the execution pass to LV2 syscall 471

    LV2

    Lv2 is accessed using syscall471 which haves the following syntax:

    int syscall_471(uint32_t type, char* titleID, void* klicensee, uint8_t* actdat, uint8_t* rif, int32_t licenseType, uint8_t* magicVersion);

    The function has different parameters depending if the content is debug, free or paid:

    FREE: syscall471(npd.type, &npd.titleID, freeklicensee, NULL, NULL, npd.license, &npd);
    PAID: syscall471(npd.type, &npd.titleID, NULL, &actdat.keyTable[rif.actDatIndex*0x10], &rif.key, npd.license, &npd);

    The lv2 keeps a memory table with contentID and the associated key.
    When it receives a free content (r5 is not null) then copies the titleID and the klicensee to the table. For a paid content the rif.key is converted to the klicensee using:

    AES_KEY IDPSKey, ConstKey, ActDatKey;
    uint8_t encrConst[0x10];
    uint8_t decryptedActDat[0x10];
    uint8_t klicensee[0x10];
    int result = AES_set_encrypt_key(&IDPSVariation, 0x80, &IDPSKey);
    AES_encrypt(&CONSTACTDAT, &encrConst, &IDPSKey);
    result = AES_set_decrypt_key(&encrConst,0x80,&ConstKey);
    AES_decrypt(actDat,&decryptedActDat,&ConstKey);
    result = AES_set_decrypt_key(&decryptedActDat,0x80,&ActDatK ey);
    AES_decrypt(rif,&klicensee,&ActDatKey);


    where CONSTACTDAT is a constant value on lv2, IDPSVaritaion appears to be IDPS (not checked but DRM_Manager_initialize (see graf_chokolo's "bible") to something with the same structure), actdat are the 0x10bytes selected by rif keyIndex, and rif is rif.key (bytes 0x50-0x5f).

    Once transformed it is stored on memory table...

    I haven't check further steps on vsh nor lv2 so perhaps there are further transformations on the paid case (NOT FOR THE FREE AS I HAVE DECRYPTED THOSE) so we are jumping directly to the appldr

    AppLdr

    As you can see from graf_chokolo payloads a parameter is passed on spu_args.field60. That parameter is the previously stored klicensee.

    However this key must be transformed (again) even for the free case. The transformation is:

    uint8_t decryptedKLicensee[0x10]
    AES_KEY KLicenseeKey
    int result = AES_set_decrypt_key(&KLicenseeDecryptKey,0x80,&KLI CENSEEKEY);
    AES_decrypt(klicensee,&decryptedKLicensee,&KLicens eeKey);
    EY is another key located inside the apploader and klicensee is the parameter.

    Then we can finally remove the NPDRM layer using:


    AES_KEY key;
    uint8_t iv[0x10];
    memset(&iv[0],0,0x10);
    int result = AES_set_decrypt_key(&KLicenseeDecryptKey,0x80,&key );
    AES_cbc_encrypt(self + self->metaoffset + 0x20, self + self->metaoffset + 0x20,0x40,&key,&iv,0);

    Once that layer is removed we proceed as normal:
    -Decrypt using AESCBC256 with the NPDRM keys to obtain the metadata keys
    -Decrypt using AESCTR128 the data sha,hmac,iv keys
    -Decrypt the data.

    PD: I WILL NOT PROVIDE ANY OF THE KEYS MENTIONED ABOVE

    SOURCE
    Read more: NPDRM Self algorithm - PS3Hax Network - Playstation 3 Hacks and Mods
    Reply With Quote  

  2. #2  
    Warning's Avatar
    Warning is offline GodOfWar
    Join Date
    May 2011
    Location
    Hell
    Posts
    389
    Downloads
    5
    Uploads
    0
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Likes Given
    253
    Likes Received
    59
    Reply With Quote  

  3. #3  
    LKJHGFDSA is offline Member
    Join Date
    Sep 2010
    Posts
    225
    Downloads
    7
    Uploads
    0
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Likes Given
    14
    Likes Received
    13
    i think this the 3rd time I've seen this posted on this site now.
    Reply With Quote  

  4. #4  
    Warning's Avatar
    Warning is offline GodOfWar
    Join Date
    May 2011
    Location
    Hell
    Posts
    389
    Downloads
    5
    Uploads
    0
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Likes Given
    253
    Likes Received
    59
    Quote Originally Posted by LKJHGFDSA View Post
    i think this the 3rd time I've seen this posted on this site now.
    I had it posted in member news but this gives people the option of sharing their opinion on the subject.
    Reply With Quote  

Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •