Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create Google Chrome Crx file with PHP

Id like to be able to generate a crx file with PHP.

A crx file is a zip file with an additional header and Im at a lost on how to create this header. I can create a crx file if I use a pregenerated pem file but this leads to all the crx files having the same extension id and this is not good. Heres a link to what Ive got so far.....
http://valorsolo.com/index.php?page=Viewing%20Message&id=1472&pagenum=2#1500

Incase it helps this has been done in Python and there is an excellent blog post on the finer details here....
http://blog.roomanna.com/12-12-2010/packaging-chrome-extensions
and heres some links to other code on the subject.....
http://code.google.com/chrome/extensions/crx.html
http://code.google.com/p/crx-packaging/source/browse/trunk/packer.py
https://github.com/bellbind/crxmake-python/blob/master/crxmake.py
http://www.curetheitch.com/projects/buildcrx/

like image 505
PAEz Avatar asked Feb 16 '11 06:02

PAEz


3 Answers

This ruby code was helpful.

Your public key must be in DER format, and unfortunately PHP's OpenSSL extension can't do that, so far as I can tell. I had to generate it from my private key at the command line:

openssl rsa -pubout -outform DER < extension_private_key.pem > extension_public_key.pub

UPDATE: there is a PHP der2pem() function available here, thanks to tutuDajuju for pointing it out.

Once that's done, building the .crx file is quite easy:

# make a SHA1 signature using our private key
$pk = openssl_pkey_get_private(file_get_contents('extension_private_key.pem'));
openssl_sign(file_get_contents('extension.zip'), $signature, $pk, 'sha1');
openssl_free_key($pk);

# decode the public key
$key = base64_decode(file_get_contents('extension_public_key.pub'));

# .crx package format:
#
#   magic number               char(4)
#   crx format ver             byte(4)
#   pub key lenth              byte(4)
#   signature length           byte(4)
#   public key                 string
#   signature                  string
#   package contents, zipped   string
#
# see http://code.google.com/chrome/extensions/crx.html
#
$fh = fopen('extension.crx', 'wb');
fwrite($fh, 'Cr24');                             // extension file magic number
fwrite($fh, pack('V', 2));                       // crx format version
fwrite($fh, pack('V', strlen($key)));            // public key length
fwrite($fh, pack('V', strlen($signature)));      // signature length
fwrite($fh, $key);                               // public key
fwrite($fh, $signature);                         // signature
fwrite($fh, file_get_contents('extension.zip')); // package contents, zipped
fclose($fh);
like image 112
2 revs Avatar answered Nov 02 '22 09:11

2 revs


The CRX format is described in detail on the documentation page: http://code.google.com/chrome/extensions/crx.html

There are examples on the end of that file for Ruby and Bash. Follow the format in your language (PHP).

like image 44
Mohamed Mansour Avatar answered Nov 02 '22 10:11

Mohamed Mansour


You can use the working PHP solution: https://github.com/andyps/crxbuild There are a PHP class that you can include in your project and command line script.

like image 21
user2999212 Avatar answered Nov 02 '22 10:11

user2999212