package com.beowulfe.hap;
import java.math.BigInteger;
/**
* Authentication info that must be provided when constructing a new {@link HomekitServer}. You will need to implement
* this interface yourself to provide the necessary callbacks to a persistent storage mechanism. All values provided
* must be constant across invocations or the accessories will require re-pairing within iOS.
*
* @author Andy Lintner
*/
public interface HomekitAuthInfo {
/**
* A pin code used for pairing the device. This pin will be required within iOS in order to complete pairing. The numbers
* cannot be sequential and should not have a repeating pattern.
*
* @return the pin code, in the form ###-##-###
*/
String getPin();
/**
* A unique MAC address to be advertised with the Homekit information. This does not have to be the MAC address of the
* network interface. You can generate this using {@link HomekitServer#generateMac()}.
*
* @return the unique MAC address.
*/
String getMac();
/**
* The Salt that will be used when hashing the pin code to send to the client. You should generate this using
* {@link HomekitServer#generateSalt()}.
*
* @return the Salt.
*/
BigInteger getSalt();
/**
* The private key used by the server during pairing and message encryption. You should generate this using
* {@link HomekitServer#generateKey()}
*
* @return the private key.
*/
byte[] getPrivateKey();
/**
* Called during the pairing process, you should store the user and public key in a manner that the public key can later
* be retrieved using {@link #getUserPublicKey(String)}. This must be stored in a persistent store as pairing will
* need to be reset if the information is lost.
*
* @param username the iOS device's username. The value will not be meaningful to anything but iOS.
* @param publicKey the iOS device's public key.
*/
void createUser(String username, byte[] publicKey);
/**
* Called when an iOS device needs to remove an existing pairing. Subsequent calls to {@link #getUserPublicKey(String)} for this
* username return null.
*
* @param username the username to delete from the persistent store.
*/
void removeUser(String username);
/**
* Called when an already paired iOS device is re-connecting. The public key returned by this method will be compared
* with the signature of the pair verification request to validate the device.
*
* @param username the username of the iOS device to retrieve the public key for.
* @return the previously stored public key for this user.
*/
byte[] getUserPublicKey(String username);
/**
* Called to check if a user has been created. The homekit accessory advertises whether the accessory has already been paired.
* At this time, it's unclear whether multiple users can be created, however it is known that advertising as unpaired
* will break in iOS 9. The default value has been provided to maintain API compatibility for implementations targeting iOS 8.
*
* @return whether a user has been created and stored
*/
default boolean hasUser() { return false; };
}