org.whispersystems.util.Base64 Java Examples

The following examples show how to use org.whispersystems.util.Base64. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: SignalServiceMessageSender.java    From mollyim-android with GNU General Public License v3.0 6 votes vote down vote up
private void sendMessage(VerifiedMessage message, Optional<UnidentifiedAccessPair> unidentifiedAccess)
    throws IOException, UntrustedIdentityException
{
  byte[] nullMessageBody = DataMessage.newBuilder()
                                      .setBody(Base64.encodeBytes(Util.getRandomLengthBytes(140)))
                                      .build()
                                      .toByteArray();

  NullMessage nullMessage = NullMessage.newBuilder()
                                       .setPadding(ByteString.copyFrom(nullMessageBody))
                                       .build();

  byte[] content          = Content.newBuilder()
                                   .setNullMessage(nullMessage)
                                   .build()
                                   .toByteArray();

  SendMessageResult result = sendMessage(message.getDestination(), getTargetUnidentifiedAccess(unidentifiedAccess), message.getTimestamp(), content, false);

  if (result.getSuccess().isNeedsSync()) {
    byte[] syncMessage = createMultiDeviceVerifiedContent(message, nullMessage.toByteArray());
    sendMessage(localAddress, Optional.<UnidentifiedAccess>absent(), message.getTimestamp(), syncMessage, false);
  }
}
 
Example #2
Source File: ResumableUploadSpec.java    From mollyim-android with GNU General Public License v3.0 6 votes vote down vote up
public static ResumableUploadSpec deserialize(String serializedSpec) throws ResumeLocationInvalidException {
  if (serializedSpec == null) return null;

  try {
    ResumableUploads.ResumableUpload resumableUpload = ResumableUploads.ResumableUpload.parseFrom(ByteString.copyFrom(Base64.decode(serializedSpec)));

    return new ResumableUploadSpec(
        resumableUpload.getSecretKey().toByteArray(),
        resumableUpload.getIv().toByteArray(),
        resumableUpload.getCdnKey(),
        resumableUpload.getCdnNumber(),
        resumableUpload.getLocation(),
        resumableUpload.getTimeout()
    );
  } catch (IOException e) {
    throw new ResumeLocationInvalidException();
  }
}
 
Example #3
Source File: SignalServiceMessageSender.java    From libsignal-service-java with GNU General Public License v3.0 6 votes vote down vote up
private void sendMessage(VerifiedMessage message, Optional<UnidentifiedAccessPair> unidentifiedAccess)
    throws IOException, UntrustedIdentityException
{
  byte[] nullMessageBody = DataMessage.newBuilder()
                                      .setBody(Base64.encodeBytes(Util.getRandomLengthBytes(140)))
                                      .build()
                                      .toByteArray();

  NullMessage nullMessage = NullMessage.newBuilder()
                                       .setPadding(ByteString.copyFrom(nullMessageBody))
                                       .build();

  byte[] content          = Content.newBuilder()
                                   .setNullMessage(nullMessage)
                                   .build()
                                   .toByteArray();

  SendMessageResult result = sendMessage(message.getDestination(), getTargetUnidentifiedAccess(unidentifiedAccess), message.getTimestamp(), content, false);

  if (result.getSuccess().isNeedsSync()) {
    byte[] syncMessage = createMultiDeviceVerifiedContent(message, nullMessage.toByteArray());
    sendMessage(localAddress, Optional.<UnidentifiedAccess>absent(), message.getTimestamp(), syncMessage, false);
  }
}
 
