From 8246b5cbdc79d50073528409e5ff2a832ab7dc6b Mon Sep 17 00:00:00 2001 From: Cody Cutrer Date: Tue, 12 Feb 2019 12:41:35 -0700 Subject: [PATCH] Helper method for generating random, valid PINs Now that we have the spec, we know what PINs are invalid to easily weed them out. --- .../java/com/beowulfe/hap/HomekitServer.java | 10 +++++++ .../com/beowulfe/hap/impl/HomekitUtils.java | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/main/java/com/beowulfe/hap/HomekitServer.java b/src/main/java/com/beowulfe/hap/HomekitServer.java index 5c70c8e02..67158174a 100644 --- a/src/main/java/com/beowulfe/hap/HomekitServer.java +++ b/src/main/java/com/beowulfe/hap/HomekitServer.java @@ -149,4 +149,14 @@ public static byte[] generateKey() throws InvalidAlgorithmParameterException { public static String generateMac() { return HomekitUtils.generateMac(); } + + /** + * Generates a value to supply in {@link HomekitAuthInfo#getPin() HomekitAuthInfo.getPin()}. This + * is used as the Pin a user enters into their Homekit device in order to confirm pairing. + * + * @return the generated Pin + */ + public static String generatePin() { + return HomekitUtils.generatePin(); + } } diff --git a/src/main/java/com/beowulfe/hap/impl/HomekitUtils.java b/src/main/java/com/beowulfe/hap/impl/HomekitUtils.java index f82eb77e1..204c71e16 100644 --- a/src/main/java/com/beowulfe/hap/impl/HomekitUtils.java +++ b/src/main/java/com/beowulfe/hap/impl/HomekitUtils.java @@ -35,6 +35,33 @@ public static String generateMac() { .collect(Collectors.joining(":")); } + public static String generatePin() { + String pin = + String.format( + "%03d-%02d-%03d", + getSecureRandom().nextInt(1000), + getSecureRandom().nextInt(100), + getSecureRandom().nextInt(1000)); + + if (pin == "000-00-000" + || pin == "111-11-111" + || pin == "222-22-222" + || pin == "333-33-333" + || pin == "444-44-444" + || pin == "555-55-555" + || pin == "666-66-666" + || pin == "777-77-777" + || pin == "888-88-888" + || pin == "999-99-999" + || pin == "123-45-678" + || pin == "876-54-321") { + // disallowed Pin; just recurse and generate a new one + return generatePin(); + } + + return pin; + } + private static SecureRandom getSecureRandom() { if (secureRandom == null) { synchronized (HomekitUtils.class) {