Index: chrome/common/extensions/docs/server2/templates/articles/crx.html |
diff --git a/chrome/common/extensions/docs/server2/templates/articles/crx.html b/chrome/common/extensions/docs/server2/templates/articles/crx.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b761b859f0201398d76b2cf43ec5730749576470 |
--- /dev/null |
+++ b/chrome/common/extensions/docs/server2/templates/articles/crx.html |
@@ -0,0 +1,147 @@ |
+<h1>CRX Package Format</h1> |
+ |
+ |
+<p> |
+CRX files are ZIP files with a special header and the <code>.crx</code> file |
+extension. |
+</p> |
+ |
+<h2>Package header</h2> |
+ |
+<p> |
+The header contains the author's public key and the extension's signature. |
+The signature is generated from the ZIP file using SHA-1 with the |
+author's private key. The header requires a little-endian byte ordering with |
+4-byte alignment. The following table describes the fields of |
+the <code>.crx</code> header in order: |
+</p> |
+ |
+<table> |
+ <tr> |
+ <th>Field</th><th>Type</th><th>Length</th><th>Value</th><th>Description</th> |
+ </tr> |
+ <tr> |
+ <td><em>magic number</em></td><td>char[]</td><td>32 bits</td><td>Cr24</td> |
+ <td> |
+ Chrome requires this constant at the beginning of every <code>.crx</code> |
+ package. |
+ </td> |
+ </tr> |
+ <tr> |
+ <td><em>version</em></td><td>unsigned int</td><td>32 bits</td><td>2</td> |
+ <td>The version of the <code>*.crx</code> file format used (currently 2).</td> |
+ </tr> |
+ <tr> |
+ <td><em>public key length</em></td><td>unsigned int</td><td>32 bits</td> |
+ <td><i>pubkey.length</i></td> |
+ <td> |
+ The length of the RSA public key in <em>bytes</em>. |
+ </td> |
+ </tr> |
+ <tr> |
+ <td><em>signature length</em></td><td>unsigned int</td><td>32 bits</td> |
+ <td><i>sig.length</i></td> |
+ <td> |
+ The length of the signature in <em>bytes</em>. |
+ </td> |
+ </tr> |
+ <tr> |
+ <td><em>public key</em></td><td>byte[]</td><td><i>pubkey.length</i></i></td> |
+ <td><i>pubkey.contents</i></td> |
+ <td> |
+ The contents of the author's RSA public key, formatted as an X509 |
+ SubjectPublicKeyInfo block. |
+ </td> |
+ </tr> |
+ <tr> |
+ <td><em>signature</em></td><td>byte[]</td><td><i>sig.length</i></td> |
+ <td><i>sig.contents</i></td> |
+ <td> |
+ The signature of the ZIP content using the author's private key. The |
+ signature is created using the RSA algorithm with the SHA-1 hash function. |
+ </td> |
+ </tr> |
+</table> |
+ |
+<h2>Extension contents</h2> |
+ |
+<p> |
+The extension's ZIP file is appended to the <code>*.crx</code> package after the |
+header. This should be the same ZIP file that the signature in the header |
+was generated from. |
+</p> |
+ |
+<h2>Example</h2> |
+ |
+<p> |
+The following is an example hex dump from the beginning of a <code>.crx</code> |
+file. |
+</p> |
+ |
+<pre> |
+43 72 32 34 # "Cr24" -- the magic number |
+02 00 00 00 # 2 -- the crx format version number |
+A2 00 00 00 # 162 -- length of public key in bytes |
+80 00 00 00 # 128 -- length of signature in bytes |
+........... # the contents of the public key |
+........... # the contents of the signature |
+........... # the contents of the zip file |
+ |
+</pre> |
+ |
+<h2 id="scripts">Packaging scripts</h2> |
+<p> |
+Members of the community have written the following scripts to package |
+<code>.crx</code> files. |
+</p> |
+ |
+<h3 id="ruby">Ruby</h3> |
+<blockquote> |
+<a href="http://github.com/Constellation/crxmake">github: crxmake</a> |
+</blockquote> |
+ |
+<h3>Bash</h3> |
+<pre> |
+#!/bin/bash -e |
+# |
+# Purpose: Pack a Chromium extension directory into crx format |
+ |
+if test $# -ne 2; then |
+ echo "Usage: crxmake.sh <extension dir> <pem path>" |
+ exit 1 |
+fi |
+ |
+dir=$1 |
+key=$2 |
+name=$(basename "$dir") |
+crx="$name.crx" |
+pub="$name.pub" |
+sig="$name.sig" |
+zip="$name.zip" |
+trap 'rm -f "$pub" "$sig" "$zip"' EXIT |
+ |
+# zip up the crx dir |
+cwd=$(pwd -P) |
+(cd "$dir" && zip -qr -9 -X "$cwd/$zip" .) |
+ |
+# signature |
+openssl sha1 -sha1 -binary -sign "$key" < "$zip" > "$sig" |
+ |
+# public key |
+openssl rsa -pubout -outform DER < "$key" > "$pub" 2>/dev/null |
+ |
+byte_swap () { |
+ # Take "abcdefgh" and return it as "ghefcdab" |
+ echo "${1:6:2}${1:4:2}${1:2:2}${1:0:2}" |
+} |
+ |
+crmagic_hex="4372 3234" # Cr24 |
+version_hex="0200 0000" # 2 |
+pub_len_hex=$(byte_swap $(printf '%08x\n' $(ls -l "$pub" | awk '{print $5}'))) |
+sig_len_hex=$(byte_swap $(printf '%08x\n' $(ls -l "$sig" | awk '{print $5}'))) |
+( |
+ echo "$crmagic_hex $version_hex $pub_len_hex $sig_len_hex" | xxd -r -p |
+ cat "$pub" "$sig" "$zip" |
+) > "$crx" |
+echo "Wrote $crx" |
+</pre> |