Example #4
Source File: ServiceConfig.java    From signal-cli with GNU General Public License v3.0 6 votes vote down vote up
public static SignalServiceConfiguration createDefaultServiceConfiguration(String userAgent) {
    final Interceptor userAgentInterceptor = chain ->
            chain.proceed(chain.request().newBuilder()
                    .header("User-Agent", userAgent)
                    .build());

    final List<Interceptor> interceptors = Collections.singletonList(userAgentInterceptor);

    final byte[] zkGroupServerPublicParams;
    try {
        zkGroupServerPublicParams = Base64.decode(zkGroupServerPublicParamsHex);
    } catch (IOException e) {
        throw new AssertionError(e);
    }

    return new SignalServiceConfiguration(
            new SignalServiceUrl[]{new SignalServiceUrl(URL, TRUST_STORE)},
            makeSignalCdnUrlMapFor(new SignalCdnUrl[]{new SignalCdnUrl(CDN_URL, TRUST_STORE)}, new SignalCdnUrl[]{new SignalCdnUrl(CDN2_URL, TRUST_STORE)}),
            new SignalContactDiscoveryUrl[0],
            new SignalKeyBackupServiceUrl[]{new SignalKeyBackupServiceUrl(SIGNAL_KEY_BACKUP_URL, TRUST_STORE)},
            new SignalStorageUrl[]{new SignalStorageUrl(STORAGE_URL, TRUST_STORE)},
            interceptors,
            dns,
            zkGroupServerPublicParams
    );
}
 
Example #5
Source File: JsonSessionStore.java    From signal-cli with GNU General Public License v3.0 6 votes vote down vote up
@Override
public void serialize(JsonSessionStore jsonSessionStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException {
    json.writeStartArray();
    for (SessionInfo sessionInfo : jsonSessionStore.sessions) {
        json.writeStartObject();
        if (sessionInfo.address.getNumber().isPresent()) {
            json.writeStringField("name", sessionInfo.address.getNumber().get());
        }
        if (sessionInfo.address.getUuid().isPresent()) {
            json.writeStringField("uuid", sessionInfo.address.getUuid().get().toString());
        }
        json.writeNumberField("deviceId", sessionInfo.deviceId);
        json.writeStringField("record", Base64.encodeBytes(sessionInfo.sessionRecord));
        json.writeEndObject();
    }
    json.writeEndArray();
}
 
Example #6
Source File: JsonIdentityKeyStore.java    From signal-cli with GNU General Public License v3.0 6 votes vote down vote up
@Override
public void serialize(JsonIdentityKeyStore jsonIdentityKeyStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException {
    json.writeStartObject();
    json.writeNumberField("registrationId", jsonIdentityKeyStore.getLocalRegistrationId());
    json.writeStringField("identityKey", Base64.encodeBytes(jsonIdentityKeyStore.getIdentityKeyPair().serialize()));
    json.writeArrayFieldStart("trustedKeys");
    for (Identity trustedKey : jsonIdentityKeyStore.identities) {
        json.writeStartObject();
        if (trustedKey.getAddress().getNumber().isPresent()) {
            json.writeStringField("name", trustedKey.getAddress().getNumber().get());
        }
        if (trustedKey.getAddress().getUuid().isPresent()) {
            json.writeStringField("uuid", trustedKey.getAddress().getUuid().get().toString());
        }
        json.writeStringField("identityKey", Base64.encodeBytes(trustedKey.identityKey.serialize()));
        json.writeNumberField("trustLevel", trustedKey.trustLevel.ordinal());
        json.writeNumberField("addedTimestamp", trustedKey.added.getTime());
        json.writeEndObject();
    }
    json.writeEndArray();
    json.writeEndObject();
}
 
Example #7
Source File: JsonSignedPreKeyStore.java    From signal-cli with GNU General Public License v3.0 6 votes vote down vote up
@Override
public JsonSignedPreKeyStore deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    JsonNode node = jsonParser.getCodec().readTree(jsonParser);

    Map<Integer, byte[]> preKeyMap = new HashMap<>();
    if (node.isArray()) {
        for (JsonNode preKey : node) {
            Integer preKeyId = preKey.get("id").asInt();
            try {
                preKeyMap.put(preKeyId, Base64.decode(preKey.get("record").asText()));
            } catch (IOException e) {
                System.out.println(String.format("Error while decoding prekey for: %s", preKeyId));
            }
        }
    }

    JsonSignedPreKeyStore keyStore = new JsonSignedPreKeyStore();
    keyStore.addSignedPreKeys(preKeyMap);

    return keyStore;

}
 
Example #8
Source File: JsonPreKeyStore.java    From signal-cli with GNU General Public License v3.0 6 votes vote down vote up
@Override
public JsonPreKeyStore deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    JsonNode node = jsonParser.getCodec().readTree(jsonParser);

    Map<Integer, byte[]> preKeyMap = new HashMap<>();
    if (node.isArray()) {
        for (JsonNode preKey : node) {
            Integer preKeyId = preKey.get("id").asInt();
            try {
                preKeyMap.put(preKeyId, Base64.decode(preKey.get("record").asText()));
            } catch (IOException e) {
                System.out.println(String.format("Error while decoding prekey for: %s", preKeyId));
            }
        }
    }

    JsonPreKeyStore keyStore = new JsonPreKeyStore();
    keyStore.addPreKeys(preKeyMap);

    return keyStore;

}
 
