/packages/libogcfpc/src/ogc/es.inc
https://github.com/slibre/freepascal · Pascal · 465 lines · 332 code · 119 blank · 14 comment · 0 complexity · 64b0981771673aa272fb0d43a211ca2c MD5 · raw file
- {$IFDEF OGC_INTERFACE}
- {$ifdef HW_RVL}
- const
- ES_EINVAL = - $1004;
- ES_ENOMEM = - $100C;
- ES_ENOTINIT = - $1100;
- ES_EALIGN = - $1101;
- ES_SIG_RSA4096 = $10000;
- ES_SIG_RSA2048 = $10001;
- ES_SIG_ECDSA = $10002;
- ES_CERT_RSA4096 = 0;
- ES_CERT_RSA2048 = 1;
- ES_CERT_ECDSA = 2;
- ES_KEY_COMMON = 4;
- ES_KEY_SDCARD = 6;
- type
- sigtype = cuint32;
- sig_header = sigtype;
- signed_blob = sig_header;
- psigned_blob = ^signed_blob;
- sha1 = array [0..19] of cuint8;
- psha1 = ^sha1;
- aeskey = array [0..15] of cuint8;
- _sig_rsa2048 = packed record
- type_ : sigtype;
- sig : array [0..255] of cuint8;
- fill : array [0..59] of cuint8;
- end;
- sig_rsa2048 = _sig_rsa2048;
- type
- _sig_rsa4096 = packed record
- type_ : sigtype;
- sig : array [0..511] of cuint8;
- fill : array [0..59] of cuint8;
- end;
- sig_rsa4096 = _sig_rsa4096;
- type
- _sig_ecdsa = packed record
- type_ : sigtype;
- sig : array [0..59] of cuint8;
- fill : array [0..63] of cuint8;
- end;
- sig_ecdsa = _sig_ecdsa;
- type
- sig_issuer = array [0..63] of cchar;
- type
- _tiklimit = packed record
- tag : cuint32;
- value : cuint32;
- end;
- tiklimit = _tiklimit;
- type
- _tikview = packed record
- view : cuint32;
- ticketid : cuint64;
- devicetype : cuint32;
- titleid : cuint64;
- access_mask : cuint16;
- reserved : array [0..59] of cuint8;
- cidx_mask : array [0..63] of cuint8;
- padding : cuint16;
- limits : array [0..7] of tiklimit;
- end;
- tikview = _tikview;
- ptikview = ^_tikview;
- type
- _tik = packed record
- issuer : sig_issuer;
- fill : array [0..62] of cuint8; //TODO: not really fill
- cipher_title_key : aeskey;
- fill2 : cuint8;
- ticketid : cuint64;
- devicetype : cuint32;
- titleid : cuint64;
- access_mask : cuint16;
- reserved : array [0..59] of cuint8;
- cidx_mask : array [0..63] of cuint8;
- padding : cuint16;
- limits : array [0..7] of tiklimit;
- end;
- tik = _tik;
- type
- _tmd_content = packed record
- cid : cuint32;
- index_ : cuint16;
- type_ : cuint16;
- size : cuint64;
- hash : sha1;
- end;
- tmd_content = _tmd_content;
- ptmd_content = ^tmd_content;
- _tmd = packed record
- issuer : sig_issuer; //0x140
- version : cuint8; //0x180
- ca_crl_version : cuint8; //0x181
- signer_crl_version : cuint8; //0x182
- fill2 : cuint8; //0x183
- sys_version : cuint64; //0x184
- title_id : cuint64; //0x18c
- title_type : cuint32; //0x194
- group_id : cuint16; //0x198
- zero : cuint16; //0x19a
- region : cuint16; //0x19c
- ratings : array [0..15] of cuint8; //0x19e
- reserved : array [0..11] of cuint8; //0x1ae
- ipc_mask : array [0..11] of cuint8;
- reserved2 : array [0..17] of cuint8;
- access_rights : cuint32;
- title_version : cuint16;
- num_contents : cuint16;
- boot_index : cuint16;
- fill3 : cuint16;
- // content records follow
- // C99 flexible array
- contents: Ptmd_content;
- end;
- tmd = _tmd;
- ptmd = ^tmd;
- type
- _tmd_view_content = packed record
- cid : cuint32;
- index_ : cuint16;
- type_ : cuint16;
- size : cuint64;
- end;
- tmd_view_content = _tmd_view_content;
- ptmd_view_content = ^tmd_view_content;
- _tmdview = packed record
- version : cuint8; // 0x0000;
- filler : array [0..2] of cuint8;
- sys_version : cuint64; //0x0004
- title_id : cuint64; // 0x00c
- title_type : cuint32; //0x0014
- group_id : cuint16; //0x0018
- reserved : array [0..61] of cuint8; //0x001a this is the same reserved 0x3e bytes from the tmd
- title_version : cuint16; //0x0058
- num_contents : cuint16; //0x005a
- contents : ptmd_view_content;
- end;
- tmd_view = _tmdview;
- ptmd_view = ^tmd_view;
- type
- _cert_header = packed record
- issuer : sig_issuer;
- cert_type : cuint32;
- cert_name : array [0..63] of cchar;
- cert_id : cuint32; //???
- end;
- cert_header = _cert_header;
- pcert_header = ^_cert_header;
- type
- _cert_rsa2048 = packed record
- issuer : sig_issuer;
- cert_type : cuint32;
- cert_name : array [0..63] of cchar;
- cert_id : cuint32;
- modulus : array [0..255] of cuint8;
- exponent : cuint32;
- pad : array [0..51] of cuint8;
- end;
- cert_rsa2048 = _cert_rsa2048;
- type
- _cert_rsa4096 = packed record
- issuer : sig_issuer;
- cert_type : cuint32;
- cert_name : array [0..63] of cchar;
- cert_id : cuint32;
- modulus : array [0..511] of cuint8;
- exponent : cuint32;
- pad : array [0..51] of cuint8;
- end;
- cert_rsa4096 = _cert_rsa4096;
- type
- _cert_ecdsa = packed record
- issuer : sig_issuer;
- cert_type : cuint32;
- cert_name : array [0..63] of cchar;
- cert_id : cuint32; // ng key id
- r : array [0..29] of cuint8;
- s : array [0..29] of cuint8;
- pad : array [0..59] of cuint8;
- end;
- cert_ecdsa = _cert_ecdsa;
- function TMD_SIZE(x: ptmd): cint; inline;
- // backwards compatibility
- function TMD_CONTENTS(x: ptmd): tmd_content; inline;
- //TODO: add ECC stuff
- function IS_VALID_SIGNATURE(x: psigned_blob): boolean; inline;
- function SIGNATURE_SIZE(x: psigned_blob): cint; inline;
- function SIGNATURE_SIG(x: psigned_blob): cint; inline;
- function IS_VALID_CERT(x: cert_header): boolean; inline;
- function CERTIFICATE_SIZE(x: cert_header): cint; inline;
- function SIGNATURE_PAYLOAD(x: psigned_blob): pointer; inline;
- function SIGNED_TMD_SIZE(x: psigned_blob): cint; inline;
- function SIGNED_TIK_SIZE(x: psigned_blob): cint; inline;
- function SIGNED_CERT_SIZE(x: psigned_blob): cint; inline;
- function STD_SIGNED_TIK_SIZE(): cint; inline;
- const
- MAX_NUM_TMD_CONTENTS = 512;
- function MAX_TMD_SIZE(): cint; inline;
- function MAX_SIGNED_TMD_SIZE(): cint; inline;
- function __ES_Init: cint32; cdecl; external;
- function __ES_Close: cint32; cdecl; external;
- function __ES_Reset: cint32; cdecl; external;
- function ES_GetTitleID(titleID: pcuint64): cint32; cdecl; external;
- function ES_SetUID(uid: cuint64): cint32; cdecl; external;
- function ES_GetDataDir(titleID: cuint64; filepath: pcchar): cint32; cdecl; external;
- function ES_GetNumTicketViews(titleID: cuint64; cnt: pcuint32): cint32; cdecl; external;
- function ES_GetTicketViews(titleID: cuint64; views: Ptikview; cnt: cuint32)
- : cint32; cdecl; external;
- function ES_GetNumOwnedTitles(cnt: pcuint32): cint32; cdecl; external;
- function ES_GetOwnedTitles(titles: pcuint64; cnt: cuint32): cint32; cdecl; external;
- function ES_GetNumTitles(cnt: pcuint32): cint32; cdecl; external;
- function ES_GetTitles(titles: pcuint64; cnt: cuint32): cint32; cdecl; external;
- function ES_GetNumStoredTMDContents(stmd: Psigned_blob; tmd_size: cuint32;
- cnt: pcuint32): cint32; cdecl; external;
- function ES_GetStoredTMDContents(stmd: Psigned_blob; tmd_size: cuint32;
- contents: pcuint32; cnt: cuint32): cint32; cdecl; external;
- function ES_GetStoredTMDSize(titleID: cuint64; size: pcuint32): cint32; cdecl; external;
- function ES_GetStoredTMD(titleID: cuint64; stmd: Psigned_blob; size: cuint32)
- : cint32; cdecl; external;
- function ES_GetTitleContentsCount(titleID: cuint64; num: pcuint32): cint32; cdecl; external;
- function ES_GetTitleContents(titleID: cuint64; data: pcuint8; size: cuint32)
- : cint32; cdecl; external;
- function ES_GetTMDViewSize(titleID: cuint64; size: pcuint32): cint32; cdecl; external;
- function ES_GetTMDView(titleID: cuint64; data: pcuint8; size: cuint32): cint32; cdecl; external;
- function ES_GetNumSharedContents(cnt: pcuint32): cint32; cdecl; external;
- function ES_GetSharedContents(contents: Psha1; cnt: cuint32): cint32; cdecl; external;
- function ES_LaunchTitle(titleID: cuint64; view: Ptikview): cint32; cdecl; external;
- function ES_LaunchTitleBackground(titleID: cuint64; view: Ptikview): cint32; cdecl; external;
- function ES_Identify(certificates: Psigned_blob; certificates_size: cuint32;
- tmd: Psigned_blob; tmd_size: cuint32; ticket: Psigned_blob;
- ticket_size: cuint32; keyid: pcuint32): cint32; cdecl; external;
- function ES_AddTicket(tik: Psigned_blob; tik_size: cuint32;
- certificates: Psigned_blob; certificates_size: cuint32; crl: Psigned_blob;
- crl_size: cuint32): cint32; cdecl; external;
- function ES_DeleteTicket(view: Ptikview): cint32; cdecl; external;
- function ES_AddTitleTMD(tmd: Psigned_blob; tmd_size: cuint32): cint32; cdecl; external;
- function ES_AddTitleStart(tmd: Psigned_blob; tmd_size: cuint32;
- certificatess: Psigned_blob; certificatess_size: cuint32; crl: Psigned_blob;
- crl_size: cuint32): cint32; cdecl; external;
- function ES_AddContentStart(titleID: cuint64; cid: cuint32): cint32; cdecl; external;
- function ES_AddContentData(cid: cint32; data: pcuint8; data_size: cuint32)
- : cint32; cdecl; external;
- function ES_AddContentFinish(cid: cuint32): cint32; cdecl; external;
- function ES_AddTitleFinish: cint32; cdecl; external;
- function ES_AddTitleCancel: cint32; cdecl; external;
- function ES_ImportBoot(tik: Psigned_blob; tik_size: cuint32;
- tik_certs: Psigned_blob; tik_certs_size: cuint32; tmd: Psigned_blob;
- tmd_size: cuint32; tmd_certs: Psigned_blob; tmd_certs_size: cuint32;
- content: pcuint8; content_size: cuint32): cint32; cdecl; external;
- function ES_OpenContent(index_: cuint16): cint32; cdecl; external;
- function ES_OpenTitleContent(titleID: cuint64; views: Ptikview; index_: cuint16)
- : cint32; cdecl; external;
- function ES_ReadContent(cfd: cint32; data: pcuint8; data_size: cuint32): cint32; cdecl; external;
- function ES_SeekContent(cfd, where, whence: cint32): cint32; cdecl; external;
- function ES_CloseContent(cfd: cint32): cint32; cdecl; external;
- function ES_DeleteTitle(titleID: cuint64): cint32; cdecl; external;
- function ES_DeleteTitleContent(titleID: cuint64): cint32; cdecl; external;
- function ES_Encrypt(keynum: cuint32; iv, source: pcuint8; size: cuint32;
- dest: pcuint8): cint32; cdecl; external;
- function ES_Decrypt(keynum: cuint32; iv, source: pcuint8; size: cuint32;
- dest: pcuint8): cint32; cdecl; external;
- function ES_Sign(source: pcuint8; size: cuint32; sig, certs: pcuint8): cint32; cdecl; external;
- function ES_GetDeviceCert(outbuf: pcuint8): cint32; cdecl; external;
- function ES_GetDeviceID(device_id: pcuint32): cint32; cdecl; external;
- function ES_GetBoot2Version(version: pcuint32): cint32; cdecl; external;
- function ES_NextCert(certs: Psigned_blob): Psigned_blob; cdecl; external;
- {$endif HW_RVL}
- {$ENDIF}
- {$IFDEF OGC_IMPLEMENTATION}
- {$ifdef HW_RVL}
- function TMD_SIZE(x: ptmd): cint; inline;
- begin
- TMD_SIZE := (x^.num_contents) * sizeof(tmd_content) + sizeof(tmd);
- end;
- // backwards compatibility
- function TMD_CONTENTS(x: ptmd): tmd_content; inline;
- begin
- TMD_CONTENTS := x^.contents^;
- end;
- //TODO: add ECC stuff
- function IS_VALID_SIGNATURE(x: psigned_blob): boolean; inline;
- begin
- IS_VALID_SIGNATURE := (x^ = ES_SIG_RSA2048) or (x^ = ES_SIG_RSA4096) or (x^ = ES_SIG_ECDSA);
- end;
- function SIGNATURE_SIZE(x: psigned_blob): cint; inline;
- begin
- case x^ of
- ES_SIG_RSA2048: SIGNATURE_SIZE := sizeof(sig_rsa2048);
- ES_SIG_RSA4096: SIGNATURE_SIZE := sizeof(sig_rsa4096);
- ES_SIG_ECDSA: SIGNATURE_SIZE := sizeof(sig_ecdsa);
- else
- SIGNATURE_SIZE := 0;
- end;
- end;
- function SIGNATURE_SIG(x: psigned_blob): cint; inline;
- begin
- SIGNATURE_SIG := cuint8(x^) + 4;
- end;
- function IS_VALID_CERT(x: cert_header): boolean; inline;
- begin
- IS_VALID_CERT := (x.cert_type = ES_CERT_RSA2048) or
- (x.cert_type = ES_CERT_RSA4096) or
- (x.cert_type = ES_CERT_ECDSA);
- end;
- function CERTIFICATE_SIZE(x: cert_header): cint; inline;
- begin
- case x.cert_type of
- ES_CERT_RSA2048: CERTIFICATE_SIZE := sizeof(cert_rsa2048);
- ES_CERT_RSA4096: CERTIFICATE_SIZE := sizeof(cert_rsa4096);
- ES_CERT_ECDSA: CERTIFICATE_SIZE := sizeof(cert_ecdsa);
- else
- CERTIFICATE_SIZE := 0;
- end;
- end;
- function SIGNATURE_PAYLOAD(x: psigned_blob): pointer; inline;
- begin
- SIGNATURE_PAYLOAD := pointer(x^ + SIGNATURE_SIZE(x));
- end;
- function SIGNED_TMD_SIZE(x: psigned_blob): cint; inline;
- begin
- SIGNED_TMD_SIZE := TMD_SIZE(ptmd(SIGNATURE_PAYLOAD(x))) + SIGNATURE_SIZE(x);
- end;
- function SIGNED_TIK_SIZE(x: psigned_blob): cint; inline;
- begin
- SIGNED_TIK_SIZE := sizeof(tik) + SIGNATURE_SIZE(x);
- end;
- function SIGNED_CERT_SIZE(x: psigned_blob): cint; inline;
- begin
- SIGNED_CERT_SIZE := CERTIFICATE_SIZE(pcert_header(SIGNATURE_PAYLOAD(x))^) + SIGNATURE_SIZE(x);
- end;
- function STD_SIGNED_TIK_SIZE(): cint; inline;
- begin
- STD_SIGNED_TIK_SIZE := sizeof(tik) + sizeof(sig_rsa2048);
- end;
- function MAX_TMD_SIZE(): cint; inline;
- begin
- MAX_TMD_SIZE := sizeof(tmd) + MAX_NUM_TMD_CONTENTS * sizeof(tmd_content);
- end;
- function MAX_SIGNED_TMD_SIZE(): cint; inline;
- begin
- MAX_SIGNED_TMD_SIZE := MAX_TMD_SIZE + sizeof(sig_rsa2048);
- end;
- {$endif HW_RVL}
- {$ENDIF}