1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.bluetooth.btservice; 17 18 import java.io.File; 19 import java.io.FileOutputStream; 20 import java.io.IOException; 21 22 /** 23 * Class to generate a default Device Bloomfilter 24 */ 25 public class DeviceBloomfilterGenerator { 26 public static final String BLOOM_FILTER_DEFAULT = 27 "01070000013b23cef3cd0e063e5dd15a" 28 + "1a3f14b8a2d6974ab2e5a2d37f2efa97" 29 + "10e526000ae8728c41445c9a1387c123" 30 + "dc63675c0b8da3d365cde65b9edf153d" 31 + "12d3a1ecdf9b78b3b2f86bc294ccf7ea" 32 + "f650e1fa767bcaad3b61520125d38364" 33 + "4cb480d820122ad455e7e422e9bc51fd" 34 + "c442628ed66154916130be24212e4f44" 35 + "efed5a6bc9b7064fa7b2efe86dd4e801" 36 + "72c65b972a7524b370a2bca955429385" 37 + "a405671d87ead027e7cb4080713dd0bf" 38 + "6b440048b14d3d55d41d1f4497143b98" 39 + "3b939c0bb686f026aa3c42df96bcab6a" 40 + "542f9b8b62cd30e76ac744b4a185c7aa" 41 + "3433dd714e95c0f268449c56e904a4d4" 42 + "8bf9d242f99fbbe3e259ee97cbafd1f7" 43 + "65306274f54f67b7dfbf2423b8ef8fd6" 44 + "ee3fca0e2217bb351bd3347c610fa3f7" 45 + "7e5ec2d7b931f657d61784fe59e2516c" 46 + "9c8f8f4bcffe0a247ed16d93347a818a" 47 + "a798320da96f05dbee4c5cf31661121f" 48 + "e0e6e6ce9b657df24a7b8e0b8a34e443" 49 + "79dcb270d856a5431a2b6416464e9327" 50 + "22bb423d6f4e620c33a5f2b1d02f9a8f" 51 + "521f7b49947284af61c0dfc4d0e64ccd" 52 + "1df147ae9999fdf9a3538c0ad83ee7d5" 53 + "d066f0f4759bcb5c46b7c3fd57697b88" 54 + "5a8f82a77d927617a6ea077ff352ff18" 55 + "1ab520f1cc0d73f688b55c37761e0be7" 56 + "e543e33accef44fa212f2b746a239bfd" 57 + "b139e39439ffa76919419b79e4505d17" 58 + "0b412ace6f21c6c34bff54eb2e16429a" 59 + "cbc691d3c17aa9e0590e3d4d3acc9349" 60 + "0d67e7cfbf4dfa9aeaadfead7770af8f" 61 + "fb827e2376d30d027cc949712dbce0f7" 62 + "3bb193dbf9201a59632ba6daf11b8a92" 63 + "6bea34175531df805afd72792c9ebada" 64 + "823a0b677c4ee75d745806a98a4dd754" 65 + "2f5e5f665e3280385a416e94ccd8eb88" 66 + "a949d2daaee0f11c238fed182e1c234c" 67 + "c4021288a0f7f31807b735ea96e3e4fe" 68 + "66d07484a2336971d6ac0e6a79967116" 69 + "cc9eac2921ea51ec822fcc5f90c0f6b4" 70 + "96845542dfe8fbd6299e7d2af66ce423" 71 + "a7346d1af0f5bca2f261e9a247e214a5" 72 + "aecf8d19f2e368d7f0ea9699bc313ccf" 73 + "ccdb8f759d9bf4ee42a49cda2021eba7" 74 + "71add727d5d8cf35143fd4ffc595ee83" 75 + "6d293113cd9ddcea69c009c6f94e4605" 76 + "f96efe314bbad0e5fa449b35e24d1121" 77 + "c1cbcfbacd3bad9759bb5028033ebfc4" 78 + "8ac390285e7b41195fa4c4512cb48bd7" 79 + "2787f52eb8d260e6a9e2b02d32d57c04" 80 + "fd236b933cb365d2ebc99c30fb972ac1" 81 + "fcd1afcf4087c4d612eb1fefc9a03e78" 82 + "de594bc828e3b1aaddb46b7f3d2e0916" 83 + "8c324e1059e2d6b8535c34e4ab05bc13" 84 + "adaf2d75db9d9c8f0891541b573f5782" 85 + "a543f214b34bfdad7373bd6703d4b1ae" 86 + "3793910ad3ccceebda27f714df06c63a" 87 + "94ac90a3044f9c9494ffdc7cb050a750" 88 + "0d647262b98a7f74378f525ba945ddc7" 89 + "a9926b67c553b37ca370ac9016e6b34d" 90 + "5966a6571bc62dfb0fea8906ce4e0739" 91 + "3ff747c356734343bcdc2362baa97e2a" 92 + "eb37244316ac6d0f91e0c6dada3f19d2" 93 + "21f4f309db772bcca9128ee94b11dca5" 94 + "58e678deabfd506f3acf269c0cdd4d66" 95 + "951567041afd88acfa5afff876f024bb" 96 + "7e72db189f9f9e77782aef5f565ceb12" 97 + "1b9cea8200c797bf46f9e086bb6c45c7" 98 + "2a8a7f521523158d005ba13f72866e4b" 99 + "281abb7c01bc16e666b3d9c49ac4ef8a" 100 + "d45b4a63a2d8318cfd6387fa59fc9c1e" 101 + "a7f753d4a2a12a9e802ecaf24ded9075" 102 + "4c476cb2d1f547ecabe06180471cf5b2" 103 + "18099f595df1f96eb9bb301da60853cb" 104 + "3db3ee16dc09f5c167632cb742f9b631" 105 + "35ebf72aaad9f8fbd44f15d9ba77b7c2" 106 + "9bc2873378bd433c0d27258dbf095c75" 107 + "dd7b4ed56b2db02331a5b3817473c6b5" 108 + "b3228749bf1fa16cd88903276b12ac9d" 109 + "949042a04c364725f27644fd082e8e1b" 110 + "2bcaa9ac54b170a67862fd3325e09896" 111 + "bdf499eb1a933d255bb7bd58011379a6" 112 + "20da77c55a7484c0aa19681a8fb71b8b" 113 + "5f10efa2cbaf518a071651b899961dcd" 114 + "953d695f8187a0a3249db6afc81492f1" 115 + "03de215ca8af5c62bda273e0c46f6d4e" 116 + "0f4f8025cc52532b7f4c3ef61769326e" 117 + "841c9c775294ddd2aeba8b7fcb7ce8c4" 118 + "66472f0551c905db5d6c7901e51ba435" 119 + "9a42ed96fb170e2b6e933440de8f4b7e" 120 + "7832696368f9c61c46840db11f5e411a" 121 + "d64e2aa300cfd0768fb919f9434f53b0" 122 + "02e9316c926fe1498ea8b8bfb1f87943" 123 + "6ad5633e004878d47f3102ec93f56737" 124 + "c7a4f0f723f402726f4419f1805b9bcb" 125 + "c25e5536a1356f30756580aa919dcc5f" 126 + "1491bdf6e4639eb56b246e6aa846f721" 127 + "59684a64b413264678df77a633c1c448" 128 + "0ceddd569bf36b61f9fb492ef7ad14dd" 129 + "6b5460e9b267ec1aecf078e3ad180e06" 130 + "35b86c65a0ae236c4cdaed5e48b33525" 131 + "856a70eac296a1744932ee9a91b45821" 132 + "fd7dcaa3e47ef274ed4d34ca440c71bf" 133 + "d9cee7e20b85993d61acb72acaeaf969" 134 + "4f6480d157c4a062a2abf5df87835df8" 135 + "cafbb79aa8f2f2b6b8eae630ff25bdc9" 136 + "5e4df395ce7626882cbb26de3a13d98a" 137 + "b5b7f3bde86c39ab85844cfabaaa9d5e" 138 + "8d6bb9f1c6d644f20c8bf59960efad58" 139 + "ec5071353c1fa7da4a681a650fcbeb8f" 140 + "9cc48389e5e8c0734d2d77126904addb" 141 + "6cf4166e1f4cb964d658a3bba2a2fb33" 142 + "0c16fc9b83f54774b826b38ca96019c8" 143 + "49705809b8656d61044ee19ade74e59f" 144 + "6bce4d414a11bdc1bb76cd096d88dd9d" 145 + "83ca5813bdfa7cc4cd6cefbd090c928d" 146 + "a944ca2012500c510f9462056ee6d99c" 147 + "a76467f9999f4ecf62f7ad1c98eb5914" 148 + "283c354c3fae5b527204983915648b2d" 149 + "4ccda53623e4e1c4eae633f5ed3f18d1" 150 + "3c25d41487014bcc72f3fb69cfe8cdc2" 151 + "d157f899b935ee1501bd8131cd2bdcc1" 152 + "b64c5425562fa6491d24a53047c8720a" 153 + "736be13878c14326035d4b45f319f249" 154 + "cab39e4332aa2e309d264be67c4fb376" 155 + "d3a9698df50497276792384787a9fd1e" 156 + "81c785a7491ec03b7b41625969898df5" 157 + "3456585ebe6db84fd70dcf6cb2914279" 158 + "ccfd1e7fc25d41f5d1020dce935a2eb6" 159 + "7d45641a180f47ab3e6b8cf8f507ef27" 160 + "c8c02c9fbd18519dcfd9adf0fdd4a50b" 161 + "e2c33bd38df85723e9c9763b6ac5a3da" 162 + "70d96dd329a42ca1e7bfed5f7f59e2ab" 163 + "830ba4f968bcf3b7dc2fe6e4d5851ab6" 164 + "360e5265525f153d9fd9ffc333cd946d" 165 + "6c7b035dbb9ee9d1d5a62b1c721481b5" 166 + "0a703f8e9ae4491a83d0fb5e2c72305d" 167 + "3d045f3c43d2db5168af4e1372d5a477" 168 + "ec76b55e3c734fdf9e17d4182ffd5c78" 169 + "0fcf25d709f331a2bd9bd991ab9acbd8" 170 + "50f701c039172dca18db78836de81f96" 171 + "7e75dfa622fe6bdaa7ea896eaab576f8" 172 + "3e9e39148bf5960dc4dc8f3b768415f3" 173 + "67f477cd34cd47ae7b7de6d3332d42d9" 174 + "cf87b883abbd016d668b5f389d72a219" 175 + "c82bdd4f2c2b6768779fe2d74bf01653" 176 + "1d5618d537029d86004bf48f4cc89d16" 177 + "7bdffccd73134c971cff61096877a799" 178 + "9d1bf238fb8c12aae9f02a08b9abdfa5" 179 + "c8d1101a3d1928a7bc63973cd84b62c2" 180 + "9f7c74668d3f203c84b165b5eee84881" 181 + "a8b7a86cf7edf7b2a060c56b75d55286" 182 + "fbf4468a573a7e77e24d32470b95680e" 183 + "7155eeeea7e9522814528e2c414bbf2d" 184 + "fcafa73fcbb3b7a42f19b5f057dd"; 185 hexStringToByteArray(String s)186 public static byte[] hexStringToByteArray(String s) { 187 int len = s.length(); 188 byte[] data = new byte[len / 2]; 189 for (int i = 0; i < len; i += 2) { 190 data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 191 + Character.digit(s.charAt(i + 1), 16)); 192 } 193 return data; 194 } 195 generateDefaultBloomfilter(String filePath)196 public static void generateDefaultBloomfilter(String filePath) throws IOException { 197 File outputFile = new File(filePath); 198 outputFile.createNewFile(); // if file already exists will do nothing 199 FileOutputStream fos = new FileOutputStream(filePath); 200 fos.write(hexStringToByteArray(BLOOM_FILTER_DEFAULT)); 201 fos.close(); 202 } 203 } 204