Example #9
Source File: SignalServiceAccountManager.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
public void setProfileName(ProfileKey key, String name)
    throws IOException
{
  if (FeatureFlags.DISALLOW_OLD_PROFILE_SETTING) {
    throw new AssertionError();
  }

  if (name == null) name = "";

  String ciphertextName = Base64.encodeBytesWithoutPadding(new ProfileCipher(key).encryptName(name.getBytes(StandardCharsets.UTF_8), ProfileCipher.NAME_PADDED_LENGTH));

  this.pushServiceSocket.setProfileName(ciphertextName);
}
 
Example #10
Source File: SignalServiceAccountManager.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
private String createDirectoryServerToken(String e164number, boolean urlSafe) {
  try {
    MessageDigest digest  = MessageDigest.getInstance("SHA1");
    byte[]        token   = Util.trim(digest.digest(e164number.getBytes()), 10);
    String        encoded = Base64.encodeBytesWithoutPadding(token);

    if (urlSafe) return encoded.replace('+', '-').replace('/', '_');
    else         return encoded;
  } catch (NoSuchAlgorithmException e) {
    throw new AssertionError(e);
  }
}
 
Example #11
Source File: SignalServiceEnvelope.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
private SecretKeySpec getCipherKey(String signalingKey) throws IOException {
  byte[] signalingKeyBytes = Base64.decode(signalingKey);
  byte[] cipherKey         = new byte[CIPHER_KEY_SIZE];
  System.arraycopy(signalingKeyBytes, 0, cipherKey, 0, cipherKey.length);

  return new SecretKeySpec(cipherKey, "AES");
}
 
Example #12
Source File: SignalServiceEnvelope.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
private SecretKeySpec getMacKey(String signalingKey) throws IOException {
  byte[] signalingKeyBytes = Base64.decode(signalingKey);
  byte[] macKey            = new byte[MAC_KEY_SIZE];
  System.arraycopy(signalingKeyBytes, CIPHER_KEY_SIZE, macKey, 0, macKey.length);

  return new SecretKeySpec(macKey, "HmacSHA256");
}
 
