cairo-native 0.9.0-rc.3

A compiler to convert Cairo's IR Sierra code to MLIR and execute it.
use crate::sha256::compute_sha256_byte_array;

#[test]
fn test_sha256_byte_array() {
    assert_eq!(
        sha256_as_u256("a"), 0xca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb,
    );
    assert_eq!(
        sha256_as_u256("aa"), 0x961b6dd3ede3cb8ecbaacbd68de040cd78eb2ed5889130cceb4c49268ea4d506,
    );
    assert_eq!(
        sha256_as_u256("aaa"), 0x9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0,
    );
    assert_eq!(
        sha256_as_u256("aaaa"), 0x61be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b4,
    );
    // test length 0
    assert_eq!(
        sha256_as_u256(""), 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,
    );
    // test length 1
    assert_eq!(
        sha256_as_u256("x"), 0x2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881,
    );
    // test length 7
    assert_eq!(
        sha256_as_u256("xffidcw"),
        0x692ca8f4448048d3eee81365d91f9220c4c446d123bf9dcd82a6e4d0dfd0940a,
    );
    // test length 8
    assert_eq!(
        sha256_as_u256("szhgvskg"),
        0xbea98c851b81bb113b5b8fbb7add06a8aaae36555b63bbf3abe393b8b35260bd,
    );
    // test length 9
    assert_eq!(
        sha256_as_u256("nokwxzwsl"),
        0x063dc8cf320d4dd4403c2e22b7255ab21898c97e4a131d26e1fc0589f7e9cbc4,
    );
    // test length 15
    assert_eq!(
        sha256_as_u256("bhmvtgdkhgajqaf"),
        0xaffa8850bb7b05ac9e948fda305bfe39a15057a0269225ae8c2eeeb3c46e8fe8,
    );
    // test length 16
    assert_eq!(
        sha256_as_u256("qxwwcxzjiibvkqky"),
        0xef1b40920adc9bd453103e171e79776be73f53288dd22baeb087f664e300d1e2,
    );
    // test length 17
    assert_eq!(
        sha256_as_u256("ipjjkvuojtcinvvnu"),
        0x5419df507a08e45a805ae8dcdcfe544fbdfb955e71b65b048f46b4961aebf06c,
    );
    // test length 23
    assert_eq!(
        sha256_as_u256("ygjbndjbjqfqwrywlpggahh"),
        0xb717c1690433f7e07809147d740c2061ce62ca12ac1e458bb2c9c7b4e720e1e2,
    );
    // test length 24
    assert_eq!(
        sha256_as_u256("tqeruqfqlvrsxhjjzyfiuyni"),
        0xb4706bbfe2551f3838df517953f1f2e4cbd869c020fc2a6a78bd6dce26b2996d,
    );
    // test length 25
    assert_eq!(
        sha256_as_u256("oppudxpkzsspqtmopvdhicyhc"),
        0xd81c9f032105f08d7411af404b9c40ba773e9fb5109ec43d742ab2b124b0985f,
    );
    // test length 31
    assert_eq!(
        sha256_as_u256("iehpuxzsxzffqyhqxsnsybpygdscgrf"),
        0x0814d4d5d16c637c0c32b9cbe4831284027ea275f4363c7a0c2006eefcaf6a95,
    );
    // test length 32
    assert_eq!(
        sha256_as_u256("dwdnlgtqkicjpyonhxtzqmxxqsjiwuov"),
        0x41e8c2ec97ab4c2ca0ea63a4d457d184f9daeeecfc67369fb485657227ee4055,
    );
    // test length 33
    assert_eq!(
        sha256_as_u256("owhqocwxqapkjjryeveiuvyomnzgptexp"),
        0x7ca52baf871a67553eae8e1b7e319a4186f41a31bea6a8b13553986b5494304d,
    );
    // test length 39
    assert_eq!(
        sha256_as_u256("jhgdvhubfsgmvqaiehclbhxtkerusriurmepeyz"),
        0x7ca8143c46fb792674f225441b7471b7f545571517478bce80e7e0c9cdbefff8,
    );
    // test length 40
    assert_eq!(
        sha256_as_u256("pbzqxiqewdfzvelghpjclwwhkocssdmknssasdap"),
        0xdeff2a399ce47b6289bd6c051341403e195b4a68c299729414d13bcdef3eaee3,
    );
    // test length 41
    assert_eq!(
        sha256_as_u256("twxzmlfepsjutlpmlpsetkfvixlttvegfdxeefcda"),
        0xebd7f16ac58ae7cc6fa5469c229b896f2a76440d394e0717ff1c49cc777dd81b,
    );
    // test length 47
    assert_eq!(
        sha256_as_u256("ahdlyumrwxiwumrvkscepnxtptzsdkzhlfpuhypdoeqcqql"),
        0x31db2dea1937ece94652015558e98da557a1c6cf1841cd25e3e0748818a75f1c,
    );
    // test length 48
    assert_eq!(
        sha256_as_u256("kmjeneddmhlcsyokduzjovbynzatmmqoekslfwiqbcoaudgd"),
        0x0b9cda0453fa1adbe558a18f7af8c72090891471ac3b09faa1ddf942d223c73b,
    );
    // test length 49
    assert_eq!(
        sha256_as_u256("vyqcddnljnjajyilmafspxnwgxlgwulpkdgvpaweitfgjcgue"),
        0x1ea01ee2976b0361f8a24346c0f26911a98597a9ab2ebbd293fe7cfad72e6a7a,
    );
    // test length 55
    assert_eq!(
        sha256_as_u256("wugdolcxgjgjugcibpydicnpjkeygkowbkqvsqhnydknzpiguhcwaxt"),
        0xb3fffae87e85a7d9085d04210e29a3dfc27469c61e60a957ad0c87db71c8cb79,
    );
    // test length 56
    assert_eq!(
        sha256_as_u256("sdkxocmqvmljrezvkkfnylvjoklmpeyimvtnhtkheylolizwtqulbluf"),
        0x5c2b04d3b63a9fd04afe1137a00f1c642a962933e20ef1d4e4729fd1cadb01a6,
    );
    // test length 57
    assert_eq!(
        sha256_as_u256("msrqhpytgzqnavnazvhswjwifxwvkiapcetishwuagxultoimyfzoself"),
        0x55bc8a6602d12fc6d5354ad9964e2d13ca9e3ede3e2e788c4c928d75b175a7ca,
    );
    // test length 63
    assert_eq!(
        sha256_as_u256("xtoesagtsybcibtwsqxqltbdiygasnozjniwqnjakjogmcvdpujpprgcdmtuyvn"),
        0x7f70e2a9a8854f0634b57721b48fa5f95185b2ca1099d9e093088e416245da06,
    );
    // test length 64
    assert_eq!(
        sha256_as_u256("fjxootkrqqljdfdvwwxjhndsqshphzaoehyyibqulmtihoutvofsekymjwczelit"),
        0x58c09482981dffd40109b7c14c82418ac1841395e9bbf106d53b0f228b37a464,
    );
    // test length 65
    assert_eq!(
        sha256_as_u256("phtpnnjkxyinhxkwklyvxxrmhzaenpkauucubsubwcjucuyauxahxvylffqiqezbd"),
        0x9cba0ff0b0a2ec07208b46ef0a89a27bbbfe23fd24d8b9939a603c2f47bac1b0,
    );
    // test length 71
    assert_eq!(
        sha256_as_u256("gjgdfsbmbbyhbuujhwlsvobhsfooaogvzxeixzpccpzogkkkkxuorhtaaemyojknipfdewb"),
        0x7d3bc3e84c1a82e4ea1e16a5150f73657a4d54f1ee127bd963f6ecf160c6d3bb,
    );
    // test length 72
    assert_eq!(
        sha256_as_u256("kbziqjtltnzicqhvcgiqfbvamdhddiqzyqucuzbualvrajlcaslsvubilzfwvioysvdqypcp"),
        0xd1e18df0c2acc467e21cd7c7ea46c239bfdf3b75cc55addd255eee751daf5d54,
    );
    // test length 73
    assert_eq!(
        sha256_as_u256("ugombvhpwrkpgvqdwjpopdbqvmldlupczklkdevzkhsjzfylgrkotaoltbnxtoqdhposxtuaz"),
        0xe64839141b5b17df5f84c7fb5561723f6050cf0bc52c81082a50f2de99e4a617,
    );
}

/// computes the sha256 of the input and returns it as a u256.
fn sha256_as_u256(input: ByteArray) -> u256 {
    let hash_result = compute_sha256_byte_array(@input);
    let mut value: u256 = 0;
    for word in hash_result.span() {
        value *= 0x100000000;
        value = value + (*word).into();
    }
    value
}