hap-java / HAP-Java

Java implementation of the HomeKit Accessory Protocol
MIT License
153 stars 82 forks source link

On ARM device slow creating pair (maybe) #36

Closed js4958223 closed 7 years ago

js4958223 commented 7 years ago

Hello.

I try up HAP-Java on embedded system (OrangePiZero), and i found same trouble.

When mobile device try connect to HomeKit server (bridge with one accessory) server freeze on next stage:

Thread[defaultEventExecutorGroup-4-1,5,main] java.math.BigInteger.implMulAdd(BigInteger.java:2946) java.math.BigInteger.mulAdd(BigInteger.java:2917) java.math.BigInteger.implSquareToLen(BigInteger.java:1994) java.math.BigInteger.squareToLen(BigInteger.java:1915) java.math.BigInteger.implMontgomerySquare(BigInteger.java:2612) java.math.BigInteger.montgomerySquare(BigInteger.java:2571) java.math.BigInteger.oddModPow(BigInteger.java:2839) java.math.BigInteger.modPow(BigInteger.java:2502) com.nimbusds.srp6.SRP6Routines.computePublicServerValue(SRP6Routines.java:182) com.beowulfe.hap.impl.pairing.HomekitSRP6ServerSession.step1(HomekitSRP6ServerSession.java:206) com.beowulfe.hap.impl.pairing.SrpHandler.step1(SrpHandler.java:67) com.beowulfe.hap.impl.pairing.SrpHandler.handle(SrpHandler.java:44) com.beowulfe.hap.impl.pairing.PairingManager.handle(PairingManager.java:36) com.beowulfe.hap.impl.connections.HttpSession.handlePairSetup(HttpSession.java:107) com.beowulfe.hap.impl.connections.HttpSession.handleRequest(HttpSession.java:51) com.beowulfe.hap.impl.connections.ConnectionImpl.doHandleRequest(ConnectionImpl.java:51) com.beowulfe.hap.impl.connections.ConnectionImpl.handleRequest(ConnectionImpl.java:46) com.beowulfe.hap.impl.http.impl.AccessoryHandler.channelRead0(AccessoryHandler.java:47) com.beowulfe.hap.impl.http.impl.AccessoryHandler.channelRead0(AccessoryHandler.java:15) io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308) io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:32) io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:299) io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:36) io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) java.lang.Thread.run(Thread.java:748)

Same time server make response, same time happen timeout on mobile device (HomeKit App show - can't create pair)

I think com.nimbusds.srp6.SRP6Routines.computePublicServerValue need more CPU resources.

Maybe exist solution to simplify algorithm for creating pair ?

js4958223 commented 7 years ago

com.nimbusds.srp6 usese BigInteger.modPow. For calc BigInteger.modPow need moooore CPU resource. Orange PI Zero for that task very slow.

For my issue I change com.nimbusds.srp6.SRP6Routines. All call BigInteger.modPow send to remove sever, over https request for calculation on fast PC.