Example #13
Source File: SignalServiceMessagePipe.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
public Future<SendMessageResponse> send(OutgoingPushMessageList list, Optional<UnidentifiedAccess> unidentifiedAccess) throws IOException {
  List<String> headers = new LinkedList<String>() {{
    add("content-type:application/json");
  }};

  if (unidentifiedAccess.isPresent()) {
    headers.add("Unidentified-Access-Key:" + Base64.encodeBytes(unidentifiedAccess.get().getUnidentifiedAccessKey()));
  }

  WebSocketRequestMessage requestMessage = WebSocketRequestMessage.newBuilder()
                                                                  .setId(new SecureRandom().nextLong())
                                                                  .setVerb("PUT")
                                                                  .setPath(String.format("/v1/messages/%s", list.getDestination()))
                                                                  .addAllHeaders(headers)
                                                                  .setBody(ByteString.copyFrom(JsonUtil.toJson(list).getBytes()))
                                                                  .build();

  ListenableFuture<WebsocketResponse> response = websocket.sendRequest(requestMessage);

  return FutureTransformers.map(response, value -> {
    if (value.getStatus() < 200 || value.getStatus() >= 300) {
      throw new IOException("Non-successful response: " + value.getStatus());
    }

    if (Util.isEmpty(value.getBody())) {
      return new SendMessageResponse(false);
    } else {
      return JsonUtil.fromJson(value.getBody(), SendMessageResponse.class);
    }
  });
}
 
Example #14
Source File: SigningCertificate.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
public void verifySignature(String body, String encodedSignature)
    throws SignatureException
{
  try {
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initVerify(path.getCertificates().get(0));
    signature.update(body.getBytes());
    if (!signature.verify(Base64.decode(encodedSignature.getBytes()))) {
      throw new SignatureException("Signature verification failed.");
    }
  } catch (NoSuchAlgorithmException | InvalidKeyException e) {
    throw new AssertionError(e);
  }
}
 
Example #15
Source File: PushServiceSocket.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
private String getAuthorizationHeader(CredentialsProvider credentialsProvider) {
  try {
    String identifier = credentialsProvider.getUuid() != null ? credentialsProvider.getUuid().toString() : credentialsProvider.getE164();
    return "Basic " + Base64.encodeBytes((identifier + ":" + credentialsProvider.getPassword()).getBytes("UTF-8"));
  } catch (UnsupportedEncodingException e) {
    throw new AssertionError(e);
  }
}
 
Example #16
Source File: PreKeyEntity.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
@Override
public ECPublicKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  try {
    return Curve.decodePoint(Base64.decodeWithoutPadding(p.getValueAsString()), 0);
  } catch (InvalidKeyException e) {
    throw new IOException(e);
  }
}
 
Example #17
Source File: ResumableUploadSpec.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
public String serialize() {
  ResumableUploads.ResumableUpload.Builder builder = ResumableUploads.ResumableUpload.newBuilder()
                                                                                     .setSecretKey(ByteString.copyFrom(getSecretKey()))
                                                                                     .setIv(ByteString.copyFrom(getIV()))
                                                                                     .setTimeout(getExpirationTimestamp())
                                                                                     .setCdnNumber(getCdnNumber())
                                                                                     .setCdnKey(getCdnKey())
                                                                                     .setLocation(getResumeLocation())
                                                                                     .setTimeout(getExpirationTimestamp());

  return Base64.encodeBytes(builder.build().toByteArray());
}
 
Example #18
Source File: JsonUtil.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
@Override
public IdentityKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  try {
    return new IdentityKey(Base64.decodeWithoutPadding(p.getValueAsString()), 0);
  } catch (InvalidKeyException e) {
    throw new IOException(e);
  }
}
 
