57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * Copyright © 2018 Samuel Holland <samuel@sholland.org>
 | |
|  * Copyright © 2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  */
 | |
| 
 | |
| package com.wireguard.crypto;
 | |
| 
 | |
| import java.security.SecureRandom;
 | |
| 
 | |
| /**
 | |
|  * Represents a Curve25519 keypair as used by WireGuard.
 | |
|  */
 | |
| 
 | |
| public class Keypair {
 | |
|     private final byte[] privateKey;
 | |
|     private final byte[] publicKey;
 | |
| 
 | |
|     public Keypair() {
 | |
|         this(generatePrivateKey());
 | |
|     }
 | |
| 
 | |
|     private Keypair(final byte[] privateKey) {
 | |
|         this.privateKey = privateKey;
 | |
|         publicKey = generatePublicKey(privateKey);
 | |
|     }
 | |
| 
 | |
|     public Keypair(final String privateKey) {
 | |
|         this(KeyEncoding.keyFromBase64(privateKey));
 | |
|     }
 | |
| 
 | |
|     @SuppressWarnings("MagicNumber")
 | |
|     private static byte[] generatePrivateKey() {
 | |
|         final SecureRandom secureRandom = new SecureRandom();
 | |
|         final byte[] privateKey = new byte[KeyEncoding.KEY_LENGTH];
 | |
|         secureRandom.nextBytes(privateKey);
 | |
|         privateKey[0] &= 248;
 | |
|         privateKey[31] &= 127;
 | |
|         privateKey[31] |= 64;
 | |
|         return privateKey;
 | |
|     }
 | |
| 
 | |
|     private static byte[] generatePublicKey(final byte[] privateKey) {
 | |
|         final byte[] publicKey = new byte[KeyEncoding.KEY_LENGTH];
 | |
|         Curve25519.eval(publicKey, 0, privateKey, null);
 | |
|         return publicKey;
 | |
|     }
 | |
| 
 | |
|     public String getPrivateKey() {
 | |
|         return KeyEncoding.keyToBase64(privateKey);
 | |
|     }
 | |
| 
 | |
|     public String getPublicKey() {
 | |
|         return KeyEncoding.keyToBase64(publicKey);
 | |
|     }
 | |
| }
 |