GNU bug report logs - #33078
wpa-supplicant service API change leads to breakage

Previous Next

Package: guix;

Reported by: Mark H Weaver <mhw <at> netris.org>

Date: Wed, 17 Oct 2018 19:44:02 UTC

Severity: normal

Done: Bruno Victal <mirai <at> makinata.eu>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 33078 in the body.
You can then email your comments to 33078 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guix <at> gnu.org:
bug#33078; Package guix. (Wed, 17 Oct 2018 19:44:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Mark H Weaver <mhw <at> netris.org>:
New bug report received and forwarded. Copy sent to bug-guix <at> gnu.org. (Wed, 17 Oct 2018 19:44:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Mark H Weaver <mhw <at> netris.org>
To: bug-guix <at> gnu.org
Subject: Attempt to build my GuixSD system now fails
Date: Wed, 17 Oct 2018 15:42:41 -0400
When I try to build my x86_64 GuixSD system, based on my system
configuration which I've not modified since May, it now fails:

--8<---------------cut here---------------start------------->8---
mhw <at> jojen ~$ guix system build /etc/config.scm
Backtrace:
In srfi/srfi-1.scm:
   592:17 19 (map1 (#<<service> type: #<service-type profile 2b09…> …))
In gnu/services.scm:
   778:26 18 (loop #<<service> type: #<service-type profile 2b09d20>…>)
In srfi/srfi-1.scm:
   592:17 17 (map1 (#<<service> type: #<service-type shepherd-roo…> …))
In gnu/services.scm:
   778:26 16 (loop #<<service> type: #<service-type shepherd-root 2b…>)
In srfi/srfi-1.scm:
   592:29 15 (map1 (#<<service> type: #<service-type file-systems…> …))
   592:29 14 (map1 (#<<service> type: #<service-type root-file-sy…> …))
   592:29 13 (map1 (#<<service> type: #<service-type user-process…> …))
   592:29 12 (map1 (#<<service> type: #<service-type host-name 2b…> …))
   592:17 11 (map1 (#<<service> type: #<service-type account 2b09…> …))
In gnu/services.scm:
   778:26 10 (loop #<<service> type: #<service-type account 2b09aa0>…>)
In srfi/srfi-1.scm:
   592:29  9 (map1 (#<<service> type: #<service-type guix 240fc30…> …))
   592:17  8 (map1 (#<<service> type: #<service-type dbus 240f910…> …))
In gnu/services.scm:
   779:26  7 (loop #<<service> type: #<service-type dbus 240f910> va…>)
In srfi/srfi-1.scm:
   592:29  6 (map1 (#<<service> type: #<service-type elogind 240f…> …))
   592:29  5 (map1 (#<<service> type: #<service-type polkit 240f8…> …))
   592:29  4 (map1 (#<<service> type: #<service-type colord 240f1…> …))
   592:29  3 (map1 (#<<service> type: #<service-type upower 240f2…> …))
   592:29  2 (map1 (#<<service> type: #<service-type udisks 240f1…> …))
   592:17  1 (map1 (#<<service> type: #<service-type wpa-supplica…> …))
In gnu/services/networking.scm:
   1076:9  0 (config->package _)

gnu/services/networking.scm:1076:9: In procedure config->package:
Throw to key `match-error' with args `("match" "no matching pattern" #<package wpa-supplicant <at> 2.6 gnu/packages/admin.scm:1147 3246780>)'.
mhw <at> jojen ~$
--8<---------------cut here---------------end--------------->8---

Here's my system configuration:

--8<---------------cut here---------------start------------->8---
;; This is an operating system configuration template
;; for a "desktop" setup with GNOME and Xfce where the
;; root partition is encrypted with LUKS.

(use-modules (gnu) (gnu system nss) (srfi srfi-1) (guix packages))
(use-service-modules base desktop networking xorg dbus)
(use-package-modules certs gnome cryptsetup linux admin guile firmware xdisorg libusb suckless)

(define keymap
  (plain-file
   "keymap"
   "keymaps 0-255
keycode 42 = Shift
keycode 54 = Shift
keycode 29 = Control
keycode 58 = Control
keycode 56 = Alt
keycode 100 = Alt
alt shift keycode 1 = Meta_Escape
alt shift keycode 2 = Meta_exclam
alt shift keycode 3 = Meta_at
alt shift keycode 4 = Meta_numbersign
alt shift keycode 5 = Meta_dollar
alt shift keycode 6 = Meta_percent
alt shift keycode 7 = Meta_asciicircum
shift control keycode 7 = Control_asciicircum
control alt keycode 7 = Meta_Control_asciicircum
shift control alt keycode 7 = Meta_Control_asciicircum
alt shift keycode 8 = Meta_ampersand
alt shift keycode 9 = Meta_asterisk
alt shift keycode 10 = Meta_parenleft
alt shift keycode 11 = Meta_parenright
alt shift keycode 12 = Meta_underscore
shift control keycode 12 = Control_underscore
control alt keycode 12 = Meta_Control_underscore
shift control alt keycode 12 = Meta_Control_underscore
alt shift keycode 13 = Meta_plus
alt shift keycode 14 = Meta_Delete
alt shift keycode 15 = Meta_Tab
alt shift keycode 16 = Meta_Q
alt shift keycode 17 = Meta_W
alt shift keycode 18 = Meta_E
alt shift keycode 19 = Meta_R
alt shift keycode 20 = Meta_T
alt shift keycode 21 = Meta_Y
alt shift keycode 22 = Meta_U
alt shift keycode 23 = Meta_I
alt shift keycode 24 = Meta_O
alt shift keycode 25 = Meta_P
alt shift keycode 26 = Meta_braceleft
control alt keycode 26 = Meta_Escape
alt shift keycode 27 = Meta_braceright
control alt keycode 27 = Meta_Control_bracketright
alt shift keycode 28 = Meta_Control_m
alt shift keycode 29 = Meta_Control
alt shift keycode 30 = Meta_A
alt shift keycode 31 = Meta_S
alt shift keycode 32 = Meta_D
alt shift keycode 33 = Meta_F
alt shift keycode 34 = Meta_G
alt shift keycode 35 = Meta_H
alt shift keycode 36 = Meta_J
alt shift keycode 37 = Meta_K
alt shift keycode 38 = Meta_L
alt shift keycode 39 = Meta_colon
alt shift keycode 40 = Meta_quotedbl
alt shift keycode 41 = Meta_asciitilde
alt shift keycode 43 = Meta_bar
control alt keycode 43 = Meta_Control_backslash
alt shift keycode 44 = Meta_Z
alt shift keycode 45 = Meta_X
alt shift keycode 46 = Meta_C
alt shift keycode 47 = Meta_V
alt shift keycode 48 = Meta_B
alt shift keycode 49 = Meta_N
alt shift keycode 50 = Meta_M
alt shift keycode 51 = Meta_less
alt shift keycode 52 = Meta_greater
alt shift keycode 53 = Meta_question
alt shift keycode 57 = Meta_space
"))

(operating-system
  (host-name "jojen")
  (timezone "US/Eastern")
  (locale "en_US.utf8")

  (bootloader (bootloader-configuration
	       (bootloader grub-bootloader)
	       (target "/dev/sda")))

  (kernel linux-libre)

  ;;(firmware (list ath9k-htc-firmware))
  (firmware '())

  ;; Specify a mapped device for the encrypted root partition.
  ;; The UUID is that returned by 'cryptsetup luksUUID'.
  (mapped-devices
   (list (mapped-device
          (source (uuid "a56c53e7-b345-4e24-a17b-6cf158dbc7d3"))
          (target "jojen-root")
          (type luks-device-mapping))))

  (file-systems (cons* (file-system
                         ;; FIXME: reference by the file system label?
                         (device "/dev/mapper/jojen-root")
                         (mount-point "/")
                         (type "btrfs")
                         (dependencies mapped-devices))
                       %base-file-systems))

  (users (cons* (user-account
                 (name "mhw")
                 (uid 1000)
                 (group "mhw")
                 (supplementary-groups '("wheel" "users" "netdev"
                                         "audio" "video" "dialout"))
                 (home-directory "/home/mhw"))
                %base-user-accounts))

  (groups (cons* (user-group
                  (name "mhw")
                  (id 1000))
                 %base-groups))

  (setuid-programs
   (list (file-append shadow "/bin/passwd")
         (file-append inetutils "/bin/ping")))

  ;; This is where we specify system-wide packages.
  (packages (cons* nss-certs         ;for HTTPS access
                   gvfs              ;for user mounts
                   cryptsetup
                   btrfs-progs
                   wpa-supplicant
                   network-manager
                   network-manager-applet
                   (delete sudo %base-packages)))

  (services (cons* (console-keymap-service keymap)
                   ;;(xfce-desktop-service)
                   (gnome-desktop-service)
                   (service network-manager-service-type
                            (network-manager-configuration))
                   (service wpa-supplicant-service-type wpa-supplicant)

                   ;; Desktop services follow
                   (slim-service)
                   (screen-locker-service slock)
                   ;;(screen-locker-service xlockmore "xlock")
                   (simple-service 'mtp udev-service-type (list libmtp))
                   ;;(avahi-service)    ; I don't trust this
                   ;;(wicd-service)     ; using NetworkManager instead
                   (udisks-service)
                   (upower-service)
                   (colord-service)
                   ;;(geoclue-service)  ; I don't want this
                   (polkit-service)
                   (elogind-service)
                   (dbus-service)
                   ;;(ntp-service)      ; I don't trust this

                   (modify-services (remove (lambda (svc)
                                              (eq? (service-kind svc)
                                                   wicd-service-type))
                                            %base-services)
                     ;; This is for debugging
                     #;
                     (nscd-service-type config =>
                                        (nscd-configuration
                                          (inherit config)
                                          (debug-level 3)
                                          (log-file "/var/log/nscd.log")))
                     ;; I don't trust the build farm
                     (guix-service-type config =>
                                        (guix-configuration
                                          (inherit config)
                                          (use-substitutes? #f)
                                          (authorized-keys '())
                                          (substitute-urls '())
                                          (extra-options '("--gc-keep-derivations=yes"
                                                           "--gc-keep-outputs=yes")))))))

  ;; Allow resolution of '.local' host names with mDNS.
  ;;(name-service-switch %mdns-host-lookup-nss)  ; disabled for now
  )
--8<---------------cut here---------------end--------------->8---

       Mark




Information forwarded to bug-guix <at> gnu.org:
bug#33078; Package guix. (Wed, 17 Oct 2018 19:53:02 GMT) Full text and rfc822 format available.

Message #8 received at 33078 <at> debbugs.gnu.org (full text, mbox):

From: Mark H Weaver <mhw <at> netris.org>
To: 33078 <at> debbugs.gnu.org
Subject: Re: bug#33078: Attempt to build my GuixSD system now fails
Date: Wed, 17 Oct 2018 15:51:43 -0400
Mark H Weaver <mhw <at> netris.org> writes:
> When I try to build my x86_64 GuixSD system, based on my system
> configuration which I've not modified since May, it now fails:

Reverting commit acce0a474c1493ab18912bc46285248e4ccb0314 (services:
wpa-supplicant: Extend to support configuration parameters) seems to fix
the issue for me.  I guess my system configuration needs to be updated
to adapt to it, but it's not obvious what I need to do.

      Mark




Information forwarded to bug-guix <at> gnu.org:
bug#33078; Package guix. (Wed, 17 Oct 2018 20:51:02 GMT) Full text and rfc822 format available.

Message #11 received at 33078 <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Mark H Weaver <mhw <at> netris.org>, 33078 <at> debbugs.gnu.org
Subject: Re: bug#33078: Attempt to build my GuixSD system now fails
Date: Wed, 17 Oct 2018 22:50:51 +0200
[Message part 1 (text/plain, inline)]
Mark H Weaver <mhw <at> netris.org> writes:

> When I try to build my x86_64 GuixSD system, based on my system
> configuration which I've not modified since May, it now fails:

[...]

> In gnu/services/networking.scm:
>    1076:9  0 (config->package _)
>
> gnu/services/networking.scm:1076:9: In procedure config->package:
> Throw to key `match-error' with args `("match" "no matching pattern" #<package wpa-supplicant <at> 2.6 gnu/packages/admin.scm:1147 3246780>)'.

Whoops, sorry for this breakage!

> Here's my system configuration:

[...]

>   (services (cons* (console-keymap-service keymap)
>                    ;;(xfce-desktop-service)
>                    (gnome-desktop-service)
>                    (service network-manager-service-type
>                             (network-manager-configuration))
>                    (service wpa-supplicant-service-type wpa-supplicant)

To adapt to the new interface, this should be changed to:

(service wpa-supplicant-service-type)

...though it would be good to have backwards compatibility here.  WDYT
of this approach?

[Message part 2 (text/x-patch, inline)]
1 file changed, 15 insertions(+), 12 deletions(-)
gnu/services/networking.scm | 27 +++++++++++++++------------

modified   gnu/services/networking.scm
@@ -1072,19 +1072,22 @@ networking."))))
             (stop #~(make-kill-destructor)))))))
 
 (define wpa-supplicant-service-type
-  (let ((config->package
-         (match-lambda
-           (($ <wpa-supplicant-configuration> wpa-supplicant)
-            (list wpa-supplicant)))))
-    (service-type (name 'wpa-supplicant)
-                  (extensions
-                   (list (service-extension shepherd-root-service-type
-                                            wpa-supplicant-shepherd-service)
-                         (service-extension dbus-root-service-type config->package)
-                         (service-extension profile-service-type config->package)))
-                  (description "Run the WPA Supplicant daemon, a service that
+  (lambda* (#:optional wpa-supplicant-package)      ;deprecated
+    (let ((package
+           (if wpa-supplicant-package
+               wpa-supplicant-package
+               (match-lambda
+                 (($ <wpa-supplicant-configuration> wpa-supplicant)
+                  (list wpa-supplicant))))))
+      (service-type (name 'wpa-supplicant)
+                    (extensions
+                     (list (service-extension shepherd-root-service-type
+                                              wpa-supplicant-shepherd-service)
+                           (service-extension dbus-root-service-type package)
+                           (service-extension profile-service-type package)))
+                    (description "Run the WPA Supplicant daemon, a service that
 implements authentication, key negotiation and more for wireless networks.")
-                  (default-value (wpa-supplicant-configuration)))))
+                    (default-value (wpa-supplicant-configuration))))))
 
 
 ;;;

[back]
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#33078; Package guix. (Wed, 17 Oct 2018 21:50:01 GMT) Full text and rfc822 format available.

Message #14 received at 33078 <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Mark H Weaver <mhw <at> netris.org>, 33078 <at> debbugs.gnu.org
Subject: Re: bug#33078: Attempt to build my GuixSD system now fails
Date: Wed, 17 Oct 2018 23:49:46 +0200
[Message part 1 (text/plain, inline)]
Marius Bakke <mbakke <at> fastmail.com> writes:

> Mark H Weaver <mhw <at> netris.org> writes:
>
>>   (services (cons* (console-keymap-service keymap)
>>                    ;;(xfce-desktop-service)
>>                    (gnome-desktop-service)
>>                    (service network-manager-service-type
>>                             (network-manager-configuration))
>>                    (service wpa-supplicant-service-type wpa-supplicant)
>
> To adapt to the new interface, this should be changed to:
>
> (service wpa-supplicant-service-type)
>
> ...though it would be good to have backwards compatibility here.  WDYT
> of this approach?

[...]
  
>  (define wpa-supplicant-service-type
> -  (let ((config->package
> -         (match-lambda
> -           (($ <wpa-supplicant-configuration> wpa-supplicant)
> -            (list wpa-supplicant)))))
> -    (service-type (name 'wpa-supplicant)
> -                  (extensions
> -                   (list (service-extension shepherd-root-service-type
> -                                            wpa-supplicant-shepherd-service)
> -                         (service-extension dbus-root-service-type config->package)
> -                         (service-extension profile-service-type config->package)))
> -                  (description "Run the WPA Supplicant daemon, a service that
> +  (lambda* (#:optional wpa-supplicant-package)      ;deprecated
> +    (let ((package
> +           (if wpa-supplicant-package
> +               wpa-supplicant-package
> +               (match-lambda
> +                 (($ <wpa-supplicant-configuration> wpa-supplicant)
> +                  (list wpa-supplicant))))))

Derp, this obviously won't work.

I've tried various incarnations to match a package object in the
match-lambda with little success.  Suggestions?
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#33078; Package guix. (Fri, 19 Oct 2018 14:01:01 GMT) Full text and rfc822 format available.

Message #17 received at 33078 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 33078 <at> debbugs.gnu.org, Mark H Weaver <mhw <at> netris.org>
Subject: Re: bug#33078: Attempt to build my GuixSD system now fails
Date: Fri, 19 Oct 2018 16:00:35 +0200
[Message part 1 (text/plain, inline)]
Hello,

Marius Bakke <mbakke <at> fastmail.com> skribis:

> Marius Bakke <mbakke <at> fastmail.com> writes:
>
>> Mark H Weaver <mhw <at> netris.org> writes:
>>
>>>   (services (cons* (console-keymap-service keymap)
>>>                    ;;(xfce-desktop-service)
>>>                    (gnome-desktop-service)
>>>                    (service network-manager-service-type
>>>                             (network-manager-configuration))
>>>                    (service wpa-supplicant-service-type wpa-supplicant)
>>
>> To adapt to the new interface, this should be changed to:
>>
>> (service wpa-supplicant-service-type)
>>
>> ...though it would be good to have backwards compatibility here.  WDYT
>> of this approach?
>
> [...]
>   
>>  (define wpa-supplicant-service-type
>> -  (let ((config->package
>> -         (match-lambda
>> -           (($ <wpa-supplicant-configuration> wpa-supplicant)
>> -            (list wpa-supplicant)))))
>> -    (service-type (name 'wpa-supplicant)
>> -                  (extensions
>> -                   (list (service-extension shepherd-root-service-type
>> -                                            wpa-supplicant-shepherd-service)
>> -                         (service-extension dbus-root-service-type config->package)
>> -                         (service-extension profile-service-type config->package)))
>> -                  (description "Run the WPA Supplicant daemon, a service that
>> +  (lambda* (#:optional wpa-supplicant-package)      ;deprecated
>> +    (let ((package
>> +           (if wpa-supplicant-package
>> +               wpa-supplicant-package
>> +               (match-lambda
>> +                 (($ <wpa-supplicant-configuration> wpa-supplicant)
>> +                  (list wpa-supplicant))))))
>
> Derp, this obviously won't work.
>
> I've tried various incarnations to match a package object in the
> match-lambda with little success.  Suggestions?

‘wpa-supplicant-service-type’ must remain a <service-type> record, so
the above cannot work.

Maybe this?

[Message part 2 (text/x-patch, inline)]
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index 61a0e975c..391c6ec59 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -1077,7 +1077,9 @@ networking."))))
   (let ((config->package
          (match-lambda
            (($ <wpa-supplicant-configuration> wpa-supplicant)
-            (list wpa-supplicant)))))
+            (list wpa-supplicant))
+           ((? package? package)
+            (list package)))))
     (service-type (name 'wpa-supplicant)
                   (extensions
                    (list (service-extension shepherd-root-service-type
[Message part 3 (text/plain, inline)]
HTH,
Ludo’.

Information forwarded to bug-guix <at> gnu.org:
bug#33078; Package guix. (Wed, 07 Nov 2018 21:43:01 GMT) Full text and rfc822 format available.

Message #20 received at 33078 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 33078 <at> debbugs.gnu.org, Mark H Weaver <mhw <at> netris.org>
Subject: Re: bug#33078: Attempt to build my GuixSD system now fails
Date: Wed, 07 Nov 2018 22:41:37 +0100
Hey Marius,

Ping!  :-)

Ludo’.

ludo <at> gnu.org (Ludovic Courtès) skribis:

> Hello,
>
> Marius Bakke <mbakke <at> fastmail.com> skribis:
>
>> Marius Bakke <mbakke <at> fastmail.com> writes:
>>
>>> Mark H Weaver <mhw <at> netris.org> writes:
>>>
>>>>   (services (cons* (console-keymap-service keymap)
>>>>                    ;;(xfce-desktop-service)
>>>>                    (gnome-desktop-service)
>>>>                    (service network-manager-service-type
>>>>                             (network-manager-configuration))
>>>>                    (service wpa-supplicant-service-type wpa-supplicant)
>>>
>>> To adapt to the new interface, this should be changed to:
>>>
>>> (service wpa-supplicant-service-type)
>>>
>>> ...though it would be good to have backwards compatibility here.  WDYT
>>> of this approach?
>>
>> [...]
>>   
>>>  (define wpa-supplicant-service-type
>>> -  (let ((config->package
>>> -         (match-lambda
>>> -           (($ <wpa-supplicant-configuration> wpa-supplicant)
>>> -            (list wpa-supplicant)))))
>>> -    (service-type (name 'wpa-supplicant)
>>> -                  (extensions
>>> -                   (list (service-extension shepherd-root-service-type
>>> -                                            wpa-supplicant-shepherd-service)
>>> -                         (service-extension dbus-root-service-type config->package)
>>> -                         (service-extension profile-service-type config->package)))
>>> -                  (description "Run the WPA Supplicant daemon, a service that
>>> +  (lambda* (#:optional wpa-supplicant-package)      ;deprecated
>>> +    (let ((package
>>> +           (if wpa-supplicant-package
>>> +               wpa-supplicant-package
>>> +               (match-lambda
>>> +                 (($ <wpa-supplicant-configuration> wpa-supplicant)
>>> +                  (list wpa-supplicant))))))
>>
>> Derp, this obviously won't work.
>>
>> I've tried various incarnations to match a package object in the
>> match-lambda with little success.  Suggestions?
>
> ‘wpa-supplicant-service-type’ must remain a <service-type> record, so
> the above cannot work.
>
> Maybe this?
>
> diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
> index 61a0e975c..391c6ec59 100644
> --- a/gnu/services/networking.scm
> +++ b/gnu/services/networking.scm
> @@ -1077,7 +1077,9 @@ networking."))))
>    (let ((config->package
>           (match-lambda
>             (($ <wpa-supplicant-configuration> wpa-supplicant)
> -            (list wpa-supplicant)))))
> +            (list wpa-supplicant))
> +           ((? package? package)
> +            (list package)))))
>      (service-type (name 'wpa-supplicant)
>                    (extensions
>                     (list (service-extension shepherd-root-service-type
>
>
> HTH,
> Ludo’.




Changed bug title to 'wpa-supplicant service API change leads to breakage' from 'Attempt to build my GuixSD system now fails' Request was from ludo <at> gnu.org (Ludovic Courtès) to control <at> debbugs.gnu.org. (Wed, 07 Nov 2018 21:43:02 GMT) Full text and rfc822 format available.

bug closed, send any further explanations to 33078 <at> debbugs.gnu.org and Mark H Weaver <mhw <at> netris.org> Request was from Bruno Victal <mirai <at> makinata.eu> to control <at> debbugs.gnu.org. (Thu, 30 Mar 2023 23:01:02 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 28 Apr 2023 11:24:16 GMT) Full text and rfc822 format available.

This bug report was last modified 360 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.