4.1 Common Wrapper Format

An encrypted file wrapper begins with the following 36-byte header, where xxx identifies the type of file encapsulated: SAV for a system file, SPS for a syntax file, SPV for a viewer file. PSPP code for identifying these files just checks for the ENCRYPTED keyword at offset 8, but the other bytes are also fixed in practice:

0000  1c 00 00 00 00 00 00 00  45 4e 43 52 59 50 54 45  |........ENCRYPTE|
0010  44 xx xx xx 15 00 00 00  00 00 00 00 00 00 00 00  |Dxxx............|
0020  00 00 00 00                                       |....|

Following the fixed header is essentially the regular contents of the encapsulated file in its usual format, with each 16-byte block encrypted with AES-256 in ECB mode.

To make the plaintext an even multiple of 16 bytes in length, the encryption process appends PKCS #7 padding, as specified in RFC 5652 section 6.3. Padding appends 1 to 16 bytes to the plaintext, in which each byte of padding is the number of padding bytes added. If the plaintext is, for example, 2 bytes short of a multiple of 16, the padding is 2 bytes with value 02; if the plaintext is a multiple of 16 bytes in length, the padding is 16 bytes with value 0x10.

The AES-256 key is derived from a password in the following way:

  1. Start from the literal password typed by the user. Truncate it to at most 10 bytes, then append as many null bytes as necessary until there are exactly 32 bytes. Call this password.
  2. Let constant be the following 73-byte constant:
    0000  00 00 00 01 35 27 13 cc  53 a7 78 89 87 53 22 11
    0010  d6 5b 31 58 dc fe 2e 7e  94 da 2f 00 cc 15 71 80
    0020  0a 6c 63 53 00 38 c3 38  ac 22 f3 63 62 0e ce 85
    0030  3f b8 07 4c 4e 2b 77 c7  21 f5 1a 80 1d 67 fb e1
    0040  e1 83 07 d8 0d 00 00 01  00
    
  3. Compute CMAC-AES-256(password, constant). Call the 16-byte result cmac.
  4. The 32-byte AES-256 key is cmac || cmac, that is, cmac repeated twice.

Example

Consider the password ‘pspp’. password is:

0000  70 73 70 70 00 00 00 00  00 00 00 00 00 00 00 00  |pspp............|
0010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

cmac is:

0000  3e da 09 8e 66 04 d4 fd  f9 63 0c 2c a8 6f b0 45

The AES-256 key is:

0000  3e da 09 8e 66 04 d4 fd  f9 63 0c 2c a8 6f b0 45
0010  3e da 09 8e 66 04 d4 fd  f9 63 0c 2c a8 6f b0 45