19d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root/* 29d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * Copyright (C) 2012 The Android Open Source Project 39d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * 49d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 59d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * you may not use this file except in compliance with the License. 69d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * You may obtain a copy of the License at 79d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * 89d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 99d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * 109d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * Unless required by applicable law or agreed to in writing, software 119d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 129d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * See the License for the specific language governing permissions and 149d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root * limitations under the License. 159d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root */ 169d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 1738375a4d0b3d34e2babbd2f6a013976c7c439696Kenny Rootpackage org.conscrypt; 189d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 199d2fb535e5d43ad34af09195d490da18a7694a48Kenny Rootimport java.math.BigInteger; 209d2fb535e5d43ad34af09195d490da18a7694a48Kenny Rootimport java.security.spec.ECPoint; 219d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 229d2fb535e5d43ad34af09195d490da18a7694a48Kenny Rootfinal class OpenSSLECPointContext { 239d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root private final OpenSSLECGroupContext group; 248acd6134dc84b387608746fbf2054c6d7dcd4f52Joel Dice private final long pointCtx; 259d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 268acd6134dc84b387608746fbf2054c6d7dcd4f52Joel Dice OpenSSLECPointContext(OpenSSLECGroupContext group, long pointCtx) { 279d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root this.group = group; 289d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root this.pointCtx = pointCtx; 299d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 309d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 319d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root @Override 329d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root protected void finalize() throws Throwable { 339d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root try { 349d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root if (pointCtx != 0) { 359d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root NativeCrypto.EC_POINT_clear_free(pointCtx); 369d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 379d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } finally { 389d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root super.finalize(); 399d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 409d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 419d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 429d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root @Override 439d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root public boolean equals(Object o) { 449d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root if (!(o instanceof OpenSSLECPointContext)) { 459d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return false; 469d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 479d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 489d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root final OpenSSLECPointContext other = (OpenSSLECPointContext) o; 499d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root if (!NativeCrypto.EC_GROUP_cmp(group.getContext(), other.group.getContext())) { 509d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return false; 519d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 529d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 539d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return NativeCrypto.EC_POINT_cmp(group.getContext(), pointCtx, other.pointCtx); 549d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 559d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 569d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root public ECPoint getECPoint() { 579d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root final byte[][] generatorCoords = NativeCrypto.EC_POINT_get_affine_coordinates( 589d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root group.getContext(), pointCtx); 599d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root final BigInteger x = new BigInteger(generatorCoords[0]); 609d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root final BigInteger y = new BigInteger(generatorCoords[1]); 619d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return new ECPoint(x, y); 629d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 639d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 649d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root @Override 659d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root public int hashCode() { 669d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root // TODO Auto-generated method stub 679d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return super.hashCode(); 689d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 699d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 708acd6134dc84b387608746fbf2054c6d7dcd4f52Joel Dice public long getContext() { 719d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return pointCtx; 729d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 739d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root 749d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root public static OpenSSLECPointContext getInstance(int curveType, OpenSSLECGroupContext group, 759d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root ECPoint javaPoint) { 769d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root OpenSSLECPointContext point = new OpenSSLECPointContext(group, 779d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root NativeCrypto.EC_POINT_new(group.getContext())); 789d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root NativeCrypto.EC_POINT_set_affine_coordinates(group.getContext(), 799d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root point.getContext(), javaPoint.getAffineX().toByteArray(), 809d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root javaPoint.getAffineY().toByteArray()); 819d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root return point; 829d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root } 839d2fb535e5d43ad34af09195d490da18a7694a48Kenny Root} 84