Example #19
Source File: SigningCertificateTest.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
public void testBadSignature() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException, CertPathValidatorException, SignatureException {
  String certificateChain = URLDecoder.decode("-----BEGIN%20CERTIFICATE-----%0AMIIEoTCCAwmgAwIBAgIJANEHdl0yo7CWMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNV%0ABAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmExGjAYBgNV%0ABAoMEUludGVsIENvcnBvcmF0aW9uMTAwLgYDVQQDDCdJbnRlbCBTR1ggQXR0ZXN0%0AYXRpb24gUmVwb3J0IFNpZ25pbmcgQ0EwHhcNMTYxMTIyMDkzNjU4WhcNMjYxMTIw%0AMDkzNjU4WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1Nh%0AbnRhIENsYXJhMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlvbjEtMCsGA1UEAwwk%0ASW50ZWwgU0dYIEF0dGVzdGF0aW9uIFJlcG9ydCBTaWduaW5nMIIBIjANBgkqhkiG%0A9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqXot4OZuphR8nudFrAFiaGxxkgma/Es/BA%2Bt%0AbeCTUR106AL1ENcWA4FX3K%2BE9BBL0/7X5rj5nIgX/R/1ubhkKWw9gfqPG3KeAtId%0Acv/uTO1yXv50vqaPvE1CRChvzdS/ZEBqQ5oVvLTPZ3VEicQjlytKgN9cLnxbwtuv%0ALUK7eyRPfJW/ksddOzP8VBBniolYnRCD2jrMRZ8nBM2ZWYwnXnwYeOAHV%2BW9tOhA%0AImwRwKF/95yAsVwd21ryHMJBcGH70qLagZ7Ttyt%2B%2BqO/6%2BKAXJuKwZqjRlEtSEz8%0AgZQeFfVYgcwSfo96oSMAzVr7V0L6HSDLRnpb6xxmbPdqNol4tQIDAQABo4GkMIGh%0AMB8GA1UdIwQYMBaAFHhDe3amfrzQr35CN%2Bs1fDuHAVE8MA4GA1UdDwEB/wQEAwIG%0AwDAMBgNVHRMBAf8EAjAAMGAGA1UdHwRZMFcwVaBToFGGT2h0dHA6Ly90cnVzdGVk%0Ac2VydmljZXMuaW50ZWwuY29tL2NvbnRlbnQvQ1JML1NHWC9BdHRlc3RhdGlvblJl%0AcG9ydFNpZ25pbmdDQS5jcmwwDQYJKoZIhvcNAQELBQADggGBAGcIthtcK9IVRz4r%0ARq%2BZKE%2B7k50/OxUsmW8aavOzKb0iCx07YQ9rzi5nU73tME2yGRLzhSViFs/LpFa9%0AlpQL6JL1aQwmDR74TxYGBAIi5f4I5TJoCCEqRHz91kpG6Uvyn2tLmnIdJbPE4vYv%0AWLrtXXfFBSSPD4Afn7%2B3/XUggAlc7oCTizOfbbtOFlYA4g5KcYgS1J2ZAeMQqbUd%0AZseZCcaZZZn65tdqee8UXZlDvx0%2BNdO0LR%2B5pFy%2BjuM0wWbu59MvzcmTXbjsi7HY%0A6zd53Yq5K244fwFHRQ8eOB0IWB%2B4PfM7FeAApZvlfqlKOlLcZL2uyVmzRkyR5yW7%0A2uo9mehX44CiPJ2fse9Y6eQtcfEhMPkmHXI01sN%2BKwPbpA39%2BxOsStjhP9N1Y1a2%0AtQAVo%2ByVgLgV2Hws73Fc0o3wC78qPEA%2Bv2aRs/Be3ZFDgDyghc/1fgU%2B7C%2BP6kbq%0Ad4poyb6IW8KCJbxfMJvkordNOgOUUxndPHEi/tb/U7uLjLOgPA%3D%3D%0A-----END%20CERTIFICATE-----%0A-----BEGIN%20CERTIFICATE-----%0AMIIFSzCCA7OgAwIBAgIJANEHdl0yo7CUMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNV%0ABAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmExGjAYBgNV%0ABAoMEUludGVsIENvcnBvcmF0aW9uMTAwLgYDVQQDDCdJbnRlbCBTR1ggQXR0ZXN0%0AYXRpb24gUmVwb3J0IFNpZ25pbmcgQ0EwIBcNMTYxMTE0MTUzNzMxWhgPMjA0OTEy%0AMzEyMzU5NTlaMH4xCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwL%0AU2FudGEgQ2xhcmExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMTAwLgYDVQQD%0ADCdJbnRlbCBTR1ggQXR0ZXN0YXRpb24gUmVwb3J0IFNpZ25pbmcgQ0EwggGiMA0G%0ACSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCfPGR%2BtXc8u1EtJzLA10Feu1Wg%2Bp7e%0ALmSRmeaCHbkQ1TF3Nwl3RmpqXkeGzNLd69QUnWovYyVSndEMyYc3sHecGgfinEeh%0ArgBJSEdsSJ9FpaFdesjsxqzGRa20PYdnnfWcCTvFoulpbFR4VBuXnnVLVzkUvlXT%0AL/TAnd8nIZk0zZkFJ7P5LtePvykkar7LcSQO85wtcQe0R1Raf/sQ6wYKaKmFgCGe%0ANpEJUmg4ktal4qgIAxk%2BQHUxQE42sxViN5mqglB0QJdUot/o9a/V/mMeH8KvOAiQ%0AbyinkNndn%2BBgk5sSV5DFgF0DffVqmVMblt5p3jPtImzBIH0QQrXJq39AT8cRwP5H%0AafuVeLHcDsRp6hol4P%2BZFIhu8mmbI1u0hH3W/0C2BuYXB5PC%2B5izFFh/nP0lc2Lf%0A6rELO9LZdnOhpL1ExFOq9H/B8tPQ84T3Sgb4nAifDabNt/zu6MmCGo5U8lwEFtGM%0ARoOaX4AS%2B909x00lYnmtwsDVWv9vBiJCXRsCAwEAAaOByTCBxjBgBgNVHR8EWTBX%0AMFWgU6BRhk9odHRwOi8vdHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9jb250ZW50%0AL0NSTC9TR1gvQXR0ZXN0YXRpb25SZXBvcnRTaWduaW5nQ0EuY3JsMB0GA1UdDgQW%0ABBR4Q3t2pn680K9%2BQjfrNXw7hwFRPDAfBgNVHSMEGDAWgBR4Q3t2pn680K9%2BQjfr%0ANXw7hwFRPDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkq%0AhkiG9w0BAQsFAAOCAYEAeF8tYMXICvQqeXYQITkV2oLJsp6J4JAqJabHWxYJHGir%0AIEqucRiJSSx%2BHjIJEUVaj8E0QjEud6Y5lNmXlcjqRXaCPOqK0eGRz6hi%2BripMtPZ%0AsFNaBwLQVV905SDjAzDzNIDnrcnXyB4gcDFCvwDFKKgLRjOB/WAqgscDUoGq5ZVi%0AzLUzTqiQPmULAQaB9c6Oti6snEFJiCQ67JLyW/E83/frzCmO5Ru6WjU4tmsmy8Ra%0AUd4APK0wZTGtfPXU7w%2BIBdG5Ez0kE1qzxGQaL4gINJ1zMyleDnbuS8UicjJijvqA%0A152Sq049ESDz%2B1rRGc2NVEqh1KaGXmtXvqxXcTB%2BLjy5Bw2ke0v8iGngFBPqCTVB%0A3op5KBG3RjbF6RRSzwzuWfL7QErNC8WEy5yDVARzTA5%2BxmBc388v9Dm21HGfcC8O%0ADD%2BgT9sSpssq0ascmvH49MOgjt1yoysLtdCtJW/9FZpoOypaHx0R%2BmJTLwPXVMrv%0ADaVzWh5aiEx%2BidkSGMnX%0A-----END%20CERTIFICATE-----%0A");
  String signature        = "Kn2Ya2T039qvEWIzIQeSksNyyCQIkcVjciClcp3a6C766dJANXxLLIn6CfyvUZddMtePrTOLpC2e5QTQxB4RwtWmFfr7nxRdFUtA3dH2DAQL5DqqlmPv46ZWSPfiiOXUsu8vNgX3Z4Znt4Q+dIPIquNPY8ZmiAcpKR7n2K3QtabgOnJ2EyngabY3LMQTtriXbZjpl53ynhVhV1rciMdvMaTz4DUYt7gKi+KeNd3CBFSev+eTgYPC3em96J/3bfVR+wC5m3JGbIBCrwAsbO05JkiNIMck3s+p4d/hwiABR75EplxaWmGgIm6VvUKtGhdJ/cNrmF0nxMX6Vi6N2WaLTA==";
  String signatureBody    = "{\"id\":\"287419896494669543891634765983074535548\",\"timestamp\":\"2019-03-11T20:01:21.658293\",\"version\":3,\"isvEnclaveQuoteStatus\":\"OK\",\"isvEnclaveQuoteBody\":\"AgAAADILAAAIAAcAAAAAAPiLWcRSSA3shraxepsGV9qF4zYUPJgE42ZZZXS2G9zaBQUCBP//AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAM1s/DQpN7I7G907v5chqlYVrJ/1CnXFUn1EHNMnaCbJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrzm117Qj8NlEllyDkV4Pae4UgsPjgVXtAA5UsG90gVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHgz6GaO6bkxfPLBYcR5rEf9Itrt81OEanXteSMcd/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}";

  KeyStore keyStore = KeyStore.getInstance("JKS");
  keyStore.load(getClass().getResourceAsStream("/ias.jks"), "whisper".toCharArray());

  SigningCertificate certificate      = new SigningCertificate(certificateChain, keyStore);
  byte[]             decodedSignature = Base64.decode(signature);

  for (int i=0;i<signature.length();i++) {
    for (int j=0;i<8;i++) {
      byte[] malformedSignature = new byte[decodedSignature.length];
      System.arraycopy(decodedSignature, 0, malformedSignature, 0, decodedSignature.length);

      malformedSignature[i] ^= (0x01 << j);

      try {
        certificate.verifySignature(signatureBody, Base64.encodeBytes(malformedSignature));
        throw new AssertionError("Signature verification should fail!");
      } catch (SignatureException e) {
        // good
      }
    }
  }
}
 
