File wrapping framework.
This commit is contained in:
28
fetcher.py
28
fetcher.py
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
# coding=utf8
|
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import hashlib
|
import hashlib
|
||||||
|
from OpenSSL import crypto
|
||||||
import socket
|
import socket
|
||||||
import struct
|
import struct
|
||||||
import urllib.request
|
import urllib.request
|
||||||
@@ -15,6 +15,11 @@ parser.add_argument(
|
|||||||
dest='base_url',
|
dest='base_url',
|
||||||
action='store',
|
action='store',
|
||||||
required=True)
|
required=True)
|
||||||
|
parser.add_argument(
|
||||||
|
'--ca-cert',
|
||||||
|
dest='ca_cert',
|
||||||
|
action='store',
|
||||||
|
required=True)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--image-type',
|
'--image-type',
|
||||||
dest='image_type',
|
dest='image_type',
|
||||||
@@ -27,13 +32,24 @@ class Fetcher(object):
|
|||||||
|
|
||||||
_MAX_BP = 10000
|
_MAX_BP = 10000
|
||||||
|
|
||||||
def __init__(self, base_url, image_type):
|
def __init__(self, base_url, image_type, ca_cert):
|
||||||
self._base_url = base_url
|
self._base_url = base_url
|
||||||
self._image_type = image_type
|
self._image_type = image_type
|
||||||
|
with open(ca_cert, 'r') as fh:
|
||||||
|
self._ca_cert = crypto.load_certificate(crypto.FILETYPE_PEM, fh.read())
|
||||||
|
|
||||||
|
def _Unwrap(self, wrapped):
|
||||||
|
cert = crypto.load_certificate(crypto.FILETYPE_PEM, wrapped['cert'])
|
||||||
|
crypto.verify(
|
||||||
|
cert,
|
||||||
|
wrapped['sig'].encode('ascii'),
|
||||||
|
wrapped['inner'].encode('ascii'),
|
||||||
|
'sha256')
|
||||||
|
|
||||||
def _GetManifest(self):
|
def _GetManifest(self):
|
||||||
url = '%s/%s.manifest.json' % (self._base_url, self._image_type)
|
url = '%s/%s.manifest.json' % (self._base_url, self._image_type)
|
||||||
return json.loads(urllib.request.urlopen(url).read().decode('utf8'))
|
resp = urllib.request.urlopen(url).read().decode('utf8')
|
||||||
|
return self._Unwrap(json.loads(resp))
|
||||||
|
|
||||||
def _ChooseImage(self, manifest):
|
def _ChooseImage(self, manifest):
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
@@ -47,9 +63,9 @@ class Fetcher(object):
|
|||||||
|
|
||||||
def Fetch(self):
|
def Fetch(self):
|
||||||
manifest = self._GetManifest()
|
manifest = self._GetManifest()
|
||||||
image = self._ChooseImage(manifest)
|
#image = self._ChooseImage(manifest)
|
||||||
print(image)
|
#print(image)
|
||||||
|
|
||||||
|
|
||||||
fetcher = Fetcher(FLAGS.base_url, FLAGS.image_type)
|
fetcher = Fetcher(FLAGS.base_url, FLAGS.image_type, FLAGS.ca_cert)
|
||||||
fetcher.Fetch()
|
fetcher.Fetch()
|
||||||
|
|||||||
54
wrapfile.py
Executable file
54
wrapfile.py
Executable file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import codecs
|
||||||
|
import json
|
||||||
|
from OpenSSL import crypto
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='iconograph wrapfile')
|
||||||
|
parser.add_argument(
|
||||||
|
'--cert',
|
||||||
|
dest='cert',
|
||||||
|
action='store',
|
||||||
|
required=True)
|
||||||
|
parser.add_argument(
|
||||||
|
'--key',
|
||||||
|
dest='key',
|
||||||
|
action='store',
|
||||||
|
required=True)
|
||||||
|
parser.add_argument(
|
||||||
|
'--other-cert',
|
||||||
|
dest='other_certs',
|
||||||
|
action='store',
|
||||||
|
nargs='*')
|
||||||
|
FLAGS = parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
class Wrapper(object):
|
||||||
|
|
||||||
|
def __init__(self, key, cert, other_certs):
|
||||||
|
with open(key, 'r') as fh:
|
||||||
|
self._key = crypto.load_privatekey(crypto.FILETYPE_PEM, fh.read())
|
||||||
|
with open(cert, 'r') as fh:
|
||||||
|
self._cert_str = fh.read()
|
||||||
|
self._cert = crypto.load_certificate(crypto.FILETYPE_PEM, self._cert_str)
|
||||||
|
self._other_cert_strs = []
|
||||||
|
for path in (other_certs or []):
|
||||||
|
with open(path, 'r') as fh:
|
||||||
|
self._other_cert_strs.append(fh.read())
|
||||||
|
|
||||||
|
def Wrap(self, instr):
|
||||||
|
inbytes = instr.encode('utf8')
|
||||||
|
return {
|
||||||
|
'cert': self._cert_str,
|
||||||
|
'other_certs': self._other_cert_strs,
|
||||||
|
'sig': codecs.encode(crypto.sign(self._key, inbytes, 'sha256'), 'hex').decode('ascii'),
|
||||||
|
'inner': instr,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wrapper = Wrapper(FLAGS.key, FLAGS.cert, FLAGS.other_certs)
|
||||||
|
wrapped = wrapper.Wrap(sys.stdin.read())
|
||||||
|
json.dump(wrapped, sys.stdout, sort_keys=True, indent=4)
|
||||||
Reference in New Issue
Block a user