Hello community,

here is the log from the commit of package shim.3096 for openSUSE:12.3:Update 
checked in at 2015-01-21 14:19:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:12.3:Update/shim.3096 (Old)
 and      /work/SRC/openSUSE:12.3:Update/.shim.3096.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "shim.3096"

Changes:
--------
New Changes file:

--- /dev/null   2014-12-25 22:38:16.200041506 +0100
+++ /work/SRC/openSUSE:12.3:Update/.shim.3096.new/shim.changes  2015-01-21 
14:19:33.000000000 +0100
@@ -0,0 +1,498 @@
+-------------------------------------------------------------------
+Mon Oct  6 09:59:23 UTC 2014 - [email protected]
+
+- Fixed buffer overflow and OOB access in shim trusted code path (bnc#889332)
+  (bnc#889332, CVE-2014-3675, CVE-2014-3676, CVE-2014-3677)
+  * added bug-889332_shim-mok-oob.patch, bug-889332_shim-overflow.patch
+
+-------------------------------------------------------------------
+Wed Sep  3 12:32:25 UTC 2014 - [email protected]
+
+- re-introduce build failure if shim_enforce_ms_signature is defined. That way
+  a project like openSUSE:Factory can decide whether or not shim needs a valid
+  MS signature.
+
+-------------------------------------------------------------------
+Tue Aug 19 04:38:36 UTC 2014 - [email protected]
+
+- Add shim-update-openssl-0.9.8zb.patch to update openssl to
+  0.9.8zb
+
+-------------------------------------------------------------------
+Tue Aug 12 14:19:36 UTC 2014 - [email protected]
+
+- updated shim to new version (OpenSSL 0.9.8za) and requested a new
+  certificate from Microsoft. Removed
+  * shim-allow-fallback-use-system-loadimage.patch
+  * shim-bnc872503-check-key-encoding.patch
+  * shim-bnc877003-fetch-from-the-same-device.patch
+  * shim-correct-user_insecure-usage.patch
+  * shim-fallback-avoid-duplicate-bootorder.patch
+  * shim-fallback-improve-entries-creation.patch
+  * shim-fix-dhcpv4-path-generation.patch
+  * shim-fix-uninitialized-variable.patch
+  * shim-fix-verify-mok.patch
+  * shim-get-variable-check.patch
+  * shim-improve-error-messages.patch
+  * shim-mokmanager-delete-bs-var-right.patch
+  * shim-mokmanager-handle-keystroke-error.patch
+  * shim-remove-unused-variables.patch
+  since they're included in upstream and rebased the remaining onces.
+  Added shim-signed-unsigned-compares.patch to fix some compiler
+  warnings
+
+-------------------------------------------------------------------
+Tue Aug 12 09:18:42 UTC 2014 - [email protected]
+
+- Keep shim-devel.efi for the devel project
+
+-------------------------------------------------------------------
+Fri Aug  8 11:18:36 UTC 2014 - [email protected]
+
+- don't fail the build if the UEFI signing service signature can't
+  be attached anymore. This way shim can still pass through staging
+  projects. We will verify the correct signature for release builds
+  using openQA instead.
+
+-------------------------------------------------------------------
+Mon Aug  4 07:53:22 UTC 2014 - [email protected]
+
+- shim-install: fix GRUB shows broken letters at boot by calling
+  grub2-install to initialize /boot/grub2 directory with files 
+  needed by grub.cfg (bnc#889765) 
+
+-------------------------------------------------------------------
+Wed May 28 04:13:33 UTC 2014 - [email protected]
+
+- Add shim-remove-unused-variables.patch to remove the unused
+  variables
+- Add shim-bnc872503-check-key-encoding.patch to check the encoding
+  of the keys (bnc#872503)
+- Add shim-bnc877003-fetch-from-the-same-device.patch to fetch the
+  netboot image from the same device (bnc#877003)
+- Refresh shim-opensuse-cert-prompt.patch
+
+-------------------------------------------------------------------
+Wed May 14 09:39:02 UTC 2014 - [email protected]
+
+- Use --reinit instead of --refresh in %post to update the files
+  in /boot
+
+-------------------------------------------------------------------
+Tue Apr 29 07:38:11 UTC 2014 - [email protected]
+
+- shim-install: fix boot partition and rollback support kluge
+  (bnc#875385) 
+
+-------------------------------------------------------------------
+Thu Apr 10 08:20:20 UTC 2014 - [email protected]
+
+- Replace shim-mokmanager-support-sha1.patch with
+  shim-mokmanager-support-sha-family.patch to support the SHA
+  family
+
+-------------------------------------------------------------------
+Mon Apr  7 09:32:21 UTC 2014 - [email protected]
+
+- Add shim-mokmanager-support-sha1.patch to support SHA1 hashes in
+  MOK
+
+-------------------------------------------------------------------
+Mon Mar 31 11:57:13 UTC 2014 - [email protected]
+
+- snapper rollback support (fate#317062)
+  - refresh shim-install
+
+-------------------------------------------------------------------
+Thu Mar 13 02:32:15 UTC 2014 - [email protected]
+
+- Insert the right signature (bnc#867974)
+
+-------------------------------------------------------------------
+Mon Mar 10 07:56:44 UTC 2014 - [email protected]
+
+- Add shim-fix-uninitialized-variable.patch to fix the use of
+  uninitialzed variables in lib 
+
+-------------------------------------------------------------------
+Fri Mar  7 09:09:12 UTC 2014 - [email protected]
+
+- Add shim-mokmanager-delete-bs-var-right.patch to delete the BS+NV
+  variables the right way
+- Update shim-opensuse-cert-prompt.patch to delete openSUSE_Verify
+  correctly
+
+-------------------------------------------------------------------
+Thu Mar  6 07:37:57 UTC 2014 - [email protected]
+
+- Add shim-fallback-avoid-duplicate-bootorder.patch to fix the
+  duplicate entries in BootOrder
+- Add shim-allow-fallback-use-system-loadimage.patch to handle the
+  shim protocol properly to keep only one protocol entity
+- Refresh shim-opensuse-cert-prompt.patch
+
+-------------------------------------------------------------------
+Thu Mar  6 03:53:49 UTC 2014 - [email protected]
+
+- shim-install: fix the $prefix to use grub2-mkrelpath for paths
+  on btrfs subvolume (bnc#866690).
+
+-------------------------------------------------------------------
+Tue Mar  4 04:19:05 UTC 2014 - [email protected]
+
+- FATE#315002: Update shim-install to install shim.efi as the EFI
+  default bootloader when none exists in \EFI\boot.
+
+-------------------------------------------------------------------
+Thu Feb 27 09:46:49 UTC 2014 - [email protected]
+
+- Update signature-sles.asc: shim signed by UEFI signing service,
+  based on code from "Thu Feb 20 11:57:01 UTC 2014"
+
+-------------------------------------------------------------------
+Fri Feb 21 08:45:46 UTC 2014 - [email protected]
+
+- Add shim-opensuse-cert-prompt.patch to show the prompt to ask
+  whether the user trusts the openSUSE certificate or not
+
+-------------------------------------------------------------------
+Thu Feb 20 11:57:01 UTC 2014 - [email protected]
+
+- allow package to carry multiple signatures
+- check correct certificate is embedded
+
+-------------------------------------------------------------------
+Thu Feb 20 10:06:47 UTC 2014 - [email protected]
+
+- always clean up generated files that embed certificates
+  (shim_cert.h shim.cer shim.crt) to make sure next build loop
+  rebuilds them properly
+
+-------------------------------------------------------------------
+Mon Feb 17 09:58:56 UTC 2014 - [email protected]
+
+- Add shim-bnc863205-mokmanager-fix-hash-delete.patch to fix the
+  hash deletion operation to avoid ruining the whole list
+  (bnc#863205)
+
+-------------------------------------------------------------------
+Tue Feb 11 06:30:02 UTC 2014 - [email protected]
+
+- Update shim-mokx-support.patch to support the resetting of MOK
+  blacklist
+- Add shim-get-variable-check.patch to fix the variable checking
+  in get_variable_attr
+- Add shim-fallback-improve-entries-creation.patch to improve the
+  boot entry pathes and avoid generating the boot entries that
+  are already there
+- Update SUSE certificate
+- Update attach_signature.sh, show_hash.sh, strip_signature.sh,
+  extract_signature.sh and show_signatures.sh to remove the
+  creation of the temporary nss database
+- Add shim-only-os-name.patch: remove the kernel version of the
+  build server
+- Match the the prefix of the project name properly by escaping the 
+  percent sign.
+
+-------------------------------------------------------------------
++++ 301 more lines (skipped)
++++ between /dev/null
++++ and /work/SRC/openSUSE:12.3:Update/.shim.3096.new/shim.changes

New:
----
  SLES-UEFI-CA-Certificate.crt
  attach_signature.sh
  bug-889332_shim-mok-oob.patch
  bug-889332_shim-overflow.patch
  extract_signature.sh
  openSUSE-UEFI-CA-Certificate-4096.crt
  openSUSE-UEFI-CA-Certificate.crt
  shim-0.7.318.81ee561d.tar.bz2
  shim-bnc863205-mokmanager-fix-hash-delete.patch
  shim-install
  shim-mokmanager-support-sha-family.patch
  shim-mokx-support.patch
  shim-only-os-name.patch
  shim-opensuse-cert-prompt.patch
  shim-opensuse.efi
  shim-signed-unsigned-compares.patch
  shim-update-openssl-0.9.8zb.patch
  shim.changes
  shim.spec
  show_hash.sh
  show_signatures.sh
  signature-opensuse.asc
  signature-sles.asc
  strip_signature.sh
  timestamp.pl

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ shim.spec ++++++
#
# spec file for package shim
#
# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via http://bugs.opensuse.org/
#


# needssslcertforbuild
%define commit      81ee561dde0213bc487aa1b701799f6d2faeaf31
%define shortcommit 81ee561d

Name:           shim
# to ensure newer versions of the git export are always higher numbers the 
output of
# git rev-list master|wc -l is added before the git commit hash
Version:        0.7.318.%{shortcommit}
Release:        0
Summary:        UEFI shim loader
License:        BSD-2-Clause
Group:          System/Boot
Url:            https://github.com/mjg59/shim
Source:         %{name}-%{version}.tar.bz2
# run "extract_signature.sh shim.efi" where shim.efi is the binary
# with the signature from the UEFI signing service.
Source1:        signature-opensuse.asc
Source2:        openSUSE-UEFI-CA-Certificate.crt
Source3:        shim-install
Source4:        SLES-UEFI-CA-Certificate.crt
Source5:        extract_signature.sh
Source6:        attach_signature.sh
Source7:        show_hash.sh
Source8:        show_signatures.sh
Source9:        openSUSE-UEFI-CA-Certificate-4096.crt
Source10:       timestamp.pl
Source11:       strip_signature.sh
Source12:       signature-sles.asc
# PATCH-FIX-UPSTREAM shim-mokx-support.patch [email protected] -- Support MOK 
blacklist
Patch1:         shim-mokx-support.patch
# PATCH-FIX-SUSE shim-only-os-name.patch [email protected] -- Only include the OS 
name in version.c
Patch2:         shim-only-os-name.patch
# PATCH-FIX-UPSTREAM shim-bnc863205-mokmanager-fix-hash-delete.patch bnc#863205 
[email protected] -- Fix the hash deletion operation to avoid ruining the whole list
Patch3:         shim-bnc863205-mokmanager-fix-hash-delete.patch
# PATCH-FIX-UPSTREAM shim-mokmanager-support-sha-family.patch [email protected] -- 
Support SHA hashes in MOK
Patch4:         shim-mokmanager-support-sha-family.patch
# PATCH-FIX-OPENSUSE shim-signed-unsigned-compares.patch [email protected] -- 
Fixed some signed - unsigned comparisons
Patch5:         shim-signed-unsigned-compares.patch
# PATCH-FIX-UPSTREAM shim-update-openssl-0.9.8zb.patch [email protected] -- Update 
openssl to 0.9.8zb
Patch6:         shim-update-openssl-0.9.8zb.patch
# PATCH-FIX-UPSTREAM bug-889332_shim-overflow.patch [email protected] -- patch 
for overflow issue.
Patch7:         bug-889332_shim-overflow.patch
# PATCH-FIX-UPSTREAM bug-889332_shim-mok-oob.patch [email protected] -- patch 
for MOK OOB access.
Patch8:         bug-889332_shim-mok-oob.patch
# PATCH-FIX-OPENSUSE shim-opensuse-cert-prompt.patch [email protected] -- Show the 
prompt to ask whether the user trusts openSUSE certificate or not
Patch100:       shim-opensuse-cert-prompt.patch
BuildRequires:  gnu-efi >= 3.0t
BuildRequires:  mozilla-nss-tools
BuildRequires:  openssl >= 0.9.8
BuildRequires:  pesign
BuildRequires:  pesign-obs-integration
Requires:       perl-Bootloader
BuildRoot:      %{_tmppath}/%{name}-%{version}-build
# For shim-install script
Requires:       grub2-efi
ExclusiveArch:  x86_64

%description
shim is a trivial EFI application that, when run, attempts to open and
execute another application.



Authors:
--------
    Matthew Garrett <[email protected]>

%prep
%setup -q
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch100 -p1

%build
# first, build MokManager and fallback as they don't depend on a
# specific certificate
make EFI_PATH=/usr/lib64 MokManager.efi fallback.efi 2>/dev/null

# now build variants of shim that embed different certificates
default=''
suffixes=(opensuse sles)
# check whether the project cert is a known one. If it is we build
# just one shim that embeds this specific cert. If it's a devel
# project we build all variants to simplify testing.
if test -e %{_sourcedir}/_projectcert.crt ; then
    prjsubject=$(openssl x509 -in %{_sourcedir}/_projectcert.crt -noout 
-subject_hash)
    prjissuer=$(openssl x509 -in %{_sourcedir}/_projectcert.crt -noout 
-issuer_hash)
    opensusesubject=$(openssl x509 -in %{SOURCE2} -noout -subject_hash)
    slessubject=$(openssl x509 -in %{SOURCE4} -noout -subject_hash)
    if test "$prjissuer" = "$opensusesubject" ; then 
        suffixes=(opensuse)
    elif test "$prjissuer" = "$slessubject" ; then
        suffixes=(sles)
    elif test "$prjsubject" = "$prjissuer" ; then
        suffixes=(devel opensuse sles)
    fi
fi

for suffix in "${suffixes[@]}"; do
    if test "$suffix" = "opensuse"; then
        cert=%{SOURCE2}
        cert2=%{SOURCE9}
        verify='openSUSE Secure Boot CA1'
        signature=%{SOURCE1}
    elif test "$suffix" = "sles"; then
        cert=%{SOURCE4}
        cert2=''
        verify='SUSE Linux Enterprise Secure Boot CA1'
        signature=%{SOURCE12}
    elif test "$suffix" = "devel"; then
        cert=%{_sourcedir}/_projectcert.crt
        cert2=''
        verify=`openssl x509 -in "$cert" -noout -email`
        signature=''
        test -e "$cert" || continue
    else
        echo "invalid suffix"
        false
    fi

    openssl x509 -in $cert -outform DER -out shim-$suffix.der
    rm -f shim_cert.h shim.cer shim.crt
    if [ -z "$cert2" ]; then
            # create empty local cert file, we don't need a local key pair as we
            # sign the mokmanager with our vendor key
            touch shim.crt
            touch shim.cer
    else
            cp $cert2 shim.crt
    fi
    # make sure cast warnings don't trigger post build check
    make EFI_PATH=/usr/lib64 VENDOR_CERT_FILE=shim-$suffix.der shim.efi 
2>/dev/null
    #
    # assert correct certificate embedded
    grep -q "$verify" shim.efi
    # make VENDOR_CERT_FILE=cert.der VENDOR_DBX_FILE=dbx
    chmod 755 %{SOURCE10}
    # alternative: verify signature
    #sbverify --cert MicCorThiParMarRoo_2010-10-05.pem shim-signed.efi
    if test -n "$signature"; then
        head -1 "$signature" > hash1
        cp shim.efi shim.efi.bak
        # pe header contains timestamp and checksum. we need to
        # restore that
        %{SOURCE10} --set-from-file "$signature" shim.efi
        pesign -h -P -i shim.efi > hash2
        cat hash1 hash2
        if ! cmp -s hash1 hash2; then
                echo "ERROR: $suffix binary changed, need to request new 
signature!"
%if %{defined shim_enforce_ms_signature}
                false
%endif
                mv shim.efi.bak shim-$suffix.efi
                rm shim.efi
        else
                # attach signature
                pesign -m "$signature" -i shim.efi -o shim-$suffix.efi
                rm -f shim.efi
        fi
    else
        mv shim.efi shim-$suffix.efi
    fi
    rm -f shim.cer shim.crt
    # make sure cert.o gets rebuilt
    rm -f cert.o
done

ln -s shim-${suffixes[0]}.efi shim.efi

%install
export BRP_PESIGN_FILES='%{_libdir}/efi/shim*.efi %{_libdir}/efi/MokManager.efi 
%{_libdir}/efi/fallback.efi'
install -d %{buildroot}/%{_libdir}/efi
cp -a shim*.efi %{buildroot}/%{_libdir}/efi
install -m 444 shim-*.der %{buildroot}/%{_libdir}/efi
install -m 644 MokManager.efi %{buildroot}/%{_libdir}/efi/MokManager.efi
install -m 644 fallback.efi %{buildroot}/%{_libdir}/efi/fallback.efi
install -d %{buildroot}/%{_sbindir}
install -m 755 %{SOURCE3} %{buildroot}/%{_sbindir}/
# install SUSE certificate
install -d %{buildroot}/%{_sysconfdir}/uefi/certs/
for file in shim-*.der; do
    fpr=$(openssl x509 -sha1 -fingerprint -inform DER -noout -in $file | cut -c 
18- | cut -d ":" -f 1,2,3,4 | sed 's/://g')
    install -m 644 $file %{buildroot}/%{_sysconfdir}/uefi/certs/$fpr.crt
done

%clean
%{?buildroot:%__rm -rf "%{buildroot}"}

%post
/sbin/update-bootloader --refresh || true

%files
%defattr(-,root,root)
%doc COPYRIGHT
%dir %{_libdir}/efi
%{_libdir}/efi/shim.efi
%{_libdir}/efi/shim-*.efi
%{_libdir}/efi/shim-*.der
%{_libdir}/efi/MokManager.efi
%{_libdir}/efi/fallback.efi
%{_sbindir}/shim-install
%dir %{_sysconfdir}/uefi/
%dir %{_sysconfdir}/uefi/certs/
%{_sysconfdir}/uefi/certs/*.crt

%changelog
++++++ SLES-UEFI-CA-Certificate.crt ++++++
-----BEGIN CERTIFICATE-----
MIIE5TCCA82gAwIBAgIBATANBgkqhkiG9w0BAQsFADCBpjEtMCsGA1UEAwwkU1VT
RSBMaW51eCBFbnRlcnByaXNlIFNlY3VyZSBCb290IENBMQswCQYDVQQGEwJERTES
MBAGA1UEBwwJTnVyZW1iZXJnMSEwHwYDVQQKDBhTVVNFIExpbnV4IFByb2R1Y3Rz
IEdtYkgxEzARBgNVBAsMCkJ1aWxkIFRlYW0xHDAaBgkqhkiG9w0BCQEWDWJ1aWxk
QHN1c2UuZGUwHhcNMTMwNDE4MTQzMzQxWhcNMzUwMzE0MTQzMzQxWjCBpjEtMCsG
A1UEAwwkU1VTRSBMaW51eCBFbnRlcnByaXNlIFNlY3VyZSBCb290IENBMQswCQYD
VQQGEwJERTESMBAGA1UEBwwJTnVyZW1iZXJnMSEwHwYDVQQKDBhTVVNFIExpbnV4
IFByb2R1Y3RzIEdtYkgxEzARBgNVBAsMCkJ1aWxkIFRlYW0xHDAaBgkqhkiG9w0B
CQEWDWJ1aWxkQHN1c2UuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDN/avXKoT4gcM2NVA1LMfsBPH01sxgS8gTs3SbvfbEP2M+ZlHyfj9ufHZ7cZ1p
ISoVm6ql5VbIeZgSNc17Y4y4Nynud1C8t2SP/iZK5YMYHGxdtIfv1zPE+Bo/KZqE
WgHg2YFtMXdiKfXBZRTfSh37t0pGO/OQi6K4JioKw55UtQNggePZWDXtsAviT2vv
abqLR9+kxdrQ0iWqhWM+LwXbTGkCpg41s8KucLD/JYAxxw05dKPApFDNnz+Ft2L7
e5JtyB4S0u4PlvQBMNHt4hDs0rK4oeHFLbOxHvjF+nloneWhkg9eT0VCfpAYVYz+
whMxuCHerDCdmeFrRGEMQz11AgMBAAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/
MB0GA1UdDgQWBBTsqw1CxFbPdwQ2uXOZOGKWXocmLzCB0wYDVR0jBIHLMIHIgBTs
qw1CxFbPdwQ2uXOZOGKWXocmL6GBrKSBqTCBpjEtMCsGA1UEAwwkU1VTRSBMaW51
eCBFbnRlcnByaXNlIFNlY3VyZSBCb290IENBMQswCQYDVQQGEwJERTESMBAGA1UE
BwwJTnVyZW1iZXJnMSEwHwYDVQQKDBhTVVNFIExpbnV4IFByb2R1Y3RzIEdtYkgx
EzARBgNVBAsMCkJ1aWxkIFRlYW0xHDAaBgkqhkiG9w0BCQEWDWJ1aWxkQHN1c2Uu
ZGWCAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IBAQASviyFhVqU
Wc1JUQgXwdljJynTnp0/FQOZJBSe7XdBGPmy91+3ITqrXgyqo/218KISiQl53Qlw
pq+cIiGRAia1D7p7wbg7wsg+Trt0zZFXes30wfYq5pjfWadEBAgNCffkBz10TSjL
jQrVwW5N+yUJMoq+r843TzV56Huy6LBOVhI5yTz7X7i2rSJYfyQWM8oeHLj8Yl5M
rOB9gyTumxB4mOLmSqwKzJiUB0ppGPohdLUSSEKDdo6KSH/GjR7M7uBicwnzwJD3
SVfT9nx9HKF2nXZlHvs5ViQQru3qP1tc6i0eXEnPTYW2+zkZcN0e5iHyozEZHsO0
rvc1p6G0YWtO
-----END CERTIFICATE-----
++++++ attach_signature.sh ++++++
#!/bin/bash
# attach ascii armored signature to a PE binary
set -e

sig="$1"
infile="$2"
if [ -z "$sig" -o ! -e "$sig" -o -z "$infile" -o ! -e "$infile" ]; then
        echo "USAGE: $0 sig.asc file.efi"
        exit 1
fi

outfile="${infile%.efi}-signed.efi"

pesign -m "$sig" -i "$infile" -o "$outfile"
++++++ bug-889332_shim-mok-oob.patch ++++++
Index: shim-0.7.318.81ee561d/MokManager.c
===================================================================
--- shim-0.7.318.81ee561d.orig/MokManager.c
+++ shim-0.7.318.81ee561d/MokManager.c
@@ -163,8 +163,18 @@ static UINT32 count_keys(void *Data, UIN
        EFI_SIGNATURE_LIST *CertList = Data;
        UINTN dbsize = DataSize;
        UINT32 MokNum = 0;
+       void *end = Data + DataSize;
 
        while ((dbsize > 0) && (dbsize >= CertList->SignatureListSize)) {
+
+               /* Use ptr arithmetics to ensure bounded access. Do not allow 0
+                * SignatureListSize that will cause endless loop.
+                */
+               if ((void *)(CertList + 1) > end || CertList->SignatureListSize 
== 0) {
+                       console_notify(L"Invalid MOK detected! Ignoring MOK 
List.");
+                       return 0;
+               }
+
                if (CertList->SignatureListSize == 0 ||
                    CertList->SignatureListSize <= CertList->SignatureSize) {
                        console_errorbox(L"Corrupted signature list");
@@ -192,6 +202,7 @@ static MokListNode *build_mok_list(UINT3
        EFI_GUID CertType = X509_GUID;
        UINTN dbsize = DataSize;
        UINTN count = 0;
+       void *end = Data + DataSize;
 
        list = AllocatePool(sizeof(MokListNode) * num);
 
@@ -201,12 +212,24 @@ static MokListNode *build_mok_list(UINT3
        }
 
        while ((dbsize > 0) && (dbsize >= CertList->SignatureListSize)) {
+               /* CertList out of bounds? */
+               if ((void *)(CertList + 1) > end || CertList->SignatureListSize 
== 0) {
+                       FreePool(list);
+                       return NULL;
+               }
+
                /* Omit the signature check here since we already did it
                   in count_keys() */
 
                Cert = (EFI_SIGNATURE_DATA *) (((UINT8 *) CertList) +
                  sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
 
+               /* Cert out of bounds? */
+               if ((void *)(Cert + 1) > end || CertList->SignatureSize <= 
sizeof(EFI_GUID)) {
+                       FreePool(list);
+                       return NULL;
+               }
+
                list[count].Type = CertList->SignatureType;
                if (CompareGuid (&CertList->SignatureType, &CertType) == 0) {
                        list[count].MokSize = CertList->SignatureSize -
@@ -218,6 +241,12 @@ static MokListNode *build_mok_list(UINT3
                        list[count].Mok = (void *)Cert;
                }
 
+               /* MOK out of bounds? */
+               if (list[count].MokSize > end - (void *)list[count].Mok) {
+                       FreePool(list);
+                       return NULL;
+               }
+
                count++;
                dbsize -= CertList->SignatureListSize;
                CertList = (EFI_SIGNATURE_LIST *) ((UINT8 *) CertList +
++++++ bug-889332_shim-overflow.patch ++++++
diff --git a/netboot.c b/netboot.c
index 5ef53f7..f01a9bc 100644
--- a/netboot.c
+++ b/netboot.c
@@ -116,29 +116,34 @@ BOOLEAN findNetboot(EFI_HANDLE device)
 
 static CHAR8 *get_v6_bootfile_url(EFI_PXE_BASE_CODE_DHCPV6_PACKET *pkt)
 {
-       void *optr;
-       EFI_DHCP6_PACKET_OPTION *option;
-       CHAR8 *url;
-       UINT32 urllen;
+       void *optr = NULL, *end = NULL;
+       EFI_DHCP6_PACKET_OPTION *option = NULL;
+       CHAR8 *url = NULL;
+       UINT32 urllen = 0;
 
        optr = pkt->DhcpOptions;
+       end = optr + sizeof(pkt->DhcpOptions);
 
-       for(;;) {
+       for (;;) {
                option = (EFI_DHCP6_PACKET_OPTION *)optr;
 
                if (ntohs(option->OpCode) == 0)
-                       return NULL;
+                       break;
 
                if (ntohs(option->OpCode) == 59) {
                        /* This is the bootfile url option */
                        urllen = ntohs(option->Length);
-                       url = AllocateZeroPool(urllen+1);
+                       if ((void *)(option->Data + urllen) > end)
+                               break;
+                       url = AllocateZeroPool(urllen + 1);
                        if (!url)
-                               return NULL;
+                               break;
                        memcpy(url, option->Data, urllen);
                        return url;
                }
                optr += 4 + ntohs(option->Length);
+               if (optr + sizeof(EFI_DHCP6_PACKET_OPTION) > end)
+                       break;
        }
 
        return NULL;
@@ -164,45 +169,60 @@ static CHAR16 str2ns(CHAR8 *str)
 
 static CHAR8 *str2ip6(CHAR8 *str)
 {
-        UINT8 i, j, p;
-       size_t len;
-        CHAR8 *a, *b, t;
-        static UINT16 ip[8];
+       UINT8 i = 0, j = 0, p = 0;
+       size_t len = 0, dotcount = 0;
+       enum { MAX_IP6_DOTS = 7 };
+       CHAR8 *a = NULL, *b = NULL, t = 0;
+       static UINT16 ip[8];
 
-        for(i=0; i < 8; i++) {
-                ip[i] = 0;
-        }
-        len = strlen(str);
-        a = b = str;
-        for(i=p=0; i < len; i++, b++) {
-                if (*b != ':')
-                        continue;
-                *b = '\0';
-                ip[p++] = str2ns(a);
-                *b = ':';
-                a = b + 1;
-                if ( *(b+1) == ':' )
-                        break;
-        }
-        a = b = (str + len);
-        for(j=len, p=7; j > i; j--, a--) {
-                if (*a != ':')
-                        continue;
-                t = *b;
-                *b = '\0';
-                ip[p--] = str2ns(a+1);
-                *b = t;
-                b = a;
-        }
-        return (CHAR8 *)ip;
+       memset(ip, 0, sizeof(ip));
+
+       /* Count amount of ':' to prevent overflows.
+        * max. count = 7. Returns an invalid ip6 that
+        * can be checked against
+        */
+       for (a = str; *a != 0; ++a) {
+               if (*a == ':')
+                       ++dotcount;
+       }
+       if (dotcount > MAX_IP6_DOTS)
+               return (CHAR8 *)ip;
+
+       len = strlen(str);
+       a = b = str;
+       for (i = p = 0; i < len; i++, b++) {
+               if (*b != ':')
+                       continue;
+               *b = '\0';
+               ip[p++] = str2ns(a);
+               *b = ':';
+               a = b + 1;
+               if (b[1] == ':' )
+                       break;
+       }
+       a = b = (str + len);
+       for (j = len, p = 7; j > i; j--, a--) {
+               if (*a != ':')
+                       continue;
+               t = *b;
+               *b = '\0';
+               ip[p--] = str2ns(a+1);
+               *b = t;
+               b = a;
+       }
+       return (CHAR8 *)ip;
 }
 
 static BOOLEAN extract_tftp_info(CHAR8 *url)
 {
        CHAR8 *start, *end;
        CHAR8 ip6str[40];
+       CHAR8 ip6inv[16];
        CHAR8 *template = (CHAR8 *)translate_slashes(DEFAULT_LOADER_CHAR);
 
+       // to check against str2ip6() errors
+       memset(ip6inv, 0, sizeof(ip6inv));
+
        if (strncmp((UINT8 *)url, (UINT8 *)"tftp://";, 7)) {
                Print(L"URLS MUST START WITH tftp://\n";);
                return FALSE;
@@ -217,7 +237,7 @@ static BOOLEAN extract_tftp_info(CHAR8 *url)
        end = start;
        while ((*end != '\0') && (*end != ']')) {
                end++;
-               if (end - start > 39) {
+               if (end - start >= (int)sizeof(ip6str)) {
                        Print(L"TFTP URL includes malformed IPv6 address\n");
                        return FALSE;
                }
@@ -226,10 +246,12 @@ static BOOLEAN extract_tftp_info(CHAR8 *url)
                Print(L"TFTP SERVER MUST BE ENCLOSED IN [..]\n");
                return FALSE;
        }
-       memset(ip6str, 0, 40);
+       memset(ip6str, 0, sizeof(ip6str));
        memcpy(ip6str, start, end - start);
        end++;
        memcpy(&tftp_addr.v6, str2ip6(ip6str), 16);
+       if (memcmp(&tftp_addr.v6, ip6inv, sizeof(ip6inv)) == 0)
+               return FALSE;
        full_path = AllocateZeroPool(strlen(end)+strlen(template)+1);
        if (!full_path)
                return FALSE;
++++++ extract_signature.sh ++++++
#!/bin/bash
# extract ascii armored signature from a PE binary
set -e

infile="$1"

if [ -z "$infile" -o ! -e "$infile" ]; then
        echo "USAGE: $0 file.efi"
        exit 1
fi

# wtf?
(pesign -h -P -i "$infile";
perl $(dirname $0)/timestamp.pl "$infile";
pesign -a -f -e /dev/stdout -i "$infile")|cat
++++++ openSUSE-UEFI-CA-Certificate-4096.crt ++++++
-----BEGIN CERTIFICATE-----
MIIGdDCCBFygAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgTEgMB4GA1UEAwwXb3Bl
blNVU0UgU2VjdXJlIEJvb3QgQ0ExCzAJBgNVBAYTAkRFMRIwEAYDVQQHDAlOdXJl
bWJlcmcxGTAXBgNVBAoMEG9wZW5TVVNFIFByb2plY3QxITAfBgkqhkiG9w0BCQEW
EmJ1aWxkQG9wZW5zdXNlLm9yZzAeFw0xMzAxMjgxNDUzMzBaFw0zNDEyMjQxNDUz
MzBaMIGBMSAwHgYDVQQDDBdvcGVuU1VTRSBTZWN1cmUgQm9vdCBDQTELMAkGA1UE
BhMCREUxEjAQBgNVBAcMCU51cmVtYmVyZzEZMBcGA1UECgwQb3BlblNVU0UgUHJv
amVjdDEhMB8GCSqGSIb3DQEJARYSYnVpbGRAb3BlbnN1c2Uub3JnMIICIjANBgkq
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuqmSgrdlO0B96sOK5mJj1k4OetzmP6l8
YKdy+HdzN/3bS97vfqIIqb0YCgzmJROSLsXv6WQReuAtKbftgla6R/dOvKU/CxCN
z0uCbzuM+gN5Q7pSWifnm81QNDowFpxZlJBFvIP92zh5yWNEGqVzMN0jDjOFxLfh
O1sx6W8YBOYzScWrlTKysH6uK79gWenwvh3nmkx+68PV08azmizG6As4IAPDqtd/
w92iLTzjLVGp32wFDhLuDleojjvJgnOGngKa8oRcLlvfh07wKO0urjt8/3HKxcUf
RmbSyaLdfP8lOt/mFPpfN4kev9wjqdbIhLIZs6iKbu+hR40QfAR46V8vnPoeIYeM
ibsl1mvr0U7O6w7kTQuzW7JmJkCYf7n4HoPBgxTzgjKlsBGY0I+dTvZXozsKuTKx
ir/w6WWcdkIWoXJh00Nb9eWqFQr0exG0hwa1o0ESXjv7aJHwg39B6m8MZVppdpmg
i0G8pOKtHQZ6OR87YeSUHJ400ocIfYMOAybuB/5rHfC58BvCcjaZwHKTkHlyx28i
EXgFyzGMqbWlgmI5RJ8UzaM6rTaieIRSsyGbYrDa89BFMhGmY8xMIeeT8191bLbH
CpX7CMW9npoEqslHL67FMI3LXC5fgYKoPwUnj/TlT0gkjVobEXmXZB6sCDQ6BFTg
4dpPIFEjnxsCAwEAAaOB9DCB8TAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSZ
DSa38E3ZzmTn0Y79aHtKXeKGpTCBrgYDVR0jBIGmMIGjgBSZDSa38E3ZzmTn0Y79
aHtKXeKGpaGBh6SBhDCBgTEgMB4GA1UEAwwXb3BlblNVU0UgU2VjdXJlIEJvb3Qg
Q0ExCzAJBgNVBAYTAkRFMRIwEAYDVQQHDAlOdXJlbWJlcmcxGTAXBgNVBAoMEG9w
ZW5TVVNFIFByb2plY3QxITAfBgkqhkiG9w0BCQEWEmJ1aWxkQG9wZW5zdXNlLm9y
Z4IBATAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAFsmHlxiAGKu
Qyx1qb6l7bEWgXAePQfVaaCEH4Mn+oq80kJ67S7s6We8e5QJOgYznk5mDk+PTUC/
phkP3aJRqZAf5UDrQkOHobpk7FFBxZKjZfULPls3H9+Hichw/XJ2/xJwG+Ja6pgD
dNO2UaKOjZHCiyZ4ehO7syle/EgQALVwKH4cVq6zIh4xUH4r9WvfdR5vkhhTgM/0
nzzoBnFRnCUpcsLPj10246wVuLQcliZBeKjiV4xqrMe6cXX8crHvZqqJPZ2jMTGD
eVIpVES12ZpMT7SbQbcDR1XgjqrL3U9vfcabdqLU60000ALvnDFNN0Sm7xhB+d3c
sDIyJMwSfIb9jWApsB/En5uRCM++ruqjyFiqTCORo9gzaocw6gut6WYs2TOrZ2NO
Tq4JNAFfCL/z0p8jdz1dJZmqpgFAlltKNNDWV6KlBPUAdxDEbIiuGoYweB+Zxed3
BKdlrKGcH0ewPmzt4vVLCl2yFoODxjVtndXieDt/BWIYltMjqYU1qrrOdISHdeAG
A24L/uxiU4Ej2bKKWNYtvrGMNLMUWBTx5afHMQnK9MD8Z6cpjccNaR0Pe9ZCBRGI
xyUitlfnU604q1GfYdymiq4mUvSEgy3vbbsVBvcAKElN+hWpAeZbiWc/KcBWKMtp
4aQ0yoLWDFkQNGU0rGazsu3hpOWta6mL
-----END CERTIFICATE-----
++++++ openSUSE-UEFI-CA-Certificate.crt ++++++
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgTEgMB4GA1UEAwwXb3Bl
blNVU0UgU2VjdXJlIEJvb3QgQ0ExCzAJBgNVBAYTAkRFMRIwEAYDVQQHDAlOdXJl
bWJlcmcxGTAXBgNVBAoMEG9wZW5TVVNFIFByb2plY3QxITAfBgkqhkiG9w0BCQEW
EmJ1aWxkQG9wZW5zdXNlLm9yZzAeFw0xMzA4MjYxNjEyMDdaFw0zNTA3MjIxNjEy
MDdaMIGBMSAwHgYDVQQDDBdvcGVuU1VTRSBTZWN1cmUgQm9vdCBDQTELMAkGA1UE
BhMCREUxEjAQBgNVBAcMCU51cmVtYmVyZzEZMBcGA1UECgwQb3BlblNVU0UgUHJv
amVjdDEhMB8GCSqGSIb3DQEJARYSYnVpbGRAb3BlbnN1c2Uub3JnMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3t9hknqk/oPRfTtoDrGn8E6Sk/xHPnAt
Tojcmp76M7Sm2w4jwQ2owdVlBIQE/zpIGE85MuTKTvkEnp8PzSBdYaunANil/yt/
vuhHwy9bAsi73o4a6UbThu//iJmQ6xCJuIs/PqgHxlV6btNf/IM8PRbtJsUTc5Kx
cB4ilcgAbCV2RvGi2dCwmGgPpy2xDWeJypRK6hLFkVV2f2x6LvkYiZ/49CRD1TVq
ywAOLu1L4l0J2BuXcJmeWm+mgaidqVh2fWlxgtO6OpZDm/DaFcZO6cgVuenLx+Rx
zuoQG2vEKnABqVK0F94AUs995P0PTQMYspAo1G/Erla8NmBJRotrCwIDAQABo4H0
MIHxMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFGhCYA3iLExHfpW+I9/qlRPl
lxdiMIGuBgNVHSMEgaYwgaOAFGhCYA3iLExHfpW+I9/qlRPllxdioYGHpIGEMIGB
MSAwHgYDVQQDDBdvcGVuU1VTRSBTZWN1cmUgQm9vdCBDQTELMAkGA1UEBhMCREUx
EjAQBgNVBAcMCU51cmVtYmVyZzEZMBcGA1UECgwQb3BlblNVU0UgUHJvamVjdDEh
MB8GCSqGSIb3DQEJARYSYnVpbGRAb3BlbnN1c2Uub3JnggEBMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAiqOJwo7Z+YIL8zPO6RkXF6NlgM0zrgZR
Vim2OId79J38KI6q4FMSDjpgxwbYOmF2O3cI9JSkjHxHOpnYhJsXzCBiLuJ25MY2
DSbpLlM1Cvs6NZNFw5OCwQvzCOlXH1k3qdBsafto6n87r9P3WSeO1MeWc/QMCvc+
5K9sjMd6bwl59EEf428R+z5ssaB75JK3yvky9d7DsHN947OCXc3sYdz+DD7Gteds
LV2Sc//tqmqpm2aeXjptcLAxwM7fLyEQaAyH83egMzEKDxX27jKIxZpTcc0NGqEo
idC/9lasSzs2BisBxevl3HKDPZSsKIMT+8FdJ5wT9jJf9h9Ktz5Tig==
-----END CERTIFICATE-----
++++++ shim-bnc863205-mokmanager-fix-hash-delete.patch ++++++
>From 23cdee7b62fc62cd988d74b2180014595da9e4c5 Mon Sep 17 00:00:00 2001
From: Gary Ching-Pang Lin <[email protected]>
Date: Thu, 13 Feb 2014 15:05:45 +0800
Subject: [PATCH 1/2] MokManager: calculate the variable size correctly

MokSize of the hash signature list includes the owner GUID,
so we should not add the 16bytes compensation.

Signed-off-by: Gary Ching-Pang Lin <[email protected]>
---
 MokManager.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Index: shim-0.7/MokManager.c
===================================================================
--- shim-0.7.orig/MokManager.c
+++ shim-0.7/MokManager.c
@@ -940,7 +940,9 @@ static EFI_STATUS write_back_mok_list (M
                if (list[i].Mok == NULL)
                        continue;
 
-               DataSize += sizeof(EFI_SIGNATURE_LIST) + sizeof(EFI_GUID);
+               DataSize += sizeof(EFI_SIGNATURE_LIST);
+               if (CompareGuid(&(list[i].Type), &CertType) == 0)
+                       DataSize += sizeof(EFI_GUID);
                DataSize += list[i].MokSize;
        }
 
@@ -1046,6 +1048,7 @@ static void delete_hash_in_list (UINT8 *
 {
        EFI_GUID HashType = EFI_CERT_SHA256_GUID;
        UINT32 sig_size;
+       UINT32 list_num;
        int i, del_ind;
        void *start, *end;
        UINT32 remain;
@@ -1057,8 +1060,10 @@ static void delete_hash_in_list (UINT8 *
                    (mok[i].MokSize < sig_size))
                        continue;
 
+               list_num = mok[i].MokSize / sig_size;
+
                del_ind = match_hash(hash, hash_size, 0, mok[i].Mok,
-                                    mok[i].MokSize);
+                                    list_num);
                while (del_ind >= 0) {
                        /* Remove the hash */
                        if (sig_size == mok[i].MokSize) {
@@ -1073,9 +1078,10 @@ static void delete_hash_in_list (UINT8 *
 
                        mem_move(start, end, remain);
                        mok[i].MokSize -= sig_size;
+                       list_num--;
 
                        del_ind = match_hash(hash, hash_size, del_ind,
-                                            mok[i].Mok, mok[i].MokSize);
+                                            mok[i].Mok, list_num);
                }
        }
 }
++++++ shim-install ++++++
#! /bin/bash -e

rootdir=
bootdir=
efidir=
install_device=
efibootdir=
ca_string=
removable=no
clean=no
sysconfdir="/etc"
libdir="/usr/lib64"
source_dir="$libdir/efi"
grub_probe="`which grub2-probe`"
grub_mkrelpath="`which grub2-mkrelpath`"
grub_install="`which grub2-install`"
self="`basename $0`"
grub_cfg="/boot/grub2/grub.cfg"
update_boot=no

# Get GRUB_DISTRIBUTOR.
if test -f "${sysconfdir}/default/grub" ; then
    . "${sysconfdir}/default/grub"
fi

bootloader_id="$(echo "$GRUB_DISTRIBUTOR" | tr 'A-Z' 'a-z' | cut -d' ' -f1)"
if test -z "$bootloader_id"; then
    bootloader_id=grub
fi

efi_distributor="$bootloader_id"
bootloader_id="${bootloader_id}-secureboot"

case "$bootloader_id" in
    "sle"*)
        ca_string='SUSE Linux Enterprise Secure Boot CA1';;
    "opensuse"*)
        ca_string='openSUSE Secure Boot CA1';;
    *) ca_string="";;
esac

usage () {
    echo "Usage: $self [OPTION] [INSTALL_DEVICE]"
    echo
    echo "Install Secure Boot Loaders on your drive.\n"
    echo
    echo "--directory=DIR use images from DIR.\n"
    echo "--grub-probe=FILE use FILE as grub-probe.\n"
    echo "--removable the installation device is removable.\n"
    echo "--bootloader-id=ID the ID of bootloader.\n"
    echo "--efi-directory=DIR use DIR as the EFI System Partition root.\n"
    echo "--config-file=FILE use FILE as config file, default is $grub_cfg.\n"
    echo "--clean remove all installed files and configs.\n"
    echo
    echo "INSTALL_DEVICE must be system device filename.\n"
}

argument () {
  opt="$1"
  shift

  if test $# -eq 0; then
      echo "$0: option requires an argument -- \`$opt'" 1>&2
      exit 1
  fi
  echo "$1"
}

# Check the arguments.
while test $# -gt 0
do
    option=$1
    shift

    case "$option" in
    -h | --help)
        usage
        exit 0 ;;

    --root-directory)
        rootdir="`argument $option "$@"`"; shift;;
    --root-directory=*)
        rootdir="`echo "$option" | sed 's/--root-directory=//'`" ;;

    --efi-directory)
        efidir="`argument $option "$@"`"; shift;;
    --efi-directory=*)
        efidir="`echo "$option" | sed 's/--efi-directory=//'`" ;;

    --directory | -d)
        source_dir="`argument $option "$@"`"; shift;;
    --directory=*)
        source_dir="`echo "$option" | sed 's/--directory=//'`" ;;

    --bootloader-id)
        bootloader_id="`argument $option "$@"`"; shift;;
    --bootloader-id=*)
        bootloader_id="`echo "$option" | sed 's/--bootloader-id=//'`" ;;

    --grub-probe)
        grub_probe="`argument "$option" "$@"`"; shift;;
    --grub-probe=*)
        grub_probe="`echo "$option" | sed 's/--grub-probe=//'`" ;;

    --config-file)
        grub_cfg="`argument "$option" "$@"`"; shift;;
    --config-file=*)
        grub_cfg="`echo "$option" | sed 's/--config-file=//'`" ;;

    --removable)
        removable=yes ;;

    --clean)
        clean=yes ;;

    -*)
        echo "Unrecognized option \`$option'"  1>&2
        usage
        exit 1
        ;;
    *)
        if test "x$install_device" != x; then
            echo "More than one install device?" 1>&2
            usage
            exit 1
        fi
        install_device="${option}" ;;
    esac
done

if test -n "$efidir"; then
    efi_fs=`"$grub_probe" --target=fs "${efidir}"`
    if test "x$efi_fs" = xfat; then :; else
        echo "$efidir doesn't look like an EFI partition." 1>&2
        efidir=
    fi
fi


if [ -z "$bootdir" ]; then
    bootdir="/boot"
    if [ -n "$rootdir" ] ; then
        # Initialize bootdir if rootdir was initialized.
        bootdir="${rootdir}/boot"
    fi
fi

# Find the EFI System Partition.
if test -n "$efidir"; then
    install_device="`"$grub_probe" --target=device --device-map= "${efidir}"`"
else
    if test -d "${bootdir}/efi"; then
        install_device="`"$grub_probe" --target=device --device-map= 
"${bootdir}/efi"`"
        # Is it a mount point?
        if test "x$install_device" != "x`"$grub_probe" --target=device 
--device-map= "${bootdir}"`"; then
        efidir="${bootdir}/efi"
        fi
    elif test -d "${bootdir}/EFI"; then
        install_device="`"$grub_probe" --target=device --device-map= 
"${bootdir}/EFI"`"
        # Is it a mount point?
        if test "x$install_device" != "x`"$grub_probe" --target=device 
--device-map= "${bootdir}"`"; then
        efidir="${bootdir}/EFI"
        fi
    elif test -n "$rootdir" && test "x$rootdir" != "x/"; then
    # The EFI System Partition may have been given directly using
    # --root-directory.
        install_device="`"$grub_probe" --target=device --device-map= 
"${rootdir}"`"
    # Is it a mount point?
        if test "x$install_device" != "x`"$grub_probe" --target=device 
--device-map= "${rootdir}/.."`"; then
        efidir="${rootdir}"
        fi
    fi

    if test -n "$efidir"; then
        efi_fs=`"$grub_probe" --target=fs "${efidir}"`
        if test "x$efi_fs" = xfat; then :; else
        echo "$efidir doesn't look like an EFI partition." 1>&2
        efidir=
        fi
    fi
fi

if test -n "$efidir"; then
    efi_file=shim.efi
    efibootdir="$efidir/EFI/boot"
    mkdir -p "$efibootdir" || exit 1
    efidir="$efidir/EFI/$efi_distributor"
    mkdir -p "$efidir" || exit 1
else
    exit 1;
fi

if test -f "$efibootdir/bootx64.efi"; then
    if test -n "$ca_string" && (grep -q "$ca_string" 
"$efibootdir/bootx64.efi"); then
        update_boot=yes
    fi
else
    update_boot=yes
fi

if test "$clean" = "yes"; then
    rm -f "${efidir}/shim.efi"
    rm -f "${efidir}/MokManager.efi"
    rm -f "${efidir}/grub.efi"
    rm -f "${efidir}/grub.cfg"
    rm -f "${efidir}/boot.csv"
    if test "$update_boot" = "yes"; then
        rm -f "${efibootdir}/bootx64.efi"
        rm -f "${efibootdir}/fallback.efi"
    fi
    efibootmgr="`which efibootmgr`"
    if test "$removable" = no && test -n "$bootloader_id" && test -n 
"$efibootmgr"; then
        # Delete old entries from the same distributor.
        for bootnum in `efibootmgr | grep '^Boot[0-9]' | \
            fgrep -i " $bootloader_id" | cut -b5-8`; do
            efibootmgr -b "$bootnum" -B
        done
        fi
        exit 0
fi

cp "${source_dir}/shim.efi" "${efidir}"
cp "${source_dir}/MokManager.efi" "${efidir}"
cp "${source_dir}/grub.efi" "${efidir}"
echo "shim.efi,${bootloader_id}" | iconv -f ascii -t ucs2 > "${efidir}/boot.csv"
if test "$update_boot" = "yes"; then
    cp "${source_dir}/shim.efi" "${efibootdir}/bootx64.efi"
    cp "${source_dir}/fallback.efi" "${efibootdir}"
fi


make_grubcfg () {

grub_cfg_dirname=`dirname $grub_cfg`
grub_cfg_basename=`basename $grub_cfg`
cfg_fs_uuid=`"$grub_probe" --target=fs_uuid "$grub_cfg_dirname"`

if test "x$SUSE_BTRFS_SNAPSHOT_BOOTING" = "xtrue"; then
cat <<EOF
set btrfs_relative_path="yes"
EOF
if ${grub_mkrelpath} --usage | grep -q -e '--relative'; then
  grub_mkrelpath="${grub_mkrelpath} -r"
fi
fi
cat <<EOF
search --fs-uuid --set=root ${cfg_fs_uuid}
set prefix=(\${root})`${grub_mkrelpath} ${grub_cfg_dirname}`
configfile \$prefix/${grub_cfg_basename}
EOF

}

make_grubcfg > "${efidir}/grub.cfg"
# bnc#889765 GRUB shows broken letters at boot
# invoke grub_install to initialize /boot/grub2 directory with files needed by 
grub.cfg
${grub_install} --no-nvram

efibootmgr="`which efibootmgr`"
if test "$removable" = no && test -n "$bootloader_id" && test -n "$efibootmgr"; 
then

    modprobe -q efivars 2>/dev/null || true

    # Delete old entries from the same distributor.
    for bootnum in `efibootmgr | grep '^Boot[0-9]' | \
        fgrep -i " $bootloader_id" | cut -b5-8`; do
        efibootmgr -b "$bootnum" -B
    done

    efidir_drive="$("$grub_probe" --target=drive --device-map= "$efidir")"
    efidir_disk="$("$grub_probe" --target=disk --device-map= "$efidir")"
    if test -z "$efidir_drive" || test -z "$efidir_disk"; then
        echo "Can't find GRUB drive for $efidir; unable to create EFI Boot 
Manager entry." >&2
    else
        efidir_part="$(echo "$efidir_drive" | sed 's/^([^,]*,[^0-9]*//; 
s/[^0-9].*//')"
        efibootmgr -c -d "$efidir_disk" -p "$efidir_part" -w \
        -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file"
    fi
fi

++++++ shim-mokmanager-support-sha-family.patch ++++++
>From f110c89b169505156741ee4ce4b0952e899ed0d8 Mon Sep 17 00:00:00 2001
From: Gary Ching-Pang Lin <[email protected]>
Date: Thu, 3 Apr 2014 18:26:37 +0800
Subject: [PATCH 1/5] MokManager: Support SHA1 hash in MOK

Add SHA1 hash support and amend the code to make it easier to support
other SHA digests.
---
 MokManager.c | 121 ++++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 75 insertions(+), 46 deletions(-)

Index: shim-0.7/MokManager.c
===================================================================
--- shim-0.7.orig/MokManager.c
+++ shim-0.7/MokManager.c
@@ -25,6 +25,9 @@
 #define EFI_VARIABLE_APPEND_WRITE 0x00000040
 
 EFI_GUID SHIM_LOCK_GUID = { 0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 
0xd8, 0x10, 0xdd, 0x8b, 0x23} };
+EFI_GUID EFI_CERT_SHA224_GUID = { 0xb6e5233, 0xa65c, 0x44c9, {0x94, 0x7, 0xd9, 
0xab, 0x83, 0xbf, 0xc8, 0xbd} };
+EFI_GUID EFI_CERT_SHA384_GUID = { 0xff3e5307, 0x9fd0, 0x48c9, {0x85, 0xf1, 
0x8a, 0xd5, 0x6c, 0x70, 0x1e, 0x1} };
+EFI_GUID EFI_CERT_SHA512_GUID = { 0x93e0fae, 0xa6c4, 0x4f50, {0x9f, 0x1b, 
0xd4, 0x1e, 0x2b, 0x89, 0xc1, 0x9a} };
 
 #define CERT_STRING L"Select an X509 certificate to enroll:\n\n"
 #define HASH_STRING L"Select a file to trust:\n\n"
@@ -93,31 +96,84 @@ done:
        return status;
 }
 
+static BOOLEAN is_sha_hash (EFI_GUID Type)
+{
+       EFI_GUID Sha1 = EFI_CERT_SHA1_GUID;
+       EFI_GUID Sha224 = EFI_CERT_SHA224_GUID;
+       EFI_GUID Sha256 = EFI_CERT_SHA256_GUID;
+       EFI_GUID Sha384 = EFI_CERT_SHA384_GUID;
+       EFI_GUID Sha512 = EFI_CERT_SHA512_GUID;
+
+       if (CompareGuid(&Type, &Sha1) == 0)
+               return TRUE;
+       else if (CompareGuid(&Type, &Sha224) == 0)
+               return TRUE;
+       else if (CompareGuid(&Type, &Sha256) == 0)
+               return TRUE;
+       else if (CompareGuid(&Type, &Sha384) == 0)
+               return TRUE;
+       else if (CompareGuid(&Type, &Sha512) == 0)
+               return TRUE;
+
+       return FALSE;
+}
+
+static UINT32 sha_size (EFI_GUID Type)
+{
+       EFI_GUID Sha1 = EFI_CERT_SHA1_GUID;
+       EFI_GUID Sha224 = EFI_CERT_SHA224_GUID;
+       EFI_GUID Sha256 = EFI_CERT_SHA256_GUID;
+       EFI_GUID Sha384 = EFI_CERT_SHA384_GUID;
+       EFI_GUID Sha512 = EFI_CERT_SHA512_GUID;
+
+       if (CompareGuid(&Type, &Sha1) == 0)
+               return SHA1_DIGEST_SIZE;
+       else if (CompareGuid(&Type, &Sha224) == 0)
+               return SHA224_DIGEST_LENGTH;
+       else if (CompareGuid(&Type, &Sha256) == 0)
+               return SHA256_DIGEST_SIZE;
+       else if (CompareGuid(&Type, &Sha384) == 0)
+               return SHA384_DIGEST_LENGTH;
+       else if (CompareGuid(&Type, &Sha512) == 0)
+               return SHA512_DIGEST_LENGTH;
+
+       return 0;
+}
+
+static BOOLEAN is_valid_siglist (EFI_GUID Type, UINT32 SigSize)
+{
+       EFI_GUID CertType = X509_GUID;
+       UINT32 hash_sig_size;
+
+       if (CompareGuid (&Type, &CertType) == 0 && SigSize != 0)
+               return TRUE;
+
+       if (!is_sha_hash (Type))
+               return FALSE;
+
+       hash_sig_size = sha_size (Type) + sizeof(EFI_GUID);
+       if (SigSize != hash_sig_size)
+               return FALSE;
+
+       return TRUE;
+}
+
 static UINT32 count_keys(void *Data, UINTN DataSize)
 {
        EFI_SIGNATURE_LIST *CertList = Data;
-       EFI_GUID CertType = X509_GUID;
-       EFI_GUID HashType = EFI_CERT_SHA256_GUID;
        UINTN dbsize = DataSize;
        UINT32 MokNum = 0;
 
        while ((dbsize > 0) && (dbsize >= CertList->SignatureListSize)) {
-               if ((CompareGuid (&CertList->SignatureType, &CertType) != 0) &&
-                   (CompareGuid (&CertList->SignatureType, &HashType) != 0)) {
-                       console_notify(L"Doesn't look like a key or hash");
-                       dbsize -= CertList->SignatureListSize;
-                       CertList = (EFI_SIGNATURE_LIST *) ((UINT8 *) CertList +
-                                                 CertList->SignatureListSize);
-                       continue;
+               if (CertList->SignatureListSize == 0 ||
+                   CertList->SignatureListSize <= CertList->SignatureSize) {
+                       console_errorbox(L"Corrupted signature list");
+                       return 0;
                }
 
-               if ((CompareGuid (&CertList->SignatureType, &CertType) != 0) &&
-                   (CertList->SignatureSize != 48)) {
-                       console_notify(L"Doesn't look like a valid hash");
-                       dbsize -= CertList->SignatureListSize;
-                       CertList = (EFI_SIGNATURE_LIST *) ((UINT8 *) CertList +
-                                                 CertList->SignatureListSize);
-                       continue;
+               if (!is_valid_siglist(CertList->SignatureType, 
CertList->SignatureSize)) {
+                       console_errorbox(L"Invalid signature list found");
+                       return 0;
                }
 
                MokNum++;
@@ -134,7 +190,6 @@ static MokListNode *build_mok_list(UINT3
        EFI_SIGNATURE_LIST *CertList = Data;
        EFI_SIGNATURE_DATA *Cert;
        EFI_GUID CertType = X509_GUID;
-       EFI_GUID HashType = EFI_CERT_SHA256_GUID;
        UINTN dbsize = DataSize;
        UINTN count = 0;
 
@@ -146,21 +201,8 @@ static MokListNode *build_mok_list(UINT3
        }
 
        while ((dbsize > 0) && (dbsize >= CertList->SignatureListSize)) {
-               if ((CompareGuid (&CertList->SignatureType, &CertType) != 0) &&
-                   (CompareGuid (&CertList->SignatureType, &HashType) != 0)) {
-                       dbsize -= CertList->SignatureListSize;
-                       CertList = (EFI_SIGNATURE_LIST *)((UINT8 *) CertList +
-                                                 CertList->SignatureListSize);
-                       continue;
-               }
-
-               if ((CompareGuid (&CertList->SignatureType, &HashType) == 0) &&
-                   (CertList->SignatureSize != 48)) {
-                       dbsize -= CertList->SignatureListSize;
-                       CertList = (EFI_SIGNATURE_LIST *)((UINT8 *) CertList +
-                                                 CertList->SignatureListSize);
-                       continue;
-               }
+               /* Omit the signature check here since we already did it
+                  in count_keys() */
 
                Cert = (EFI_SIGNATURE_DATA *) (((UINT8 *) CertList) +
                  sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);
@@ -380,22 +422,46 @@ static void show_x509_info (X509 *X509Ce
        FreePool(text);
 }
 
-static void show_sha256_digest (UINT8 *hash)
+static void show_sha_digest (EFI_GUID Type, UINT8 *hash)
 {
+       EFI_GUID Sha1 = EFI_CERT_SHA1_GUID;
+       EFI_GUID Sha224 = EFI_CERT_SHA224_GUID;
+       EFI_GUID Sha256 = EFI_CERT_SHA256_GUID;
+       EFI_GUID Sha384 = EFI_CERT_SHA384_GUID;
+       EFI_GUID Sha512 = EFI_CERT_SHA512_GUID;
        CHAR16 *text[5];
        POOL_PRINT hash_string1;
        POOL_PRINT hash_string2;
        int i;
+       int length;
+
+       if (CompareGuid(&Type, &Sha1) == 0) {
+               length = SHA1_DIGEST_SIZE;
+               text[0] = L"SHA1 hash";
+       } else if (CompareGuid(&Type, &Sha224) == 0) {
+               length = SHA224_DIGEST_LENGTH;
+               text[0] = L"SHA224 hash";
+       } else if (CompareGuid(&Type, &Sha256) == 0) {
+               length = SHA256_DIGEST_SIZE;
+               text[0] = L"SHA256 hash";
+       } else if (CompareGuid(&Type, &Sha384) == 0) {
+               length = SHA384_DIGEST_LENGTH;
+               text[0] = L"SHA384 hash";
+       } else if (CompareGuid(&Type, &Sha512) == 0) {
+               length = SHA512_DIGEST_LENGTH;
+               text[0] = L"SHA512 hash";
+       } else {
+               return;
+       }
 
        ZeroMem(&hash_string1, sizeof(hash_string1));
        ZeroMem(&hash_string2, sizeof(hash_string2));
 
-       text[0] = L"SHA256 hash";
        text[1] = L"";
 
-       for (i=0; i<16; i++)
+       for (i=0; i<length/2; i++)
                CatPrint(&hash_string1, L"%02x ", hash[i]);
-       for (i=16; i<32; i++)
+       for (i=length/2; i<length; i++)
                CatPrint(&hash_string2, L"%02x ", hash[i]);
 
        text[2] = hash_string1.str;
@@ -411,7 +477,7 @@ static void show_sha256_digest (UINT8 *h
                FreePool(hash_string2.str);
 }
 
-static void show_efi_hash (void *Mok, UINTN MokSize)
+static void show_efi_hash (EFI_GUID Type, void *Mok, UINTN MokSize)
 {
        UINTN sig_size;
        UINTN hash_num;
@@ -420,7 +486,7 @@ static void show_efi_hash (void *Mok, UI
        int key_num = 0;
        int i;
 
-       sig_size = SHA256_DIGEST_SIZE + sizeof(EFI_GUID);
+       sig_size = sha_size(Type) + sizeof(EFI_GUID);
        if ((MokSize % sig_size) != 0) {
                console_errorbox(L"Corrupted Hash List");
                return;
@@ -429,7 +495,7 @@ static void show_efi_hash (void *Mok, UI
 
        if (hash_num == 1) {
                hash = (UINT8 *)Mok + sizeof(EFI_GUID);
-               show_sha256_digest(hash);
+               show_sha_digest(Type, hash);
                return;
        }
 
@@ -452,7 +518,7 @@ static void show_efi_hash (void *Mok, UI
                        break;
 
                hash = (UINT8 *)Mok + sig_size*key_num + sizeof(EFI_GUID);
-               show_sha256_digest(hash);
+               show_sha_digest(Type, hash);
        }
 
        for (i=0; menu_strings[i] != NULL; i++)
@@ -467,7 +533,6 @@ static void show_mok_info (EFI_GUID Type
        UINT8 hash[SHA1_DIGEST_SIZE];
        X509 *X509Cert;
        EFI_GUID CertType = X509_GUID;
-       EFI_GUID HashType = EFI_CERT_SHA256_GUID;
 
        if (!Mok || MokSize == 0)
                return;
@@ -488,8 +553,8 @@ static void show_mok_info (EFI_GUID Type
                        console_notify(L"Not a valid X509 certificate");
                        return;
                }
-       } else if (CompareGuid (&Type, &HashType) == 0) {
-               show_efi_hash(Mok, MokSize);
+       } else if (is_sha_hash(Type)) {
+               show_efi_hash(Type, Mok, MokSize);
        }
 }
 
@@ -504,15 +569,18 @@ static EFI_STATUS list_keys (void *KeyLi
        if (KeyListSize < (sizeof(EFI_SIGNATURE_LIST) +
                           sizeof(EFI_SIGNATURE_DATA))) {
                console_notify(L"No MOK keys found");
-               return 0;
+               return EFI_NOT_FOUND;
        }
 
        MokNum = count_keys(KeyList, KeyListSize);
+       if (MokNum == 0) {
+               console_errorbox(L"Invalid key list");
+               return EFI_ABORTED;
+       }
        keys = build_mok_list(MokNum, KeyList, KeyListSize);
-
        if (!keys) {
-               console_notify(L"Failed to construct key list");
-               return 0;
+               console_errorbox(L"Failed to construct key list");
+               return EFI_ABORTED;
        }
 
        menu_strings = AllocateZeroPool(sizeof(CHAR16 *) * (MokNum + 2));
@@ -837,7 +905,7 @@ static EFI_STATUS store_keys (void *MokN
        return EFI_SUCCESS;
 }
 
-static UINTN mok_enrollment_prompt (void *MokNew, UINTN MokNewSize, int auth,
+static INTN mok_enrollment_prompt (void *MokNew, UINTN MokNewSize, int auth,
                                    BOOLEAN MokX)
 {
        EFI_GUID shim_lock_guid = SHIM_LOCK_GUID;
@@ -974,7 +1042,7 @@ static EFI_STATUS write_back_mok_list (M
                } else {
                        CertList->SignatureListSize = list[i].MokSize +
                                                      
sizeof(EFI_SIGNATURE_LIST);
-                       CertList->SignatureSize = SHA256_DIGEST_SIZE + 
sizeof(EFI_GUID);
+                       CertList->SignatureSize = sha_size(list[i].Type) + 
sizeof(EFI_GUID);
 
                        CopyMem(CertData, list[i].Mok, list[i].MokSize);
                }
@@ -1043,10 +1111,9 @@ static void mem_move (void *dest, void *
                d[i] = s[i];
 }
 
-static void delete_hash_in_list (UINT8 *hash, UINT32 hash_size,
+static void delete_hash_in_list (EFI_GUID Type, UINT8 *hash, UINT32 hash_size,
                                 MokListNode *mok, INTN mok_num)
 {
-       EFI_GUID HashType = EFI_CERT_SHA256_GUID;
        UINT32 sig_size;
        UINT32 list_num;
        int i, del_ind;
@@ -1056,7 +1123,7 @@ static void delete_hash_in_list (UINT8 *
        sig_size = hash_size + sizeof(EFI_GUID);
 
        for (i = 0; i < mok_num; i++) {
-               if ((CompareGuid(&(mok[i].Type), &HashType) != 0) ||
+               if ((CompareGuid(&(mok[i].Type), &Type) != 0) ||
                    (mok[i].MokSize < sig_size))
                        continue;
 
@@ -1086,7 +1153,7 @@ static void delete_hash_in_list (UINT8 *
        }
 }
 
-static void delete_hash_list (void *hash_list, UINT32 list_size,
+static void delete_hash_list (EFI_GUID Type, void *hash_list, UINT32 list_size,
                              MokListNode *mok, INTN mok_num)
 {
        UINT32 hash_size;
@@ -1095,7 +1162,7 @@ static void delete_hash_list (void *hash
        UINT8 *hash;
        int i;
 
-       hash_size = SHA256_DIGEST_SIZE;
+       hash_size = sha_size (Type);
        sig_size = hash_size + sizeof(EFI_GUID);
        if (list_size < sig_size)
                return;
@@ -1105,7 +1172,7 @@ static void delete_hash_list (void *hash
        hash = hash_list + sizeof(EFI_GUID);
 
        for (i = 0; i < hash_num; i++) {
-               delete_hash_in_list (hash, hash_size, mok, mok_num);
+               delete_hash_in_list (Type, hash, hash_size, mok, mok_num);
                hash += sig_size;
        }
 }
@@ -1114,7 +1181,6 @@ static EFI_STATUS delete_keys (void *Mok
 {
        EFI_GUID shim_lock_guid = SHIM_LOCK_GUID;
        EFI_GUID CertType = X509_GUID;
-       EFI_GUID HashType = EFI_CERT_SHA256_GUID;
        EFI_STATUS efi_status;
        CHAR16 *db_name;
        CHAR16 *auth_name;
@@ -1161,7 +1227,13 @@ static EFI_STATUS delete_keys (void *Mok
 
        efi_status = get_variable_attr (db_name, &MokListData, &MokListDataSize,
                                        shim_lock_guid, &attributes);
-       if (attributes & EFI_VARIABLE_RUNTIME_ACCESS) {
+       if (efi_status != EFI_SUCCESS) {
+               if (MokX)
+                       console_errorbox(L"Failed to retrieve MokListX");
+               else
+                       console_errorbox(L"Failed to retrieve MokList");
+               return EFI_ABORTED;
+       } else if (attributes & EFI_VARIABLE_RUNTIME_ACCESS) {
                if (MokX) {
                        err_str1 = L"MokListX is compromised!";
                        err_str2 = L"Erase all keys in MokListX!";
@@ -1170,7 +1242,11 @@ static EFI_STATUS delete_keys (void *Mok
                        err_str2 = L"Erase all keys in MokList!";
                }
                console_alertbox((CHAR16 *[]){err_str1, err_str2, NULL});
-               LibDeleteVariable(db_name, &shim_lock_guid);
+               uefi_call_wrapper(RT->SetVariable, 5, db_name,
+                                 &shim_lock_guid,
+                                 EFI_VARIABLE_NON_VOLATILE |
+                                 EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                                 0, NULL);
                return EFI_ACCESS_DENIED;
        }
 
@@ -1180,23 +1256,56 @@ static EFI_STATUS delete_keys (void *Mok
 
        /* Construct lists */
        mok_num = count_keys(MokListData, MokListDataSize);
+       if (mok_num == 0) {
+               if (MokX) {
+                       err_str1 = L"Failed to construct the key list of 
MokListX";
+                       err_str2 = L"Reset MokListX!";
+               } else {
+                       err_str1 = L"Failed to construct the key list of 
MokList";
+                       err_str2 = L"Reset MokList!";
+               }
+               console_alertbox((CHAR16 *[]){err_str1, err_str2, NULL});
+               uefi_call_wrapper(RT->SetVariable, 5, db_name,
+                                 &shim_lock_guid,
+                                 EFI_VARIABLE_NON_VOLATILE |
+                                 EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                                 0, NULL);
+               efi_status = EFI_ABORTED;
+               goto error;
+       }
        mok = build_mok_list(mok_num, MokListData, MokListDataSize);
+       if (!mok) {
+               console_errorbox(L"Failed to construct key list");
+               efi_status = EFI_ABORTED;
+               goto error;
+       }
        del_num = count_keys(MokDel, MokDelSize);
+       if (del_num == 0) {
+               console_errorbox(L"Invalid key delete list");
+               efi_status = EFI_ABORTED;
+               goto error;
+       }
        del_key = build_mok_list(del_num, MokDel, MokDelSize);
+       if (!del_key) {
+               console_errorbox(L"Failed to construct key list");
+               efi_status = EFI_ABORTED;
+               goto error;
+       }
 
        /* Search and destroy */
        for (i = 0; i < del_num; i++) {
                if (CompareGuid(&(del_key[i].Type), &CertType) == 0) {
                        delete_cert(del_key[i].Mok, del_key[i].MokSize,
                                    mok, mok_num);
-               } else if (CompareGuid(&(del_key[i].Type), &HashType) == 0) {
-                       delete_hash_list(del_key[i].Mok, del_key[i].MokSize,
-                                        mok, mok_num);
+               } else if (is_sha_hash(del_key[i].Type)) {
+                       delete_hash_list(del_key[i].Type, del_key[i].Mok,
+                                        del_key[i].MokSize, mok, mok_num);
                }
        }
 
        efi_status = write_back_mok_list(mok, mok_num, MokX);
 
+error:
        if (MokListData)
                FreePool(MokListData);
        if (mok)
++++++ shim-mokx-support.patch ++++++
++++ 850 lines (skipped)

++++++ shim-only-os-name.patch ++++++
Index: shim-0.7/Makefile
===================================================================
--- shim-0.7.orig/Makefile
+++ shim-0.7/Makefile
@@ -67,7 +67,7 @@ shim_cert.h: shim.cer
 
 version.c : version.c.in
        sed     -e "s,@@VERSION@@,$(VERSION)," \
-               -e "s,@@UNAME@@,$(shell uname -a)," \
+               -e "s,@@UNAME@@,$(shell uname -o)," \
                -e "s,@@COMMIT@@,$(shell if [ -d .git ] ; then git log -1 
--pretty=format:%H ; elif [ -f commit ]; then cat commit ; else echo commit id 
not available; fi)," \
                < version.c.in > version.c
 
++++++ shim-opensuse-cert-prompt.patch ++++++
>From b13d18d4069032ccf6c885774e9eada6a1d80ddd Mon Sep 17 00:00:00 2001
From: Gary Ching-Pang Lin <[email protected]>
Date: Tue, 18 Feb 2014 17:29:19 +0800
Subject: [PATCH 1/3] Show the build-in certificate prompt

This is an openSUSE-only patch.

Pop up a window to ask if the user is willing to trust the built-in
openSUSE certificate.

If yes, set openSUSE_Verify, a BootService variable, to 1, and shim
won't bother the user afterward.

If no, continue the booting process without using the built-in
certificate to verify the EFI images, and the window will show up
again after reboot.

The state will store in use_openSUSE_cert, a volatile RT variable.
---
 shim.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 97 insertions(+), 19 deletions(-)

Index: shim-0.7/shim.c
===================================================================
--- shim-0.7.orig/shim.c
+++ shim-0.7/shim.c
@@ -90,6 +90,7 @@ UINT8 *vendor_dbx;
  */
 verification_method_t verification_method;
 int loader_is_participating;
+BOOLEAN use_builtin_cert;
 
 #define EFI_IMAGE_SECURITY_DATABASE_GUID { 0xd719b2cb, 0x3d3a, 0x4596, { 0xa3, 
0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f }}
 
@@ -817,7 +818,7 @@ static EFI_STATUS verify_buffer (char *d
        if (status == EFI_SUCCESS)
                return status;
 
-       if (cert) {
+       if (cert && use_builtin_cert) {
                /*
                 * Check against the shim build key
                 */
@@ -1523,11 +1524,14 @@ EFI_STATUS mirror_mok_list()
        if (efi_status != EFI_SUCCESS)
                DataSize = 0;
 
-       FullDataSize = DataSize
-                    + sizeof (*CertList)
-                    + sizeof (EFI_GUID)
-                    + vendor_cert_size
-                    ;
+       FullDataSize = DataSize;
+       if (use_builtin_cert) {
+               FullDataSize += sizeof (*CertList) +
+                               sizeof (EFI_GUID) +
+                               vendor_cert_size;
+       } else if (DataSize == 0) {
+               return EFI_SUCCESS;
+       }
        FullData = AllocatePool(FullDataSize);
        if (!FullData) {
                perror(L"Failed to allocate space for MokListRT\n");
@@ -1539,21 +1543,24 @@ EFI_STATUS mirror_mok_list()
                CopyMem(p, Data, DataSize);
                p += DataSize;
        }
-       CertList = (EFI_SIGNATURE_LIST *)p;
-       p += sizeof (*CertList);
-       CertData = (EFI_SIGNATURE_DATA *)p;
-       p += sizeof (EFI_GUID);
-
-       CertList->SignatureType = EFI_CERT_X509_GUID;
-       CertList->SignatureListSize = vendor_cert_size
-                                     + sizeof (*CertList)
-                                     + sizeof (*CertData)
-                                     -1;
-       CertList->SignatureHeaderSize = 0;
-       CertList->SignatureSize = vendor_cert_size + sizeof (EFI_GUID);
 
-       CertData->SignatureOwner = SHIM_LOCK_GUID;
-       CopyMem(p, vendor_cert, vendor_cert_size);
+       if (use_builtin_cert) {
+               CertList = (EFI_SIGNATURE_LIST *)p;
+               p += sizeof (*CertList);
+               CertData = (EFI_SIGNATURE_DATA *)p;
+               p += sizeof (EFI_GUID);
+
+               CertList->SignatureType = EFI_CERT_X509_GUID;
+               CertList->SignatureListSize = vendor_cert_size
+                                             + sizeof (*CertList)
+                                             + sizeof (*CertData)
+                                             -1;
+               CertList->SignatureHeaderSize = 0;
+               CertList->SignatureSize = vendor_cert_size + sizeof (EFI_GUID);
+
+               CertData->SignatureOwner = SHIM_LOCK_GUID;
+               CopyMem(p, vendor_cert, vendor_cert_size);
+       }
 
        efi_status = uefi_call_wrapper(RT->SetVariable, 5, L"MokListRT",
                                       &shim_lock_guid,
@@ -1600,7 +1607,7 @@ EFI_STATUS check_mok_request(EFI_HANDLE
            check_var(L"MokPW") || check_var(L"MokAuth") ||
            check_var(L"MokDel") || check_var(L"MokDB") ||
            check_var(L"MokXNew") || check_var(L"MokXDel") ||
-           check_var(L"MokXAuth")) {
+           check_var(L"MokXAuth") || check_var(L"ClearVerify")) {
                efi_status = start_image(image_handle, MOK_MANAGER);
 
                if (efi_status != EFI_SUCCESS) {
@@ -1840,6 +1847,75 @@ uninstall_shim_protocols(void)
                          &shim_lock_guid, &shim_lock_interface);
 }
 
+#define VENDOR_VERIFY L"openSUSE_Verify"
+
+/* Show the built-in certificate prompt if necessary */
+static int builtin_cert_prompt(void)
+{
+       EFI_GUID shim_lock_guid = SHIM_LOCK_GUID;
+       EFI_STATUS status;
+       UINT32 attributes;
+       UINTN len = sizeof(UINT8);
+       UINT8 data;
+
+       use_builtin_cert = FALSE;
+
+       if (vendor_cert_size == 0)
+               return 0;
+
+       status = uefi_call_wrapper(RT->GetVariable, 5, VENDOR_VERIFY,
+                                  &shim_lock_guid, &attributes,
+                                  &len, &data);
+       if (status != EFI_SUCCESS ||
+           (attributes & EFI_VARIABLE_RUNTIME_ACCESS)) {
+               int choice;
+
+               if (status != EFI_NOT_FOUND)
+                       LibDeleteVariable(VENDOR_VERIFY, &shim_lock_guid);
+
+               CHAR16 *str[] = {L"Trust openSUSE Certificate",
+                                L"",
+                                L"Do you agree to use the built-in openSUSE 
certificate",
+                                L"to verify boot loaders and kernels?",
+                                NULL};
+               choice = console_yes_no(str);
+               if (choice != 1) {
+                       data = 0;
+                       goto done;
+               }
+
+               data = 1;
+               status = uefi_call_wrapper(RT->SetVariable, 5,
+                                          VENDOR_VERIFY,
+                                          &shim_lock_guid,
+                                          EFI_VARIABLE_NON_VOLATILE |
+                                          EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                                          sizeof(UINT8), &data);
+               if (status != EFI_SUCCESS) {
+                       console_error(L"Failed to set openSUSE_Verify", status);
+                       return -1;
+               }
+       }
+
+       use_builtin_cert = TRUE;
+       data = 1;
+
+done:
+       /* Setup a runtime variable to show the current state */
+       status = uefi_call_wrapper(RT->SetVariable, 5,
+                                  L"use_openSUSE_cert",
+                                  &shim_lock_guid,
+                                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
+                                  EFI_VARIABLE_RUNTIME_ACCESS,
+                                  sizeof(UINT8), &data);
+       if (status != EFI_SUCCESS) {
+               console_error(L"Failed to set use_openSUSE_cert", status);
+               return -1;
+       }
+
+       return 0;
+}
+
 EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *passed_systab)
 {
        EFI_STATUS efi_status;
@@ -1895,6 +1971,8 @@ EFI_STATUS efi_main (EFI_HANDLE image_ha
                         */
                        hook_system_services(systab);
                        loader_is_participating = 0;
+                       if (builtin_cert_prompt() != 0)
+                               return EFI_ABORTED;
                }
        }
 
Index: shim-0.7/MokManager.c
===================================================================
--- shim-0.7.orig/MokManager.c
+++ shim-0.7/MokManager.c
@@ -1701,6 +1701,36 @@ static INTN mok_pw_prompt (void *MokPW,
        return -1;
 }
 
+static INTN mok_clear_verify_prompt(void *ClearVerify, UINTN ClearVerifySize) {
+       EFI_GUID shim_lock_guid = SHIM_LOCK_GUID;
+       EFI_STATUS status;
+
+        if (console_yes_no((CHAR16 *[]){L"Do you want to revoke openSUSE 
certificate?", NULL}) != 1)
+                return 0;
+
+       if (ClearVerifySize == PASSWORD_CRYPT_SIZE) {
+               status = match_password((PASSWORD_CRYPT *)ClearVerify, NULL, 0,
+                                        NULL, NULL);
+       }
+       if (status != EFI_SUCCESS)
+               return -1;
+
+       status = uefi_call_wrapper(RT->SetVariable, 5,
+                                  L"openSUSE_Verify", &shim_lock_guid,
+                                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
EFI_VARIABLE_NON_VOLATILE,
+                                  0, NULL);
+       if (status != EFI_SUCCESS) {
+               console_error(L"Failed to delete openSUSE_Verify", status);
+               return -1;
+       }
+
+       console_notify(L"The system must now be rebooted");
+       uefi_call_wrapper(RT->ResetSystem, 4, EfiResetWarm,
+                         EFI_SUCCESS, 0, NULL);
+       console_notify(L"Failed to reboot");
+       return -1;
+}
+
 static BOOLEAN verify_certificate(UINT8 *cert, UINTN size)
 {
        X509 *X509Cert;
@@ -2053,6 +2083,7 @@ typedef enum {
        MOK_CHANGE_SB,
        MOK_SET_PW,
        MOK_CHANGE_DB,
+       MOK_CLEAR_VERIFY,
        MOK_KEY_ENROLL,
        MOK_HASH_ENROLL
 } mok_menu_item;
@@ -2064,7 +2095,8 @@ static EFI_STATUS enter_mok_menu(EFI_HAN
                                 void *MokPW, UINTN MokPWSize,
                                 void *MokDB, UINTN MokDBSize,
                                 void *MokXNew, UINTN MokXNewSize,
-                                void *MokXDel, UINTN MokXDelSize)
+                                void *MokXDel, UINTN MokXDelSize,
+                                void *ClearVerify, UINTN ClearVerifySize)
 {
        CHAR16 **menu_strings;
        mok_menu_item *menu_item;
@@ -2138,6 +2170,9 @@ static EFI_STATUS enter_mok_menu(EFI_HAN
        if (MokDB)
                menucount++;
 
+       if (ClearVerify)
+               menucount++;
+
        menu_strings = AllocateZeroPool(sizeof(CHAR16 *) * (menucount + 1));
 
        if (!menu_strings)
@@ -2207,6 +2242,12 @@ static EFI_STATUS enter_mok_menu(EFI_HAN
                i++;
        }
 
+       if (ClearVerify) {
+               menu_strings[i] = L"Revoke openSUSE certificate";
+               menu_item[i] = MOK_CLEAR_VERIFY;
+               i++;
+       }
+
        menu_strings[i] = L"Enroll key from disk";
        menu_item[i] = MOK_KEY_ENROLL;
        i++;
@@ -2257,6 +2298,9 @@ static EFI_STATUS enter_mok_menu(EFI_HAN
                case MOK_CHANGE_DB:
                        mok_db_prompt(MokDB, MokDBSize);
                        break;
+               case MOK_CLEAR_VERIFY:
+                       mok_clear_verify_prompt(ClearVerify, ClearVerifySize);
+                       break;
                case MOK_KEY_ENROLL:
                        mok_key_enroll();
                        break;
@@ -2282,6 +2326,7 @@ static EFI_STATUS check_mok_request(EFI_
        EFI_GUID shim_lock_guid = SHIM_LOCK_GUID;
        UINTN MokNewSize = 0, MokDelSize = 0, MokSBSize = 0, MokPWSize = 0;
        UINTN MokDBSize = 0, MokXNewSize = 0, MokXDelSize = 0;
+       UINTN ClearVerifySize = 0;
        void *MokNew = NULL;
        void *MokDel = NULL;
        void *MokSB = NULL;
@@ -2289,6 +2334,7 @@ static EFI_STATUS check_mok_request(EFI_
        void *MokDB = NULL;
        void *MokXNew = NULL;
        void *MokXDel = NULL;
+       void *ClearVerify = NULL;
        EFI_STATUS status;
 
        status = get_variable(L"MokNew", (UINT8 **)&MokNew, &MokNewSize,
@@ -2361,9 +2407,20 @@ static EFI_STATUS check_mok_request(EFI_
                console_error(L"Could not retrieve MokXDel", status);
        }
 
+       status = get_variable(L"ClearVerify", (UINT8 **)&ClearVerify, 
&ClearVerifySize,
+                               shim_lock_guid);
+       if (status == EFI_SUCCESS) {
+               if (LibDeleteVariable(L"ClearVerify", &shim_lock_guid) != 
EFI_SUCCESS) {
+                       console_notify(L"Failed to delete ClearVerify");
+               }
+       } else if (EFI_ERROR(status) && status != EFI_NOT_FOUND) {
+               console_error(L"Could not retrieve ClearVerify", status);
+       }
+
        enter_mok_menu(image_handle, MokNew, MokNewSize, MokDel, MokDelSize,
                       MokSB, MokSBSize, MokPW, MokPWSize, MokDB, MokDBSize,
-                      MokXNew, MokXNewSize, MokXDel, MokXDelSize);
+                      MokXNew, MokXNewSize, MokXDel, MokXDelSize,
+                      ClearVerify, ClearVerifySize);
 
        if (MokNew)
                FreePool (MokNew);
@@ -2386,6 +2443,9 @@ static EFI_STATUS check_mok_request(EFI_
        if (MokXDel)
                FreePool (MokXDel);
 
+       if (ClearVerify)
+               FreePool (ClearVerify);
+
        LibDeleteVariable(L"MokAuth", &shim_lock_guid);
        LibDeleteVariable(L"MokDelAuth", &shim_lock_guid);
        LibDeleteVariable(L"MokXAuth", &shim_lock_guid);
++++++ shim-signed-unsigned-compares.patch ++++++
Index: shim-0.7/MokManager.c
===================================================================
--- shim-0.7.orig/MokManager.c
+++ shim-0.7/MokManager.c
@@ -483,8 +483,8 @@ static void show_efi_hash (EFI_GUID Type
        UINTN hash_num;
        UINT8 *hash;
        CHAR16 **menu_strings;
-       int key_num = 0;
-       int i;
+       UINTN key_num = 0;
+       UINTN i;
 
        sig_size = sha_size(Type) + sizeof(EFI_GUID);
        if ((MokSize % sig_size) != 0) {
@@ -562,7 +562,7 @@ static EFI_STATUS list_keys (void *KeyLi
 {
        UINT32 MokNum = 0;
        MokListNode *keys = NULL;
-       int key_num = 0;
+       UINT32 key_num = 0;
        CHAR16 **menu_strings;
        unsigned int i;
 
@@ -1088,7 +1088,7 @@ static int match_hash (UINT8 *hash, UINT
                       void *hash_list, UINT32 list_num)
 {
        UINT8 *ptr;
-       int i;
+       UINTN i;
 
        ptr = hash_list + sizeof(EFI_GUID);
        for (i = start; i < list_num; i++) {
@@ -1103,7 +1103,7 @@ static int match_hash (UINT8 *hash, UINT
 static void mem_move (void *dest, void *src, UINTN size)
 {
        UINT8 *d, *s;
-       int i;
+       UINTN i;
 
        d = (UINT8 *)dest;
        s = (UINT8 *)src;
@@ -1160,7 +1160,7 @@ static void delete_hash_list (EFI_GUID T
        UINT32 hash_num;
        UINT32 sig_size;
        UINT8 *hash;
-       int i;
+       UINT32 i;
 
        hash_size = sha_size (Type);
        sig_size = hash_size + sizeof(EFI_GUID);
++++++ shim-update-openssl-0.9.8zb.patch ++++++
++++ 4231 lines (skipped)

++++++ show_hash.sh ++++++
#!/bin/bash
# show hash of PE binary
set -e

infile="$1"

if [ -z "$infile" -o ! -e "$infile" ]; then
        echo "USAGE: $0 file.efi"
        exit 1
fi

pesign -h -P -i "$infile"
++++++ show_signatures.sh ++++++
#!/bin/bash
# show signatures on a PE binary
set -e

infile="$1"

if [ -z "$infile" -o ! -e "$infile" ]; then
        echo "USAGE: $0 file.efi"
        exit 1
fi

pesign -S -i "$infile"
++++++ signature-opensuse.asc ++++++
hash: 9783b5ee4492e9e891c655f1f48035959dad453c0e623af0fe7bf2c0a57885e3
# 2014-10-06 11:05:13
timestamp: 54327769
checksum: 3b
-----BEGIN AUTHENTICODE SIGNATURE-----
MIIh2QYJKoZIhvcNAQcCoIIhyjCCIcYCAQExDzANBglghkgBZQMEAgEFADBcBgor
BgEEAYI3AgEEoE4wTDAXBgorBgEEAYI3AgEPMAkDAQCgBKICgAAwMTANBglghkgB
ZQMEAgEFAAQgl4O17kSS6eiRxlXx9IA1lZ2tRTwOYjrw/nvywKV4heOgggs8MIIF
JDCCBAygAwIBAgITMwAAABCkkSlD2UzmLgABAAAAEDANBgkqhkiG9w0BAQsFADCB
gTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMi
TWljcm9zb2Z0IENvcnBvcmF0aW9uIFVFRkkgQ0EgMjAxMTAeFw0xNDEwMDExODAy
MTBaFw0xNjAxMDExODAyMTBaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
cnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMTAwLgYDVQQDEydNaWNyb3NvZnQgV2lu
ZG93cyBVRUZJIERyaXZlciBQdWJsaXNoZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQCrOWu2NBXiasW7Oi7/N6NEe27jZ/9cYueb9aHYznf0HmI9yzsW
VL2bdi//3yyrb1JgYYMHKovB4jQA+EKiAhfaDHsf8i6piqXTnkrma3IjbvWzYo90
uoHJj9wRss0seA9dEwJRvTPctJPjuGmSNNkBSJkes+ZtFjvFLi8/kEEWcDIy1pxC
2rxvwRut5jfFN1XSdG75/Ho+DKcrac1iSd4qxHfhLqBBGya68Ar75BEeBQakPhv9
HL9SOvhxOrgv4TDAQEaeFssfl9Fb3G4LC5+YEfjFSNrK05f7DXJi0kxr+TTx/1Iq
eRmp28gYjvN6ln1LU6K1trMciLpTu8Wu40lrAgMBAAGjggF9MIIBeTAfBgNVHSUE
GDAWBggrBgEFBQcDAwYKKwYBBAGCN1ACATAdBgNVHQ4EFgQUgU9+kB/S6oPylTrh
rnCRk7+dXZQwUQYDVR0RBEowSKRGMEQxDTALBgNVBAsTBE1PUFIxMzAxBgNVBAUT
KjMxNjE5Kzk1Mzg3ZDM3LThhZjktNDBjNC04ZWQ5LWI2MTNkNjljNjgwMDAfBgNV
HSMEGDAWgBQTrb9DCb2CcJyM1U8xbtUimIob1DBTBgNVHR8ETDBKMEigRqBEhkJo
dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb3JVRUZDQTIw
MTFfMjAxMS0wNi0yNy5jcmwwYAYIKwYBBQUHAQEEVDBSMFAGCCsGAQUFBzAChkRo
dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvclVFRkNB
MjAxMV8yMDExLTA2LTI3LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUA
A4IBAQArGwiyBnS4rLrVJIdaQvC01Lpt9CS5rbHoPJMJ5lf+SZ84bN+TpPcTk6tX
2l7uTjRuvM35p+mQtEp2Qzr0Bx6Q7g4PyHRAA/mv5r3aHL0TL++CNdOckyu5lg9S
u+ogYu13OlK+7yazM/YD2OmgqWUsIioBPLG9RLtdyWwaQTUoTJF4Tw1motfZfFni
b9GdZF5zC2VtVueoFm8iinUadFxEkfGGXI1aSxv2H9SlZIEeMmmd7/A6MyiCnNiI
rlP8ywgZlX7kmaKtedHB1z73MkVivuhldRk5g7QfZsEsletdFx31xL7aeZxPsxTo
4nvEexleHIos0tO/uynIJk6935XaMIIGEDCCA/igAwIBAgIKYQjTxAAAAAAABDAN
BgkqhkiG9w0BAQsFADCBkTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
dGlvbjE7MDkGA1UEAxMyTWljcm9zb2Z0IENvcnBvcmF0aW9uIFRoaXJkIFBhcnR5
IE1hcmtldHBsYWNlIFJvb3QwHhcNMTEwNjI3MjEyMjQ1WhcNMjYwNjI3MjEzMjQ1
WjCBgTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UE
AxMiTWljcm9zb2Z0IENvcnBvcmF0aW9uIFVFRkkgQ0EgMjAxMTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKUIbEzHRQlqSwykwId/BnUMQwFUZOAWfwft
kn0LsnO/DArGSkVhoMUWLZbT9Sug+01Jm0GAkDy5VP3mvNGdxKQYin9BilxZg2gy
u4xHye5xvCFPmop8/0Q/jY8ysiZIrnW17slMHkoZfuSCmh14d00MsL32D9MW07z6
K6VROF31+7rbeALb/+wKG5bVg7gZE+m2wHtAe+EfKCfJ+u9WXhzmfpR+wPBEsnk5
5dqyYotNvzhw4mgkFMkzpAg31VhpXtN87cEEUwjnTrAqh2MIYW9jFVnqsit51wxh
Z4pb/V6th3+6hmdPcVgSIgQiIs6L71RxAM5QNVh2lQjuarGiAdUCAwEAAaOCAXYw
ggFyMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFPjBa7d/d1NK
8yU3HU6hJnsPIHCAMB0GA1UdDgQWBBQTrb9DCb2CcJyM1U8xbtUimIob1DAZBgkr
BgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
AwEB/zAfBgNVHSMEGDAWgBRFZlJD4X5YEb/WTp4jVQg7OiJqqDBcBgNVHR8EVTBT
MFGgT6BNhktodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0
cy9NaWNDb3JUaGlQYXJNYXJSb29fMjAxMC0xMC0wNS5jcmwwYAYIKwYBBQUHAQEE
VDBSMFAGCCsGAQUFBzAChkRodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
cnRzL01pY0NvclRoaVBhck1hclJvb18yMDEwLTEwLTA1LmNydDANBgkqhkiG9w0B
AQsFAAOCAgEANQhC/zDMzvd2DK0QaFg1KUYydid87xJBJ0IbSqptgThIWRNV8+lY
NKYWC4KqXa2C2oCDQQaPtB3yA7nzGl0b8VCQ+bNVhEIoHCC9sq5RFMXArJeVIRyQ
2w/8d56Vc5GIyr29UrkFUA3fV56gYe0N5W0l2UAPF0DIzqNKwk2vmhIdCFSPvce8
uSs9SSsfMvxqIWlPm8h+QjT8NgYXi48gQMCzmiV1J83JA6P2XdHnNlR6uVC10xLR
B7+7dN/cHo+A1e0Y9C8UFmsv3maMsCPlx4TY7erBM4KtVksYLfFolQfNz/By8K67
3YaFmCwhTDMr8A9K8GiHtZJVMnWhaoJqPKMlEaTtrdcErsvYQFmghNGVTGKRIhp0
HYw9Rw5EpuSwmzQ1sfq2U6gsgeykBXHInbi66BtEZuRHVA6OVn+znxaYsobQaD6Q
I7UvXo9QhY3GjYJfQaH0Lg3gmdJsdeS2abUhhvoH0fbiTdHarSx3Ux4lMjfHbFJy
lYaw8TVhahn1sjuBUFamMi3+oon5QoYnGFWhgspam/gwmFQUpkeWJS/IJuRBlBpc
Aj/lluOFWzw+P7tHFnJV4iUisdl75wMGKqP3HpBGwwAN1hmJ4w41J2IDcRWm79An
oKBZN2D4OJS44Hhw+LpMhoeU9uCuAkXuZcK2o35pFnUHkpv1prxZg1gxghYQMIIW
DAIBATCBmTCBgTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEr
MCkGA1UEAxMiTWljcm9zb2Z0IENvcnBvcmF0aW9uIFVFRkkgQ0EgMjAxMQITMwAA
ABCkkSlD2UzmLgABAAAAEDANBglghkgBZQMEAgEFAKCCAREwGQYJKoZIhvcNAQkD
MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ
KoZIhvcNAQkEMSIEIEAaWZwqZJovYkXeEpQSG3WWqLd/DNldt8Xw8yuAJN/eMIGk
BgorBgEEAYI3AgEMMYGVMIGSoF6AXABoAHQAdABwADoALwAvAHcAdwB3AC4AbQBp
AGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAHcAaABkAGMALwBoAGMAbAAvAGQAZQBm
AGEAdQBsAHQALgBtAHMAcAB4oTCALmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93
aGRjL2hjbC9kZWZhdWx0Lm1zcHgwDQYJKoZIhvcNAQEBBQAEggEAhc4SUki9GASq
5vLFVQkF4CesGXYqlMXekaQJKkhZV63+oJway35TiLAI69t5E5a65SOlp+bmoSeH
DuTX/aCKlCF8XFu5wEw3vcWuHZD9a3JBZBw4MWGb2w+RAzYI9oPhfJvw1QRsCccf
OBT1TDefMZeamlf5oXw8ueQ8/r/DlfDCdm7XNXV7gOM9lWlZjEHhlmwyKVqLUpP4
rmuCBiXiWutxy4Hh8QEWSODbLHLI87R0WYU8FZPe0oRA6wq35gu2UTEf45btBc4F
ZG9N0SwYqlvH7yvEntrbE4y+AM0lwa070IyJppcFHLZIngD958GGLdMiQc5DP3gv
VWUANZP8OKGCEzIwghMuBgorBgEEAYI3AwMBMYITHjCCExoGCSqGSIb3DQEHAqCC
EwswghMHAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggE1BgsqhkiG9w0BCRABBKCCASQE
ggEgMIIBHAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCCxlskZ4ZuH
n9P54K2R+C2ay1r5KRUNJyp6eKFu9Izh9QIGVBr7RMvHGBMyMDE0MTAxNTIzMTI1
NS4zNzdaMAcCAQGAAgH0oIGxpIGuMIGrMQswCQYDVQQGEwJVUzELMAkGA1UECBMC
V0ExEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
dGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNOOjdE
MkUtMzc4Mi1CMEY3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2
aWNloIIOvTCCBnEwggRZoAMCAQICCmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAw
gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT
KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEw
MDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
UENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGK
OiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0Eb
GpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/
JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0k
ZxJyGiGKr0tkiVBisV39dx898Fd1rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7l
msqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlE
XV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4E
FgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD
AEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZW
y4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5t
aWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAt
MDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3
dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0y
My5jcnQwgaAGA1UdIAEB/wSBlTCBkjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUF
BwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1
bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5
AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohR
DeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l
4/m87WtUVwgrUYJEEvu5U4zM9GASinbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/
f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WW
j1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI5
7BlKcWOdeyFtw5yjojz6f32WapB4pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1
gJsiOCC1JeVk7Pf0v35jWSUPei45V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9Dv
fYPw4TtxCd9ddJgiCGHasFAeb73x4QDf5zEHpJM692VHeOj4qEir995yfmFrb3ep
gcunCaw5u+zGy9iCtHLNHfS4hQEegPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMu
Ein1wC9UJyH3yKxO2ii4sanblrKnQqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmK
LxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu
7w2gUDXa7wknHNWzfjUeCLraNtvTX4/edIhJEjCCBNIwggO6oAMCAQICEzMAAABR
/WjgVmQVwzoAAAAAAFEwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzAR
BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh
bXAgUENBIDIwMTAwHhcNMTQwNTIzMTcyMDA5WhcNMTUwODIzMTcyMDA5WjCBqzEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIxJzAlBgNV
BAsTHm5DaXBoZXIgRFNFIEVTTjo3RDJFLTM3ODItQjBGNzElMCMGA1UEAxMcTWlj
cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAJ2gwcMKK55pNc4pF5dUX3yQa7CJ3ZRysSWAG388wceY6sZM6X5z
2zrNVpT5WECnhC69KK6/Q/E8qG5FhLYLVseR3aq0RioUWzERisDDIm5gttB/XP52
jBbgakdHEgOcFoJOyZ4xiumB4SlCR46r1RQUirLAz3BOtBN2PnbVS6AaFpK5epfE
KU5O5hZ+jJSJUuZUFzcwJ9XcmaAkPePwqtsN/8tZo2kGmbD10oXg1VhATlzFbvgQ
tyYQutQ7hE1iyXHAzmOYdgbTDm3Thg+O3W8Q91qbBLZUzaeH1YxsJmq0cTFfsNGO
KW9xI2utvUJkYwpzgPBBL4uFBWjOYb2rIwUCAwEAAaOCARswggEXMB0GA1UdDgQW
BBRGxA7sEUJd1uDh/FEtuFyNWPuZlDAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYb
xTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
b20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmww
WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
dC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNV
HRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IB
AQBa1WIhevMGwzVGn7dOMI8VXkj7qY9K5VPt/Tgna3uloOntHcxzpcpzDuv3nlti
SVmfxCms/LcIX2FD3AVEAyWXGdQ+CKaKve43n4BPtDg6s0sILRR8UmC4ZUfvQ0gZ
QFwGHZwQ2G4OBX4KV/pZ23aQ0YBf0Ztf9LClC3MZNw8cst3+pU6qi9/C+esfbk7/
yeEcufwGd14FHm4Xou/N+9zXklD/WoAzQke+eYDCiGSzN68R2oldMQNhghzyWbm6
2WVn96mKUw/qprSQ7NP6GGa7kBGAgy/SK9Ri6irEZFvwOd4nKrvGIGRChjGuTp8j
3oKLuFsGy6JfvtHMsAj0zXGJoYIDbjCCAlYCAQEwgduhgbGkga4wgasxCzAJBgNV
BAYTAlVTMQswCQYDVQQIEwJXQTEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
TWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5u
Q2lwaGVyIERTRSBFU046N0QyRS0zNzgyLUIwRjcxJTAjBgNVBAMTHE1pY3Jvc29m
dCBUaW1lLVN0YW1wIFNlcnZpY2WiJQoBATAJBgUrDgMCGgUAAxUAs+36yqCWBPBh
GIZgQt8DMXvCQ1+ggcIwgb+kgbwwgbkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
Q29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgTlRT
IEVTTjo1N0Y2LUMxRTAtNTU0QzErMCkGA1UEAxMiTWljcm9zb2Z0IFRpbWUgU291
cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIFANfo5t0wIhgPMjAxNDEw
MTUxMjI4MTNaGA8yMDE0MTAxNjEyMjgxM1owdDA6BgorBgEEAYRZCgQBMSwwKjAK
AgUA1+jm3QIBADAHAgEAAgIA6jAHAgEAAgIZFTAKAgUA1+o4XQIBADA2BgorBgEE
AYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAIDFuNgoQowCAIBAAIDB6Eg
MA0GCSqGSIb3DQEBBQUAA4IBAQCG8zzgxSFt1+GzKjH9Xus5Boc/2BQFbeZDi1Fa
LmeEVvLCUv0AXJBjaBiaMW4QNxlPKyHYi9EAdVIoaB4VhvGYlhfaTIDgYT68RvLq
HSCgoXqmm6/zjdJMO44qtgDYo/izZ60rzlLC9uMORSqPbrL8c7BJwBoAojtvCGVt
rM5uXvQHgjsQkbO79EpteueyuR1ZM3p4dq2Bu7dSL249aabCz2+9eqbfQXbwMNU1
8xOOetuknnj2wYYzja0CrRFiPbWjMf3QYSDdJP+4QFAbcV3HAwJSDJsQdxmN/y3z
Rl0gybA2omrFtHeaa5WziYAjjVLGO6cJt1Kw9eRooOIMpjpBMYIC9TCCAvECAQEw
gZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE
AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAABR/WjgVmQVwzoA
AAAAAFEwDQYJYIZIAWUDBAIBBQCgggEyMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B
CRABBDAvBgkqhkiG9w0BCQQxIgQg5bG3zVdKiwZ5QZHFbp+vCKG8gX0yhUxC+imb
v89Ak7gwgeIGCyqGSIb3DQEJEAIMMYHSMIHPMIHMMIGxBBSz7frKoJYE8GEYhmBC
3wMxe8JDXzCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMz
AAAAUf1o4FZkFcM6AAAAAABRMBYEFJzmMth+/GwtkYA7SufTSdPZoZp/MA0GCSqG
SIb3DQEBCwUABIIBABjVdXQ9EWcTxVdNHRX9+cXQ5q/IZSbGlrhKOwTbIrHvD3UH
1fIW50QKW3fByHLwtCUSX0L0D42wjHJmPGkr8NHflXLZPCa5+nm0JNP4vpglOfMP
WUls4Zko5B0rKmh2s2TIe1c1jscMa+t1Q/wbAZVZxY+JQQW96zFINrCweU2OeK8i
jDbqOtV/eh853N31xSC5OFwKUZiadQYhtxiXNYcJ51/r2ltgUUCDsf+Jq8P30zCF
DCvZ0TCdqhg/wP0jsxyVV8v/2BjUOfXpZMVyVsaTILOd0+Ke/0NzDxt6nBM6fwgT
EwHaEfVf4kY1Gt8zBVnnk16MZ5SQ0zSjJ1mFxxEAAAA=
-----END AUTHENTICODE SIGNATURE-----
++++++ signature-sles.asc ++++++
hash: f31fd461c5e99510403fc97c1da2d8a9cbe270597d32badf8fd66b77495f8d94
# 2069-04-10 06:07:54
timestamp: babababa
checksum: 61c9
-----BEGIN AUTHENTICODE SIGNATURE-----
MIIh9AYJKoZIhvcNAQcCoIIh5TCCIeECAQExDzANBglghkgBZQMEAgEFADBcBgor
BgEEAYI3AgEEoE4wTDAXBgorBgEEAYI3AgEPMAkDAQCgBKICgAAwMTANBglghkgB
ZQMEAgEFAAQg8x/UYcXplRBAP8l8HaLYqcvicFl9Mrrfj9Zrd0lfjZSgggs8MIIF
JDCCBAygAwIBAgITMwAAAApmQvP0n7c3lgABAAAACjANBgkqhkiG9w0BAQsFADCB
gTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMi
TWljcm9zb2Z0IENvcnBvcmF0aW9uIFVFRkkgQ0EgMjAxMTAeFw0xMzA5MjQxNzU0
MDNaFw0xNDEyMjQxNzU0MDNaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
cnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMTAwLgYDVQQDEydNaWNyb3NvZnQgV2lu
ZG93cyBVRUZJIERyaXZlciBQdWJsaXNoZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQCc2PZRP3t6i2DCLSAuWrFHZKfyD98yckc9yxqqqJACgekdZi4s
ZEN1vYcVfiUhW4hFpdH3kcPah7wf+uqgyQa1hb/9AzDH63JYfaHLWA+Jx0leY0cG
CsIFviaUHrCEgxhkeXdrGfHroDcWArv2yBBvj+zvePVE9/VpDoBK+2nAFxz0oG23
BzE5duVpHIZn96fNyoDKYvCf649VqjM+O5/b5jlDylkMWAIVTvWqE0r/7YnC1Vcc
cgJDQk8IaIWSepRsjrvvf8C8uG3ZSxVjQeuPz7ETAryJIWvYdz240MzVAJD7SazH
SbVJm1LPHfS2FEpx3uUNOuo3IJrrxqeals8FAgMBAAGjggF9MIIBeTAfBgNVHSUE
GDAWBggrBgEFBQcDAwYKKwYBBAGCN1ACATAdBgNVHQ4EFgQU6t49RpSALGo0XSnP
ixuEhp5y0NEwUQYDVR0RBEowSKRGMEQxDTALBgNVBAsTBE1PUFIxMzAxBgNVBAUT
KjMxNjE5KzAxMjU1ZjQ2LTc0ZjUtNGZjNC1iYzcxLWU0ZGE5NzM2YmVlZTAfBgNV
HSMEGDAWgBQTrb9DCb2CcJyM1U8xbtUimIob1DBTBgNVHR8ETDBKMEigRqBEhkJo
dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb3JVRUZDQTIw
MTFfMjAxMS0wNi0yNy5jcmwwYAYIKwYBBQUHAQEEVDBSMFAGCCsGAQUFBzAChkRo
dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvclVFRkNB
MjAxMV8yMDExLTA2LTI3LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUA
A4IBAQAqJ9a9LzTGipmJ7IVkSf5JNK1cBhXsWBlmQ5kFNzeoa+RskUuUeM45NTS3
We7F628BW3BrhT8dK+Uf6YB7F46qng+VWNal2RPFjHSSy60QartzlUJoAaQvNjhC
5gv3LQRmaIZdtdjOLJAclnMETQWrt0wXGsGYwPk3a7kYXsdSO7U+bSwRRkL/v74g
78bCVxwgBhWctw/yxCjpl/bOg79XrZpHxH3szpgwz4YaFWRxxiYAoCYLROKeqObj
PEB8BG83vkpG3K84wBiyT5ab63FtjnbOvD0dGRNO1vIWzC41eEi0mYGW69cya8o+
Ot4bqI6YYSpWmkah9FhW9OLfoCpdMIIGEDCCA/igAwIBAgIKYQjTxAAAAAAABDAN
BgkqhkiG9w0BAQsFADCBkTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
dGlvbjE7MDkGA1UEAxMyTWljcm9zb2Z0IENvcnBvcmF0aW9uIFRoaXJkIFBhcnR5
IE1hcmtldHBsYWNlIFJvb3QwHhcNMTEwNjI3MjEyMjQ1WhcNMjYwNjI3MjEzMjQ1
WjCBgTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UE
AxMiTWljcm9zb2Z0IENvcnBvcmF0aW9uIFVFRkkgQ0EgMjAxMTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKUIbEzHRQlqSwykwId/BnUMQwFUZOAWfwft
kn0LsnO/DArGSkVhoMUWLZbT9Sug+01Jm0GAkDy5VP3mvNGdxKQYin9BilxZg2gy
u4xHye5xvCFPmop8/0Q/jY8ysiZIrnW17slMHkoZfuSCmh14d00MsL32D9MW07z6
K6VROF31+7rbeALb/+wKG5bVg7gZE+m2wHtAe+EfKCfJ+u9WXhzmfpR+wPBEsnk5
5dqyYotNvzhw4mgkFMkzpAg31VhpXtN87cEEUwjnTrAqh2MIYW9jFVnqsit51wxh
Z4pb/V6th3+6hmdPcVgSIgQiIs6L71RxAM5QNVh2lQjuarGiAdUCAwEAAaOCAXYw
ggFyMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFPjBa7d/d1NK
8yU3HU6hJnsPIHCAMB0GA1UdDgQWBBQTrb9DCb2CcJyM1U8xbtUimIob1DAZBgkr
BgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
AwEB/zAfBgNVHSMEGDAWgBRFZlJD4X5YEb/WTp4jVQg7OiJqqDBcBgNVHR8EVTBT
MFGgT6BNhktodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0
cy9NaWNDb3JUaGlQYXJNYXJSb29fMjAxMC0xMC0wNS5jcmwwYAYIKwYBBQUHAQEE
VDBSMFAGCCsGAQUFBzAChkRodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
cnRzL01pY0NvclRoaVBhck1hclJvb18yMDEwLTEwLTA1LmNydDANBgkqhkiG9w0B
AQsFAAOCAgEANQhC/zDMzvd2DK0QaFg1KUYydid87xJBJ0IbSqptgThIWRNV8+lY
NKYWC4KqXa2C2oCDQQaPtB3yA7nzGl0b8VCQ+bNVhEIoHCC9sq5RFMXArJeVIRyQ
2w/8d56Vc5GIyr29UrkFUA3fV56gYe0N5W0l2UAPF0DIzqNKwk2vmhIdCFSPvce8
uSs9SSsfMvxqIWlPm8h+QjT8NgYXi48gQMCzmiV1J83JA6P2XdHnNlR6uVC10xLR
B7+7dN/cHo+A1e0Y9C8UFmsv3maMsCPlx4TY7erBM4KtVksYLfFolQfNz/By8K67
3YaFmCwhTDMr8A9K8GiHtZJVMnWhaoJqPKMlEaTtrdcErsvYQFmghNGVTGKRIhp0
HYw9Rw5EpuSwmzQ1sfq2U6gsgeykBXHInbi66BtEZuRHVA6OVn+znxaYsobQaD6Q
I7UvXo9QhY3GjYJfQaH0Lg3gmdJsdeS2abUhhvoH0fbiTdHarSx3Ux4lMjfHbFJy
lYaw8TVhahn1sjuBUFamMi3+oon5QoYnGFWhgspam/gwmFQUpkeWJS/IJuRBlBpc
Aj/lluOFWzw+P7tHFnJV4iUisdl75wMGKqP3HpBGwwAN1hmJ4w41J2IDcRWm79An
oKBZN2D4OJS44Hhw+LpMhoeU9uCuAkXuZcK2o35pFnUHkpv1prxZg1gxghYrMIIW
JwIBATCBmTCBgTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEr
MCkGA1UEAxMiTWljcm9zb2Z0IENvcnBvcmF0aW9uIFVFRkkgQ0EgMjAxMQITMwAA
AApmQvP0n7c3lgABAAAACjANBglghkgBZQMEAgEFAKCCAREwGQYJKoZIhvcNAQkD
MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ
KoZIhvcNAQkEMSIEIJrzMZcr8o7z/mk2WCbI8fEz7nZbYeVPQtJjL0exXBCxMIGk
BgorBgEEAYI3AgEMMYGVMIGSoF6AXABoAHQAdABwADoALwAvAHcAdwB3AC4AbQBp
AGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAHcAaABkAGMALwBoAGMAbAAvAGQAZQBm
AGEAdQBsAHQALgBtAHMAcAB4oTCALmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93
aGRjL2hjbC9kZWZhdWx0Lm1zcHgwDQYJKoZIhvcNAQEBBQAEggEAjHDQORfm8d8T
eyJMiPDMRPFiO/aBL7UtF4rtDUeYi+c9UU6KDVXHi19Z9DNt3pkRRm4DxFVdDPXU
P1TFD8HWbQPQ7YGGRjDOv1BwxZ+5F6xmNgoxUh0khKisi3l0LPq6Zauee7ebgly3
6A6GQSKlaXH7MXxMsgbvGFdXAQs/KVMb3xzuttby/jcQ9lxoMr4SVcM6Vu6fFZ24
DWhHFtONzHFSvJ3Sf10d8teTvikrIaXg7pzNU+T7+sMXsiyhVhWiFFFtetaaxtT4
vcKDuGHNP797WM1YYxZz+2sMbWyi81h+We6ReHn0V+UUW4b7i4yh0p2Vy3xPrzb6
TgGQIyi536GCE00wghNJBgorBgEEAYI3AwMBMYITOTCCEzUGCSqGSIb3DQEHAqCC
EyYwghMiAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggE9BgsqhkiG9w0BCRABBKCCASwE
ggEoMIIBJAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAqAR+tIZOx
IQiET4LQ+OsCmH0VlrTUkAPePwl/JtC8pAIGUt6TDOrUGBMyMDE0MDIyNzAxMDcz
My43NzNaMAcCAQGAAgH0oIG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
IENvcnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERT
RSBFU046QzBGNC0zMDg2LURFRjgxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0
YW1wIFNlcnZpY2Wggg7QMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG
9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
MTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJV
UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt
ZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vw
FVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNF
DdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC7
32H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOW
RH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJ
k3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEA
MB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4K
AFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
GDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRw
Oi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJB
dXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5o
dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8y
MDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEw
PQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9D
UFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABv
AGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQAD
ggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/1
5/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRW
S3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBvSzBE
JCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/
3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9
nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5H
moDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv3
3nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI
5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0
MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0e
GTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSMIIE2jCCA8KgAwIB
AgITMwAAACiQZ7kEsDxuZgAAAAAAKDANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQG
EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
VGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xMzAzMjcyMDEzMTNaFw0xNDA2MjcyMDEz
MTNaMIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0wCwYD
VQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046QzBGNC0zMDg2LURF
RjgxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdpUi/akidSiGckmve4C3c5GP4zLmJ
xMcbvee10/vtrs8x/vNmsEQD2plnCFq/dQYiEYnQZ1LM+s+SN0Xo+vG9M9PMc+O4
IaSgFX3LL8QDBdo/lnPTWeWYTQtWhi+dR9HWX52R6ceE2ZVrMky0awBS4EHTPGl0
qM7MfWidUlXmcH8UB6KeZ7CGRPMzP3Ndxij4F19SAS1EL9bteAi45TsvwLnDS8O3
Oy/TprWcsUhK3TIJVqEbS1rTqiYnDBJDYMVq19pADWCYiUG7k3Pdv/7EjFvO+lUn
yk1Nmm99EWyxRyOwTHxsfwahdIIfUngY6QYaFlCawzrdgYH3mydyIX91AgMBAAGj
ggEbMIIBFzAdBgNVHQ4EFgQU3JgInXnRBLKLR8Nx0Izns+awU50wHwYDVR0jBBgw
FoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov
L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENB
XzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0
cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAx
MC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDAN
BgkqhkiG9w0BAQsFAAOCAQEAgiLztz1kfhJL/Cb84OS30MQUTgn+q1aa0VqYpr6M
QR6UtDK+hLS3RXbj72AYJIeoz+m00VQpvMrkyxJ7wPHUDp8xMxsRP3o73d0CqhjK
yjz6luNsu6+7yYQ+x9gMhctyCwEbpPUxERAMRaVaSJl+2r5Fhte6TeSB/9NYCnZl
Blkv9sJCzwTJqxv6YZ3185hJcLFJ0GTEIejuYBdTfusC2miVi/UKPAHbo7WYFFF0
nlPp2nKYZqBfKc+Prx+CnNPr5vFMG1T46DLcwRXDrCpudAUWg+NEmJ/L7+gweX+v
UqU6H99lx43+J9hHGZIItIs0jmknNxoC9pGzlSL/CEgq/qGCA3kwggJhAgEBMIHj
oYG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0w
CwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046QzBGNC0zMDg2
LURFRjgxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiJQoB
ATAJBgUrDgMCGgUAAxUA8120HsdfO2ZOZQ7emART9hWnH0SggcIwgb+kgbwwgbkx
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1P
UFIxJzAlBgNVBAsTHm5DaXBoZXIgTlRTIEVTTjpCMDI3LUM2RjgtMUQ4ODErMCkG
A1UEAxMiTWljcm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG
9w0BAQUFAAIFANa4+LowIhgPMjAxNDAyMjYyMzM1MjJaGA8yMDE0MDIyNzIzMzUy
MlowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA1rj4ugIBADAKAgEAAgIM/AIB/zAH
AgEAAgIV3zAKAgUA1rpKOgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZ
CgMBoAowCAIBAAIDFuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQBm
lwBgKM7WFYZn7KoOxHuc0HCwn9KJ7P2+V1ixjuYcd9TJPbpom+P6TqrtdVyqC1qN
P1ika8uTrueq+WIyDkpbBeRjgRPxywB8p6swJXn3a8FQJlYM8wZlX6k4DXOQ5a1I
8Df1MoZedlnFIJFCuailsPek9CZSuawhHvQu6tutrNrCtOJpHGwP/g7QhqDby6MU
9W08fcBbMQ+Q+NN9R+O5914iiyXTxNYply2O6zmRRXVV8Os49n6MAdLMQwlW/Hjf
Qx9xsPgmOpnwA3IVmPCEtJnHbNPnmX23cB3zQ5HQ8Rgzh4a2iGFTUKVLQzP2XbJI
GAt0fd2U/pFkRHTpexsrMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMxEzAR
BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh
bXAgUENBIDIwMTACEzMAAAAokGe5BLA8bmYAAAAAACgwDQYJYIZIAWUDBAIBBQCg
ggEyMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg
igCH0fhbYKLF4fSmxZObvVlmifs8MaWR0dGzScGuExwwgeIGCyqGSIb3DQEJEAIM
MYHSMIHPMIHMMIGxBBTzXbQex187Zk5lDt6YBFP2FacfRDCBmDCBgKR+MHwxCzAJ
BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv
c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAKJBnuQSwPG5mAAAAAAAoMBYE
FP/tXYkB9TLyFTNFAIYorcmDMtYiMA0GCSqGSIb3DQEBCwUABIIBABg8AdKpFO37
Mdc4SKY28D2Sff2uoRuCoLxMZPhC7rR14gC1sXKSBHIoNyMBR32mYJnJsTAgJRwT
YTEmsHYl6l37/tkLAsRS21lt+YuynR9/fdGlwvqxc41HkUHdcTRjvsetVZ7v2HSz
vpCBje4TsAaxblVCsyXiH94CyMR3Aq6brcoG+QJKh14NFLLLIxN2melZYivfcAJR
ES78bXBRGa6hPqsvOIZ6USSC1rAwHodonNcp4Xb1QMPoXKcMPyUAYdzz0q673Mec
hsP7HKqhezXDmpGe6Hg4RrO/In7qyRok6LZ4DH5hsp6dp0Omcgqm3kmcqTTNmtF6
0JelOr7e+os=
-----END AUTHENTICODE SIGNATURE-----
++++++ strip_signature.sh ++++++
#!/bin/bash
# attach ascii armored signature to a PE binary
set -e

infile="$1"
if [ -z "$infile" -o ! -e "$infile" ]; then
        echo "USAGE: $0 file.efi"
        exit 1
fi

outfile="${infile%.efi}-unsigned.efi"

pesign -r -i "$infile" -o "$outfile"
++++++ timestamp.pl ++++++
#!/usr/bin/perl -w
# Copyright (c) 2012,2013 SUSE Linux Products GmbH
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

=head1 timestamp.pl

timestamp.pl - show or set pe timestamp in file

=head1 SYNOPSIS

timestamp.pl [OPTIONS] FILE...

=head1 OPTIONS

=over 4

=item B<--set-form-file=FILE>

parse timestamp and checksum from file

=item B<--help, -h>

print help

=back

=head1 DESCRIPTION

lorem ipsum ...

=cut

use strict;
use Getopt::Long;
Getopt::Long::Configure("no_ignore_case");
use POSIX qw/strftime/;

my %options;

sub usage($) {
        my $r = shift;
        eval "use Pod::Usage; pod2usage($r);";
        if ($@) {
                die "cannot display help, install perl(Pod::Usage)\n";
        }
}

GetOptions(
        \%options,
        "set-from-file=s",
        "verbose|v",
        "help|h",
) or usage(1);

usage(1) unless @ARGV;
usage(0) if ($options{'help'});

my $set_timestamp;
my $set_checksum;

if ($options{'set-from-file'}) {
        die "$options{'set-from-file'}: $!\n" unless open(my $fh, '<', 
$options{'set-from-file'});
        while (<$fh>) {
                chomp;
                if (/^timestamp: ([0-9a-f]+)/) {
                        $set_timestamp = pack('L', hex($1));
                        next;
                } elsif (/^checksum: ([0-9a-f]+)/) {
                        $set_checksum = pack('S', hex($1));
                        next;
                }
                last if $set_timestamp && $set_checksum;
        }
        close($fh);
        die "file didn't contain timestamp and checksum\n" unless 
$set_timestamp && $set_checksum;
}

sub do_show($)
{
        my $file = shift;
        die "$file: $!\n" unless open(my $fh, '<', $file);
        die "seek $file: $!\n" unless seek($fh, 136, 0);
        my $value;
        die "read $file: $!\n" unless read($fh, $value, 4);

        my $timestamp = unpack('L', $value);
        print strftime("# %Y-%m-%d %H:%M:%S\n", gmtime($timestamp));
        printf ("timestamp: %x\n", $timestamp);

        die "seek $file: $!\n" unless seek($fh, 216, 0);
        die "read $file: $!\n" unless read($fh, $value, 2);

        printf ("checksum: %x\n", unpack('S', $value));

        close($fh);
}

sub do_set($)
{
        my $file = shift;
        die "$file: $!\n" unless open(my $fh, '+<', $file);
        die "seek $file: $!\n" unless seek($fh, 136, 0);
        die "write $file: $!\n" unless print $fh $set_timestamp;

        die "seek $file: $!\n" unless seek($fh, 216, 0);
        die "read $file: $!\n" unless print $fh $set_checksum;
        close($fh);
}


for my $file (@ARGV) {
        if ($options{'set-from-file'}) {
                do_set($file);
        } else {
                do_show($file);
        }

}
-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to