Example #20
Source File: EncryptedPreferences.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
static private byte[] decrypt(String key, String encryptedValue, MasterCipher masterCipher) {
  try {
    return masterCipher.decrypt(Base64.decode(encryptedValue), key.getBytes(UTF_8));
  } catch (GeneralSecurityException | IOException e) {
    throw new SecurityException("Could not decrypt '" + key + "' value. " + e.getMessage(), e);
  }
}
 
Example #21
Source File: AudioHash.java    From mollyim-android with GNU General Public License v3.0 5 votes vote down vote up
public static @Nullable AudioHash parseOrNull(@Nullable String hash) {
  if (hash == null) return null;
  try {
    return new AudioHash(hash, AudioWaveFormData.parseFrom(Base64.decode(hash)));
  } catch (IOException e) {
    return null;
  }
}
 
Example #22
Source File: SignalServiceAccountManager.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
public void setProfileName(byte[] key, String name)
    throws IOException
{
  if (name == null) name = "";

  String ciphertextName = Base64.encodeBytesWithoutPadding(new ProfileCipher(key).encryptName(name.getBytes("UTF-8"), ProfileCipher.NAME_PADDED_LENGTH));

  this.pushServiceSocket.setProfileName(ciphertextName);
}
 
Example #23
Source File: SignalServiceAccountManager.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
private String createDirectoryServerToken(String e164number, boolean urlSafe) {
  try {
    MessageDigest digest  = MessageDigest.getInstance("SHA1");
    byte[]        token   = Util.trim(digest.digest(e164number.getBytes()), 10);
    String        encoded = Base64.encodeBytesWithoutPadding(token);

    if (urlSafe) return encoded.replace('+', '-').replace('/', '_');
    else         return encoded;
  } catch (NoSuchAlgorithmException e) {
    throw new AssertionError(e);
  }
}
 
