GLEGram 12.5 — Initial public release

Based on Swiftgram 12.5 (Telegram iOS 12.5).
All GLEGram features ported and organized in GLEGram/ folder.

Features: Ghost Mode, Saved Deleted Messages, Content Protection Bypass,
Font Replacement, Fake Profile, Chat Export, Plugin System, and more.

See CHANGELOG_12.5.md for full details.
This commit is contained in:
Leeksov
2026-04-06 09:48:12 +03:00
commit 4647310322
39685 changed files with 11052678 additions and 0 deletions
@@ -0,0 +1,19 @@
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
swift_library(
name = "EncryptionKeyVisualization",
module_name = "EncryptionKeyVisualization",
srcs = glob([
"Sources/**/*.swift",
]),
copts = [
"-warnings-as-errors",
],
deps = [
"//submodules/TelegramCore:TelegramCore",
"//submodules/EncryptionKeyVisualization/Impl:EncryptionKeyVisualizationImpl",
],
visibility = [
"//visibility:public",
],
)
@@ -0,0 +1,22 @@
objc_library(
name = "EncryptionKeyVisualizationImpl",
enable_modules = True,
module_name = "EncryptionKeyVisualizationImpl",
srcs = glob([
"Sources/**/*.m",
"Sources/**/*.h",
], allow_empty=True),
hdrs = glob([
"PublicHeaders/**/*.h",
]),
includes = [
"PublicHeaders",
],
sdk_frameworks = [
"Foundation",
],
visibility = [
"//visibility:public",
],
)
@@ -0,0 +1,5 @@
#import <UIKit/UIKit.h>
#import <EncryptionKeyVisualizationImpl/SecretChatKeyVisualization.h>
@@ -0,0 +1,4 @@
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
UIImage *SecretChatKeyVisualization(NSData *data, NSData *additionalData, CGSize size);
@@ -0,0 +1,111 @@
#import <EncryptionKeyVisualizationImpl/SecretChatKeyVisualization.h>
#import <objc/runtime.h>
#define UIColorRGB(rgb) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:1.0f])
static int32_t get_bits(uint8_t const *bytes, unsigned int bitOffset, unsigned int numBits)
{
uint8_t const *data = bytes;
numBits = (unsigned int)pow(2, numBits) - 1; //this will only work up to 32 bits, of course
data += bitOffset / 8;
bitOffset %= 8;
return (*((int*)data) >> bitOffset) & numBits;
}
UIImage *SecretChatKeyVisualization(NSData *data, NSData *additionalData, CGSize size) {
uint8_t bits[128];
memset(bits, 0, 128);
uint8_t additionalBits[256 * 8];
memset(additionalBits, 0, 256 * 8);
[data getBytes:bits length:MIN((NSUInteger)128, data.length)];
[additionalData getBytes:additionalBits length:MIN((NSUInteger)256, additionalData.length)];
static CGColorRef colors[6];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
static const int textColors[] =
{
0xffffff,
0xd5e6f3,
0x2d5775,
0x2f99c9
};
for (int i = 0; i < 4; i++)
{
colors[i] = CGColorRetain(UIColorRGB(textColors[i]).CGColor);
}
});
UIGraphicsBeginImageContextWithOptions(size, true, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, colors[0]);
CGContextFillRect(context, CGRectMake(0.0f, 0.0f, size.width, size.height));
if (additionalData == nil) {
int bitPointer = 0;
CGFloat rectSize = size.width / 8.0f;
for (int iy = 0; iy < 8; iy++)
{
for (int ix = 0; ix < 8; ix++)
{
int32_t byteValue = get_bits(bits, bitPointer, 2);
bitPointer += 2;
int colorIndex = ABS(byteValue) % 4;
CGContextSetFillColorWithColor(context, colors[colorIndex]);
CGRect rect = CGRectMake(ix * rectSize, iy * rectSize, rectSize, rectSize);
if (size.width > 200) {
rect.origin.x = ceil(rect.origin.x);
rect.origin.y = ceil(rect.origin.y);
rect.size.width = ceil(rect.size.width);
rect.size.height = ceil(rect.size.height);
}
CGContextFillRect(context, rect);
}
}
} else {
int bitPointer = 0;
CGFloat rectSize = size.width / 12.0f;
for (int iy = 0; iy < 12; iy++)
{
for (int ix = 0; ix < 12; ix++)
{
int32_t byteValue = 0;
if (bitPointer < 128) {
byteValue = get_bits(bits, bitPointer, 2);
} else {
byteValue = get_bits(additionalBits, bitPointer - 128, 2);
}
bitPointer += 2;
int colorIndex = ABS(byteValue) % 4;
CGContextSetFillColorWithColor(context, colors[colorIndex]);
CGRect rect = CGRectMake(ix * rectSize, iy * rectSize, rectSize, rectSize);
if (size.width > 200) {
rect.origin.x = ceil(rect.origin.x);
rect.origin.y = ceil(rect.origin.y);
rect.size.width = ceil(rect.size.width);
rect.size.height = ceil(rect.size.height);
}
CGContextFillRect(context, rect);
}
}
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@@ -0,0 +1,10 @@
import Foundation
import UIKit
import TelegramCore
import EncryptionKeyVisualizationImpl
public func secretChatKeyImage(_ fingerprint: SecretChatKeyFingerprint, size: CGSize) -> UIImage? {
let keySignatureData = fingerprint.sha1.data()
let additionalSignature = fingerprint.sha256.data()
return SecretChatKeyVisualization(keySignatureData, additionalSignature, size)
}