swupdate-common.bbclass 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. def swupdate_is_hash_needed(s, filename):
  2. with open(os.path.join(s, "sw-description"), 'r') as f:
  3. for line in f:
  4. if line.find("@%s" % (filename)) != -1:
  5. return True
  6. return False
  7. def swupdate_get_sha256(s, filename):
  8. import hashlib
  9. m = hashlib.sha256()
  10. with open(os.path.join(s, filename), 'rb') as f:
  11. while True:
  12. data = f.read(1024)
  13. if not data:
  14. break
  15. m.update(data)
  16. return m.hexdigest()
  17. def swupdate_write_sha256(s, filename, hash):
  18. write_lines = []
  19. with open(os.path.join(s, "sw-description"), 'r') as f:
  20. for line in f:
  21. write_lines.append(line.replace("@%s" % (filename), hash))
  22. with open(os.path.join(s, "sw-description"), 'w+') as f:
  23. for line in write_lines:
  24. f.write(line)
  25. def prepare_sw_description(d, s, list_for_cpio):
  26. for file in list_for_cpio:
  27. if file != 'sw-description' and swupdate_is_hash_needed(s, file):
  28. hash = swupdate_get_sha256(s, file)
  29. swupdate_write_sha256(s, file, hash)
  30. signing = d.getVar('SWUPDATE_SIGNING', True)
  31. if signing == "1":
  32. bb.warn('SWUPDATE_SIGNING = "1" is deprecated, falling back to "RSA". It is advised to set it to "RSA" if using RSA signing.')
  33. signing = "RSA"
  34. if signing:
  35. if signing == "CUSTOM":
  36. sign_tool = d.getVar('SWUPDATE_SIGN_TOOL', True)
  37. if sign_tool:
  38. ret = os.system(sign_tool)
  39. if ret != 0:
  40. bb.fatal("Failed to sign with %s" % (sign_tool))
  41. else:
  42. bb.fatal("Custom SWUPDATE_SIGN_TOOL is not given")
  43. elif signing == "RSA":
  44. privkey = d.getVar('SWUPDATE_PRIVATE_KEY', True)
  45. if not privkey:
  46. bb.fatal("SWUPDATE_PRIVATE_KEY isn't set")
  47. if not os.path.exists(privkey):
  48. bb.fatal("SWUPDATE_PRIVATE_KEY %s doesn't exist" % (privkey))
  49. passout = d.getVar('SWUPDATE_PASSWORD_FILE', True)
  50. if passout:
  51. passout = "-passin file:'%s' " % (passout)
  52. else:
  53. passout = ""
  54. signcmd = "openssl dgst -sha256 -sign '%s' %s -out '%s' '%s'" % (
  55. privkey,
  56. passout,
  57. os.path.join(s, 'sw-description.sig'),
  58. os.path.join(s, 'sw-description'))
  59. if os.system(signcmd) != 0:
  60. bb.fatal("Failed to sign sw-description with %s" % (privkey))
  61. elif signing == "CMS":
  62. cms_cert = d.getVar('SWUPDATE_CMS_CERT', True)
  63. if not cms_cert:
  64. bb.fatal("SWUPDATE_CMS_CERT is not set")
  65. if not os.path.exists(cms_cert):
  66. bb.fatal("SWUPDATE_CMS_CERT %s doesn't exist" % (cms_cert))
  67. cms_key = d.getVar('SWUPDATE_CMS_KEY', True)
  68. if not cms_key:
  69. bb.fatal("SWUPDATE_CMS_KEY isn't set")
  70. if not os.path.exists(cms_key):
  71. bb.fatal("SWUPDATE_CMS_KEY %s doesn't exist" % (cms_key))
  72. signcmd = "openssl cms -sign -in '%s' -out '%s' -signer '%s' -inkey '%s' -outform DER -nosmimecap -binary" % (
  73. os.path.join(s, 'sw-description'),
  74. os.path.join(s, 'sw-description.sig'),
  75. cms_cert,
  76. cms_key)
  77. if os.system(signcmd) != 0:
  78. bb.fatal("Failed to sign sw-description with %s" % (privkey))
  79. else:
  80. bb.fatal("Unrecognized SWUPDATE_SIGNING mechanism.");