Example #24
Source File: SignalServiceEnvelope.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
private SecretKeySpec getCipherKey(String signalingKey) throws IOException {
  byte[] signalingKeyBytes = Base64.decode(signalingKey);
  byte[] cipherKey         = new byte[CIPHER_KEY_SIZE];
  System.arraycopy(signalingKeyBytes, 0, cipherKey, 0, cipherKey.length);

  return new SecretKeySpec(cipherKey, "AES");
}
 
Example #25
Source File: SignalServiceEnvelope.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
private SecretKeySpec getMacKey(String signalingKey) throws IOException {
  byte[] signalingKeyBytes = Base64.decode(signalingKey);
  byte[] macKey            = new byte[MAC_KEY_SIZE];
  System.arraycopy(signalingKeyBytes, CIPHER_KEY_SIZE, macKey, 0, macKey.length);

  return new SecretKeySpec(macKey, "HmacSHA256");
}
 
Example #26
Source File: SignalServiceMessagePipe.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
public SignalServiceProfile getProfile(SignalServiceAddress address, Optional<UnidentifiedAccess> unidentifiedAccess) throws IOException {
  try {
    List<String> headers = new LinkedList<>();

    if (unidentifiedAccess.isPresent()) {
      headers.add("Unidentified-Access-Key:" + Base64.encodeBytes(unidentifiedAccess.get().getUnidentifiedAccessKey()));
    }

    WebSocketRequestMessage requestMessage = WebSocketRequestMessage.newBuilder()
                                                                    .setId(SecureRandom.getInstance("SHA1PRNG").nextLong())
                                                                    .setVerb("GET")
                                                                    .setPath(String.format("/v1/profile/%s", address.getIdentifier()))
                                                                    .addAllHeaders(headers)
                                                                    .build();

    Pair<Integer, String> response = websocket.sendRequest(requestMessage).get(10, TimeUnit.SECONDS);

    if (response.first() < 200 || response.first() >= 300) {
      throw new IOException("Non-successful response: " + response.first());
    }

    return JsonUtil.fromJson(response.second(), SignalServiceProfile.class);
  } catch (NoSuchAlgorithmException nsae) {
    throw new AssertionError(nsae);
  } catch (InterruptedException | ExecutionException | TimeoutException e) {
    throw new IOException(e);
  }
}
 
