Как заменить вызовы openSSL кодом C #? - PullRequest
0 голосов
/ 27 марта 2010

Сегодня я столкнулся с проблемой, когда создавал новую тему для Chrome. Как вы, возможно, знаете, Chrome использует «новый» формат файла, называемый CRX, для управления плагинами и темами. Это простой zip-файл, но немного измененный:

"Cr24" + ключик + подпись + zipFile

И тут возникает проблема. Есть только два создателя CRX, написанные на Ruby или Python. Я не слишком хорошо знаю ни один из этих языков (хотя и имел некоторый базовый опыт работы с Python, но в основном с PyS60), поэтому я хотел бы попросить вас помочь мне преобразовать это приложение на Python в код C #, который не зависит от внешних программ .

Кроме того, вот источник crxmake.py:



#!/usr/bin/python
# Cribbed from http://github.com/Constellation/crxmake/blob/master/lib/crxmake.rb
# and http://src.chromium.org/viewvc/chrome/trunk/src/chrome/tools/extensions/chromium_extension.py?revision=14872&content-type=text/plain&pathrev=14872

# from: http://grack.com/blog/2009/11/09/packing-chrome-extensions-in-python/
import sys
from array import *
from subprocess import *
import os
import tempfile

def main(argv):

  arg0,dir,key,output = argv

  # zip up the directory

  input = dir + ".zip"

  if not os.path.exists(input):
    os.system("cd %(dir)s; zip  -r ../%(input)s . -x '.svn/*'" % locals())
  else:
    print "'%s' already exists using it" % input

  # Sign the zip file with the private key in PEM format
  signature = Popen(["openssl", "sha1", "-sign", key, input], stdout=PIPE).stdout.read();

  # Convert the PEM key to DER (and extract the public form) for inclusion in the CRX header
  derkey = Popen(["openssl", "rsa", "-pubout", "-inform", "PEM", "-outform", "DER", "-in", key], stdout=PIPE).stdout.read();

  out=open(output, "wb");
  out.write("Cr24")  # Extension file magic number
  header = array("l");
  header.append(2); # Version 2
  header.append(len(derkey));
  header.append(len(signature));
  header.tofile(out);
  out.write(derkey)
  out.write(signature)
  out.write(open(input).read())

  os.unlink(input)
  print "Done."

if __name__ == '__main__':
  main(sys.argv)

Пожалуйста, не могли бы вы помочь мне?

1 Ответ

0 голосов
/ 11 октября 2010

Для Linux существует множество утилит для этого, в том числе и для bash, но звучит так, как будто вы хотите что-то для windows (догадываясь из вашего комментария C #).

Я пытался включить ссылки на все из них - но я новый пользователь stackoverflow и могу опубликовать только 1 ссылку.

В любом случае, все они могут работать в Windows, однако они требуют настройки интерпретатора языка и OpenSSL - поэтому я потратил несколько часов и собрал версию на C, которая работает на Windows или Linux (хотя я не уверен, почему вы будете использовать его в Linux).

Он статически связан с OpenSSL, поэтому нет требований к интерпретатору или библиотеке.

Хранилище можно найти здесь: http://github.com/kylehuff/buildcrx

Следует отметить, что я не использую windows - это было написано в Linux, а двоичный файл win32 был кросс-скомпилирован в Linux (а также в библиотеках OpenSSL) - я тестировал его в Windows - но не очень широко. Если у вас есть проблемы с этим, пожалуйста, не запрашивайте поддержку здесь; Я не буду отвечать. Воспользуйтесь страницей вопросов по ссылке выше.

Кроме того, я не буду преобразовывать это в C # - я не вижу смысла использовать C # для такой простой утилиты, которая просто увековечила бы необходимость в «другом программном обеспечении», чтобы оно было полезно на других платформах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...