Example #27
Source File: SigningCertificate.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
public void verifySignature(String body, String encodedSignature)
    throws SignatureException
{
  try {
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initVerify(path.getCertificates().get(0));
    signature.update(body.getBytes());
    if (!signature.verify(Base64.decode(encodedSignature.getBytes()))) {
      throw new SignatureException("Signature verification failed.");
    }
  } catch (NoSuchAlgorithmException | InvalidKeyException e) {
    throw new AssertionError(e);
  }
}
 
Example #28
Source File: PushServiceSocket.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
private String getAuthorizationHeader(CredentialsProvider credentialsProvider) {
  try {
    String identifier = credentialsProvider.getUuid() != null ? credentialsProvider.getUuid().toString() : credentialsProvider.getE164();
    return "Basic " + Base64.encodeBytes((identifier + ":" + credentialsProvider.getPassword()).getBytes("UTF-8"));
  } catch (UnsupportedEncodingException e) {
    throw new AssertionError(e);
  }
}
 
Example #29
Source File: PreKeyEntity.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
@Override
public ECPublicKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  try {
    return Curve.decodePoint(Base64.decodeWithoutPadding(p.getValueAsString()), 0);
  } catch (InvalidKeyException e) {
    throw new IOException(e);
  }
}
 
Example #30
Source File: JsonUtil.java    From libsignal-service-java with GNU General Public License v3.0 5 votes vote down vote up
@Override
public IdentityKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  try {
    return new IdentityKey(Base64.decodeWithoutPadding(p.getValueAsString()), 0);
  } catch (InvalidKeyException e) {
    throw new IOException(e);
  }
}